summaryrefslogtreecommitdiff
path: root/src/c/gdt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/c/gdt.c')
-rw-r--r--src/c/gdt.c35
1 files changed, 10 insertions, 25 deletions
diff --git a/src/c/gdt.c b/src/c/gdt.c
index e3d2b4c..8791cbe 100644
--- a/src/c/gdt.c
+++ b/src/c/gdt.c
@@ -1,46 +1,31 @@
+#include<source/gdt.h>
#include<types.h>
-struct gdt_entry
-{
- uint16_t limit;
- uint16_t base1;
- uint8_t base2;
- uint8_t access;
- uint8_t limit_flags;
- uint8_t base3;
-} __attribute__((packed));
-
-struct gdt_pointer
-{
- uint16_t size;
- uint32_t offset;
-} __attribute__((packed));
-
extern void load_gdt(struct gdt_pointer *gdtp);
struct gdt_entry gdt[5];
struct gdt_pointer gdtp;
-void init_gdt_entry(size_t num, uint32_t limit, uint32_t base, uint8_t access, uint8_t limit_flags)
+void init_gdt_entry(size_t num, uint16_t limit, uint32_t base, uint8_t access, uint8_t limit_flags)
{
gdt[num].limit=limit;
gdt[num].base1=(base & 0xffff);
- gdt[num].base2=(base & 0xff0000) >> 16;
+ gdt[num].base2=(uint8_t)((base & 0xff0000) >> 16);
gdt[num].access=access;
gdt[num].limit_flags=limit_flags;
- gdt[num].base3=(base & 0xff000000) >> 24;
+ gdt[num].base3=(uint8_t)((base & 0xff000000) >> 24);
}
-void init_gdt_table()
+void init_gdt_table(void)
{
gdtp.size=sizeof(gdt)-1;
gdtp.offset=(uint32_t)&gdt;
- init_gdt_entry(0,0,0,0,0); // null segment
- init_gdt_entry(1,0xffffffff,0,0b10011010,0b11001111); // code segment
- init_gdt_entry(2,0xffffffff,0,0b10010010,0b11001111); // data segment
- init_gdt_entry(3,0xffffffff,0,0b11111010,0b11001111); // user mode code segment
- init_gdt_entry(4,0xffffffff,0,0b11110010,0b11001111); // user mode data segment
+ init_gdt_entry(0,0,0,0,0); // null segment
+ init_gdt_entry(1,0xffff,0,0x9a,0xcf); // code segment
+ init_gdt_entry(2,0xffff,0,0x92,0xcf); // data segment
+ init_gdt_entry(3,0xffff,0,0xfa,0xcf); // user mode code segment
+ init_gdt_entry(4,0xffff,0,0xf2,0xcf); // user mode data segment
load_gdt(&gdtp);
}