1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include "gdt.h"
#include "idt.h"
void arch_init() {
// setup gdt
SegDesc segs[5];
GDTR gdtr{sizeof(struct SegDesc) * 5 - 1, (uint64_t)&segs};
gdt_entry(&segs[0], 0, 0, 0, 0); // null desc
gdt_entry(&segs[1], 0, 0xFFFFF, 0x9A, 0xA); // kcode
gdt_entry(&segs[2], 0, 0xFFFFF, 0x92, 0xA); // kdata
gdt_entry(&segs[3], 0, 0xFFFFF, 0xFA, 0xA); // ucode
gdt_entry(&segs[4], 0, 0xFFFFF, 0xF2, 0xA); // udata
load_gdt(&gdtr);
reload_segments();
setup_idt();
}
|