gdt.c (1480B)
1 #include <stdint.h> 2 #include "../include/gdt.h" 3 4 struct gdt_entry_struct gdt_entry[6]; 5 struct gdt_desc_ptr gdt_ptr; 6 7 void set_gdt_entry (int n, uint16_t limit, uint16_t base_low, uint8_t base_mid, uint8_t access, uint8_t flags, uint8_t base_high) { 8 gdt_entry[n].limit = limit; 9 gdt_entry[n].base_low = base_low; 10 gdt_entry[n].base_mid = base_mid; 11 gdt_entry[n].access = access; 12 gdt_entry[n].flags = flags; 13 gdt_entry[n].base_high = base_high; 14 } 15 16 void load_gdt () { 17 set_gdt_entry(0, (uint16_t)0x00, (uint16_t)0x0000, (uint8_t)0x00, (uint8_t)0x00, (uint8_t)0x00, (uint8_t)0x00); 18 set_gdt_entry(1, (uint16_t)0xffff, (uint16_t)0x0000, (uint8_t)0x00, (uint8_t)0b10011011, (uint8_t)0b10101111, (uint8_t)0x00); 19 set_gdt_entry(2, (uint16_t)0xffff, (uint16_t)0x0000, (uint8_t)0x00, (uint8_t)0b10010011, (uint8_t)0b11001111, (uint8_t)0x00); 20 set_gdt_entry(3, (uint16_t)0xffff, (uint16_t)0x0000, (uint8_t)0x00, (uint8_t)0b11111011, (uint8_t)0b10101111, (uint8_t)0x00); 21 set_gdt_entry(4, (uint16_t)0xffff, (uint16_t)0x0000, (uint8_t)0x00, (uint8_t)0b11110011, (uint8_t)0b11001111, (uint8_t)0x00); 22 23 gdt_ptr.limit = sizeof(gdt_entry) - 1; 24 gdt_ptr.base = (uint64_t)gdt_entry; 25 26 asm volatile("lgdt %0" : : "m" (gdt_ptr)); 27 28 asm volatile ("mov $0x10, %%ax \n" "mov %%ax, %%ds \n" "mov %%ax, %%es \n" "mov %%ax, %%ss \n" : : : "ax"); 29 30 asm volatile ("pushq $0x08 \n" "lea 1f(%%rip), %%rax \n" "pushq %%rax \n" "lretq \n" "1:\n" : : : "rax"); 31 }