aboutsummaryrefslogtreecommitdiffstats
path: root/arch/cris/arch-v32/kernel/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/cris/arch-v32/kernel/signal.c')
-rw-r--r--arch/cris/arch-v32/kernel/signal.c66
1 files changed, 16 insertions, 50 deletions
diff --git a/arch/cris/arch-v32/kernel/signal.c b/arch/cris/arch-v32/kernel/signal.c
index ce4ab1a5552c..b338d8fc0c12 100644
--- a/arch/cris/arch-v32/kernel/signal.c
+++ b/arch/cris/arch-v32/kernel/signal.c
@@ -59,19 +59,11 @@ void keep_debug_flags(unsigned long oldccs, unsigned long oldspc,
59 * dummy arguments to be able to reach the regs argument. 59 * dummy arguments to be able to reach the regs argument.
60 */ 60 */
61int 61int
62sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof, 62sys_sigsuspend(old_sigset_t mask)
63 long srp, struct pt_regs *regs)
64{ 63{
65 mask &= _BLOCKABLE; 64 sigset_t blocked;
66 spin_lock_irq(&current->sighand->siglock); 65 siginitset(&blocked, mask);
67 current->saved_sigmask = current->blocked; 66 return sigsuspend(&blocked);
68 siginitset(&current->blocked, mask);
69 recalc_sigpending();
70 spin_unlock_irq(&current->sighand->siglock);
71 current->state = TASK_INTERRUPTIBLE;
72 schedule();
73 set_thread_flag(TIF_RESTORE_SIGMASK);
74 return -ERESTARTNOHAND;
75} 67}
76 68
77int 69int
@@ -87,11 +79,11 @@ sys_sigaction(int signal, const struct old_sigaction *act,
87 79
88 if (!access_ok(VERIFY_READ, act, sizeof(*act)) || 80 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
89 __get_user(newk.sa.sa_handler, &act->sa_handler) || 81 __get_user(newk.sa.sa_handler, &act->sa_handler) ||
90 __get_user(newk.sa.sa_restorer, &act->sa_restorer)) 82 __get_user(newk.sa.sa_restorer, &act->sa_restorer) ||
83 __get_user(newk.sa.sa_flags, &act->sa_flags) ||
84 __get_user(mask, &act->sa_mask))
91 return -EFAULT; 85 return -EFAULT;
92 86
93 __get_user(newk.sa.sa_flags, &act->sa_flags);
94 __get_user(mask, &act->sa_mask);
95 siginitset(&newk.sa.sa_mask, mask); 87 siginitset(&newk.sa.sa_mask, mask);
96 } 88 }
97 89
@@ -100,11 +92,11 @@ sys_sigaction(int signal, const struct old_sigaction *act,
100 if (!retval && oact) { 92 if (!retval && oact) {
101 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || 93 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
102 __put_user(oldk.sa.sa_handler, &oact->sa_handler) || 94 __put_user(oldk.sa.sa_handler, &oact->sa_handler) ||
103 __put_user(oldk.sa.sa_restorer, &oact->sa_restorer)) 95 __put_user(oldk.sa.sa_restorer, &oact->sa_restorer) ||
96 __put_user(oldk.sa.sa_flags, &oact->sa_flags) ||
97 __put_user(oldk.sa.sa_mask.sig[0], &oact->sa_mask))
104 return -EFAULT; 98 return -EFAULT;
105 99
106 __put_user(oldk.sa.sa_flags, &oact->sa_flags);
107 __put_user(oldk.sa.sa_mask.sig[0], &oact->sa_mask);
108 } 100 }
109 101
110 return retval; 102 return retval;
@@ -176,12 +168,7 @@ sys_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
176 goto badframe; 168 goto badframe;
177 169
178 sigdelsetmask(&set, ~_BLOCKABLE); 170 sigdelsetmask(&set, ~_BLOCKABLE);
179 spin_lock_irq(&current->sighand->siglock); 171 set_current_blocked(&set);
180
181 current->blocked = set;
182
183 recalc_sigpending();
184 spin_unlock_irq(&current->sighand->siglock);
185 172
186 if (restore_sigcontext(regs, &frame->sc)) 173 if (restore_sigcontext(regs, &frame->sc))
187 goto badframe; 174 goto badframe;
@@ -222,12 +209,7 @@ sys_rt_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
222 goto badframe; 209 goto badframe;
223 210
224 sigdelsetmask(&set, ~_BLOCKABLE); 211 sigdelsetmask(&set, ~_BLOCKABLE);
225 spin_lock_irq(&current->sighand->siglock); 212 set_current_blocked(&set);
226
227 current->blocked = set;
228
229 recalc_sigpending();
230 spin_unlock_irq(&current->sighand->siglock);
231 213
232 if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) 214 if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
233 goto badframe; 215 goto badframe;
@@ -363,10 +345,7 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
363 return 0; 345 return 0;
364 346
365give_sigsegv: 347give_sigsegv:
366 if (sig == SIGSEGV) 348 force_sigsegv(sig, current);
367 ka->sa.sa_handler = SIG_DFL;
368
369 force_sig(SIGSEGV, current);
370 return -EFAULT; 349 return -EFAULT;
371} 350}
372 351
@@ -450,10 +429,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
450 return 0; 429 return 0;
451 430
452give_sigsegv: 431give_sigsegv:
453 if (sig == SIGSEGV) 432 force_sigsegv(sig, current);
454 ka->sa.sa_handler = SIG_DFL;
455
456 force_sig(SIGSEGV, current);
457 return -EFAULT; 433 return -EFAULT;
458} 434}
459 435
@@ -512,18 +488,8 @@ handle_signal(int canrestart, unsigned long sig,
512 else 488 else
513 ret = setup_frame(sig, ka, oldset, regs); 489 ret = setup_frame(sig, ka, oldset, regs);
514 490
515 if (ka->sa.sa_flags & SA_ONESHOT) 491 if (ret == 0)
516 ka->sa.sa_handler = SIG_DFL; 492 block_sigmask(ka, sig);
517
518 if (ret == 0) {
519 spin_lock_irq(&current->sighand->siglock);
520 sigorsets(&current->blocked, &current->blocked,
521 &ka->sa.sa_mask);
522 if (!(ka->sa.sa_flags & SA_NODEFER))
523 sigaddset(&current->blocked, sig);
524 recalc_sigpending();
525 spin_unlock_irq(&current->sighand->siglock);
526 }
527 493
528 return ret; 494 return ret;
529} 495}