course 6 - interrupts
[lunaix-os.git] / lunaix-os / arch / x86 / gdt.c
1 #include <lunaix/arch/gdt.h>
2 #include <stdint.h>
3
4 #define GDT_ENTRY 5
5
6 uint64_t _gdt[GDT_ENTRY];
7 uint16_t _gdt_limit = sizeof(_gdt) - 1;
8
9 void _set_gdt_entry(uint32_t index, uint32_t base, uint32_t limit, uint32_t flags) {
10     _gdt[index] = SEG_BASE_H(base) | flags | SEG_LIM_H(limit) | SEG_BASE_M(base);
11     _gdt[index] <<= 32;
12     _gdt[index] |= SEG_BASE_L(base) | SEG_LIM_L(limit);
13 }
14 // 
15 void
16 _init_gdt() {
17     _set_gdt_entry(0, 0, 0, 0);
18     _set_gdt_entry(1, 0, 0xfffff, SEG_R0_CODE);
19     _set_gdt_entry(2, 0, 0xfffff, SEG_R0_DATA);
20     _set_gdt_entry(3, 0, 0xfffff, SEG_R3_CODE);
21     _set_gdt_entry(4, 0, 0xfffff, SEG_R3_DATA);
22 }