diff options
| author | Aleksa Vučković <aleksav013@gmail.com> | 2021-10-25 00:36:33 +0200 |
|---|---|---|
| committer | Aleksa Vučković <aleksav013@gmail.com> | 2021-10-25 00:36:33 +0200 |
| commit | 20dd72e40dc2728d3c5335d860e4b8ab8da14fcc (patch) | |
| tree | dabdfdf736c45f9632fa1388d2144b1de7a438b0 /src/c/gdt.c | |
| parent | 0bca634f7e70b05239f46f3bd40bb37468d67957 (diff) | |
Changing build system to recursive make
Diffstat (limited to 'src/c/gdt.c')
| -rw-r--r-- | src/c/gdt.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/c/gdt.c b/src/c/gdt.c new file mode 100644 index 0000000..8fcda3a --- /dev/null +++ b/src/c/gdt.c @@ -0,0 +1,48 @@ +#include"../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)); + +// asm function +extern void load_gdt(struct gdt_pointer *gdtp); + +struct gdt_entry gdt[3]; +struct gdt_pointer gdtp; + +void init_gdt_entry(size_t num, uint32_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].access=access; + gdt[num].limit_flags=limit_flags; + gdt[num].base3=(base & 0xff000000) >> 24; +} + +void init_gdt_table() +{ + gdtp.size=sizeof(gdt)-1; + gdtp.offset=(uint32_t)&gdt; + + //null + init_gdt_entry(0,0,0,0,0); + //code + init_gdt_entry(1,0xffffffff,0,0b10011010,0b11001111); + //data + init_gdt_entry(2,0xffffffff,0,0b10010010,0b11001111); + + load_gdt(&gdtp); +} |
