From eb42be6dc44c69f4177ba14ef880929697aa177c Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Tue, 8 Dec 2020 01:37:19 +0100 Subject: [PATCH 1/4] Sleep before opening GDB to allow it to connect reliably --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 94e5a9c..a3652f3 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ bochs: $(KERNEL_HDD) ext/bochsrc rm bochsout.txt gdb: - QEMUFLAGS="-s -S" $(MAKE) run & gdb -x ext/gdbinit + QEMUFLAGS="-s -S" $(MAKE) run & (sleep 1; gdb -x ext/gdbinit) ext/limine/limine-install: $(MAKE) -C ext/limine/ limine-install From 026e6d0e1aae0d3904360179d21c80839f2fdb57 Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Tue, 8 Dec 2020 01:37:33 +0100 Subject: [PATCH 2/4] load my own fking GDT woop --- kernel/src/arch/x86_64/entry-stivale2.c | 2 ++ kernel/src/arch/x86_64/gdt.nasm | 25 ++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/kernel/src/arch/x86_64/entry-stivale2.c b/kernel/src/arch/x86_64/entry-stivale2.c index c609aad..c8c174e 100644 --- a/kernel/src/arch/x86_64/entry-stivale2.c +++ b/kernel/src/arch/x86_64/entry-stivale2.c @@ -42,6 +42,8 @@ void stivale2_main(struct stivale2_struct *info) { ); printf("PAGE TABLE AT: %x\n", cr3); + loadgdt(); + struct gdt_ptr pGDT; __asm__ __volatile__("sgdt %0" : : "m"(pGDT) : "memory"); printf("GDT: %x (%d)\n", pGDT.base, pGDT.limit); diff --git a/kernel/src/arch/x86_64/gdt.nasm b/kernel/src/arch/x86_64/gdt.nasm index 475e779..0f7a300 100644 --- a/kernel/src/arch/x86_64/gdt.nasm +++ b/kernel/src/arch/x86_64/gdt.nasm @@ -1,10 +1,15 @@ section .rodata +align 8 gdt64: dq 0 -.code: equ $-gdt64 +.codesys: equ $-gdt64 dq (1<<44) | (1<<47) | (1<<41) | (1<<43) | (1<<53) -.data: equ $ - gdt64 +.datasys: equ $-gdt64 dq (1<<44) | (1<<47) | (1<<41) +.codeusr: equ $-gdt64 + dq (1<<44) | (1<<47) | (1<<41) | (1<<43) | (1<<53) | (3<<45) +.datausr: equ $-gdt64 + dq (1<<44) | (1<<47) | (1<<41) | (3<<45) .pointer: dw .pointer - gdt64 - 1 dq gdt64 @@ -13,4 +18,18 @@ section .text global loadgdt loadgdt: lgdt [gdt64.pointer] - \ No newline at end of file + ; now what I tried unsuccessfully: + + mov rax, gdt64.codesys; + push rax + mov rax, loadgdtdone + push rax ; function to execute next + retfq ; far return (pops address and code segment) +loadgdtdone: + mov ax, gdt64.datasys + mov ss, ax + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + ret \ No newline at end of file From 7d257b014ac93c6ccc9741f2b685eccb0d4b31ce Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Tue, 8 Dec 2020 12:21:05 +0100 Subject: [PATCH 3/4] add panicking from assembly --- kernel/Makefile | 2 +- kernel/make/x86/make.config | 10 +++++++--- kernel/src/arch/x86_64/entry-stivale2.c | 8 +++++--- kernel/src/arch/x86_64/info.nasm | 8 +++++++- kernel/src/arch/x86_64/panic.nasminc | 17 +++++++++++++++++ 5 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 kernel/src/arch/x86_64/panic.nasminc diff --git a/kernel/Makefile b/kernel/Makefile index f4c5127..b5b9a0f 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -34,7 +34,7 @@ bin/$(TARGET)-$(ARCH): $(OBJ) @echo Linking $@ $(LD) $(LDFLAGS) $(OBJ) -o $@ -obj/$(ARCH)/%.c.o: src/%.c $(HFILES) +obj/$(ARCH)/%.c.o: src/%.c $(HFILES) $(ARCHHEADERS) @mkdir -p $(@D) @echo $(CC) $< @$(CC) $(CFLAGS) -c $< -o $@ diff --git a/kernel/make/x86/make.config b/kernel/make/x86/make.config index 822d909..42427fb 100644 --- a/kernel/make/x86/make.config +++ b/kernel/make/x86/make.config @@ -1,9 +1,13 @@ ARCHFILES := $(shell find src/arch/x86 -type f -name '*.c' -print) \ - $(shell find src/arch/x86 -type f -name '*.nasm' -print) \ - $(shell find src/arch/$(ARCH) -type f -name '*.nasm' -print) + $(shell find src/arch/x86 -type f -name '*.nasm' -print) \ + $(shell find src/arch/$(ARCH) -type f -name '*.nasm' -print) +ARCHHEADERS := $(shell find src/arch/x86 -type f -name '*.h' -print) \ + $(shell find src/arch/x86 -type f -name '*.nasminc' -print) \ + $(shell find src/arch/$(ARCH) -type f -name '*.nasminc' -print) ARCH_CFLAGS := -masm=intel +NASMFLAGS := -Isrc -obj/$(ARCH)/%.nasm.o: src/%.nasm +obj/$(ARCH)/%.nasm.o: src/%.nasm $(ARCHHEADERS) @mkdir -p $(@D) @echo nasm $< @$(NASM) $(NASMFLAGS) $< -o $@ \ No newline at end of file diff --git a/kernel/src/arch/x86_64/entry-stivale2.c b/kernel/src/arch/x86_64/entry-stivale2.c index c8c174e..61ef24e 100644 --- a/kernel/src/arch/x86_64/entry-stivale2.c +++ b/kernel/src/arch/x86_64/entry-stivale2.c @@ -13,6 +13,8 @@ static uint8_t stack[4096] = {0}; void stivale2_main(struct stivale2_struct *info); +extern void asmpanic(); + struct stivale2_header_tag_smp smp_request = { .tag = { .identifier = STIVALE2_HEADER_TAG_SMP_ID, @@ -48,10 +50,10 @@ void stivale2_main(struct stivale2_struct *info) { __asm__ __volatile__("sgdt %0" : : "m"(pGDT) : "memory"); printf("GDT: %x (%d)\n", pGDT.base, pGDT.limit); for(int i = 0; i < (pGDT.limit+1)/8; i++) { - uint64_t *gdt_ent = pGDT.base + 8*i; + uint64_t *gdt_ent = (uint64_t*)(pGDT.base + 8*i); printf("GDT %d: ", i); print_gdt_ent(gdt_ent); putchar('\n'); } - char *argv[3] = {"stivale2", info->bootloader_brand, info->bootloader_version}; - kmain(3, argv); + asmpanic(); + kmain(); } diff --git a/kernel/src/arch/x86_64/info.nasm b/kernel/src/arch/x86_64/info.nasm index 599fe31..963e001 100644 --- a/kernel/src/arch/x86_64/info.nasm +++ b/kernel/src/arch/x86_64/info.nasm @@ -1,2 +1,8 @@ +%include "arch/x86_64/panic.nasminc" + global archval -archval db "x86_64-nasm", 0 \ No newline at end of file +archval db "x86_64-nasm", 0 + +global asmpanic +asmpanic: + PANIC "asmpanic" \ No newline at end of file diff --git a/kernel/src/arch/x86_64/panic.nasminc b/kernel/src/arch/x86_64/panic.nasminc new file mode 100644 index 0000000..feccb6c --- /dev/null +++ b/kernel/src/arch/x86_64/panic.nasminc @@ -0,0 +1,17 @@ +%ifndef PANIC_NASM_MAC + %define PANIC_NASM_MAC + + extern panic + + %macro PANIC 1 + [SECTION .data] + panicval db %1, 0 + filename db __FILE__, 0 + __SECT__ + mov rdi, panicval + mov rsi, filename + mov rdx, __LINE__ + call panic + %endmacro +%endif + \ No newline at end of file From 61c5386355178c7600764d589ad8aa418688bf56 Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Tue, 8 Dec 2020 15:33:21 +0100 Subject: [PATCH 4/4] reenable normal Makefile echoing --- kernel/Makefile | 6 ++---- kernel/make/x86/make.config | 3 +-- kernel/src/arch/x86/bochs.c | 2 +- kernel/src/arch/x86/ops.c | 4 ++-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/kernel/Makefile b/kernel/Makefile index b5b9a0f..61e1217 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -10,7 +10,7 @@ LDSCRIPT = make/$(ARCH)/linker.ld CFLAGS ?= -Og -g CFLAGS := $(CFLAGS) $(ARCH_CFLAGS) \ - -Wall -Wextra -pedantic -Wno-language-extension-token -std=gnu11 -I../ext -Isrc -fPIE + -Wall -Wextra -pedantic -std=gnu11 -I../ext -Isrc -fPIE LDFLAGS := $(LDFLAGS) -T $(LDSCRIPT) @@ -31,13 +31,11 @@ $(ARCHES): bin/$(TARGET)-$(ARCH): $(OBJ) @mkdir -p $(@D) - @echo Linking $@ $(LD) $(LDFLAGS) $(OBJ) -o $@ obj/$(ARCH)/%.c.o: src/%.c $(HFILES) $(ARCHHEADERS) @mkdir -p $(@D) - @echo $(CC) $< - @$(CC) $(CFLAGS) -c $< -o $@ + $(CC) $(CFLAGS) -c $< -o $@ clean: rm -rf bin obj zig-cache diff --git a/kernel/make/x86/make.config b/kernel/make/x86/make.config index 42427fb..ad80381 100644 --- a/kernel/make/x86/make.config +++ b/kernel/make/x86/make.config @@ -9,5 +9,4 @@ NASMFLAGS := -Isrc obj/$(ARCH)/%.nasm.o: src/%.nasm $(ARCHHEADERS) @mkdir -p $(@D) - @echo nasm $< - @$(NASM) $(NASMFLAGS) $< -o $@ \ No newline at end of file + $(NASM) $(NASMFLAGS) $< -o $@ \ No newline at end of file diff --git a/kernel/src/arch/x86/bochs.c b/kernel/src/arch/x86/bochs.c index dcff4aa..450fb46 100644 --- a/kernel/src/arch/x86/bochs.c +++ b/kernel/src/arch/x86/bochs.c @@ -1,3 +1,3 @@ void breakpoint() { - asm volatile ("xchgw %bx, %bx"); + __asm__ volatile ("xchgw %bx, %bx"); } diff --git a/kernel/src/arch/x86/ops.c b/kernel/src/arch/x86/ops.c index ffa61d2..c893697 100644 --- a/kernel/src/arch/x86/ops.c +++ b/kernel/src/arch/x86/ops.c @@ -1,9 +1,9 @@ #include void halt_catch_fire() { - asm volatile ("cli"); + __asm__ volatile ("cli"); while(1) { - asm volatile ("hlt"); + __asm__ volatile ("hlt"); puts("INTERRUPTED!"); }; }