From a35e29c07873db467e0ca670290666f8786dab03 Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Sat, 26 Dec 2009 21:15:05 +0100 Subject: First steps reading multiboot info. Added GDT. --- kernel/gdt.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 kernel/gdt.c (limited to 'kernel/gdt.c') 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) + ); +} -- cgit v1.2.3