diff options
| author | Fabian Imhof <fabian.imhof@ost.ch> | 2025-04-05 15:27:20 +0000 |
|---|---|---|
| committer | Fabian Imhof <fabian.imhof@ost.ch> | 2025-04-05 15:27:20 +0000 |
| commit | a8852f91967a7e55e62e30f5cc07d076092b8b78 (patch) | |
| tree | 12708befd57fc0b89dbadc2e856c935b71c88807 /arch/x86_64/src/kernel/cpu/segment_register.cpp | |
| parent | c01d080bdc6bd843e840e4834424fe587286b274 (diff) | |
| download | kernel-a8852f91967a7e55e62e30f5cc07d076092b8b78.tar.xz kernel-a8852f91967a7e55e62e30f5cc07d076092b8b78.zip | |
add wip context switch to user mode
Diffstat (limited to 'arch/x86_64/src/kernel/cpu/segment_register.cpp')
| -rw-r--r-- | arch/x86_64/src/kernel/cpu/segment_register.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/arch/x86_64/src/kernel/cpu/segment_register.cpp b/arch/x86_64/src/kernel/cpu/segment_register.cpp new file mode 100644 index 0000000..f70c558 --- /dev/null +++ b/arch/x86_64/src/kernel/cpu/segment_register.cpp @@ -0,0 +1,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 |
