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