diff options
author | Vegard Storheil Eriksen <zyp@jvnv.net> | 2009-12-26 21:15:05 +0100 |
---|---|---|
committer | Vegard Storheil Eriksen <zyp@jvnv.net> | 2009-12-26 21:15:05 +0100 |
commit | a35e29c07873db467e0ca670290666f8786dab03 (patch) | |
tree | 93ca3d311b76a8259f6883d3f32d1eabfefea60b /kernel/gdt.c | |
parent | f57cbe8ecdb4f6ecb22618de361d4fcaee3fdcf3 (diff) |
First steps reading multiboot info. Added GDT.
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) + ); +} |