sos

[unmaintained] experimenting with low level OS development
Log | Files | Refs | README | LICENSE

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 }