aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorFabian Imhof <fabian.imhof@ost.ch>2025-04-27 15:14:04 +0000
committerFabian Imhof <fabian.imhof@ost.ch>2025-04-27 15:14:04 +0000
commitadb66c18b9e6ca0f65934f453afda1c5f9fe145f (patch)
tree791843154c416101fac1b548d2825a85f4e07b00 /arch
parent1838b8c108a842d2b4f4be55efd17be8b91f87c2 (diff)
downloadteachos-adb66c18b9e6ca0f65934f453afda1c5f9fe145f.tar.xz
teachos-adb66c18b9e6ca0f65934f453afda1c5f9fe145f.zip
wip enable syscall
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/src/context_switching/main.cpp28
1 files changed, 12 insertions, 16 deletions
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<uint64_t>(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);
}