aboutsummaryrefslogtreecommitdiff
path: root/src/gdt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gdt.cc')
-rw-r--r--src/gdt.cc18
1 files changed, 7 insertions, 11 deletions
diff --git a/src/gdt.cc b/src/gdt.cc
index 7b5e3df..726a7d7 100644
--- a/src/gdt.cc
+++ b/src/gdt.cc
@@ -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));
-}