gdt.c (788B)
1 #include <stdint.h> 2 #include "gdt.h" 3 4 extern void gdt_install(); 5 6 static void gdt_set_entry(unsigned int pos, uint32_t base, uint32_t limit, 7 uint8_t access_rights, uint8_t flags) 8 { 9 gdt[pos].base_lower = base & 0xffff; 10 gdt[pos].base_middle = (base >> 16) & 0xff; 11 gdt[pos].base_higher = (base >> 24) & 0xffff; 12 13 gdt[pos].limit_lower = limit & 0xffff; 14 gdt[pos].flags_limit_higher = ((flags << 4) & 0xf0) | ((limit >> 16) & 0x0f); 15 16 gdt[pos].access_rights = access_rights; 17 } 18 19 void gdt_setup() 20 { 21 gdt_desc.limit = GDT_ENTRIES * sizeof(struct gdt_entry) - 1; 22 gdt_desc.base = (uint32_t) (uintptr_t) gdt; 23 24 gdt_set_entry(0, 0, 0, 0, 0); 25 gdt_set_entry(1, 0, 0xfffff, 0x9a, 0xcf); 26 gdt_set_entry(2, 0, 0xfffff, 0x92, 0xcf); 27 28 gdt_install(); 29 }