diff options
author | Marvin Borner | 2019-09-19 19:56:59 +0200 |
---|---|---|
committer | Marvin Borner | 2019-09-19 20:05:38 +0200 |
commit | 05e1fedcc9cd30d1a34a65e640da45e980b4f859 (patch) | |
tree | 9cfb7620907ac126f26cdfe9363cb73ed74ea179 /src/kernel/gdt/gdt.c | |
parent | ffd82e18b5259fab477ad375a7af8550fac526d8 (diff) |
Moved source to kernel directory
Diffstat (limited to 'src/kernel/gdt/gdt.c')
-rw-r--r-- | src/kernel/gdt/gdt.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/kernel/gdt/gdt.c b/src/kernel/gdt/gdt.c new file mode 100644 index 0000000..813b432 --- /dev/null +++ b/src/kernel/gdt/gdt.c @@ -0,0 +1,51 @@ +struct gdt_entry { + unsigned short limit_low; + unsigned short base_low; + unsigned char base_middle; + unsigned char access; + unsigned char granularity; + unsigned char base_high; +} __attribute__((packed)); + +struct gdt_ptr { + unsigned short limit; + unsigned int base; +} __attribute__((packed)); + +struct gdt_entry gdt[3]; +struct gdt_ptr gp; + +extern void gdt_flush(); + +void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran) { + // Set descriptor base address + gdt[num].base_low = (base & 0xFFFF); + gdt[num].base_middle = (base >> 16) & 0xFF; + gdt[num].base_high = (base >> 24) & 0xFF; + + // Set descriptor limits + gdt[num].limit_low = (limit & 0xFFFF); + gdt[num].granularity = ((limit >> 16) & 0x0F); + + // Set granularity and access flags + gdt[num].granularity |= (gran & 0xF0); + gdt[num].access = access; +} + +void gdt_install() { + // Set GDT pointer and limit + gp.limit = (sizeof(struct gdt_entry) * 3) - 1; + gp.base = &gdt; + + // NULL descriptor + 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); + + // Remove old GDT and install the new changes! + gdt_flush(); +}
\ No newline at end of file |