diff options
Diffstat (limited to 'arch/cris/arch-v32/kernel/signal.c')
-rw-r--r-- | arch/cris/arch-v32/kernel/signal.c | 66 |
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 | */ |
61 | int | 61 | int |
62 | sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof, | 62 | sys_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(¤t->sighand->siglock); | 65 | siginitset(&blocked, mask); |
67 | current->saved_sigmask = current->blocked; | 66 | return sigsuspend(&blocked); |
68 | siginitset(¤t->blocked, mask); | ||
69 | recalc_sigpending(); | ||
70 | spin_unlock_irq(¤t->sighand->siglock); | ||
71 | current->state = TASK_INTERRUPTIBLE; | ||
72 | schedule(); | ||
73 | set_thread_flag(TIF_RESTORE_SIGMASK); | ||
74 | return -ERESTARTNOHAND; | ||
75 | } | 67 | } |
76 | 68 | ||
77 | int | 69 | int |
@@ -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(¤t->sighand->siglock); | 171 | set_current_blocked(&set); |
180 | |||
181 | current->blocked = set; | ||
182 | |||
183 | recalc_sigpending(); | ||
184 | spin_unlock_irq(¤t->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(¤t->sighand->siglock); | 212 | set_current_blocked(&set); |
226 | |||
227 | current->blocked = set; | ||
228 | |||
229 | recalc_sigpending(); | ||
230 | spin_unlock_irq(¤t->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 | ||
365 | give_sigsegv: | 347 | give_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 | ||
452 | give_sigsegv: | 431 | give_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(¤t->sighand->siglock); | ||
520 | sigorsets(¤t->blocked, ¤t->blocked, | ||
521 | &ka->sa.sa_mask); | ||
522 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
523 | sigaddset(¤t->blocked, sig); | ||
524 | recalc_sigpending(); | ||
525 | spin_unlock_irq(¤t->sighand->siglock); | ||
526 | } | ||
527 | 493 | ||
528 | return ret; | 494 | return ret; |
529 | } | 495 | } |