2 * arch/sh/kernel/signal_64.c
4 * Copyright (C) 2000, 2001 Paolo Alberelli
5 * Copyright (C) 2003 - 2008 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 handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
48 sigset_t *oldset, struct pt_regs * regs);
51 handle_syscall_restart(struct pt_regs *regs, struct sigaction *sa)
53 /* If we're not from a syscall, bail out */
54 if (regs->syscall_nr < 0)
57 /* check for system call restart.. */
58 switch (regs->regs[REG_RET]) {
59 case -ERESTART_RESTARTBLOCK:
61 no_system_call_restart:
62 regs->regs[REG_RET] = -EINTR;
66 if (!(sa->sa_flags & SA_RESTART))
67 goto no_system_call_restart;
70 /* Decode syscall # */
71 regs->regs[REG_RET] = regs->syscall_nr;
78 * Note that 'init' is a special process: it doesn't get signals it doesn't
79 * want to handle. Thus you cannot kill init even with a SIGKILL even by
82 * Note that we go through the signals twice: once to check the signals that
83 * the kernel can handle, and then we build all the user-level signal handling
84 * stack-frames in one go after that.
86 static void do_signal(struct pt_regs *regs)
90 struct k_sigaction ka;
94 * We want the common case to go fast, which
95 * is why we may in certain cases get here from
96 * kernel mode. Just return without doing anything
102 if (current_thread_info()->status & TS_RESTORE_SIGMASK)
103 oldset = ¤t->saved_sigmask;
105 oldset = ¤t->blocked;
107 signr = get_signal_to_deliver(&info, &ka, regs, 0);
109 handle_syscall_restart(regs, &ka.sa);
111 /* Whee! Actually deliver the signal. */
112 if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
114 * If a signal was successfully delivered, the
115 * saved sigmask is in its frame, and we can
116 * clear the TS_RESTORE_SIGMASK flag.
118 current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
120 tracehook_signal_handler(signr, &info, &ka, regs,
121 test_thread_flag(TIF_SINGLESTEP));
126 /* Did we come from a system call? */
127 if (regs->syscall_nr >= 0) {
128 /* Restart the system call - no handlers present */
129 switch (regs->regs[REG_RET]) {
130 case -ERESTARTNOHAND:
132 case -ERESTARTNOINTR:
133 /* Decode Syscall # */
134 regs->regs[REG_RET] = regs->syscall_nr;
138 case -ERESTART_RESTARTBLOCK:
139 regs->regs[REG_RET] = __NR_restart_syscall;
145 /* No signal to deliver -- put the saved sigmask back */
146 restore_saved_sigmask();
150 * Atomically swap in the new signal mask, and wait for a signal.
153 sys_sigsuspend(old_sigset_t mask)
156 siginitset(&blocked, mask);
157 return sigsuspend(&blocked);
161 sys_sigaction(int sig, const struct old_sigaction __user *act,
162 struct old_sigaction __user *oact)
164 struct k_sigaction new_ka, old_ka;
169 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
170 __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
171 __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
172 __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
173 __get_user(mask, &act->sa_mask))
175 siginitset(&new_ka.sa.sa_mask, mask);
178 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
181 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
182 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
183 __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
184 __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
185 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
193 sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
194 unsigned long r4, unsigned long r5, unsigned long r6,
196 struct pt_regs * regs)
198 return do_sigaltstack(uss, uoss, REF_REG_SP);
202 * Do a signal return; undo the signal stack.
205 struct sigcontext sc;
206 unsigned long extramask[_NSIG_WORDS-1];
207 long long retcode[2];
211 struct siginfo __user *pinfo;
215 long long retcode[2];
220 restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
225 err |= __get_user (fpvalid, &sc->sc_fpvalid);
226 conditional_used_math(fpvalid);
230 if (current == last_task_used_math) {
231 last_task_used_math = NULL;
235 err |= __copy_from_user(¤t->thread.xstate->hardfpu, &sc->sc_fpregs[0],
236 (sizeof(long long) * 32) + (sizeof(int) * 1));
242 setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
247 fpvalid = !!used_math();
248 err |= __put_user(fpvalid, &sc->sc_fpvalid);
252 if (current == last_task_used_math) {
256 last_task_used_math = NULL;
260 err |= __copy_to_user(&sc->sc_fpregs[0], ¤t->thread.xstate->hardfpu,
261 (sizeof(long long) * 32) + (sizeof(int) * 1));
268 restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
273 setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
280 restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, long long *r2_p)
282 unsigned int err = 0;
283 unsigned long long current_sr, new_sr;
284 #define SR_MASK 0xffff8cfd
286 #define COPY(x) err |= __get_user(regs->x, &sc->sc_##x)
288 COPY(regs[0]); COPY(regs[1]); COPY(regs[2]); COPY(regs[3]);
289 COPY(regs[4]); COPY(regs[5]); COPY(regs[6]); COPY(regs[7]);
290 COPY(regs[8]); COPY(regs[9]); COPY(regs[10]); COPY(regs[11]);
291 COPY(regs[12]); COPY(regs[13]); COPY(regs[14]); COPY(regs[15]);
292 COPY(regs[16]); COPY(regs[17]); COPY(regs[18]); COPY(regs[19]);
293 COPY(regs[20]); COPY(regs[21]); COPY(regs[22]); COPY(regs[23]);
294 COPY(regs[24]); COPY(regs[25]); COPY(regs[26]); COPY(regs[27]);
295 COPY(regs[28]); COPY(regs[29]); COPY(regs[30]); COPY(regs[31]);
296 COPY(regs[32]); COPY(regs[33]); COPY(regs[34]); COPY(regs[35]);
297 COPY(regs[36]); COPY(regs[37]); COPY(regs[38]); COPY(regs[39]);
298 COPY(regs[40]); COPY(regs[41]); COPY(regs[42]); COPY(regs[43]);
299 COPY(regs[44]); COPY(regs[45]); COPY(regs[46]); COPY(regs[47]);
300 COPY(regs[48]); COPY(regs[49]); COPY(regs[50]); COPY(regs[51]);
301 COPY(regs[52]); COPY(regs[53]); COPY(regs[54]); COPY(regs[55]);
302 COPY(regs[56]); COPY(regs[57]); COPY(regs[58]); COPY(regs[59]);
303 COPY(regs[60]); COPY(regs[61]); COPY(regs[62]);
304 COPY(tregs[0]); COPY(tregs[1]); COPY(tregs[2]); COPY(tregs[3]);
305 COPY(tregs[4]); COPY(tregs[5]); COPY(tregs[6]); COPY(tregs[7]);
307 /* Prevent the signal handler manipulating SR in a way that can
308 crash the kernel. i.e. only allow S, Q, M, PR, SZ, FR to be
310 current_sr = regs->sr;
311 err |= __get_user(new_sr, &sc->sc_sr);
313 regs->sr |= (new_sr & ~SR_MASK);
319 /* Must do this last in case it sets regs->sr.fd (i.e. after rest of sr
320 * has been restored above.) */
321 err |= restore_sigcontext_fpu(regs, sc);
323 regs->syscall_nr = -1; /* disable syscall checks */
324 err |= __get_user(*r2_p, &sc->sc_regs[REG_RET]);
328 asmlinkage int sys_sigreturn(unsigned long r2, unsigned long r3,
329 unsigned long r4, unsigned long r5,
330 unsigned long r6, unsigned long r7,
331 struct pt_regs * regs)
333 struct sigframe __user *frame = (struct sigframe __user *) (long) REF_REG_SP;
337 /* Always make any pending restarted system calls return -EINTR */
338 current_thread_info()->restart_block.fn = do_no_restart_syscall;
340 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
343 if (__get_user(set.sig[0], &frame->sc.oldmask)
345 && __copy_from_user(&set.sig[1], &frame->extramask,
346 sizeof(frame->extramask))))
349 sigdelsetmask(&set, ~_BLOCKABLE);
350 set_current_blocked(&set);
352 if (restore_sigcontext(regs, &frame->sc, &ret))
359 force_sig(SIGSEGV, current);
363 asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
364 unsigned long r4, unsigned long r5,
365 unsigned long r6, unsigned long r7,
366 struct pt_regs * regs)
368 struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP;
373 /* Always make any pending restarted system calls return -EINTR */
374 current_thread_info()->restart_block.fn = do_no_restart_syscall;
376 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
379 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
382 sigdelsetmask(&set, ~_BLOCKABLE);
383 set_current_blocked(&set);
385 if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret))
389 if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
391 /* It is more difficult to avoid calling this function than to
392 call it and ignore errors. */
393 do_sigaltstack(&st, NULL, REF_REG_SP);
398 force_sig(SIGSEGV, current);
403 * Set up a signal frame.
406 setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
411 /* Do this first, otherwise is this sets sr->fd, that value isn't preserved. */
412 err |= setup_sigcontext_fpu(regs, sc);
414 #define COPY(x) err |= __put_user(regs->x, &sc->sc_##x)
416 COPY(regs[0]); COPY(regs[1]); COPY(regs[2]); COPY(regs[3]);
417 COPY(regs[4]); COPY(regs[5]); COPY(regs[6]); COPY(regs[7]);
418 COPY(regs[8]); COPY(regs[9]); COPY(regs[10]); COPY(regs[11]);
419 COPY(regs[12]); COPY(regs[13]); COPY(regs[14]); COPY(regs[15]);
420 COPY(regs[16]); COPY(regs[17]); COPY(regs[18]); COPY(regs[19]);
421 COPY(regs[20]); COPY(regs[21]); COPY(regs[22]); COPY(regs[23]);
422 COPY(regs[24]); COPY(regs[25]); COPY(regs[26]); COPY(regs[27]);
423 COPY(regs[28]); COPY(regs[29]); COPY(regs[30]); COPY(regs[31]);
424 COPY(regs[32]); COPY(regs[33]); COPY(regs[34]); COPY(regs[35]);
425 COPY(regs[36]); COPY(regs[37]); COPY(regs[38]); COPY(regs[39]);
426 COPY(regs[40]); COPY(regs[41]); COPY(regs[42]); COPY(regs[43]);
427 COPY(regs[44]); COPY(regs[45]); COPY(regs[46]); COPY(regs[47]);
428 COPY(regs[48]); COPY(regs[49]); COPY(regs[50]); COPY(regs[51]);
429 COPY(regs[52]); COPY(regs[53]); COPY(regs[54]); COPY(regs[55]);
430 COPY(regs[56]); COPY(regs[57]); COPY(regs[58]); COPY(regs[59]);
431 COPY(regs[60]); COPY(regs[61]); COPY(regs[62]);
432 COPY(tregs[0]); COPY(tregs[1]); COPY(tregs[2]); COPY(tregs[3]);
433 COPY(tregs[4]); COPY(tregs[5]); COPY(tregs[6]); COPY(tregs[7]);
438 err |= __put_user(mask, &sc->oldmask);
444 * Determine which stack to use..
446 static inline void __user *
447 get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
449 if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
450 sp = current->sas_ss_sp + current->sas_ss_size;
452 return (void __user *)((sp - frame_size) & -8ul);
455 void sa_default_restorer(void); /* See comments below */
456 void sa_default_rt_restorer(void); /* See comments below */
458 static int setup_frame(int sig, struct k_sigaction *ka,
459 sigset_t *set, struct pt_regs *regs)
461 struct sigframe __user *frame;
465 frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
467 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
470 signal = current_thread_info()->exec_domain
471 && current_thread_info()->exec_domain->signal_invmap
473 ? current_thread_info()->exec_domain->signal_invmap[sig]
476 err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
478 /* Give up earlier as i386, in case */
482 if (_NSIG_WORDS > 1) {
483 err |= __copy_to_user(frame->extramask, &set->sig[1],
484 sizeof(frame->extramask)); }
486 /* Give up earlier as i386, in case */
490 /* Set up to return from userspace. If provided, use a stub
491 already in userspace. */
492 if (ka->sa.sa_flags & SA_RESTORER) {
494 * On SH5 all edited pointers are subject to NEFF
496 DEREF_REG_PR = neff_sign_extend((unsigned long)
497 ka->sa.sa_restorer | 0x1);
500 * Different approach on SH5.
501 * . Endianness independent asm code gets placed in entry.S .
502 * This is limited to four ASM instructions corresponding
503 * to two long longs in size.
504 * . err checking is done on the else branch only
505 * . flush_icache_range() is called upon __put_user() only
506 * . all edited pointers are subject to NEFF
507 * . being code, linker turns ShMedia bit on, always
508 * dereference index -1.
510 DEREF_REG_PR = neff_sign_extend((unsigned long)
511 frame->retcode | 0x01);
513 if (__copy_to_user(frame->retcode,
514 (void *)((unsigned long)sa_default_restorer & (~1)), 16) != 0)
517 /* Cohere the trampoline with the I-cache. */
518 flush_cache_sigtramp(DEREF_REG_PR-1);
522 * Set up registers for signal handler.
523 * All edited pointers are subject to NEFF.
525 regs->regs[REG_SP] = neff_sign_extend((unsigned long)frame);
526 regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
529 The glibc profiling support for SH-5 needs to be passed a sigcontext
530 so it can retrieve the PC. At some point during 2003 the glibc
531 support was changed to receive the sigcontext through the 2nd
532 argument, but there are still versions of libc.so in use that use
533 the 3rd argument. Until libc.so is stabilised, pass the sigcontext
534 through both 2nd and 3rd arguments.
537 regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
538 regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
540 regs->pc = neff_sign_extend((unsigned long)ka->sa.sa_handler);
545 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
546 signal, current->comm, current->pid, frame,
547 regs->pc >> 32, regs->pc & 0xffffffff,
548 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
553 force_sigsegv(sig, current);
557 static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
558 sigset_t *set, struct pt_regs *regs)
560 struct rt_sigframe __user *frame;
564 frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
566 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
569 signal = current_thread_info()->exec_domain
570 && current_thread_info()->exec_domain->signal_invmap
572 ? current_thread_info()->exec_domain->signal_invmap[sig]
575 err |= __put_user(&frame->info, &frame->pinfo);
576 err |= __put_user(&frame->uc, &frame->puc);
577 err |= copy_siginfo_to_user(&frame->info, info);
579 /* Give up earlier as i386, in case */
583 /* Create the ucontext. */
584 err |= __put_user(0, &frame->uc.uc_flags);
585 err |= __put_user(0, &frame->uc.uc_link);
586 err |= __put_user((void *)current->sas_ss_sp,
587 &frame->uc.uc_stack.ss_sp);
588 err |= __put_user(sas_ss_flags(regs->regs[REG_SP]),
589 &frame->uc.uc_stack.ss_flags);
590 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
591 err |= setup_sigcontext(&frame->uc.uc_mcontext,
593 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
595 /* Give up earlier as i386, in case */
599 /* Set up to return from userspace. If provided, use a stub
600 already in userspace. */
601 if (ka->sa.sa_flags & SA_RESTORER) {
603 * On SH5 all edited pointers are subject to NEFF
605 DEREF_REG_PR = neff_sign_extend((unsigned long)
606 ka->sa.sa_restorer | 0x1);
609 * Different approach on SH5.
610 * . Endianness independent asm code gets placed in entry.S .
611 * This is limited to four ASM instructions corresponding
612 * to two long longs in size.
613 * . err checking is done on the else branch only
614 * . flush_icache_range() is called upon __put_user() only
615 * . all edited pointers are subject to NEFF
616 * . being code, linker turns ShMedia bit on, always
617 * dereference index -1.
619 DEREF_REG_PR = neff_sign_extend((unsigned long)
620 frame->retcode | 0x01);
622 if (__copy_to_user(frame->retcode,
623 (void *)((unsigned long)sa_default_rt_restorer & (~1)), 16) != 0)
626 /* Cohere the trampoline with the I-cache. */
627 flush_icache_range(DEREF_REG_PR-1, DEREF_REG_PR-1+15);
631 * Set up registers for signal handler.
632 * All edited pointers are subject to NEFF.
634 regs->regs[REG_SP] = neff_sign_extend((unsigned long)frame);
635 regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
636 regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->info;
637 regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->uc.uc_mcontext;
638 regs->pc = neff_sign_extend((unsigned long)ka->sa.sa_handler);
642 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
643 signal, current->comm, current->pid, frame,
644 regs->pc >> 32, regs->pc & 0xffffffff,
645 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
650 force_sigsegv(sig, current);
655 * OK, we're invoking a handler
658 handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
659 sigset_t *oldset, struct pt_regs * regs)
663 /* Set up the stack frame */
664 if (ka->sa.sa_flags & SA_SIGINFO)
665 ret = setup_rt_frame(sig, ka, info, oldset, regs);
667 ret = setup_frame(sig, ka, oldset, regs);
670 block_sigmask(ka, sig);
675 asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
677 if (thread_info_flags & _TIF_SIGPENDING)
680 if (thread_info_flags & _TIF_NOTIFY_RESUME) {
681 clear_thread_flag(TIF_NOTIFY_RESUME);
682 tracehook_notify_resume(regs);