extern struct scheduler sched_ctx; /* kernel/sched.c */
+extern void
+_exit(int status);
+
void __USER__
default_sighandler_term(int signum)
{
void* default_handlers[_SIG_NUM] = {
// TODO: 添加默认handler
- [_SIGINT] = default_sighandler_term, [_SIGTERM] = default_sighandler_term,
- [_SIGKILL] = default_sighandler_term, [_SIGSEGV] = default_sighandler_term,
[_SIGINT] = default_sighandler_term,
+ [_SIGTERM] = default_sighandler_term,
+ [_SIGKILL] = default_sighandler_term,
+ [_SIGSEGV] = default_sighandler_term,
};
-volatile struct proc_sigstate __temp_save;
// Referenced in kernel/asm/x86/interrupt.S
void*
signal_dispatch()
return 0;
}
+ // TODO: SIG{INT|TERM|KILL|SEGV} should have highest priority.
+ // Terminate the process right here if any of unmaskable signal is
+ // set.
+
if (!__current->sig_handler[sig_selected] &&
!default_handlers[sig_selected]) {
// 如果该信号没有handler,则忽略
return 0;
}
- uintptr_t ustack = __current->ustack_top & ~0xf;
+ ptr_t ustack = __current->ustack_top & ~0xf;
if ((int)(ustack - USTACK_END) < (int)sizeof(struct proc_sig)) {
// 用户栈没有空间存放信号上下文
解决办法就是先吧intr_ctx拷贝到一个静态分配的区域里,然后再注入到用户栈。
*/
+ static volatile struct proc_sigstate __temp_save;
__temp_save.proc_regs = __current->intr_ctx;
memcpy(__temp_save.fxstate, __current->fxstate, 512);
__current->flags &= ~PROC_FINPAUSE;
__SIGCLEAR(__current->sig_inprogress, sig_ctx->sig_num);
schedule();
+
+ // never reach!
+ return 0;
}
__DEFINE_LXSYSCALL3(int,