2 * linux/arch/alpha/kernel/signal.c
4 * Copyright (C) 1995 Linus Torvalds
6 * 1997-11-02 Modified for POSIX.1b signals by Richard Henderson
9 #include <linux/sched.h>
10 #include <linux/kernel.h>
11 #include <linux/signal.h>
12 #include <linux/errno.h>
13 #include <linux/wait.h>
14 #include <linux/ptrace.h>
15 #include <linux/unistd.h>
17 #include <linux/smp.h>
18 #include <linux/stddef.h>
19 #include <linux/tty.h>
20 #include <linux/binfmts.h>
21 #include <linux/bitops.h>
22 #include <linux/syscalls.h>
23 #include <linux/tracehook.h>
25 #include <asm/uaccess.h>
26 #include <asm/sigcontext.h>
27 #include <asm/ucontext.h>
34 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
36 asmlinkage void ret_from_sys_call(void);
37 static void do_signal(struct pt_regs *, struct switch_stack *,
38 unsigned long, unsigned long);
42 * The OSF/1 sigprocmask calling sequence is different from the
43 * C sigprocmask() sequence..
50 * We change the range to -1 .. 1 in order to let gcc easily
51 * use the conditional move instructions.
53 * Note that we don't need to acquire the kernel lock for SMP
54 * operation, as all of this is local to this thread.
56 SYSCALL_DEFINE3(osf_sigprocmask, int, how, unsigned long, newmask,
57 struct pt_regs *, regs)
59 unsigned long oldmask = -EINVAL;
61 if ((unsigned long)how-1 <= 2) {
62 long sign = how-2; /* -1 .. 1 */
63 unsigned long block, unblock;
65 newmask &= _BLOCKABLE;
66 spin_lock_irq(¤t->sighand->siglock);
67 oldmask = current->blocked.sig[0];
69 unblock = oldmask & ~newmask;
70 block = oldmask | newmask;
75 if (_NSIG_WORDS > 1 && sign > 0)
76 sigemptyset(¤t->blocked);
77 current->blocked.sig[0] = newmask;
79 spin_unlock_irq(¤t->sighand->siglock);
81 regs->r0 = 0; /* special no error return */
86 SYSCALL_DEFINE3(osf_sigaction, int, sig,
87 const struct osf_sigaction __user *, act,
88 struct osf_sigaction __user *, oact)
90 struct k_sigaction new_ka, old_ka;
95 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
96 __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
97 __get_user(new_ka.sa.sa_flags, &act->sa_flags))
99 __get_user(mask, &act->sa_mask);
100 siginitset(&new_ka.sa.sa_mask, mask);
101 new_ka.ka_restorer = NULL;
104 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
107 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
108 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
109 __put_user(old_ka.sa.sa_flags, &oact->sa_flags))
111 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
117 SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
118 struct sigaction __user *, oact,
119 size_t, sigsetsize, void __user *, restorer)
121 struct k_sigaction new_ka, old_ka;
124 /* XXX: Don't preclude handling different sized sigset_t's. */
125 if (sigsetsize != sizeof(sigset_t))
129 new_ka.ka_restorer = restorer;
130 if (copy_from_user(&new_ka.sa, act, sizeof(*act)))
134 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
137 if (copy_to_user(oact, &old_ka.sa, sizeof(*oact)))
145 * Atomically swap in the new signal mask, and wait for a signal.
148 do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
151 spin_lock_irq(¤t->sighand->siglock);
152 current->saved_sigmask = current->blocked;
153 siginitset(¤t->blocked, mask);
155 spin_unlock_irq(¤t->sighand->siglock);
157 /* Indicate EINTR on return from any possible signal handler,
158 which will not come back through here, but via sigreturn. */
162 current->state = TASK_INTERRUPTIBLE;
164 set_thread_flag(TIF_RESTORE_SIGMASK);
165 return -ERESTARTNOHAND;
169 do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
170 struct pt_regs *regs, struct switch_stack *sw)
174 /* XXX: Don't preclude handling different sized sigset_t's. */
175 if (sigsetsize != sizeof(sigset_t))
177 if (copy_from_user(&set, uset, sizeof(set)))
180 sigdelsetmask(&set, ~_BLOCKABLE);
181 spin_lock_irq(¤t->sighand->siglock);
182 current->saved_sigmask = current->blocked;
183 current->blocked = set;
185 spin_unlock_irq(¤t->sighand->siglock);
187 /* Indicate EINTR on return from any possible signal handler,
188 which will not come back through here, but via sigreturn. */
192 current->state = TASK_INTERRUPTIBLE;
194 set_thread_flag(TIF_RESTORE_SIGMASK);
195 return -ERESTARTNOHAND;
199 sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
201 return do_sigaltstack(uss, uoss, rdusp());
205 * Do a signal return; undo the signal stack.
209 # error "Non SA_SIGINFO frame needs rearranging"
214 struct sigcontext sc;
215 unsigned int retcode[3];
222 unsigned int retcode[3];
225 /* If this changes, userland unwinders that Know Things about our signal
226 frame will break. Do not undertake lightly. It also implies an ABI
227 change wrt the size of siginfo_t, which may cause some pain. */
228 extern char compile_time_assert
229 [offsetof(struct rt_sigframe, uc.uc_mcontext) == 176 ? 1 : -1];
231 #define INSN_MOV_R30_R16 0x47fe0410
232 #define INSN_LDI_R0 0x201f0000
233 #define INSN_CALLSYS 0x00000083
236 restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
237 struct switch_stack *sw)
240 long i, err = __get_user(regs->pc, &sc->sc_pc);
242 current_thread_info()->restart_block.fn = do_no_restart_syscall;
244 sw->r26 = (unsigned long) ret_from_sys_call;
246 err |= __get_user(regs->r0, sc->sc_regs+0);
247 err |= __get_user(regs->r1, sc->sc_regs+1);
248 err |= __get_user(regs->r2, sc->sc_regs+2);
249 err |= __get_user(regs->r3, sc->sc_regs+3);
250 err |= __get_user(regs->r4, sc->sc_regs+4);
251 err |= __get_user(regs->r5, sc->sc_regs+5);
252 err |= __get_user(regs->r6, sc->sc_regs+6);
253 err |= __get_user(regs->r7, sc->sc_regs+7);
254 err |= __get_user(regs->r8, sc->sc_regs+8);
255 err |= __get_user(sw->r9, sc->sc_regs+9);
256 err |= __get_user(sw->r10, sc->sc_regs+10);
257 err |= __get_user(sw->r11, sc->sc_regs+11);
258 err |= __get_user(sw->r12, sc->sc_regs+12);
259 err |= __get_user(sw->r13, sc->sc_regs+13);
260 err |= __get_user(sw->r14, sc->sc_regs+14);
261 err |= __get_user(sw->r15, sc->sc_regs+15);
262 err |= __get_user(regs->r16, sc->sc_regs+16);
263 err |= __get_user(regs->r17, sc->sc_regs+17);
264 err |= __get_user(regs->r18, sc->sc_regs+18);
265 err |= __get_user(regs->r19, sc->sc_regs+19);
266 err |= __get_user(regs->r20, sc->sc_regs+20);
267 err |= __get_user(regs->r21, sc->sc_regs+21);
268 err |= __get_user(regs->r22, sc->sc_regs+22);
269 err |= __get_user(regs->r23, sc->sc_regs+23);
270 err |= __get_user(regs->r24, sc->sc_regs+24);
271 err |= __get_user(regs->r25, sc->sc_regs+25);
272 err |= __get_user(regs->r26, sc->sc_regs+26);
273 err |= __get_user(regs->r27, sc->sc_regs+27);
274 err |= __get_user(regs->r28, sc->sc_regs+28);
275 err |= __get_user(regs->gp, sc->sc_regs+29);
276 err |= __get_user(usp, sc->sc_regs+30);
279 for (i = 0; i < 31; i++)
280 err |= __get_user(sw->fp[i], sc->sc_fpregs+i);
281 err |= __get_user(sw->fp[31], &sc->sc_fpcr);
286 /* Note that this syscall is also used by setcontext(3) to install
287 a given sigcontext. This because it's impossible to set *all*
288 registers and transfer control from userland. */
291 do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs,
292 struct switch_stack *sw)
296 /* Verify that it's a good sigcontext before using it */
297 if (!access_ok(VERIFY_READ, sc, sizeof(*sc)))
299 if (__get_user(set.sig[0], &sc->sc_mask))
302 sigdelsetmask(&set, ~_BLOCKABLE);
303 spin_lock_irq(¤t->sighand->siglock);
304 current->blocked = set;
306 spin_unlock_irq(¤t->sighand->siglock);
308 if (restore_sigcontext(sc, regs, sw))
311 /* Send SIGTRAP if we're single-stepping: */
312 if (ptrace_cancel_bpt (current)) {
315 info.si_signo = SIGTRAP;
317 info.si_code = TRAP_BRKPT;
318 info.si_addr = (void __user *) regs->pc;
320 send_sig_info(SIGTRAP, &info, current);
325 force_sig(SIGSEGV, current);
329 do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs,
330 struct switch_stack *sw)
334 /* Verify that it's a good ucontext_t before using it */
335 if (!access_ok(VERIFY_READ, &frame->uc, sizeof(frame->uc)))
337 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
340 sigdelsetmask(&set, ~_BLOCKABLE);
341 spin_lock_irq(¤t->sighand->siglock);
342 current->blocked = set;
344 spin_unlock_irq(¤t->sighand->siglock);
346 if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw))
349 /* Send SIGTRAP if we're single-stepping: */
350 if (ptrace_cancel_bpt (current)) {
353 info.si_signo = SIGTRAP;
355 info.si_code = TRAP_BRKPT;
356 info.si_addr = (void __user *) regs->pc;
358 send_sig_info(SIGTRAP, &info, current);
363 force_sig(SIGSEGV, current);
368 * Set up a signal frame.
371 static inline void __user *
372 get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
374 if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
375 sp = current->sas_ss_sp + current->sas_ss_size;
377 return (void __user *)((sp - frame_size) & -32ul);
381 setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
382 struct switch_stack *sw, unsigned long mask, unsigned long sp)
386 err |= __put_user(on_sig_stack((unsigned long)sc), &sc->sc_onstack);
387 err |= __put_user(mask, &sc->sc_mask);
388 err |= __put_user(regs->pc, &sc->sc_pc);
389 err |= __put_user(8, &sc->sc_ps);
391 err |= __put_user(regs->r0 , sc->sc_regs+0);
392 err |= __put_user(regs->r1 , sc->sc_regs+1);
393 err |= __put_user(regs->r2 , sc->sc_regs+2);
394 err |= __put_user(regs->r3 , sc->sc_regs+3);
395 err |= __put_user(regs->r4 , sc->sc_regs+4);
396 err |= __put_user(regs->r5 , sc->sc_regs+5);
397 err |= __put_user(regs->r6 , sc->sc_regs+6);
398 err |= __put_user(regs->r7 , sc->sc_regs+7);
399 err |= __put_user(regs->r8 , sc->sc_regs+8);
400 err |= __put_user(sw->r9 , sc->sc_regs+9);
401 err |= __put_user(sw->r10 , sc->sc_regs+10);
402 err |= __put_user(sw->r11 , sc->sc_regs+11);
403 err |= __put_user(sw->r12 , sc->sc_regs+12);
404 err |= __put_user(sw->r13 , sc->sc_regs+13);
405 err |= __put_user(sw->r14 , sc->sc_regs+14);
406 err |= __put_user(sw->r15 , sc->sc_regs+15);
407 err |= __put_user(regs->r16, sc->sc_regs+16);
408 err |= __put_user(regs->r17, sc->sc_regs+17);
409 err |= __put_user(regs->r18, sc->sc_regs+18);
410 err |= __put_user(regs->r19, sc->sc_regs+19);
411 err |= __put_user(regs->r20, sc->sc_regs+20);
412 err |= __put_user(regs->r21, sc->sc_regs+21);
413 err |= __put_user(regs->r22, sc->sc_regs+22);
414 err |= __put_user(regs->r23, sc->sc_regs+23);
415 err |= __put_user(regs->r24, sc->sc_regs+24);
416 err |= __put_user(regs->r25, sc->sc_regs+25);
417 err |= __put_user(regs->r26, sc->sc_regs+26);
418 err |= __put_user(regs->r27, sc->sc_regs+27);
419 err |= __put_user(regs->r28, sc->sc_regs+28);
420 err |= __put_user(regs->gp , sc->sc_regs+29);
421 err |= __put_user(sp, sc->sc_regs+30);
422 err |= __put_user(0, sc->sc_regs+31);
424 for (i = 0; i < 31; i++)
425 err |= __put_user(sw->fp[i], sc->sc_fpregs+i);
426 err |= __put_user(0, sc->sc_fpregs+31);
427 err |= __put_user(sw->fp[31], &sc->sc_fpcr);
429 err |= __put_user(regs->trap_a0, &sc->sc_traparg_a0);
430 err |= __put_user(regs->trap_a1, &sc->sc_traparg_a1);
431 err |= __put_user(regs->trap_a2, &sc->sc_traparg_a2);
437 setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
438 struct pt_regs *regs, struct switch_stack * sw)
440 unsigned long oldsp, r26, err = 0;
441 struct sigframe __user *frame;
444 frame = get_sigframe(ka, oldsp, sizeof(*frame));
445 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
448 err |= setup_sigcontext(&frame->sc, regs, sw, set->sig[0], oldsp);
452 /* Set up to return from userspace. If provided, use a stub
453 already in userspace. */
454 if (ka->ka_restorer) {
455 r26 = (unsigned long) ka->ka_restorer;
457 err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);
458 err |= __put_user(INSN_LDI_R0+__NR_sigreturn, frame->retcode+1);
459 err |= __put_user(INSN_CALLSYS, frame->retcode+2);
461 r26 = (unsigned long) frame->retcode;
464 /* Check that everything was written properly. */
468 /* "Return" to the handler */
470 regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler;
471 regs->r16 = sig; /* a0: signal number */
472 regs->r17 = 0; /* a1: exception code */
473 regs->r18 = (unsigned long) &frame->sc; /* a2: sigcontext pointer */
474 wrusp((unsigned long) frame);
477 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
478 current->comm, current->pid, frame, regs->pc, regs->r26);
484 force_sigsegv(sig, current);
489 setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
490 sigset_t *set, struct pt_regs *regs, struct switch_stack * sw)
492 unsigned long oldsp, r26, err = 0;
493 struct rt_sigframe __user *frame;
496 frame = get_sigframe(ka, oldsp, sizeof(*frame));
497 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
500 err |= copy_siginfo_to_user(&frame->info, info);
502 /* Create the ucontext. */
503 err |= __put_user(0, &frame->uc.uc_flags);
504 err |= __put_user(0, &frame->uc.uc_link);
505 err |= __put_user(set->sig[0], &frame->uc.uc_osf_sigmask);
506 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
507 err |= __put_user(sas_ss_flags(oldsp), &frame->uc.uc_stack.ss_flags);
508 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
509 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, sw,
511 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
515 /* Set up to return from userspace. If provided, use a stub
516 already in userspace. */
517 if (ka->ka_restorer) {
518 r26 = (unsigned long) ka->ka_restorer;
520 err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);
521 err |= __put_user(INSN_LDI_R0+__NR_rt_sigreturn,
523 err |= __put_user(INSN_CALLSYS, frame->retcode+2);
525 r26 = (unsigned long) frame->retcode;
531 /* "Return" to the handler */
533 regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler;
534 regs->r16 = sig; /* a0: signal number */
535 regs->r17 = (unsigned long) &frame->info; /* a1: siginfo pointer */
536 regs->r18 = (unsigned long) &frame->uc; /* a2: ucontext pointer */
537 wrusp((unsigned long) frame);
540 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
541 current->comm, current->pid, frame, regs->pc, regs->r26);
547 force_sigsegv(sig, current);
553 * OK, we're invoking a handler.
556 handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
557 sigset_t *oldset, struct pt_regs * regs, struct switch_stack *sw)
561 if (ka->sa.sa_flags & SA_SIGINFO)
562 ret = setup_rt_frame(sig, ka, info, oldset, regs, sw);
564 ret = setup_frame(sig, ka, oldset, regs, sw);
567 spin_lock_irq(¤t->sighand->siglock);
568 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
569 if (!(ka->sa.sa_flags & SA_NODEFER))
570 sigaddset(¤t->blocked,sig);
572 spin_unlock_irq(¤t->sighand->siglock);
579 syscall_restart(unsigned long r0, unsigned long r19,
580 struct pt_regs *regs, struct k_sigaction *ka)
584 if (!(ka->sa.sa_flags & SA_RESTART)) {
591 regs->r0 = r0; /* reset v0 and a3 and replay syscall */
595 case ERESTART_RESTARTBLOCK:
603 * Note that 'init' is a special process: it doesn't get signals it doesn't
604 * want to handle. Thus you cannot kill init even with a SIGKILL even by
607 * Note that we go through the signals twice: once to check the signals that
608 * the kernel can handle, and then we build all the user-level signal handling
609 * stack-frames in one go after that.
611 * "r0" and "r19" are the registers we need to restore for system call
612 * restart. "r0" is also used as an indicator whether we can restart at
613 * all (if we get here from anything but a syscall return, it will be 0)
616 do_signal(struct pt_regs * regs, struct switch_stack * sw,
617 unsigned long r0, unsigned long r19)
621 unsigned long single_stepping = ptrace_cancel_bpt(current);
622 struct k_sigaction ka;
625 if (test_thread_flag(TIF_RESTORE_SIGMASK))
626 oldset = ¤t->saved_sigmask;
628 oldset = ¤t->blocked;
630 /* This lets the debugger run, ... */
631 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
633 /* ... so re-check the single stepping. */
634 single_stepping |= ptrace_cancel_bpt(current);
637 /* Whee! Actually deliver the signal. */
639 syscall_restart(r0, r19, regs, &ka);
640 if (handle_signal(signr, &ka, &info, oldset, regs, sw) == 0) {
641 /* A signal was successfully delivered, and the
642 saved sigmask was stored on the signal frame,
643 and will be restored by sigreturn. So we can
644 simply clear the restore sigmask flag. */
645 if (test_thread_flag(TIF_RESTORE_SIGMASK))
646 clear_thread_flag(TIF_RESTORE_SIGMASK);
649 ptrace_set_bpt(current); /* re-set bpt */
658 /* Reset v0 and a3 and replay syscall. */
663 case ERESTART_RESTARTBLOCK:
664 /* Force v0 to the restart syscall and reply. */
665 regs->r0 = __NR_restart_syscall;
671 /* If there's no signal to deliver, we just restore the saved mask. */
672 if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
673 clear_thread_flag(TIF_RESTORE_SIGMASK);
674 sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
678 ptrace_set_bpt(current); /* re-set breakpoint */
682 do_notify_resume(struct pt_regs *regs, struct switch_stack *sw,
683 unsigned long thread_info_flags,
684 unsigned long r0, unsigned long r19)
686 if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
687 do_signal(regs, sw, r0, r19);
689 if (thread_info_flags & _TIF_NOTIFY_RESUME) {
690 clear_thread_flag(TIF_NOTIFY_RESUME);
691 tracehook_notify_resume(regs);
692 if (current->replacement_session_keyring)
693 key_replace_session_keyring();