#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