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
|
.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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue