aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/kernel/signal_32.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sh/kernel/signal_32.c')
-rw-r--r--arch/sh/kernel/signal_32.c36
1 files changed, 10 insertions, 26 deletions
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c
index a7a55ed43a59..5901fba3176e 100644
--- a/arch/sh/kernel/signal_32.c
+++ b/arch/sh/kernel/signal_32.c
@@ -25,7 +25,6 @@
25#include <linux/freezer.h> 25#include <linux/freezer.h>
26#include <linux/io.h> 26#include <linux/io.h>
27#include <linux/tracehook.h> 27#include <linux/tracehook.h>
28#include <asm/system.h>
29#include <asm/ucontext.h> 28#include <asm/ucontext.h>
30#include <asm/uaccess.h> 29#include <asm/uaccess.h>
31#include <asm/pgtable.h> 30#include <asm/pgtable.h>
@@ -58,12 +57,13 @@ sys_sigsuspend(old_sigset_t mask,
58 unsigned long r5, unsigned long r6, unsigned long r7, 57 unsigned long r5, unsigned long r6, unsigned long r7,
59 struct pt_regs __regs) 58 struct pt_regs __regs)
60{ 59{
61 mask &= _BLOCKABLE; 60 sigset_t blocked;
62 spin_lock_irq(&current->sighand->siglock); 61
63 current->saved_sigmask = current->blocked; 62 current->saved_sigmask = current->blocked;
64 siginitset(&current->blocked, mask); 63
65 recalc_sigpending(); 64 mask &= _BLOCKABLE;
66 spin_unlock_irq(&current->sighand->siglock); 65 siginitset(&blocked, mask);
66 set_current_blocked(&blocked);
67 67
68 current->state = TASK_INTERRUPTIBLE; 68 current->state = TASK_INTERRUPTIBLE;
69 schedule(); 69 schedule();
@@ -240,11 +240,7 @@ asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5,
240 goto badframe; 240 goto badframe;
241 241
242 sigdelsetmask(&set, ~_BLOCKABLE); 242 sigdelsetmask(&set, ~_BLOCKABLE);
243 243 set_current_blocked(&set);
244 spin_lock_irq(&current->sighand->siglock);
245 current->blocked = set;
246 recalc_sigpending();
247 spin_unlock_irq(&current->sighand->siglock);
248 244
249 if (restore_sigcontext(regs, &frame->sc, &r0)) 245 if (restore_sigcontext(regs, &frame->sc, &r0))
250 goto badframe; 246 goto badframe;
@@ -274,10 +270,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
274 goto badframe; 270 goto badframe;
275 271
276 sigdelsetmask(&set, ~_BLOCKABLE); 272 sigdelsetmask(&set, ~_BLOCKABLE);
277 spin_lock_irq(&current->sighand->siglock); 273 set_current_blocked(&set);
278 current->blocked = set;
279 recalc_sigpending();
280 spin_unlock_irq(&current->sighand->siglock);
281 274
282 if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) 275 if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0))
283 goto badframe; 276 goto badframe;
@@ -548,17 +541,8 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
548 else 541 else
549 ret = setup_frame(sig, ka, oldset, regs); 542 ret = setup_frame(sig, ka, oldset, regs);
550 543
551 if (ka->sa.sa_flags & SA_ONESHOT) 544 if (ret == 0)
552 ka->sa.sa_handler = SIG_DFL; 545 block_sigmask(ka, sig);
553
554 if (ret == 0) {
555 spin_lock_irq(&current->sighand->siglock);
556 sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
557 if (!(ka->sa.sa_flags & SA_NODEFER))
558 sigaddset(&current->blocked,sig);
559 recalc_sigpending();
560 spin_unlock_irq(&current->sighand->siglock);
561 }
562 546
563 return ret; 547 return ret;
564} 548}