X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/ea77b9c3fc7fb9bf9d7f9604fc187c8049212a2a..642855f81fd03b9fd6540ac99c665b57b4b38cc8:/lunaix-os/kernel/process/signal.c diff --git a/lunaix-os/kernel/process/signal.c b/lunaix-os/kernel/process/signal.c index 5d09d9b..9a9a349 100644 --- a/lunaix-os/kernel/process/signal.c +++ b/lunaix-os/kernel/process/signal.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -22,7 +23,7 @@ void* default_handlers[_SIG_NUM] = { [_SIGINT] = default_sighandler_term, }; -volatile isr_param __temp_save; +volatile struct proc_sigstate __temp_save; // Referenced in kernel/asm/x86/interrupt.S void* signal_dispatch() @@ -79,7 +80,9 @@ signal_dispatch() 解决办法就是先吧intr_ctx拷贝到一个静态分配的区域里,然后再注入到用户栈。 */ - __temp_save = __current->intr_ctx; + __temp_save.proc_regs = __current->intr_ctx; + memcpy(__temp_save.fxstate, __current->fxstate, 512); + sig_ctx->prev_context = __temp_save; sig_ctx->sig_num = sig_selected; @@ -138,7 +141,8 @@ send_single: __DEFINE_LXSYSCALL1(int, sigreturn, struct proc_sig, *sig_ctx) { - __current->intr_ctx = sig_ctx->prev_context; + memcpy(__current->fxstate, sig_ctx->prev_context.fxstate, 512); + __current->intr_ctx = sig_ctx->prev_context.proc_regs; __current->flags &= ~PROC_FINPAUSE; __SIGCLEAR(__current->sig_inprogress, sig_ctx->sig_num); schedule();