aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/arch/x86_64/arch_init.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/arch/x86_64/arch_init.cpp')
-rw-r--r--kernel/arch/x86_64/arch_init.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/arch/x86_64/arch_init.cpp b/kernel/arch/x86_64/arch_init.cpp
new file mode 100644
index 0000000..eb0e442
--- /dev/null
+++ b/kernel/arch/x86_64/arch_init.cpp
@@ -0,0 +1,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();
+} \ No newline at end of file