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>
23 #include <asm/uaccess.h>
24 #include <asm/sigcontext.h>
25 #include <asm/ucontext.h>
32 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
34 asmlinkage void ret_from_sys_call(void);
35 static void do_signal(struct pt_regs *, struct switch_stack *,
36 unsigned long, unsigned long);
40 * The OSF/1 sigprocmask calling sequence is different from the
41 * C sigprocmask() sequence..
48 * We change the range to -1 .. 1 in order to let gcc easily
49 * use the conditional move instructions.
51 * Note that we don't need to acquire the kernel lock for SMP
52 * operation, as all of this is local to this thread.
54 asmlinkage unsigned long
55 do_osf_sigprocmask(int how, unsigned long newmask, struct pt_regs *regs)
57 unsigned long oldmask = -EINVAL;
59 if ((unsigned long)how-1 <= 2) {
60 long sign = how-2; /* -1 .. 1 */
61 unsigned long block, unblock;
63 newmask &= _BLOCKABLE;
64 spin_lock_irq(¤t->sighand->siglock);
65 oldmask = current->blocked.sig[0];
67 unblock = oldmask & ~newmask;
68 block = oldmask | newmask;
73 if (_NSIG_WORDS > 1 && sign > 0)
74 sigemptyset(¤t->blocked);
75 current->blocked.sig[0] = newmask;
77 spin_unlock_irq(¤t->sighand->siglock);
79 regs->r0 = 0; /* special no error return */
85 osf_sigaction(int sig, const struct osf_sigaction __user *act,
86 struct osf_sigaction __user *oact)
88 struct k_sigaction new_ka, old_ka;
93 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
94 __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
95 __get_user(new_ka.sa.sa_flags, &act->sa_flags))
97 __get_user(mask, &act->sa_mask);
98 siginitset(&new_ka.sa.sa_mask, mask);
99 new_ka.ka_restorer = NULL;
102 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
105 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
106 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
107 __put_user(old_ka.sa.sa_flags, &oact->sa_flags))
109 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
116 sys_rt_sigaction(int sig, const struct sigaction __user *act,
117 struct sigaction __user *oact,
118 size_t sigsetsize, void __user *restorer)
120 struct k_sigaction new_ka, old_ka;
123 /* XXX: Don't preclude handling different sized sigset_t's. */
124 if (sigsetsize != sizeof(sigset_t))
128 new_ka.ka_restorer = restorer;
129 if (copy_from_user(&new_ka.sa, act, sizeof(*act)))
133 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
136 if (copy_to_user(oact, &old_ka.sa, sizeof(*oact)))
144 * Atomically swap in the new signal mask, and wait for a signal.
147 do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
150 spin_lock_irq(¤t->sighand->siglock);
151 current->saved_sigmask = current->blocked;
152 siginitset(¤t->blocked, mask);
154 spin_unlock_irq(¤t->sighand->siglock);
156 /* Indicate EINTR on return from any possible signal handler,
157 which will not come back through here, but via sigreturn. */
161 current->state = TASK_INTERRUPTIBLE;
163 set_thread_flag(TIF_RESTORE_SIGMASK);
164 return -ERESTARTNOHAND;
168 do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
169 struct pt_regs *regs, struct switch_stack *sw)
173 /* XXX: Don't preclude handling different sized sigset_t's. */
174 if (sigsetsize != sizeof(sigset_t))
176 if (copy_from_user(&set, uset, sizeof(set)))
179 sigdelsetmask(&set, ~_BLOCKABLE);
180 spin_lock_irq(¤t->sighand->siglock);
181 current->saved_sigmask = current->blocked;
182 current->blocked = set;
184 spin_unlock_irq(¤t->sighand->siglock);
186 /* Indicate EINTR on return from any possible signal handler,
187 which will not come back through here, but via sigreturn. */
191 current->state = TASK_INTERRUPTIBLE;
193 set_thread_flag(TIF_RESTORE_SIGMASK);
194 return -ERESTARTNOHAND;
198 sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
200 return do_sigaltstack(uss, uoss, rdusp());
204 * Do a signal return; undo the signal stack.
208 # error "Non SA_SIGINFO frame needs rearranging"
213 struct sigcontext sc;
214 unsigned int retcode[3];
221 unsigned int retcode[3];
224 /* If this changes, userland unwinders that Know Things about our signal
225 frame will break. Do not undertake lightly. It also implies an ABI
226 change wrt the size of siginfo_t, which may cause some pain. */
227 extern char compile_time_assert
228 [offsetof(struct rt_sigframe, uc.uc_mcontext) == 176 ? 1 : -1];
230 #define INSN_MOV_R30_R16 0x47fe0410
231 #define INSN_LDI_R0 0x201f0000
232 #define INSN_CALLSYS 0x00000083
235 restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
236 struct switch_stack *sw)
239 long i, err = __get_user(regs->pc, &sc->sc_pc);
241 sw->r26 = (unsigned long) ret_from_sys_call;
243 err |= __get_user(regs->r0, sc->sc_regs+0);
244 err |= __get_user(regs->r1, sc->sc_regs+1);
245 err |= __get_user(regs->r2, sc->sc_regs+2);
246 err |= __get_user(regs->r3, sc->sc_regs+3);
247 err |= __get_user(regs->r4, sc->sc_regs+4);
248 err |= __get_user(regs->r5, sc->sc_regs+5);
249 err |= __get_user(regs->r6, sc->sc_regs+6);
250 err |= __get_user(regs->r7, sc->sc_regs+7);
251 err |= __get_user(regs->r8, sc->sc_regs+8);
252 err |= __get_user(sw->r9, sc->sc_regs+9);
253 err |= __get_user(sw->r10, sc->sc_regs+10);
254 err |= __get_user(sw->r11, sc->sc_regs+11);
255 err |= __get_user(sw->r12, sc->sc_regs+12);
256 err |= __get_user(sw->r13, sc->sc_regs+13);
257 err |= __get_user(sw->r14, sc->sc_regs+14);
258 err |= __get_user(sw->r15, sc->sc_regs+15);
259 err |= __get_user(regs->r16, sc->sc_regs+16);
260 err |= __get_user(regs->r17, sc->sc_regs+17);
261 err |= __get_user(regs->r18, sc->sc_regs+18);
262 err |= __get_user(regs->r19, sc->sc_regs+19);
263 err |= __get_user(regs->r20, sc->sc_regs+20);
264 err |= __get_user(regs->r21, sc->sc_regs+21);
265 err |= __get_user(regs->r22, sc->sc_regs+22);
266 err |= __get_user(regs->r23, sc->sc_regs+23);
267 err |= __get_user(regs->r24, sc->sc_regs+24);
268 err |= __get_user(regs->r25, sc->sc_regs+25);
269 err |= __get_user(regs->r26, sc->sc_regs+26);
270 err |= __get_user(regs->r27, sc->sc_regs+27);
271 err |= __get_user(regs->r28, sc->sc_regs+28);
272 err |= __get_user(regs->gp, sc->sc_regs+29);
273 err |= __get_user(usp, sc->sc_regs+30);
276 for (i = 0; i < 31; i++)
277 err |= __get_user(sw->fp[i], sc->sc_fpregs+i);
278 err |= __get_user(sw->fp[31], &sc->sc_fpcr);
283 /* Note that this syscall is also used by setcontext(3) to install
284 a given sigcontext. This because it's impossible to set *all*
285 registers and transfer control from userland. */
288 do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs,
289 struct switch_stack *sw)
293 /* Verify that it's a good sigcontext before using it */
294 if (!access_ok(VERIFY_READ, sc, sizeof(*sc)))
296 if (__get_user(set.sig[0], &sc->sc_mask))
299 sigdelsetmask(&set, ~_BLOCKABLE);
300 spin_lock_irq(¤t->sighand->siglock);
301 current->blocked = set;
303 spin_unlock_irq(¤t->sighand->siglock);
305 if (restore_sigcontext(sc, regs, sw))
308 /* Send SIGTRAP if we're single-stepping: */
309 if (ptrace_cancel_bpt (current)) {
312 info.si_signo = SIGTRAP;
314 info.si_code = TRAP_BRKPT;
315 info.si_addr = (void __user *) regs->pc;
317 send_sig_info(SIGTRAP, &info, current);
322 force_sig(SIGSEGV, current);
326 do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs,
327 struct switch_stack *sw)
331 /* Verify that it's a good ucontext_t before using it */
332 if (!access_ok(VERIFY_READ, &frame->uc, sizeof(frame->uc)))
334 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
337 sigdelsetmask(&set, ~_BLOCKABLE);
338 spin_lock_irq(¤t->sighand->siglock);
339 current->blocked = set;
341 spin_unlock_irq(¤t->sighand->siglock);
343 if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw))
346 /* Send SIGTRAP if we're single-stepping: */
347 if (ptrace_cancel_bpt (current)) {
350 info.si_signo = SIGTRAP;
352 info.si_code = TRAP_BRKPT;
353 info.si_addr = (void __user *) regs->pc;
355 send_sig_info(SIGTRAP, &info, current);
360 force_sig(SIGSEGV, current);
365 * Set up a signal frame.
368 static inline void __user *
369 get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
371 if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
372 sp = current->sas_ss_sp + current->sas_ss_size;
374 return (void __user *)((sp - frame_size) & -32ul);
378 setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
379 struct switch_stack *sw, unsigned long mask, unsigned long sp)
383 err |= __put_user(on_sig_stack((unsigned long)sc), &sc->sc_onstack);
384 err |= __put_user(mask, &sc->sc_mask);
385 err |= __put_user(regs->pc, &sc->sc_pc);
386 err |= __put_user(8, &sc->sc_ps);
388 err |= __put_user(regs->r0 , sc->sc_regs+0);
389 err |= __put_user(regs->r1 , sc->sc_regs+1);
390 err |= __put_user(regs->r2 , sc->sc_regs+2);
391 err |= __put_user(regs->r3 , sc->sc_regs+3);
392 err |= __put_user(regs->r4 , sc->sc_regs+4);
393 err |= __put_user(regs->r5 , sc->sc_regs+5);
394 err |= __put_user(regs->r6 , sc->sc_regs+6);
395 err |= __put_user(regs->r7 , sc->sc_regs+7);
396 err |= __put_user(regs->r8 , sc->sc_regs+8);
397 err |= __put_user(sw->r9 , sc->sc_regs+9);
398 err |= __put_user(sw->r10 , sc->sc_regs+10);
399 err |= __put_user(sw->r11 , sc->sc_regs+11);
400 err |= __put_user(sw->r12 , sc->sc_regs+12);
401 err |= __put_user(sw->r13 , sc->sc_regs+13);
402 err |= __put_user(sw->r14 , sc->sc_regs+14);
403 err |= __put_user(sw->r15 , sc->sc_regs+15);
404 err |= __put_user(regs->r16, sc->sc_regs+16);
405 err |= __put_user(regs->r17, sc->sc_regs+17);
406 err |= __put_user(regs->r18, sc->sc_regs+18);
407 err |= __put_user(regs->r19, sc->sc_regs+19);
408 err |= __put_user(regs->r20, sc->sc_regs+20);
409 err |= __put_user(regs->r21, sc->sc_regs+21);
410 err |= __put_user(regs->r22, sc->sc_regs+22);
411 err |= __put_user(regs->r23, sc->sc_regs+23);
412 err |= __put_user(regs->r24, sc->sc_regs+24);
413 err |= __put_user(regs->r25, sc->sc_regs+25);
414 err |= __put_user(regs->r26, sc->sc_regs+26);
415 err |= __put_user(regs->r27, sc->sc_regs+27);
416 err |= __put_user(regs->r28, sc->sc_regs+28);
417 err |= __put_user(regs->gp , sc->sc_regs+29);
418 err |= __put_user(sp, sc->sc_regs+30);
419 err |= __put_user(0, sc->sc_regs+31);
421 for (i = 0; i < 31; i++)
422 err |= __put_user(sw->fp[i], sc->sc_fpregs+i);
423 err |= __put_user(0, sc->sc_fpregs+31);
424 err |= __put_user(sw->fp[31], &sc->sc_fpcr);
426 err |= __put_user(regs->trap_a0, &sc->sc_traparg_a0);
427 err |= __put_user(regs->trap_a1, &sc->sc_traparg_a1);
428 err |= __put_user(regs->trap_a2, &sc->sc_traparg_a2);
434 setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
435 struct pt_regs *regs, struct switch_stack * sw)
437 unsigned long oldsp, r26, err = 0;
438 struct sigframe __user *frame;
441 frame = get_sigframe(ka, oldsp, sizeof(*frame));
442 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
445 err |= setup_sigcontext(&frame->sc, regs, sw, set->sig[0], oldsp);
449 /* Set up to return from userspace. If provided, use a stub
450 already in userspace. */
451 if (ka->ka_restorer) {
452 r26 = (unsigned long) ka->ka_restorer;
454 err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);
455 err |= __put_user(INSN_LDI_R0+__NR_sigreturn, frame->retcode+1);
456 err |= __put_user(INSN_CALLSYS, frame->retcode+2);
458 r26 = (unsigned long) frame->retcode;
461 /* Check that everything was written properly. */
465 /* "Return" to the handler */
467 regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler;
468 regs->r16 = sig; /* a0: signal number */
469 regs->r17 = 0; /* a1: exception code */
470 regs->r18 = (unsigned long) &frame->sc; /* a2: sigcontext pointer */
471 wrusp((unsigned long) frame);
474 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
475 current->comm, current->pid, frame, regs->pc, regs->r26);
481 force_sigsegv(sig, current);
486 setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
487 sigset_t *set, struct pt_regs *regs, struct switch_stack * sw)
489 unsigned long oldsp, r26, err = 0;
490 struct rt_sigframe __user *frame;
493 frame = get_sigframe(ka, oldsp, sizeof(*frame));
494 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
497 err |= copy_siginfo_to_user(&frame->info, info);
499 /* Create the ucontext. */
500 err |= __put_user(0, &frame->uc.uc_flags);
501 err |= __put_user(0, &frame->uc.uc_link);
502 err |= __put_user(set->sig[0], &frame->uc.uc_osf_sigmask);
503 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
504 err |= __put_user(sas_ss_flags(oldsp), &frame->uc.uc_stack.ss_flags);
505 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
506 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, sw,
508 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
512 /* Set up to return from userspace. If provided, use a stub
513 already in userspace. */
514 if (ka->ka_restorer) {
515 r26 = (unsigned long) ka->ka_restorer;
517 err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);
518 err |= __put_user(INSN_LDI_R0+__NR_rt_sigreturn,
520 err |= __put_user(INSN_CALLSYS, frame->retcode+2);
522 r26 = (unsigned long) frame->retcode;
528 /* "Return" to the handler */
530 regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler;
531 regs->r16 = sig; /* a0: signal number */
532 regs->r17 = (unsigned long) &frame->info; /* a1: siginfo pointer */
533 regs->r18 = (unsigned long) &frame->uc; /* a2: ucontext pointer */
534 wrusp((unsigned long) frame);
537 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
538 current->comm, current->pid, frame, regs->pc, regs->r26);
544 force_sigsegv(sig, current);
550 * OK, we're invoking a handler.
553 handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
554 sigset_t *oldset, struct pt_regs * regs, struct switch_stack *sw)
558 if (ka->sa.sa_flags & SA_SIGINFO)
559 ret = setup_rt_frame(sig, ka, info, oldset, regs, sw);
561 ret = setup_frame(sig, ka, oldset, regs, sw);
564 spin_lock_irq(¤t->sighand->siglock);
565 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
566 if (!(ka->sa.sa_flags & SA_NODEFER))
567 sigaddset(¤t->blocked,sig);
569 spin_unlock_irq(¤t->sighand->siglock);
576 syscall_restart(unsigned long r0, unsigned long r19,
577 struct pt_regs *regs, struct k_sigaction *ka)
581 if (!(ka->sa.sa_flags & SA_RESTART)) {
588 regs->r0 = r0; /* reset v0 and a3 and replay syscall */
592 case ERESTART_RESTARTBLOCK:
593 current_thread_info()->restart_block.fn = do_no_restart_syscall;
601 * Note that 'init' is a special process: it doesn't get signals it doesn't
602 * want to handle. Thus you cannot kill init even with a SIGKILL even by
605 * Note that we go through the signals twice: once to check the signals that
606 * the kernel can handle, and then we build all the user-level signal handling
607 * stack-frames in one go after that.
609 * "r0" and "r19" are the registers we need to restore for system call
610 * restart. "r0" is also used as an indicator whether we can restart at
611 * all (if we get here from anything but a syscall return, it will be 0)
614 do_signal(struct pt_regs * regs, struct switch_stack * sw,
615 unsigned long r0, unsigned long r19)
619 unsigned long single_stepping = ptrace_cancel_bpt(current);
620 struct k_sigaction ka;
623 if (test_thread_flag(TIF_RESTORE_SIGMASK))
624 oldset = ¤t->saved_sigmask;
626 oldset = ¤t->blocked;
628 /* This lets the debugger run, ... */
629 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
631 /* ... so re-check the single stepping. */
632 single_stepping |= ptrace_cancel_bpt(current);
635 /* Whee! Actually deliver the signal. */
637 syscall_restart(r0, r19, regs, &ka);
638 if (handle_signal(signr, &ka, &info, oldset, regs, sw) == 0) {
639 /* A signal was successfully delivered, and the
640 saved sigmask was stored on the signal frame,
641 and will be restored by sigreturn. So we can
642 simply clear the restore sigmask flag. */
643 if (test_thread_flag(TIF_RESTORE_SIGMASK))
644 clear_thread_flag(TIF_RESTORE_SIGMASK);
647 ptrace_set_bpt(current); /* re-set bpt */
656 /* Reset v0 and a3 and replay syscall. */
661 case ERESTART_RESTARTBLOCK:
662 /* Force v0 to the restart syscall and reply. */
663 regs->r0 = __NR_restart_syscall;
669 /* If there's no signal to deliver, we just restore the saved mask. */
670 if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
671 clear_thread_flag(TIF_RESTORE_SIGMASK);
672 sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
676 ptrace_set_bpt(current); /* re-set breakpoint */
680 do_notify_resume(struct pt_regs *regs, struct switch_stack *sw,
681 unsigned long thread_info_flags,
682 unsigned long r0, unsigned long r19)
684 if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
685 do_signal(regs, sw, r0, r19);