diff options
Diffstat (limited to 'src/gdt.cc')
-rw-r--r-- | src/gdt.cc | 18 |
1 files changed, 7 insertions, 11 deletions
@@ -14,9 +14,9 @@ constexpr uint32_t kseg_start = 0; constexpr uint32_t kseg_sz = 0xffffffff; __attribute__((section(".constinit"))) static GDT::SegmentDescriptor segments[256]{ - [GDT::null0] = seg::make<null_sz>(0, {}), - [GDT::kcode] = seg::make<kseg_sz>(kseg_start, {.r_w = true, .exe = true, .segment = true, .present = true}), - [GDT::kdata] = seg::make<kseg_sz>(kseg_start, {.r_w = true, .segment = true, .present = true}), + seg::make<null_sz>(0, {}), + seg::make<kseg_sz>(kseg_start, {.r_w = true, .exe = true, .segment = true, .present = true}), + seg::make<kseg_sz>(kseg_start, {.r_w = true, .segment = true, .present = true}), }; GDT::GDT() { @@ -24,23 +24,19 @@ GDT::GDT() { asm volatile("lgdt %0" : : "p"(gdtr)); // flush the segment registers - const auto cs = descriptor(kcode); - const auto ds = descriptor(kdata); + constexpr auto cs = GDT::descriptor(kcode); + constexpr auto ds = GDT::descriptor(kdata); asm volatile( - "jmp %0,$.reload_cs\n\t" // far jump takes cs + "jmpl %0,$.reload_cs\n\t" // far jump: cs,location ".reload_cs:\n\t" " mov %1, %%ds\n\t" // ds " mov %1, %%es\n\t" " mov %1, %%fs\n\t" " mov %1, %%gs\n\t" " mov %1, %%ss\n\t" ::"i"(cs), - "r"(ds)); + "rm"(ds)); printk("GDT installed at ", uhex{gdtr.base}, '\n'); } -uint16_t GDT::descriptor(GDT::SegmentMap i) const { - return static_cast<uint16_t>(reinterpret_cast<const uint32_t>(&segments[i]) - - reinterpret_cast<const uint32_t>(&segments)); -} |