diff options
Diffstat (limited to 'kernel/gdt.c')
-rw-r--r-- | kernel/gdt.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/kernel/gdt.c b/kernel/gdt.c new file mode 100644 index 0000000..7d23289 --- /dev/null +++ b/kernel/gdt.c @@ -0,0 +1,28 @@ +#include "gdt.h" + +gdt_entry gdt[] = { + gdt_entry_init(0, 0, 0), + gdt_entry_init(0, 0xfffff, 0xc09a), // Code segment. + gdt_entry_init(0, 0xfffff, 0xc092), // Data segment. + gdt_entry_init(0, 0xfffff, 0xc0fa), // User mode code segment. + gdt_entry_init(0, 0xfffff, 0xc0f2), // User mode data segment. +}; + +gdt_ptr gdtr = { + .base = gdt, + .limit = sizeof(gdt) - 1 +}; + +void gdt_init() { + asm volatile( + "lgdt (%0)\n" + "mov %w1, %%ds\n" + "mov %w1, %%es\n" + "mov %w1, %%fs\n" + "mov %w1, %%gs\n" + "mov %w1, %%ss\n" + "ljmp $0x08, $.flush\n" + ".flush:\n" + : : "r" (&gdtr), "r" (0x10) + ); +} |