#include "gdt.h" #include 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(segments)}; asm volatile("lgdt %0" : : "p"(gdtr)); printk("GDT installed at ", uhex{gdtr.base}, '\n'); } uint16_t GDT::codeDescriptor() const { return static_cast(reinterpret_cast(&segments[2]) - reinterpret_cast(&segments)); }