aboutsummaryrefslogtreecommitdiff
path: root/src/gdt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gdt.cc')
-rw-r--r--src/gdt.cc21
1 files changed, 4 insertions, 17 deletions
diff --git a/src/gdt.cc b/src/gdt.cc
index 202fe77..289462b 100644
--- a/src/gdt.cc
+++ b/src/gdt.cc
@@ -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));