diff options
| author | Matteo Gmür <matteo.gmuer1@ost.ch> | 2025-05-05 06:41:31 +0000 |
|---|---|---|
| committer | Matteo Gmür <matteo.gmuer1@ost.ch> | 2025-05-05 06:41:31 +0000 |
| commit | c1dff44858ebdb3cd5a49e84179796e44e7eb91c (patch) | |
| tree | 998f8cec607da4359d5b3e9db89e949250ccd197 /arch/x86_64/src/context_switching/syscall | |
| parent | f83727a0c8913d19415c2ad482c70ee7373f6f3f (diff) | |
| download | teachos-c1dff44858ebdb3cd5a49e84179796e44e7eb91c.tar.xz teachos-c1dff44858ebdb3cd5a49e84179796e44e7eb91c.zip | |
Fix recursive include using extra file
Diffstat (limited to 'arch/x86_64/src/context_switching/syscall')
3 files changed, 43 insertions, 37 deletions
diff --git a/arch/x86_64/src/context_switching/syscall/main.cpp b/arch/x86_64/src/context_switching/syscall/main.cpp index 9ac63ce..a226e23 100644 --- a/arch/x86_64/src/context_switching/syscall/main.cpp +++ b/arch/x86_64/src/context_switching/syscall/main.cpp @@ -1,39 +1,8 @@ #include "arch/context_switching/syscall/main.hpp" -#include "arch/context_switching/interrupt_descriptor_table/segment_selector.hpp" -#include "arch/exception_handling/assert.hpp" -#include "arch/exception_handling/panic.hpp" -#include "arch/kernel/cpu/msr.hpp" - -#include <cstdint> - namespace teachos::arch::context_switching::syscall { - namespace - { - constexpr interrupt_descriptor_table::segment_selector KERNEL_CODE_SEGMENT_SELECTOR{ - 1U, interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_KERNEL}; - - auto constexpr IA32_STAR_ADDRESS = 0xC0000081; - auto constexpr IA32_LSTAR_ADDRESS = 0xC0000082; - auto constexpr IA32_FMASK_ADDRESS = 0xC0000084; - - } // namespace - - auto enable_syscall() -> void - { - uint64_t const syscall_function = reinterpret_cast<uint64_t>(syscall_handler); - kernel::cpu::write_msr(IA32_LSTAR_ADDRESS, syscall_function); - kernel::cpu::write_msr(IA32_FMASK_ADDRESS, 0U); - - uint64_t const kernel_cs = KERNEL_CODE_SEGMENT_SELECTOR; - uint64_t const star_value = (kernel_cs << 32) | (kernel_cs << 48); - kernel::cpu::write_msr(IA32_STAR_ADDRESS, star_value); - - kernel::cpu::set_efer_bit(kernel::cpu::efer_flags::SCE); - } - - auto syscall(type syscall_number, arguments args) -> uint64_t + auto syscall(type syscall_number, arguments args) -> error { asm volatile("mov %[input], %%rax" : /* no output from call */ @@ -49,7 +18,7 @@ namespace teachos::arch::context_switching::syscall asm volatile("syscall"); - uint64_t error{}; + error error{}; asm volatile("mov %%rax, %[output]" : [output] "=m"(error)); return error; } diff --git a/arch/x86_64/src/context_switching/syscall/syscall_enable.cpp b/arch/x86_64/src/context_switching/syscall/syscall_enable.cpp new file mode 100644 index 0000000..e6265d3 --- /dev/null +++ b/arch/x86_64/src/context_switching/syscall/syscall_enable.cpp @@ -0,0 +1,32 @@ +#include "arch/context_switching/syscall/syscall_enable.hpp" + +#include "arch/context_switching/interrupt_descriptor_table/segment_selector.hpp" +#include "arch/context_switching/syscall/syscall_handler.hpp" +#include "arch/kernel/cpu/msr.hpp" + +namespace teachos::arch::context_switching::syscall +{ + namespace + { + constexpr interrupt_descriptor_table::segment_selector KERNEL_CODE_SEGMENT_SELECTOR{ + 1U, interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_KERNEL}; + + auto constexpr IA32_STAR_ADDRESS = 0xC0000081; + auto constexpr IA32_LSTAR_ADDRESS = 0xC0000082; + auto constexpr IA32_FMASK_ADDRESS = 0xC0000084; + + } // namespace + + auto enable_syscall() -> void + { + uint64_t const syscall_function = reinterpret_cast<uint64_t>(syscall_handler); + kernel::cpu::write_msr(IA32_LSTAR_ADDRESS, syscall_function); + kernel::cpu::write_msr(IA32_FMASK_ADDRESS, 0U); + + uint64_t const kernel_cs = KERNEL_CODE_SEGMENT_SELECTOR; + uint64_t const star_value = (kernel_cs << 32) | (kernel_cs << 48); + kernel::cpu::write_msr(IA32_STAR_ADDRESS, star_value); + + kernel::cpu::set_efer_bit(kernel::cpu::efer_flags::SCE); + } +} // namespace teachos::arch::context_switching::syscall
\ No newline at end of file diff --git a/arch/x86_64/src/context_switching/syscall/syscall_handler.cpp b/arch/x86_64/src/context_switching/syscall/syscall_handler.cpp index 759a092..fbfecc0 100644 --- a/arch/x86_64/src/context_switching/syscall/syscall_handler.cpp +++ b/arch/x86_64/src/context_switching/syscall/syscall_handler.cpp @@ -1,5 +1,6 @@ #include "arch/context_switching/syscall/syscall_handler.hpp" +#include "arch/context_switching/syscall/main.hpp" #include "arch/exception_handling/panic.hpp" #include "arch/video/vga/text.hpp" @@ -8,11 +9,12 @@ namespace teachos::arch::context_switching::syscall namespace { - auto write_to_vga_buffer(uint64_t buffer) + auto write_to_vga_buffer(uint64_t buffer) -> error { video::vga::text::write(reinterpret_cast<const char *>(buffer), video::vga::text::common_attributes::green_on_black); video::vga::text::newline(); + return error::OK; } } // namespace @@ -38,17 +40,17 @@ namespace teachos::arch::context_switching::syscall // and now. asm volatile("mov %%rax, %[output]" : [output] "=m"(syscall_number)); + error result = error::OK; switch (static_cast<type>(syscall_number)) { - case WRITE: - write_to_vga_buffer(arg_0); + case type::WRITE: + result = write_to_vga_buffer(arg_0); break; default: teachos::arch::exception_handling::panic("[Syscall Handler] Invalid syscall number"); break; } - uint64_t result = 0U; asm volatile("mov %[input], %%rax" : /* no output from call */ : [input] "m"(result) @@ -63,6 +65,9 @@ namespace teachos::arch::context_switching::syscall : [input] "m"(rflags) : "memory"); + // Additionally call leave, because x86 allocates tack space for the internal variables. If we do not clean up this + // newly created stack frame the syscall instruction that landed in this syscall_handler, will never return to the + // method that originally called it, becuase the RIP has not been restored from the previous stack frame. asm volatile("leave\n" "sysretq"); } |
