2 * arch/sh/kernel/signal_64.c
4 * Copyright (C) 2000, 2001 Paolo Alberelli
5 * Copyright (C) 2003 Paul Mundt
6 * Copyright (C) 2004 Richard Curnow
8 * This file is subject to the terms and conditions of the GNU General Public
9 * License. See the file "COPYING" in the main directory of this archive
12 #include <linux/rwsem.h>
13 #include <linux/sched.h>
15 #include <linux/smp.h>
16 #include <linux/kernel.h>
17 #include <linux/signal.h>
18 #include <linux/errno.h>
19 #include <linux/wait.h>
20 #include <linux/personality.h>
21 #include <linux/freezer.h>
22 #include <linux/ptrace.h>
23 #include <linux/unistd.h>
24 #include <linux/stddef.h>
25 #include <linux/tracehook.h>
26 #include <asm/ucontext.h>
27 #include <asm/uaccess.h>
28 #include <asm/pgtable.h>
29 #include <asm/cacheflush.h>
38 #define REF_REG_RET regs->regs[REG_RET]
39 #define REF_REG_SP regs->regs[REG_SP]
40 #define DEREF_REG_PR regs->regs[REG_PR]
44 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
47 * Note that 'init' is a special process: it doesn't get signals it doesn't
48 * want to handle. Thus you cannot kill init even with a SIGKILL even by
51 * Note that we go through the signals twice: once to check the signals that
52 * the kernel can handle, and then we build all the user-level signal handling
53 * stack-frames in one go after that.
55 static int do_signal(struct pt_regs *regs, sigset_t *oldset)
59 struct k_sigaction ka;
62 * We want the common case to go fast, which
63 * is why we may in certain cases get here from
64 * kernel mode. Just return without doing anything
73 if (test_thread_flag(TIF_RESTORE_SIGMASK))
74 oldset = ¤t->saved_sigmask;
76 oldset = ¤t->blocked;
78 signr = get_signal_to_deliver(&info, &ka, regs, 0);
81 /* Whee! Actually deliver the signal. */
82 handle_signal(signr, &info, &ka, oldset, regs);
85 * If a signal was successfully delivered, the saved sigmask
86 * is in its frame, and we can clear the TIF_RESTORE_SIGMASK
89 if (test_thread_flag(TIF_RESTORE_SIGMASK))
90 clear_thread_flag(TIF_RESTORE_SIGMASK);
92 tracehook_signal_handler(signr, &info, &ka, regs, 0);
97 /* Did we come from a system call? */
98 if (regs->syscall_nr >= 0) {
99 /* Restart the system call - no handlers present */
100 switch (regs->regs[REG_RET]) {
101 case -ERESTARTNOHAND:
103 case -ERESTARTNOINTR:
104 /* Decode Syscall # */
105 regs->regs[REG_RET] = regs->syscall_nr;
109 case -ERESTART_RESTARTBLOCK:
110 regs->regs[REG_RET] = __NR_restart_syscall;
116 /* No signal to deliver -- put the saved sigmask back */
117 if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
118 clear_thread_flag(TIF_RESTORE_SIGMASK);
119 sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
126 * Atomically swap in the new signal mask, and wait for a signal.
130 sys_sigsuspend(old_sigset_t mask,
131 unsigned long r3, unsigned long r4, unsigned long r5,
132 unsigned long r6, unsigned long r7,
133 struct pt_regs * regs)
138 spin_lock_irq(¤t->sighand->siglock);
139 saveset = current->blocked;
140 siginitset(¤t->blocked, mask);
142 spin_unlock_irq(¤t->sighand->siglock);
144 REF_REG_RET = -EINTR;
146 current->state = TASK_INTERRUPTIBLE;
148 regs->pc += 4; /* because sys_sigreturn decrements the pc */
149 if (do_signal(regs, &saveset)) {
150 /* pc now points at signal handler. Need to decrement
151 it because entry.S will increment it. */
159 sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize,
160 unsigned long r4, unsigned long r5, unsigned long r6,
162 struct pt_regs * regs)
164 sigset_t saveset, newset;
166 /* XXX: Don't preclude handling different sized sigset_t's. */
167 if (sigsetsize != sizeof(sigset_t))
170 if (copy_from_user(&newset, unewset, sizeof(newset)))
172 sigdelsetmask(&newset, ~_BLOCKABLE);
173 spin_lock_irq(¤t->sighand->siglock);
174 saveset = current->blocked;
175 current->blocked = newset;
177 spin_unlock_irq(¤t->sighand->siglock);
179 REF_REG_RET = -EINTR;
181 current->state = TASK_INTERRUPTIBLE;
183 regs->pc += 4; /* because sys_sigreturn decrements the pc */
184 if (do_signal(regs, &saveset)) {
185 /* pc now points at signal handler. Need to decrement
186 it because entry.S will increment it. */
194 sys_sigaction(int sig, const struct old_sigaction __user *act,
195 struct old_sigaction __user *oact)
197 struct k_sigaction new_ka, old_ka;
202 if (!access_ok(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);
214 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
215 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
216 __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
218 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
219 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
226 sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
227 unsigned long r4, unsigned long r5, unsigned long r6,
229 struct pt_regs * regs)
231 return do_sigaltstack(uss, uoss, REF_REG_SP);
236 * Do a signal return; undo the signal stack.
241 struct sigcontext sc;
242 unsigned long extramask[_NSIG_WORDS-1];
243 long long retcode[2];
248 struct siginfo __user *pinfo;
252 long long retcode[2];
257 restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
262 err |= __get_user (fpvalid, &sc->sc_fpvalid);
263 conditional_used_math(fpvalid);
267 if (current == last_task_used_math) {
268 last_task_used_math = NULL;
272 err |= __copy_from_user(¤t->thread.fpu.hard, &sc->sc_fpregs[0],
273 (sizeof(long long) * 32) + (sizeof(int) * 1));
279 setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
284 fpvalid = !!used_math();
285 err |= __put_user(fpvalid, &sc->sc_fpvalid);
289 if (current == last_task_used_math) {
291 save_fpu(current, regs);
293 last_task_used_math = NULL;
297 err |= __copy_to_user(&sc->sc_fpregs[0], ¤t->thread.fpu.hard,
298 (sizeof(long long) * 32) + (sizeof(int) * 1));
305 restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
310 setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
317 restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, long long *r2_p)
319 unsigned int err = 0;
320 unsigned long long current_sr, new_sr;
321 #define SR_MASK 0xffff8cfd
323 #define COPY(x) err |= __get_user(regs->x, &sc->sc_##x)
325 COPY(regs[0]); COPY(regs[1]); COPY(regs[2]); COPY(regs[3]);
326 COPY(regs[4]); COPY(regs[5]); COPY(regs[6]); COPY(regs[7]);
327 COPY(regs[8]); COPY(regs[9]); COPY(regs[10]); COPY(regs[11]);
328 COPY(regs[12]); COPY(regs[13]); COPY(regs[14]); COPY(regs[15]);
329 COPY(regs[16]); COPY(regs[17]); COPY(regs[18]); COPY(regs[19]);
330 COPY(regs[20]); COPY(regs[21]); COPY(regs[22]); COPY(regs[23]);
331 COPY(regs[24]); COPY(regs[25]); COPY(regs[26]); COPY(regs[27]);
332 COPY(regs[28]); COPY(regs[29]); COPY(regs[30]); COPY(regs[31]);
333 COPY(regs[32]); COPY(regs[33]); COPY(regs[34]); COPY(regs[35]);
334 COPY(regs[36]); COPY(regs[37]); COPY(regs[38]); COPY(regs[39]);
335 COPY(regs[40]); COPY(regs[41]); COPY(regs[42]); COPY(regs[43]);
336 COPY(regs[44]); COPY(regs[45]); COPY(regs[46]); COPY(regs[47]);
337 COPY(regs[48]); COPY(regs[49]); COPY(regs[50]); COPY(regs[51]);
338 COPY(regs[52]); COPY(regs[53]); COPY(regs[54]); COPY(regs[55]);
339 COPY(regs[56]); COPY(regs[57]); COPY(regs[58]); COPY(regs[59]);
340 COPY(regs[60]); COPY(regs[61]); COPY(regs[62]);
341 COPY(tregs[0]); COPY(tregs[1]); COPY(tregs[2]); COPY(tregs[3]);
342 COPY(tregs[4]); COPY(tregs[5]); COPY(tregs[6]); COPY(tregs[7]);
344 /* Prevent the signal handler manipulating SR in a way that can
345 crash the kernel. i.e. only allow S, Q, M, PR, SZ, FR to be
347 current_sr = regs->sr;
348 err |= __get_user(new_sr, &sc->sc_sr);
350 regs->sr |= (new_sr & ~SR_MASK);
356 /* Must do this last in case it sets regs->sr.fd (i.e. after rest of sr
357 * has been restored above.) */
358 err |= restore_sigcontext_fpu(regs, sc);
360 regs->syscall_nr = -1; /* disable syscall checks */
361 err |= __get_user(*r2_p, &sc->sc_regs[REG_RET]);
365 asmlinkage int sys_sigreturn(unsigned long r2, unsigned long r3,
366 unsigned long r4, unsigned long r5,
367 unsigned long r6, unsigned long r7,
368 struct pt_regs * regs)
370 struct sigframe __user *frame = (struct sigframe __user *) (long) REF_REG_SP;
374 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
377 if (__get_user(set.sig[0], &frame->sc.oldmask)
379 && __copy_from_user(&set.sig[1], &frame->extramask,
380 sizeof(frame->extramask))))
383 sigdelsetmask(&set, ~_BLOCKABLE);
385 spin_lock_irq(¤t->sighand->siglock);
386 current->blocked = set;
388 spin_unlock_irq(¤t->sighand->siglock);
390 if (restore_sigcontext(regs, &frame->sc, &ret))
397 force_sig(SIGSEGV, current);
401 asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
402 unsigned long r4, unsigned long r5,
403 unsigned long r6, unsigned long r7,
404 struct pt_regs * regs)
406 struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP;
411 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
414 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
417 sigdelsetmask(&set, ~_BLOCKABLE);
418 spin_lock_irq(¤t->sighand->siglock);
419 current->blocked = set;
421 spin_unlock_irq(¤t->sighand->siglock);
423 if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret))
427 if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
429 /* It is more difficult to avoid calling this function than to
430 call it and ignore errors. */
431 do_sigaltstack(&st, NULL, REF_REG_SP);
436 force_sig(SIGSEGV, current);
441 * Set up a signal frame.
445 setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
450 /* Do this first, otherwise is this sets sr->fd, that value isn't preserved. */
451 err |= setup_sigcontext_fpu(regs, sc);
453 #define COPY(x) err |= __put_user(regs->x, &sc->sc_##x)
455 COPY(regs[0]); COPY(regs[1]); COPY(regs[2]); COPY(regs[3]);
456 COPY(regs[4]); COPY(regs[5]); COPY(regs[6]); COPY(regs[7]);
457 COPY(regs[8]); COPY(regs[9]); COPY(regs[10]); COPY(regs[11]);
458 COPY(regs[12]); COPY(regs[13]); COPY(regs[14]); COPY(regs[15]);
459 COPY(regs[16]); COPY(regs[17]); COPY(regs[18]); COPY(regs[19]);
460 COPY(regs[20]); COPY(regs[21]); COPY(regs[22]); COPY(regs[23]);
461 COPY(regs[24]); COPY(regs[25]); COPY(regs[26]); COPY(regs[27]);
462 COPY(regs[28]); COPY(regs[29]); COPY(regs[30]); COPY(regs[31]);
463 COPY(regs[32]); COPY(regs[33]); COPY(regs[34]); COPY(regs[35]);
464 COPY(regs[36]); COPY(regs[37]); COPY(regs[38]); COPY(regs[39]);
465 COPY(regs[40]); COPY(regs[41]); COPY(regs[42]); COPY(regs[43]);
466 COPY(regs[44]); COPY(regs[45]); COPY(regs[46]); COPY(regs[47]);
467 COPY(regs[48]); COPY(regs[49]); COPY(regs[50]); COPY(regs[51]);
468 COPY(regs[52]); COPY(regs[53]); COPY(regs[54]); COPY(regs[55]);
469 COPY(regs[56]); COPY(regs[57]); COPY(regs[58]); COPY(regs[59]);
470 COPY(regs[60]); COPY(regs[61]); COPY(regs[62]);
471 COPY(tregs[0]); COPY(tregs[1]); COPY(tregs[2]); COPY(tregs[3]);
472 COPY(tregs[4]); COPY(tregs[5]); COPY(tregs[6]); COPY(tregs[7]);
477 err |= __put_user(mask, &sc->oldmask);
483 * Determine which stack to use..
485 static inline void __user *
486 get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
488 if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
489 sp = current->sas_ss_sp + current->sas_ss_size;
491 return (void __user *)((sp - frame_size) & -8ul);
494 void sa_default_restorer(void); /* See comments below */
495 void sa_default_rt_restorer(void); /* See comments below */
497 static void setup_frame(int sig, struct k_sigaction *ka,
498 sigset_t *set, struct pt_regs *regs)
500 struct sigframe __user *frame;
504 frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
506 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
509 signal = current_thread_info()->exec_domain
510 && current_thread_info()->exec_domain->signal_invmap
512 ? current_thread_info()->exec_domain->signal_invmap[sig]
515 err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
517 /* Give up earlier as i386, in case */
521 if (_NSIG_WORDS > 1) {
522 err |= __copy_to_user(frame->extramask, &set->sig[1],
523 sizeof(frame->extramask)); }
525 /* Give up earlier as i386, in case */
529 /* Set up to return from userspace. If provided, use a stub
530 already in userspace. */
531 if (ka->sa.sa_flags & SA_RESTORER) {
532 DEREF_REG_PR = (unsigned long) ka->sa.sa_restorer | 0x1;
535 * On SH5 all edited pointers are subject to NEFF
537 DEREF_REG_PR = (DEREF_REG_PR & NEFF_SIGN) ?
538 (DEREF_REG_PR | NEFF_MASK) : DEREF_REG_PR;
541 * Different approach on SH5.
542 * . Endianness independent asm code gets placed in entry.S .
543 * This is limited to four ASM instructions corresponding
544 * to two long longs in size.
545 * . err checking is done on the else branch only
546 * . flush_icache_range() is called upon __put_user() only
547 * . all edited pointers are subject to NEFF
548 * . being code, linker turns ShMedia bit on, always
549 * dereference index -1.
551 DEREF_REG_PR = (unsigned long) frame->retcode | 0x01;
552 DEREF_REG_PR = (DEREF_REG_PR & NEFF_SIGN) ?
553 (DEREF_REG_PR | NEFF_MASK) : DEREF_REG_PR;
555 if (__copy_to_user(frame->retcode,
556 (unsigned long long)sa_default_restorer & (~1), 16) != 0)
559 /* Cohere the trampoline with the I-cache. */
560 flush_cache_sigtramp(DEREF_REG_PR-1);
564 * Set up registers for signal handler.
565 * All edited pointers are subject to NEFF.
567 regs->regs[REG_SP] = (unsigned long) frame;
568 regs->regs[REG_SP] = (regs->regs[REG_SP] & NEFF_SIGN) ?
569 (regs->regs[REG_SP] | NEFF_MASK) : regs->regs[REG_SP];
570 regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
573 The glibc profiling support for SH-5 needs to be passed a sigcontext
574 so it can retrieve the PC. At some point during 2003 the glibc
575 support was changed to receive the sigcontext through the 2nd
576 argument, but there are still versions of libc.so in use that use
577 the 3rd argument. Until libc.so is stabilised, pass the sigcontext
578 through both 2nd and 3rd arguments.
581 regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
582 regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
584 regs->pc = (unsigned long) ka->sa.sa_handler;
585 regs->pc = (regs->pc & NEFF_SIGN) ? (regs->pc | NEFF_MASK) : regs->pc;
591 printk("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
593 current->comm, current->pid, frame,
594 regs->pc >> 32, regs->pc & 0xffffffff,
595 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
601 force_sigsegv(sig, current);
604 static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
605 sigset_t *set, struct pt_regs *regs)
607 struct rt_sigframe __user *frame;
611 frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
613 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
616 signal = current_thread_info()->exec_domain
617 && current_thread_info()->exec_domain->signal_invmap
619 ? current_thread_info()->exec_domain->signal_invmap[sig]
622 err |= __put_user(&frame->info, &frame->pinfo);
623 err |= __put_user(&frame->uc, &frame->puc);
624 err |= copy_siginfo_to_user(&frame->info, info);
626 /* Give up earlier as i386, in case */
630 /* Create the ucontext. */
631 err |= __put_user(0, &frame->uc.uc_flags);
632 err |= __put_user(0, &frame->uc.uc_link);
633 err |= __put_user((void *)current->sas_ss_sp,
634 &frame->uc.uc_stack.ss_sp);
635 err |= __put_user(sas_ss_flags(regs->regs[REG_SP]),
636 &frame->uc.uc_stack.ss_flags);
637 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
638 err |= setup_sigcontext(&frame->uc.uc_mcontext,
640 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
642 /* Give up earlier as i386, in case */
646 /* Set up to return from userspace. If provided, use a stub
647 already in userspace. */
648 if (ka->sa.sa_flags & SA_RESTORER) {
649 DEREF_REG_PR = (unsigned long) ka->sa.sa_restorer | 0x1;
652 * On SH5 all edited pointers are subject to NEFF
654 DEREF_REG_PR = (DEREF_REG_PR & NEFF_SIGN) ?
655 (DEREF_REG_PR | NEFF_MASK) : DEREF_REG_PR;
658 * Different approach on SH5.
659 * . Endianness independent asm code gets placed in entry.S .
660 * This is limited to four ASM instructions corresponding
661 * to two long longs in size.
662 * . err checking is done on the else branch only
663 * . flush_icache_range() is called upon __put_user() only
664 * . all edited pointers are subject to NEFF
665 * . being code, linker turns ShMedia bit on, always
666 * dereference index -1.
669 DEREF_REG_PR = (unsigned long) frame->retcode | 0x01;
670 DEREF_REG_PR = (DEREF_REG_PR & NEFF_SIGN) ?
671 (DEREF_REG_PR | NEFF_MASK) : DEREF_REG_PR;
673 if (__copy_to_user(frame->retcode,
674 (unsigned long long)sa_default_rt_restorer & (~1), 16) != 0)
677 flush_icache_range(DEREF_REG_PR-1, DEREF_REG_PR-1+15);
681 * Set up registers for signal handler.
682 * All edited pointers are subject to NEFF.
684 regs->regs[REG_SP] = (unsigned long) frame;
685 regs->regs[REG_SP] = (regs->regs[REG_SP] & NEFF_SIGN) ?
686 (regs->regs[REG_SP] | NEFF_MASK) : regs->regs[REG_SP];
687 regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
688 regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->info;
689 regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->uc.uc_mcontext;
690 regs->pc = (unsigned long) ka->sa.sa_handler;
691 regs->pc = (regs->pc & NEFF_SIGN) ? (regs->pc | NEFF_MASK) : regs->pc;
697 printk("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
699 current->comm, current->pid, frame,
700 regs->pc >> 32, regs->pc & 0xffffffff,
701 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
707 force_sigsegv(sig, current);
711 * OK, we're invoking a handler
715 handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
716 sigset_t *oldset, struct pt_regs * regs)
718 /* Are we from a system call? */
719 if (regs->syscall_nr >= 0) {
720 /* If so, check system call restarting.. */
721 switch (regs->regs[REG_RET]) {
722 case -ERESTART_RESTARTBLOCK:
723 case -ERESTARTNOHAND:
724 no_system_call_restart:
725 regs->regs[REG_RET] = -EINTR;
729 if (!(ka->sa.sa_flags & SA_RESTART))
730 goto no_system_call_restart;
732 case -ERESTARTNOINTR:
733 /* Decode syscall # */
734 regs->regs[REG_RET] = regs->syscall_nr;
739 /* Set up the stack frame */
740 if (ka->sa.sa_flags & SA_SIGINFO)
741 setup_rt_frame(sig, ka, info, oldset, regs);
743 setup_frame(sig, ka, oldset, regs);
745 spin_lock_irq(¤t->sighand->siglock);
746 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
747 if (!(ka->sa.sa_flags & SA_NODEFER))
748 sigaddset(¤t->blocked,sig);
750 spin_unlock_irq(¤t->sighand->siglock);
753 asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
755 if (thread_info_flags & _TIF_SIGPENDING)
758 if (thread_info_flags & _TIF_NOTIFY_RESUME) {
759 clear_thread_flag(TIF_NOTIFY_RESUME);
760 tracehook_notify_resume(regs);