aboutsummaryrefslogtreecommitdiff
path: root/src/gdt.cc
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2021-02-28 14:53:13 +0200
committerAqua-sama <aqua@iserlohn-fortress.net>2021-02-28 14:53:13 +0200
commit09cf6b4ca8799990b9c01db04c5f4ffbef798773 (patch)
treed660da543cccbfad03d637b34815017d0e477e47 /src/gdt.cc
parentEnable interrupts (diff)
downloadkernel.cpp-09cf6b4ca8799990b9c01db04c5f4ffbef798773.tar.xz
Fix interrupts causing exception 0xd
Diffstat (limited to 'src/gdt.cc')
-rw-r--r--src/gdt.cc9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/gdt.cc b/src/gdt.cc
index 289462b..9c86888 100644
--- a/src/gdt.cc
+++ b/src/gdt.cc
@@ -1,12 +1,21 @@
#include "gdt.h"
+#include <stdlib.h>
using seg = GDT::SegmentDescriptor;
GDT::GDT()
: segments{seg::make<0>(0, {.present = false}), // null segment
+ seg::make<0>(0, {.present = false}), // unused segment ???
seg::make<0xffffffff>(0, {.r_w = true, .exe = true, .segment = true}), // code segment
seg::make<0xffffffff>(0, {.r_w = true, .segment = true})} // data segment
{
Pointer gdtr{.limit = sizeof(segments) - 1, .base = reinterpret_cast<uint32_t>(segments)};
asm volatile("lgdt %0" : : "p"(gdtr));
+
+ printk("GDT installed at ", uhex{gdtr.base}, '\n');
+}
+
+uint16_t GDT::codeDescriptor() const {
+ return static_cast<uint16_t>(reinterpret_cast<const uint32_t>(&segments[2]) -
+ reinterpret_cast<const uint32_t>(&segments));
}