X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/04ee277abd77fc51c5ab02ee58790a859607ea24..7b8a1bcad75628f9add4590db2bb9b8e418ee8eb:/lunaix-os/kernel/process/signal.c diff --git a/lunaix-os/kernel/process/signal.c b/lunaix-os/kernel/process/signal.c index d00e757..6690f98 100644 --- a/lunaix-os/kernel/process/signal.c +++ b/lunaix-os/kernel/process/signal.c @@ -6,15 +6,19 @@ #include #include -LOG_MODULE("SIG") - #include +#include + +LOG_MODULE("SIG") + extern struct scheduler sched_ctx; /* kernel/sched.c */ #define UNMASKABLE (sigset(SIGKILL) | sigset(SIGTERM)) #define TERMSIG (sigset(SIGSEGV) | sigset(SIGINT) | UNMASKABLE) #define CORE (sigset(SIGSEGV)) +#define within_kstack(addr) \ + (KERNEL_STACK <= (addr) && (addr) <= KERNEL_STACK_END) static inline void signal_terminate(int errcode) @@ -35,7 +39,7 @@ signal_dispatch() struct sigact* prev_working = psig->inprogress; sigset_t mask = psig->sig_mask | (prev_working ? prev_working->sa_mask : 0); - int sig_selected = 31 - __builtin_clz(psig->sig_pending & ~mask); + int sig_selected = 31 - clz(psig->sig_pending & ~mask); sigset_clear(psig->sig_pending, sig_selected); @@ -57,13 +61,13 @@ signal_dispatch() ptr_t ustack = __current->ustack_top; - if ((int)(ustack - USTACK_END) < (int)sizeof(struct proc_sig)) { + if ((int)(ustack - USR_STACK) < (int)sizeof(struct proc_sig)) { // 用户栈没有空间存放信号上下文 return 0; } struct proc_sig* sigframe = - (struct proc_sig*)((ustack - sizeof(struct proc_sig)) & ~0xf); + (struct proc_sig*)((ustack - sizeof(struct proc_sig)) & ~0xf); sigframe->sig_num = sig_selected; sigframe->sigact = action->sa_actor; @@ -77,6 +81,12 @@ signal_dispatch() return sigframe; } +void +proc_clear_signal(struct proc_info* proc) +{ + memset(&proc->sigctx, 0, sizeof(proc->sigctx)); +} + void proc_setsignal(struct proc_info* proc, int signum) { @@ -101,7 +111,7 @@ signal_send(pid_t pid, int signum) } else if (!pid) { proc = __current; goto send_grp; - } else if (pid < -1) { + } else if (pid < 0) { proc = get_process(-pid); goto send_grp; } else { @@ -111,7 +121,7 @@ signal_send(pid_t pid, int signum) return -1; } -send_grp: +send_grp: ; struct proc_info *pos, *n; llist_for_each(pos, n, &proc->grp_member, grp_member) { @@ -168,14 +178,8 @@ __DEFINE_LXSYSCALL1(int, sigreturn, struct proc_sig, *sig_ctx) return 0; } -__DEFINE_LXSYSCALL3(int, - sigprocmask, - int, - how, - const sigset_t, - *set, - sigset_t, - *oldset) +__DEFINE_LXSYSCALL3( + int, sigprocmask, int, how, const sigset_t, *set, sigset_t, *oldset) { struct sighail* sh = &__current->sigctx; *oldset = sh->sig_mask;