diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-02-01 11:33:16 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-02-01 11:33:16 -0500 |
| commit | 439d724ce5939cab7a5c858d1829f212e01e0402 (patch) | |
| tree | 154afa843a96e4cebd4d4f4f480f36415668d620 /kernel/gdt.c | |
| parent | 1d7843c2b6d746376f87c2634c92cd93d8cdb728 (diff) | |
| download | kappa-439d724ce5939cab7a5c858d1829f212e01e0402.zip kappa-439d724ce5939cab7a5c858d1829f212e01e0402.tar.gz kappa-439d724ce5939cab7a5c858d1829f212e01e0402.tar.bz2 kappa-439d724ce5939cab7a5c858d1829f212e01e0402.tar.xz | |
first real commit
Diffstat (limited to 'kernel/gdt.c')
| -rw-r--r-- | kernel/gdt.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/kernel/gdt.c b/kernel/gdt.c new file mode 100644 index 0000000..f9b2d86 --- /dev/null +++ b/kernel/gdt.c @@ -0,0 +1,33 @@ +#include "gdt.h" + +static void gdt_set_gate(int idx, uint32_t base, uint32_t limit, uint8_t access, uint8_t gran) +{ + /* Setup the descriptor base address */ + gdt[idx].base_low = (base & 0xFFFF); + gdt[idx].base_middle = (base >> 16) & 0xFF; + gdt[idx].base_high = (base >> 24) & 0xFF; + + /* Setup the descriptor limits */ + gdt[idx].limit_low = (limit & 0xFFFF); + gdt[idx].granularity = ((limit >> 16) & 0x0F); + + /* Finally, set up the granularity and access flags */ + gdt[idx].granularity |= (gran & 0xF0); + gdt[idx].access = access; +} + +void gdt_init(void) +{ + gp.limit = (sizeof(struct gdt_entry) * sizeof(gdt)/sizeof(gdt[0])) - 1; + gp.base = (uint32_t)&gdt; + + gdt_set_gate(0, 0, 0, 0, 0); + + /* code segment */ + gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); + + /* data segment */ + gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); + + gdt_flush((uint32_t)&gp); +} |