From f73bb242f3f8757230a0e85385d468533e453607 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 27 Jun 2025 21:51:13 +0300 Subject: [PATCH] Kernel: Save fpu state and flags in signal handler This was causing some weird crashes :D --- kernel/arch/i686/Signal.S | 11 +++++++---- kernel/arch/x86_64/Signal.S | 7 +++++++ kernel/kernel/Thread.cpp | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/kernel/arch/i686/Signal.S b/kernel/arch/i686/Signal.S index 4bf29015..9c3f0542 100644 --- a/kernel/arch/i686/Signal.S +++ b/kernel/arch/i686/Signal.S @@ -7,9 +7,6 @@ .global signal_trampoline signal_trampoline: - pushl %ebp - movl %esp, %ebp - pusha movl 40(%esp), %edi @@ -19,16 +16,22 @@ signal_trampoline: movl %esp, %ebp andl $-16, %esp + subl $512, %esp + fxsave (%esp) + subl $12, %esp pushl %edi call *%eax addl $16, %esp + fxrstor (%esp) + addl $512, %esp + // restore stack movl %ebp, %esp popa - leave addl $8, %esp + popf ret diff --git a/kernel/arch/x86_64/Signal.S b/kernel/arch/x86_64/Signal.S index c3259a68..bb6397dd 100644 --- a/kernel/arch/x86_64/Signal.S +++ b/kernel/arch/x86_64/Signal.S @@ -30,8 +30,14 @@ signal_trampoline: movq %rsp, %rbp andq $-16, %rsp + subq $512, %rsp + fxsave64 (%rsp) + call *%rax + fxrstor64 (%rsp) + addq $512, %rsp + // restore stack movq %rbp, %rsp popq %r15 @@ -51,6 +57,7 @@ signal_trampoline: popq %rax addq $16, %rsp + popfq // return over red-zone ret $128 diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index fb0f838f..f1a54ed6 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -523,6 +523,7 @@ namespace Kernel interrupt_stack.sp -= 128; // skip possible red-zone #endif write_to_stack(interrupt_stack.sp, interrupt_stack.ip); + write_to_stack(interrupt_stack.sp, interrupt_stack.flags); write_to_stack(interrupt_stack.sp, signal); write_to_stack(interrupt_stack.sp, signal_handler); interrupt_stack.ip = (uintptr_t)signal_trampoline;