From 12489a4c6b3021d84893d8adef2f9b51e2310c94 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 9 Jan 2026 17:05:34 +0200 Subject: [PATCH] Kernel: Fix 32 bit target compile and runtime Apparently I have to reload stack in the fork trampoline. Not sure why or why not on x86_64. Also sse builtins did not compile --- kernel/arch/i686/Syscall.S | 8 +++++++- kernel/arch/i686/interrupts.S | 1 - kernel/kernel/Processor.cpp | 2 +- kernel/kernel/Thread.cpp | 6 ++++-- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/kernel/arch/i686/Syscall.S b/kernel/arch/i686/Syscall.S index a7e0ccd6..fbe605de 100644 --- a/kernel/arch/i686/Syscall.S +++ b/kernel/arch/i686/Syscall.S @@ -63,7 +63,7 @@ sys_fork_trampoline: call read_ip testl %eax, %eax - jz .done + jz .reload_stack movl %esp, %ebx @@ -79,3 +79,9 @@ sys_fork_trampoline: popl %ebx popl %ebp ret + + .reload_stack: + call get_thread_start_sp + movl %eax, %esp + xorl %eax, %eax + jmp .done diff --git a/kernel/arch/i686/interrupts.S b/kernel/arch/i686/interrupts.S index 28e5d4d1..7bae605f 100644 --- a/kernel/arch/i686/interrupts.S +++ b/kernel/arch/i686/interrupts.S @@ -6,7 +6,6 @@ movw %ax, %ds movw %ax, %es movw %ax, %fs - movw $0x28, %ax movw %ax, %gs 1: diff --git a/kernel/kernel/Processor.cpp b/kernel/kernel/Processor.cpp index cecea28d..5513e9bb 100644 --- a/kernel/kernel/Processor.cpp +++ b/kernel/kernel/Processor.cpp @@ -102,7 +102,7 @@ namespace Kernel asm volatile("wrmsr" :: "d"(val_hi), "a"(val_lo), "c"(MSR_IA32_GS_BASE)); } #elif ARCH(i686) - asm volatile("movw %0, %%gs" :: "r"(0x28)); + asm volatile("movw %0, %%gs" :: "r"(static_cast(0x28))); #endif #if ARCH(x86_64) diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index 475629a6..73d4c770 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -910,7 +910,8 @@ namespace Kernel #if ARCH(x86_64) __builtin_ia32_fxsave64(m_sse_storage); #elif ARCH(i686) - __builtin_ia32_fxsave(m_sse_storage); + // no idea why the builtin don't work + asm volatile("fxsave %0" :: "m"(m_sse_storage)); #else #error #endif @@ -921,7 +922,8 @@ namespace Kernel #if ARCH(x86_64) __builtin_ia32_fxrstor64(m_sse_storage); #elif ARCH(i686) - __builtin_ia32_fxrstor(m_sse_storage); + // no idea why the builtin don't work + asm volatile("fxrstor %0" :: "m"(m_sse_storage)); #else #error #endif