Kernel: Save fpu state and flags in signal handler
This was causing some weird crashes :D
This commit is contained in:
parent
9e895e5286
commit
f73bb242f3
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue