summaryrefslogtreecommitdiff
path: root/kernel/gdt.c
diff options
context:
space:
mode:
authorVegard Storheil Eriksen <zyp@jvnv.net>2010-01-20 22:19:56 +0100
committerVegard Storheil Eriksen <zyp@jvnv.net>2010-01-20 22:19:56 +0100
commit043b8b9d4624d4208a330cbce9775c43f1bf1fc6 (patch)
tree372cedf25985b37d6f29a2ca9baaf117cf853075 /kernel/gdt.c
parent068368d0bedc34f561ab0c9dd614c02b346d1d4e (diff)
Added TSS.
Diffstat (limited to 'kernel/gdt.c')
-rw-r--r--kernel/gdt.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/kernel/gdt.c b/kernel/gdt.c
index 7d23289..92d3d4c 100644
--- a/kernel/gdt.c
+++ b/kernel/gdt.c
@@ -1,11 +1,14 @@
#include "gdt.h"
+tss_entry tss = tss_entry_init(0xfffff800, 0x10, 0x0b, 0x13);
+
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_entry_init(0, sizeof(tss_entry), 0x00e9), // TSS.
};
gdt_ptr gdtr = {
@@ -14,6 +17,10 @@ gdt_ptr gdtr = {
};
void gdt_init() {
+ gdt[5].base_low = (uint32_t)&tss & 0xffff;
+ gdt[5].base_mid = (uint32_t)&tss >> 16 & 0xff;
+ gdt[5].base_high = (uint32_t)&tss >> 24 & 0xff;
+
asm volatile(
"lgdt (%0)\n"
"mov %w1, %%ds\n"
@@ -23,6 +30,7 @@ void gdt_init() {
"mov %w1, %%ss\n"
"ljmp $0x08, $.flush\n"
".flush:\n"
- : : "r" (&gdtr), "r" (0x10)
+ "ltr %w2\n"
+ : : "r" (&gdtr), "r" (0x10), "r" (0x28)
);
}