From afcf0bea094d6cebba8c8822552a06f73a598fbd Mon Sep 17 00:00:00 2001 From: Nathan Singer Date: Thu, 29 May 2025 10:17:18 -0400 Subject: [PATCH] reimplements the gdt --- kernel/arch/gdt/gdt.s | 23 +++++++++++++++++++++++ kernel/arch/{ => gdt}/gdt_entry.c | 0 kernel/kmain.c | 14 ++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 kernel/arch/gdt/gdt.s rename kernel/arch/{ => gdt}/gdt_entry.c (100%) diff --git a/kernel/arch/gdt/gdt.s b/kernel/arch/gdt/gdt.s new file mode 100644 index 0000000..86db7f4 --- /dev/null +++ b/kernel/arch/gdt/gdt.s @@ -0,0 +1,23 @@ +gdtr DW 0 ; limit store + DD 0 ; base storage + +global setGdt +setGdt: + mov ax, [esp + 4] + mov [gdtr], ax + mov eax, [esp + 8] + mov [gdtr + 2], eax + lgdt [gdtr] + ret + +global reloadSegments +reloadSegments: + jmp 0x08:.reload_CS ; 0x08 is a stand in for the code segment +.reload_CS: + mov ax, 0x10 ; stand in for the data segment + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + ret diff --git a/kernel/arch/gdt_entry.c b/kernel/arch/gdt/gdt_entry.c similarity index 100% rename from kernel/arch/gdt_entry.c rename to kernel/arch/gdt/gdt_entry.c diff --git a/kernel/kmain.c b/kernel/kmain.c index 44a4f48..34911c4 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -1,10 +1,24 @@ #include +#include #include #include +#include + +uint64_t gdt[5]; void kmain(void) { + gdt[0] = create_descriptor(0, 0, 0); // null + gdt[1] = create_descriptor(0, 0x000FFFFF, (GDT_CODE_PL0)); + gdt[2] = create_descriptor(0, 0x000FFFFF, (GDT_DATA_PL0)); + gdt[3] = create_descriptor(0, 0x000FFFFF, (GDT_CODE_PL3)); + gdt[4] = create_descriptor(0, 0x000FFFFF, (GDT_DATA_PL3)); + + setGdt((sizeof(uint64_t) * 5) - 1, &(gdt[0])); + reloadSegments(); + + terminal_initialize(); serial_initialize();