Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }