blob: 9fb743372b4911eb3d5856874dd5084217afdea3 (
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
35
36
37
38
39
40
41
42
|
#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, %%ds\n"
"mov %%rax, %%es\n"
"mov %%rax, %%fs\n"
"mov %%rax, %%gs\n"
"ret"
: /* No output from call */
: [input] "m"(segment_selector));
}
auto read_code_segment_register() -> context_switching::interrupt_descriptor_table::segment_selector
{
context_switching::interrupt_descriptor_table::segment_selector current_value;
asm volatile("mov %%cs, %[output]" : [output] "=r"(current_value));
return current_value;
}
auto validate_segment_registers() -> context_switching::interrupt_descriptor_table::segment_selector {}
} // namespace teachos::arch::kernel::cpu
|