aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/arch/x86_64/arch_init.cpp
blob: eb0e442cdc8b528c0a1d17da818a524b4c53d28f (plain) (blame)
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();
}