summaryrefslogtreecommitdiff
path: root/kernel/gdt.c
diff options
context:
space:
mode:
authorVegard Storheil Eriksen <zyp@jvnv.net>2009-12-26 21:15:05 +0100
committerVegard Storheil Eriksen <zyp@jvnv.net>2009-12-26 21:15:05 +0100
commita35e29c07873db467e0ca670290666f8786dab03 (patch)
tree93ca3d311b76a8259f6883d3f32d1eabfefea60b /kernel/gdt.c
parentf57cbe8ecdb4f6ecb22618de361d4fcaee3fdcf3 (diff)
First steps reading multiboot info. Added GDT.
Diffstat (limited to 'kernel/gdt.c')
-rw-r--r--kernel/gdt.c28
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)
+ );
+}