diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-02-28 14:53:13 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-02-28 14:53:13 +0200 |
commit | 09cf6b4ca8799990b9c01db04c5f4ffbef798773 (patch) | |
tree | d660da543cccbfad03d637b34815017d0e477e47 /src/gdt.cc | |
parent | Enable interrupts (diff) | |
download | kernel.cpp-09cf6b4ca8799990b9c01db04c5f4ffbef798773.tar.xz |
Fix interrupts causing exception 0xd
Diffstat (limited to 'src/gdt.cc')
-rw-r--r-- | src/gdt.cc | 9 |
1 files changed, 9 insertions, 0 deletions
@@ -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)); } |