aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/kernel/cpu/segment_register.cpp
blob: f70c558343ec4aae4b8a986e7b3d89153fc3392e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "arch/kernel/cpu/segment_register.hpp"

#include "arch/context_switching/interrupt_descriptor_table/segment_selector.hpp"

namespace teachos::arch::kernel::cpu
{
  [[gnu::naked]]
  auto reload_segment_registers() -> void
  {
    asm volatile("xor %rax, %rax\n"
                 "mov %rax, %ss\n"
                 "mov %rax, %ds\n"
                 "mov %rax, %es\n"
                 "mov %rax, %fs\n"
                 "mov %rax, %gs\n"
                 "ret");
  }

  [[gnu::naked]]
  auto set_segment_registers(context_switching::interrupt_descriptor_table::segment_selector segment_selector) -> void
  {
    asm volatile("xor %%rax, %%rax\n"
                 "mov %[input], %%ax\n"
                 "mov %%rax, %%ss\n"
                 "mov %%rax, %%ds\n"
                 "mov %%rax, %%es\n"
                 "mov %%rax, %%fs\n"
                 "mov %%rax, %%gs\n"
                 "ret"
                 : /* No output from call */
                 : [input] "m"(segment_selector));
  }

}  // namespace teachos::arch::kernel::cpu