Jelajahi Sumber

Kernel: Reorder the 64-bit GDT a bit

Add a kernel data segment and make the user code segment come after
the data segment. We need the GDT to be in a certain order to support
the syscall and sysret instruction pair.
Owen Smith 4 tahun lalu
induk
melakukan
d36c84c331

+ 4 - 3
Kernel/Arch/x86/DescriptorTable.h

@@ -31,10 +31,11 @@ static_assert(GDT_SELECTOR_CODE0 + 16 == GDT_SELECTOR_CODE3); // CS3 = CS0 + 16
 static_assert(GDT_SELECTOR_CODE0 + 24 == GDT_SELECTOR_DATA3); // SS3 = CS0 + 32
 #else
 #    define GDT_SELECTOR_CODE0 0x08
-#    define GDT_SELECTOR_CODE3 0x10
+#    define GDT_SELECTOR_DATA0 0x10
 #    define GDT_SELECTOR_DATA3 0x18
-#    define GDT_SELECTOR_TSS 0x20
-#    define GDT_SELECTOR_TSS_PART2 0x28
+#    define GDT_SELECTOR_CODE3 0x20
+#    define GDT_SELECTOR_TSS 0x28
+#    define GDT_SELECTOR_TSS_PART2 0x30
 #endif
 
 namespace Kernel {

+ 2 - 1
Kernel/Arch/x86/common/Processor.cpp

@@ -1156,8 +1156,9 @@ UNMAP_AFTER_INIT void Processor::gdt_init()
     write_raw_gdt_entry(GDT_SELECTOR_DATA3, 0x0000ffff, 0x00cff200); // data3
 #else
     write_raw_gdt_entry(GDT_SELECTOR_CODE0, 0x0000ffff, 0x00af9a00); // code0
-    write_raw_gdt_entry(GDT_SELECTOR_CODE3, 0x0000ffff, 0x00affa00); // code3
+    write_raw_gdt_entry(GDT_SELECTOR_DATA0, 0x0000ffff, 0x00af9200); // data0
     write_raw_gdt_entry(GDT_SELECTOR_DATA3, 0x0000ffff, 0x008ff200); // data3
+    write_raw_gdt_entry(GDT_SELECTOR_CODE3, 0x0000ffff, 0x00affa00); // code3
 #endif
 
 #if ARCH(I386)