xnoe-os/src/kernel/gdt.cpp
2021-10-21 23:19:36 +01:00

72 lines
1.4 KiB
C++

#include "gdt.h"
gdt_entry gdt[] = {
(gdt_entry){ // Null Segment
.limit_lo = 0,
.base_lo = 0,
.base_mid = 0,
.accessed = 0,
.read_write = 0,
.direction = 0,
.executable = 0,
.system_segment = 0,
.privilege = 0,
.present = 0,
.limit_hi = 0,
.__ignored__ = 0,
.size = 0,
.granularity = 0,
.base_hi = 0,
},
(gdt_entry){ // Code Segment
.limit_lo = 0xffff,
.base_lo = 0,
.base_mid = 0,
.accessed = 0,
.read_write = 1,
.direction = 0,
.executable = 1,
.system_segment = 1,
.privilege = 0,
.present = 1,
.limit_hi = 0xf,
.__ignored__ = 0,
.size = 1,
.granularity = 1,
.base_hi = 0
},
(gdt_entry){ // Data Segment
.limit_lo = 0xffff,
.base_lo = 0,
.base_mid = 0,
.accessed = 0,
.read_write = 1,
.direction = 0,
.executable = 0,
.system_segment = 1,
.privilege = 0,
.present = 1,
.limit_hi = 0xf,
.__ignored__ = 0,
.size = 1,
.granularity = 1,
.base_hi = 0
}
};
gdt_descr descr = (gdt_descr){
.size = sizeof(gdt) - 1,
.offset = gdt,
};
__attribute__((far)) void far_call() {}
void init_gdt() {
asm volatile("lgdt %0;"
"mov $0x10, %%eax;"
"mov %%eax, %%ss;"
"mov $0x10, %%eax;"
"mov %%eax, %%ds" : : "m" (descr));
far_call();
}