|
@@ -70,10 +70,7 @@ asmlinkage void sparc64_set_context(struct pt_regs *regs)
|
|
|
goto do_sigsegv;
|
|
|
}
|
|
|
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 (test_thread_flag(TIF_32BIT)) {
|
|
|
pc &= 0xffffffff;
|
|
@@ -242,12 +239,13 @@ struct rt_signal_frame {
|
|
|
|
|
|
static long _sigpause_common(old_sigset_t set)
|
|
|
{
|
|
|
- set &= _BLOCKABLE;
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
+ sigset_t blocked;
|
|
|
+
|
|
|
current->saved_sigmask = current->blocked;
|
|
|
- siginitset(¤t->blocked, set);
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
+
|
|
|
+ set &= _BLOCKABLE;
|
|
|
+ siginitset(&blocked, set);
|
|
|
+ set_current_blocked(&blocked);
|
|
|
|
|
|
current->state = TASK_INTERRUPTIBLE;
|
|
|
schedule();
|
|
@@ -327,10 +325,7 @@ void do_rt_sigreturn(struct pt_regs *regs)
|
|
|
pt_regs_clear_syscall(regs);
|
|
|
|
|
|
sigdelsetmask(&set, ~_BLOCKABLE);
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- current->blocked = set;
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
+ set_current_blocked(&set);
|
|
|
return;
|
|
|
segv:
|
|
|
force_sig(SIGSEGV, current);
|
|
@@ -484,18 +479,17 @@ static inline int handle_signal(unsigned long signr, struct k_sigaction *ka,
|
|
|
siginfo_t *info,
|
|
|
sigset_t *oldset, struct pt_regs *regs)
|
|
|
{
|
|
|
+ sigset_t blocked;
|
|
|
int err;
|
|
|
|
|
|
err = setup_rt_frame(ka, regs, signr, oldset,
|
|
|
(ka->sa.sa_flags & SA_SIGINFO) ? info : NULL);
|
|
|
if (err)
|
|
|
return err;
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
|
|
+ sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask);
|
|
|
if (!(ka->sa.sa_flags & SA_NOMASK))
|
|
|
- sigaddset(¤t->blocked,signr);
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
+ sigaddset(&blocked, signr);
|
|
|
+ set_current_blocked(&blocked);
|
|
|
|
|
|
tracehook_signal_handler(signr, info, ka, regs, 0);
|
|
|
|