aboutsummaryrefslogtreecommitdiff
path: root/src/gdt.cc
blob: 9c86888a28287554e392f0bb8d5c2428e390dbb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "gdt.h"
#include <stdlib.h>

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<uint32_t>(segments)};
  asm volatile("lgdt %0" : : "p"(gdtr));

  printk("GDT installed at ", uhex{gdtr.base}, '\n');
}

uint16_t GDT::codeDescriptor() const {
  return static_cast<uint16_t>(reinterpret_cast<const uint32_t>(&segments[2]) -
                               reinterpret_cast<const uint32_t>(&segments));
}