|
@@ -57,17 +57,15 @@ typedef struct
|
|
|
*/
|
|
|
SYSCALL_DEFINE3(sigsuspend, int, history0, int, history1, old_sigset_t, mask)
|
|
|
{
|
|
|
- mask &= _BLOCKABLE;
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- current->saved_sigmask = current->blocked;
|
|
|
- siginitset(¤t->blocked, mask);
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
+ sigset_t blocked;
|
|
|
|
|
|
+ current->saved_sigmask = current->blocked;
|
|
|
+ mask &= _BLOCKABLE;
|
|
|
+ siginitset(&blocked, mask);
|
|
|
+ set_current_blocked(&blocked);
|
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
|
schedule();
|
|
|
set_thread_flag(TIF_RESTORE_SIGMASK);
|
|
|
-
|
|
|
return -ERESTARTNOHAND;
|
|
|
}
|
|
|
|
|
@@ -172,18 +170,11 @@ SYSCALL_DEFINE0(sigreturn)
|
|
|
goto badframe;
|
|
|
if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE))
|
|
|
goto badframe;
|
|
|
-
|
|
|
sigdelsetmask(&set, ~_BLOCKABLE);
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- current->blocked = set;
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
-
|
|
|
+ set_current_blocked(&set);
|
|
|
if (restore_sigregs(regs, &frame->sregs))
|
|
|
goto badframe;
|
|
|
-
|
|
|
return regs->gprs[2];
|
|
|
-
|
|
|
badframe:
|
|
|
force_sig(SIGSEGV, current);
|
|
|
return 0;
|
|
@@ -199,21 +190,14 @@ SYSCALL_DEFINE0(rt_sigreturn)
|
|
|
goto badframe;
|
|
|
if (__copy_from_user(&set.sig, &frame->uc.uc_sigmask, sizeof(set)))
|
|
|
goto badframe;
|
|
|
-
|
|
|
sigdelsetmask(&set, ~_BLOCKABLE);
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- current->blocked = set;
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
-
|
|
|
+ set_current_blocked(&set);
|
|
|
if (restore_sigregs(regs, &frame->uc.uc_mcontext))
|
|
|
goto badframe;
|
|
|
-
|
|
|
if (do_sigaltstack(&frame->uc.uc_stack, NULL,
|
|
|
regs->gprs[15]) == -EFAULT)
|
|
|
goto badframe;
|
|
|
return regs->gprs[2];
|
|
|
-
|
|
|
badframe:
|
|
|
force_sig(SIGSEGV, current);
|
|
|
return 0;
|
|
@@ -385,14 +369,11 @@ give_sigsegv:
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * OK, we're invoking a handler
|
|
|
- */
|
|
|
-
|
|
|
-static int
|
|
|
-handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|
|
- siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
|
|
|
+static int handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|
|
+ siginfo_t *info, sigset_t *oldset,
|
|
|
+ struct pt_regs *regs)
|
|
|
{
|
|
|
+ sigset_t blocked;
|
|
|
int ret;
|
|
|
|
|
|
/* Set up the stack frame */
|
|
@@ -400,17 +381,13 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|
|
ret = setup_rt_frame(sig, ka, info, oldset, regs);
|
|
|
else
|
|
|
ret = setup_frame(sig, ka, oldset, regs);
|
|
|
-
|
|
|
- if (ret == 0) {
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
|
|
- if (!(ka->sa.sa_flags & SA_NODEFER))
|
|
|
- sigaddset(¤t->blocked,sig);
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
- }
|
|
|
-
|
|
|
- return ret;
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask);
|
|
|
+ if (!(ka->sa.sa_flags & SA_NODEFER))
|
|
|
+ sigaddset(&blocked, sig);
|
|
|
+ set_current_blocked(&blocked);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/*
|