diff options
Diffstat (limited to 'src/gdt.cc')
-rw-r--r-- | src/gdt.cc | 21 |
1 files changed, 4 insertions, 17 deletions
@@ -1,24 +1,11 @@ #include "gdt.h" -GDT::SegmentDescriptor::SegmentDescriptor(uint32_t base, uint32_t limit, uint8_t type) { - base_low = base & 0xffff; - base_high = (base >> 16) & 0xff; - base_vhigh = (base >> 24) & 0xff; -} -uint32_t GDT::SegmentDescriptor::base() const { - uint32_t base = base_vhigh; - base = (base << 8) + base_high; - base = (base << 8) + base_low; - return base; -} -uint32_t GDT::SegmentDescriptor::limit() const { - return 0; -} +using seg = GDT::SegmentDescriptor; GDT::GDT() - : segments{{0, 0, 0}, // null segment - {0, 64 * 1024 * 1024 /* 64MB */, 0x9a}, // code segment - {0, 64 * 1024 * 1024 /* 64MB */, 0x92}} // data segment + : segments{seg::make<0>(0, {.present = false}), // null 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)); |