cowos

custom OS from scratch in C
git clone git://git.daat.foo/cowos.git
Log | Files | Refs | README | LICENSE

gdt.c (1913B)


      1 #include <gdt.h>
      2 
      3 static GDTEntry descriptors[5];
      4 static GDTPtr gdtptr;
      5 
      6 void
      7 gdt_reload()
      8 {
      9 	asm volatile("lgdt %0\n\t"
     10                 "push $0x08\n\t"
     11                 "lea 1f(%%rip), %%rax\n\t"
     12                 "push %%rax\n\t"
     13                	"lretq\n\t"
     14                	"1:\n\t"
     15                	"mov $0x10, %%eax\n\t"
     16                	"mov %%eax, %%ds\n\t"
     17                	"mov %%eax, %%es\n\t"
     18                	"mov %%eax, %%fs\n\t"
     19                	"mov %%eax, %%gs\n\t"
     20                	"mov %%eax, %%ss\n\t"
     21                	:
     22                	: "m"(gdtptr)
     23                	: "rax", "memory");	
     24 }
     25 
     26 void
     27 initGDT()
     28 {
     29 	// null descriptor (0)
     30 	descriptors[0].limit_low = 0;
     31 	descriptors[0].base_low = 0;
     32   	descriptors[0].base_mid = 0;
     33   	descriptors[0].access = 0;
     34   	descriptors[0].limit_high_and_flags = 0;
     35   	descriptors[0].base_high = 0;
     36 	
     37 	// kernel code 64 (40)
     38   	descriptors[1].limit_low = 0;
     39   	descriptors[1].base_low = 0;
     40   	descriptors[1].base_mid = 0;
     41   	descriptors[1].access = 0b10011010;
     42   	descriptors[1].limit_high_and_flags = 0b00101000;
     43   	descriptors[1].base_high = 0;
     44 
     45   	// kernel data 64 (48)
     46   	descriptors[2].limit_low = 0;
     47   	descriptors[2].base_low = 0;
     48   	descriptors[2].base_mid = 0;
     49   	descriptors[2].access = 0b10010010;
     50   	descriptors[2].limit_high_and_flags = 0;
     51   	descriptors[2].base_high = 0;
     52 
     53 	// user code 64 (72)
     54   	descriptors[3].limit_low = 0;
     55   	descriptors[3].base_low = 0;
     56   	descriptors[3].base_mid = 0;
     57   	descriptors[3].access = 0b11111010;
     58   	descriptors[3].limit_high_and_flags = 0b00101000;
     59   	descriptors[3].base_high = 0;
     60 
     61   	// user data 64. (80)
     62   	descriptors[4].limit_low = 0;
     63   	descriptors[4].base_low = 0;
     64   	descriptors[4].base_mid = 0;
     65   	descriptors[4].access = 0b11110010;
     66   	descriptors[4].limit_high_and_flags = 0;
     67   	descriptors[4].base_high = 0;
     68 	
     69 	gdtptr.limit = sizeof(descriptors) - 1;
     70 	gdtptr.base = (uint64_t)&descriptors;
     71 
     72 	gdt_reload();
     73 }