Kernel: Save fpu state and flags in signal handler

This was causing some weird crashes :D
This commit is contained in:
Bananymous 2025-06-27 21:51:13 +03:00
parent 9e895e5286
commit f73bb242f3
3 changed files with 15 additions and 4 deletions

View File

@ -7,9 +7,6 @@
.global signal_trampoline .global signal_trampoline
signal_trampoline: signal_trampoline:
pushl %ebp
movl %esp, %ebp
pusha pusha
movl 40(%esp), %edi movl 40(%esp), %edi
@ -19,16 +16,22 @@ signal_trampoline:
movl %esp, %ebp movl %esp, %ebp
andl $-16, %esp andl $-16, %esp
subl $512, %esp
fxsave (%esp)
subl $12, %esp subl $12, %esp
pushl %edi pushl %edi
call *%eax call *%eax
addl $16, %esp addl $16, %esp
fxrstor (%esp)
addl $512, %esp
// restore stack // restore stack
movl %ebp, %esp movl %ebp, %esp
popa popa
leave
addl $8, %esp addl $8, %esp
popf
ret ret

View File

@ -30,8 +30,14 @@ signal_trampoline:
movq %rsp, %rbp movq %rsp, %rbp
andq $-16, %rsp andq $-16, %rsp
subq $512, %rsp
fxsave64 (%rsp)
call *%rax call *%rax
fxrstor64 (%rsp)
addq $512, %rsp
// restore stack // restore stack
movq %rbp, %rsp movq %rbp, %rsp
popq %r15 popq %r15
@ -51,6 +57,7 @@ signal_trampoline:
popq %rax popq %rax
addq $16, %rsp addq $16, %rsp
popfq
// return over red-zone // return over red-zone
ret $128 ret $128

View File

@ -523,6 +523,7 @@ namespace Kernel
interrupt_stack.sp -= 128; // skip possible red-zone interrupt_stack.sp -= 128; // skip possible red-zone
#endif #endif
write_to_stack(interrupt_stack.sp, interrupt_stack.ip); 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);
write_to_stack(interrupt_stack.sp, signal_handler); write_to_stack(interrupt_stack.sp, signal_handler);
interrupt_stack.ip = (uintptr_t)signal_trampoline; interrupt_stack.ip = (uintptr_t)signal_trampoline;