2 * linux/arch/ppc64/kernel/signal.c
5 * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
7 * Derived from "arch/i386/kernel/signal.c"
8 * Copyright (C) 1991, 1992 Linus Torvalds
9 * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version
14 * 2 of the License, or (at your option) any later version.
17 #include <linux/sched.h>
19 #include <linux/smp.h>
20 #include <linux/smp_lock.h>
21 #include <linux/kernel.h>
22 #include <linux/signal.h>
23 #include <linux/errno.h>
24 #include <linux/wait.h>
25 #include <linux/ptrace.h>
26 #include <linux/unistd.h>
27 #include <linux/stddef.h>
28 #include <linux/elf.h>
29 #include <asm/ppc32.h>
30 #include <asm/sigcontext.h>
31 #include <asm/ucontext.h>
32 #include <asm/uaccess.h>
33 #include <asm/pgtable.h>
34 #include <asm/ppcdebug.h>
35 #include <asm/unistd.h>
39 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
42 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
45 #define GP_REGS_SIZE MIN(sizeof(elf_gregset_t), sizeof(struct pt_regs))
46 #define FP_REGS_SIZE sizeof(elf_fpregset_t)
48 #define TRAMP_TRACEBACK 2
52 * When we have signals to deliver, we set up on the user stack,
53 * going down from the original stack pointer:
54 * 1) a sigframe/rt_sigframe struct which contains the sigcontext/ucontext
55 * 2) a gap of __SIGNAL_FRAMESIZE bytes which acts as a dummy caller
56 * frame for the signal handler.
61 unsigned int tramp[TRAMP_SIZE];
62 /* 64 bit ABI allows for 288 bytes below sp before decrementing it. */
67 unsigned long _unused[2];
68 unsigned int tramp[TRAMP_SIZE];
69 struct siginfo *pinfo;
73 /* 64 bit ABI allows for 288 bytes below sp before decrementing it. */
77 extern long sys_wait4(pid_t pid, unsigned int *stat_addr,
78 int options, /*unsigned long*/ struct rusage *ru);
81 copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
83 if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
85 if (from->si_code < 0)
86 return __copy_to_user(to, from, sizeof(siginfo_t));
90 /* If you change siginfo_t structure, please be sure
91 this code is fixed accordingly.
92 It should never copy any pad contained in the structure
93 to avoid security leaks, but must copy the generic
94 3 ints plus the relevant union member. */
95 err = __put_user(from->si_signo, &to->si_signo);
96 err |= __put_user(from->si_errno, &to->si_errno);
97 err |= __put_user((short)from->si_code, &to->si_code);
98 /* First 32bits of unions are always present. */
99 err |= __put_user(from->si_pid, &to->si_pid);
100 switch (from->si_code >> 16) {
101 case __SI_FAULT >> 16:
103 case __SI_CHLD >> 16:
104 err |= __put_user(from->si_utime, &to->si_utime);
105 err |= __put_user(from->si_stime, &to->si_stime);
106 err |= __put_user(from->si_status, &to->si_status);
108 err |= __put_user(from->si_uid, &to->si_uid);
110 /* case __SI_RT: This is not generated by the kernel as of now. */
116 int do_signal(sigset_t *oldset, struct pt_regs *regs);
119 * Atomically swap in the new signal mask, and wait for a signal.
122 sys_sigsuspend(old_sigset_t mask, int p2, int p3, int p4, int p6, int p7,
123 struct pt_regs *regs)
128 spin_lock_irq(¤t->sigmask_lock);
129 saveset = current->blocked;
130 siginitset(¤t->blocked, mask);
131 recalc_sigpending(current);
132 spin_unlock_irq(¤t->sigmask_lock);
134 regs->result = -EINTR;
135 regs->gpr[3] = EINTR;
136 regs->ccr |= 0x10000000;
138 current->state = TASK_INTERRUPTIBLE;
140 if (do_signal(&saveset, regs))
142 * If a signal handler needs to be called,
143 * do_signal() has set R3 to the signal number (the
144 * first argument of the signal handler), so don't
145 * overwrite that with EINTR !
146 * In the other cases, do_signal() doesn't touch
147 * R3, so it's still set to -EINTR (see above).
154 sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, int p3, int p4, int p6,
155 int p7, struct pt_regs *regs)
157 sigset_t saveset, newset;
159 /* XXX: Don't preclude handling different sized sigset_t's. */
160 if (sigsetsize != sizeof(sigset_t))
163 if (copy_from_user(&newset, unewset, sizeof(newset)))
165 sigdelsetmask(&newset, ~_BLOCKABLE);
167 spin_lock_irq(¤t->sigmask_lock);
168 saveset = current->blocked;
169 current->blocked = newset;
170 recalc_sigpending(current);
171 spin_unlock_irq(¤t->sigmask_lock);
173 regs->result = -EINTR;
174 regs->gpr[3] = EINTR;
175 regs->ccr |= 0x10000000;
177 current->state = TASK_INTERRUPTIBLE;
179 if (do_signal(&saveset, regs))
185 sys_sigaltstack(const stack_t *uss, stack_t *uoss, unsigned long r5,
186 unsigned long r6, unsigned long r7, unsigned long r8,
187 struct pt_regs *regs)
189 return do_sigaltstack(uss, uoss, regs->gpr[1]);
193 sys_sigaction(int sig, const struct old_sigaction *act,
194 struct old_sigaction *oact)
196 struct k_sigaction new_ka, old_ka;
202 if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
203 __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
204 __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
206 __get_user(new_ka.sa.sa_flags, &act->sa_flags);
207 __get_user(mask, &act->sa_mask);
208 siginitset(&new_ka.sa.sa_mask, mask);
211 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
213 if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
214 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
215 __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
217 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
218 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
225 * Set up the sigcontext for the signal frame.
229 setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
230 int signr, sigset_t *set, unsigned long handler)
234 if (regs->msr & MSR_FP)
237 current->thread.saved_msr = regs->msr & ~(MSR_FP | MSR_FE0 | MSR_FE1);
238 regs->msr = current->thread.saved_msr | current->thread.fpexc_mode;
239 current->thread.saved_softe = regs->softe;
241 err |= __put_user(&sc->gp_regs, &sc->regs);
242 err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE);
243 err |= __copy_to_user(&sc->fp_regs, ¤t->thread.fpr, FP_REGS_SIZE);
244 err |= __put_user(signr, &sc->signal);
245 err |= __put_user(handler, &sc->handler);
247 err |= __put_user(set->sig[0], &sc->oldmask);
249 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
250 current->thread.fpscr = 0;
256 * Restore the sigcontext from the signal frame.
260 restore_sigcontext(struct pt_regs *regs, sigset_t *set, struct sigcontext *sc)
262 unsigned int err = 0;
264 if (regs->msr & MSR_FP)
267 err |= __copy_from_user(regs, &sc->gp_regs, GP_REGS_SIZE);
268 err |= __copy_from_user(¤t->thread.fpr, &sc->fp_regs, FP_REGS_SIZE);
269 current->thread.fpexc_mode = regs->msr & (MSR_FE0 | MSR_FE1);
271 err |= __get_user(set->sig[0], &sc->oldmask);
273 /* Don't allow the signal handler to change these modulo FE{0,1} */
274 regs->msr = current->thread.saved_msr & ~(MSR_FP | MSR_FE0 | MSR_FE1);
275 regs->softe = current->thread.saved_softe;
281 * Allocate space for the signal frame
284 get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
288 /* Default to using normal stack */
289 newsp = regs->gpr[1];
291 if (ka->sa.sa_flags & SA_ONSTACK) {
292 if (! on_sig_stack(regs->gpr[1]))
293 newsp = (current->sas_ss_sp + current->sas_ss_size);
296 return (void *)((newsp - frame_size) & -8ul);
300 sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5,
301 unsigned long r6, unsigned long r7, unsigned long r8,
302 struct pt_regs *regs)
304 struct rt_sigframe *frame;
308 frame = (struct rt_sigframe *)(regs->gpr[1] + __SIGNAL_FRAMESIZE);
310 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
313 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
316 sigdelsetmask(&set, ~_BLOCKABLE);
317 spin_lock_irq(¤t->sigmask_lock);
318 current->blocked = set;
319 recalc_sigpending(current);
320 spin_unlock_irq(¤t->sigmask_lock);
322 if (restore_sigcontext(regs, NULL, &frame->uc.uc_mcontext))
325 if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
328 /* This function sets back the stack flags into
329 the current task structure. */
330 sys_sigaltstack(&st, NULL, 0, 0, 0, 0, regs);
339 setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
340 sigset_t *set, struct pt_regs *regs)
342 /* Handler is *really* a pointer to the function descriptor for
343 * the signal routine. The first entry in the function
344 * descriptor is the entry address of signal and the second
345 * entry is the TOC value we need to use.
347 func_descr_t *funct_desc_ptr;
348 struct rt_sigframe *frame;
352 frame = get_sigframe(ka, regs, sizeof(*frame));
354 if (verify_area(VERIFY_WRITE, frame, sizeof(*frame)))
357 err |= __put_user(&frame->info, &frame->pinfo);
358 err |= __put_user(&frame->uc, &frame->puc);
359 err |= copy_siginfo_to_user(&frame->info, info);
363 /* Create the ucontext. */
364 err |= __put_user(0, &frame->uc.uc_flags);
365 err |= __put_user(0, &frame->uc.uc_link);
366 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
367 err |= __put_user(sas_ss_flags(regs->gpr[1]),
368 &frame->uc.uc_stack.ss_flags);
369 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
370 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, signr, NULL,
371 (unsigned long)ka->sa.sa_handler);
372 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
376 /* Set up to return from userspace. */
377 /* li r0, __NR_rt_sigreturn */
378 err |= __put_user(0x38000000UL + __NR_rt_sigreturn, &frame->tramp[0]);
380 err |= __put_user(0x44000002UL, &frame->tramp[1]);
381 /* Minimal traceback info */
382 for (i=TRAMP_TRACEBACK; i < TRAMP_SIZE ;i++)
383 err |= __put_user(0, &frame->tramp[i]);
387 flush_icache_range((unsigned long) &frame->tramp[0],
388 (unsigned long) &frame->tramp[TRAMP_SIZE]);
390 funct_desc_ptr = (func_descr_t *) ka->sa.sa_handler;
392 /* Allocate a dummy caller frame for the signal handler. */
393 newsp = (unsigned long)frame - __SIGNAL_FRAMESIZE;
394 err |= put_user(0, (unsigned long *)newsp);
396 /* Set up "regs" so we "return" to the signal handler. */
397 err |= get_user(regs->nip, &funct_desc_ptr->entry);
398 regs->link = (unsigned long) &frame->tramp[0];
399 regs->gpr[1] = newsp;
400 err |= get_user(regs->gpr[2], &funct_desc_ptr->toc);
401 regs->gpr[3] = signr;
402 err |= get_user(regs->gpr[4], (unsigned long *)&frame->pinfo);
403 err |= get_user(regs->gpr[5], (unsigned long *)&frame->puc);
404 regs->gpr[6] = (unsigned long) frame;
412 printk("badframe in setup_rt_frame, regs=%p frame=%p, newsp=0x%lx\n",
419 * Do a signal return; undo the signal stack.
422 sys_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5,
423 unsigned long r6, unsigned long r7, unsigned long r8,
424 struct pt_regs *regs)
426 struct sigframe *frame;
429 frame = (struct sigframe *)(regs->gpr[1] + __SIGNAL_FRAMESIZE);
431 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
434 if (restore_sigcontext(regs, &set, &frame->sc))
437 sigdelsetmask(&set, ~_BLOCKABLE);
438 spin_lock_irq(¤t->sigmask_lock);
439 current->blocked = set;
440 recalc_sigpending(current);
441 spin_unlock_irq(¤t->sigmask_lock);
451 setup_frame(int signr, struct k_sigaction *ka, sigset_t *set,
452 struct pt_regs *regs)
454 /* Handler is *really* a pointer to the function descriptor for
455 * the signal routine. The first entry in the function
456 * descriptor is the entry address of signal and the second
457 * entry is the TOC value we need to use.
459 func_descr_t *funct_desc_ptr;
460 struct sigframe *frame;
464 frame = get_sigframe(ka, regs, sizeof(*frame));
466 if (verify_area(VERIFY_WRITE, frame, sizeof(*frame)))
469 err |= setup_sigcontext(&frame->sc, regs, signr, set,
470 (unsigned long)ka->sa.sa_handler);
472 /* Set up to return from userspace. */
473 /* li r0, __NR_rt_sigreturn */
474 err |= __put_user(0x38000000UL + __NR_sigreturn, &frame->tramp[0]);
476 err |= __put_user(0x44000002UL, &frame->tramp[1]);
477 /* Minimal traceback info */
478 for (i=TRAMP_TRACEBACK; i < TRAMP_SIZE ;i++)
479 err |= __put_user(0, &frame->tramp[i]);
483 flush_icache_range((unsigned long) &frame->tramp[0],
484 (unsigned long) &frame->tramp[TRAMP_SIZE]);
486 funct_desc_ptr = (func_descr_t *) ka->sa.sa_handler;
488 /* Allocate a dummy caller frame for the signal handler. */
489 newsp = (unsigned long)frame - __SIGNAL_FRAMESIZE;
490 err |= put_user(0, (unsigned long *)newsp);
492 /* Set up "regs" so we "return" to the signal handler. */
493 err |= get_user(regs->nip, &funct_desc_ptr->entry);
494 regs->link = (unsigned long) &frame->tramp[0];
495 regs->gpr[1] = newsp;
496 err |= get_user(regs->gpr[2], &funct_desc_ptr->toc);
497 regs->gpr[3] = signr;
498 regs->gpr[4] = (unsigned long) &frame->sc;
506 printk("badframe in setup_frame, regs=%p frame=%p newsp=%lx\n",
513 * OK, we're invoking a handler
516 handle_signal(unsigned long sig, struct k_sigaction *ka,
517 siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
519 /* Are we from a system call? */
520 if (regs->trap == 0x0C00
521 && ((int)regs->result == -ERESTARTNOHAND ||
522 ((int)regs->result == -ERESTARTSYS &&
523 !(ka->sa.sa_flags & SA_RESTART))))
524 regs->result = -EINTR;
526 /* Set up Signal Frame */
527 if (ka->sa.sa_flags & SA_SIGINFO)
528 setup_rt_frame(sig, ka, info, oldset, regs);
530 setup_frame(sig, ka, oldset, regs);
532 if (ka->sa.sa_flags & SA_ONESHOT)
533 ka->sa.sa_handler = SIG_DFL;
535 if (!(ka->sa.sa_flags & SA_NODEFER)) {
536 spin_lock_irq(¤t->sigmask_lock);
537 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
538 sigaddset(¤t->blocked,sig);
539 recalc_sigpending(current);
540 spin_unlock_irq(¤t->sigmask_lock);
545 get_signal_to_deliver(siginfo_t *info, struct pt_regs *regs)
549 struct k_sigaction *ka;
551 spin_lock_irq(¤t->sigmask_lock);
552 signr = dequeue_signal(¤t->blocked, info);
553 spin_unlock_irq(¤t->sigmask_lock);
558 if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
559 /* Let the debugger run. */
560 current->exit_code = signr;
561 current->state = TASK_STOPPED;
562 notify_parent(current, SIGCHLD);
565 /* We're back. Did the debugger cancel the sig? */
566 signr = current->exit_code;
569 current->exit_code = 0;
571 /* The debugger continued. Ignore SIGSTOP. */
572 if (signr == SIGSTOP)
575 /* Update the siginfo structure. Is this good? */
576 if (signr != info->si_signo) {
577 info->si_signo = signr;
579 info->si_code = SI_USER;
580 info->si_pid = current->p_pptr->pid;
581 info->si_uid = current->p_pptr->uid;
584 /* If the (new) signal is now blocked, requeue it. */
585 if (sigismember(¤t->blocked, signr)) {
586 send_sig_info(signr, info, current);
591 ka = ¤t->sig->action[signr-1];
593 if (ka->sa.sa_handler == SIG_IGN) {
594 if (signr != SIGCHLD)
596 /* Check for SIGCHLD: it's special. */
597 while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
602 if (ka->sa.sa_handler == SIG_DFL) {
603 int exit_code = signr;
605 /* Init gets no signals it doesn't want. */
606 if (current->pid == 1)
610 case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
613 case SIGTSTP: case SIGTTIN: case SIGTTOU:
614 if (is_orphaned_pgrp(current->pgrp))
619 struct signal_struct *sig;
620 current->state = TASK_STOPPED;
621 current->exit_code = signr;
622 sig = current->p_pptr->sig;
623 if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
624 notify_parent(current, SIGCHLD);
629 case SIGQUIT: case SIGILL: case SIGTRAP:
630 case SIGABRT: case SIGFPE: case SIGSEGV:
631 case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
632 if (do_coredump(signr, regs))
637 sig_exit(signr, exit_code, info);
647 * Note that 'init' is a special process: it doesn't get signals it doesn't
648 * want to handle. Thus you cannot kill init even with a SIGKILL even by
651 extern int do_signal32(sigset_t *oldset, struct pt_regs *regs);
654 do_signal(sigset_t *oldset, struct pt_regs *regs)
660 * If the current thread is 32 bit - invoke the
661 * 32 bit signal handling code
663 if (current->thread.flags & PPC_FLAG_32BIT)
664 return do_signal32(oldset, regs);
667 oldset = ¤t->blocked;
669 signr = get_signal_to_deliver(&info, regs);
671 struct k_sigaction *ka = ¤t->sig->action[signr-1];
673 /* Whee! Actually deliver the signal. */
674 handle_signal(signr, ka, &info, oldset, regs);
678 if (regs->trap == 0x0C00 /* System Call! */ &&
679 ((int)regs->result == -ERESTARTNOHAND ||
680 (int)regs->result == -ERESTARTSYS ||
681 (int)regs->result == -ERESTARTNOINTR)) {
682 regs->gpr[3] = regs->orig_gpr3;
683 regs->nip -= 4; /* Back up & retry system call */