From adb66c18b9e6ca0f65934f453afda1c5f9fe145f Mon Sep 17 00:00:00 2001 From: Fabian Imhof Date: Sun, 27 Apr 2025 15:14:04 +0000 Subject: wip enable syscall --- arch/x86_64/src/context_switching/main.cpp | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) (limited to 'arch/x86_64/src/context_switching') diff --git a/arch/x86_64/src/context_switching/main.cpp b/arch/x86_64/src/context_switching/main.cpp index 33af765..21299da 100644 --- a/arch/x86_64/src/context_switching/main.cpp +++ b/arch/x86_64/src/context_switching/main.cpp @@ -33,22 +33,16 @@ namespace teachos::arch::context_switching auto user_mode_main() -> void { - kernel::cpu::validate_segment_registers(USER_DATA_SEGMENT_SELECTOR, USER_CODE_SEGMENT_SELECTOR); - video::vga::text::write("Successfully entered user mode!", video::vga::text::common_attributes::green_on_black); asm volatile("syscall"); - kernel::cpu::validate_segment_registers(USER_DATA_SEGMENT_SELECTOR, USER_CODE_SEGMENT_SELECTOR); - - video::vga::text::write("Successfully made a SYSCALL and returned back with SYSRET!", + video::vga::text::write("Successfully made a SYSCALL and returned back with SYSRETQ!", video::vga::text::common_attributes::green_on_black); } auto syscall_handler() -> void { - kernel::cpu::validate_segment_registers(KERNEL_CODE_SEGMENT_SELECTOR, KERNEL_DATA_SEGMENT_SELECTOR); - uint64_t dummy{}; switch (dummy) { @@ -65,17 +59,19 @@ namespace teachos::arch::context_switching { uint64_t const syscall_function = reinterpret_cast(syscall_handler); kernel::cpu::write_msr(IA32_LSTAR_ADDRESS, syscall_function); - kernel::cpu::write_msr(IA32_FMASK_ADDRESS, 0U); - - uint64_t kernel_cs = KERNEL_CODE_SEGMENT_SELECTOR; // Your 64-bit kernel code segment selector - uint64_t user_cs = USER_CODE_SEGMENT_SELECTOR + 0x3; // User mode code segment selector (RPL=3) - - uint64_t star_value = (user_cs << 48) | (kernel_cs << 32); - + kernel::cpu::write_msr(IA32_FMASK_ADDRESS, 1 << 9U); // Disable interrupt flag during syscall + + // @MTO: This produces following values: + // After SYSCALL: CS = 0x10, SS = 0x18 + // After SYSRETQ: CS = 0x43, SS = 0x3b + // + // We probably need to modify our GDT, because the cs+8 = ss is an issue we cannot solve. + // Also, CS = 0x43 is weird. I expected it to be 0x33. + uint64_t kernel_cs = KERNEL_CODE_SEGMENT_SELECTOR; + uint64_t user_cs = USER_CODE_SEGMENT_SELECTOR; + uint64_t star_value = (kernel_cs << 32) | (user_cs << 48); kernel::cpu::write_msr(IA32_STAR_ADDRESS, star_value); - kernel::cpu::write_msr(IA32_STAR_ADDRESS, KERNEL_CODE_SEGMENT_SELECTOR); - // kernel::cpu::write_msr(IA32_STAR_ADDRESS, KERNEL_CODE_SEGMENT_SELECTOR); kernel::cpu::set_efer_bit(kernel::cpu::efer_flags::SCE); } -- cgit v1.2.3