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]
45 handle_signal(unsigned long sig
, siginfo_t
*info
, struct k_sigaction
*ka
,
46 struct pt_regs
* regs
);
49 handle_syscall_restart(struct pt_regs
*regs
, struct sigaction
*sa
)
51 /* If we're not from a syscall, bail out */
52 if (regs
->syscall_nr
< 0)
55 /* check for system call restart.. */
56 switch (regs
->regs
[REG_RET
]) {
57 case -ERESTART_RESTARTBLOCK
:
59 no_system_call_restart
:
60 regs
->regs
[REG_RET
] = -EINTR
;
64 if (!(sa
->sa_flags
& SA_RESTART
))
65 goto no_system_call_restart
;
68 /* Decode syscall # */
69 regs
->regs
[REG_RET
] = regs
->syscall_nr
;
76 * Note that 'init' is a special process: it doesn't get signals it doesn't
77 * want to handle. Thus you cannot kill init even with a SIGKILL even by
80 * Note that we go through the signals twice: once to check the signals that
81 * the kernel can handle, and then we build all the user-level signal handling
82 * stack-frames in one go after that.
84 static void do_signal(struct pt_regs
*regs
)
88 struct k_sigaction ka
;
91 * We want the common case to go fast, which
92 * is why we may in certain cases get here from
93 * kernel mode. Just return without doing anything
99 signr
= get_signal_to_deliver(&info
, &ka
, regs
, 0);
101 handle_syscall_restart(regs
, &ka
.sa
);
103 /* Whee! Actually deliver the signal. */
104 handle_signal(signr
, &info
, &ka
, regs
);
108 /* Did we come from a system call? */
109 if (regs
->syscall_nr
>= 0) {
110 /* Restart the system call - no handlers present */
111 switch (regs
->regs
[REG_RET
]) {
112 case -ERESTARTNOHAND
:
114 case -ERESTARTNOINTR
:
115 /* Decode Syscall # */
116 regs
->regs
[REG_RET
] = regs
->syscall_nr
;
120 case -ERESTART_RESTARTBLOCK
:
121 regs
->regs
[REG_RET
] = __NR_restart_syscall
;
127 /* No signal to deliver -- put the saved sigmask back */
128 restore_saved_sigmask();
132 * Atomically swap in the new signal mask, and wait for a signal.
135 sys_sigsuspend(old_sigset_t mask
)
138 siginitset(&blocked
, mask
);
139 return sigsuspend(&blocked
);
143 sys_sigaction(int sig
, const struct old_sigaction __user
*act
,
144 struct old_sigaction __user
*oact
)
146 struct k_sigaction new_ka
, old_ka
;
151 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)) ||
152 __get_user(new_ka
.sa
.sa_handler
, &act
->sa_handler
) ||
153 __get_user(new_ka
.sa
.sa_restorer
, &act
->sa_restorer
) ||
154 __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
) ||
155 __get_user(mask
, &act
->sa_mask
))
157 siginitset(&new_ka
.sa
.sa_mask
, mask
);
160 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
163 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)) ||
164 __put_user(old_ka
.sa
.sa_handler
, &oact
->sa_handler
) ||
165 __put_user(old_ka
.sa
.sa_restorer
, &oact
->sa_restorer
) ||
166 __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
) ||
167 __put_user(old_ka
.sa
.sa_mask
.sig
[0], &oact
->sa_mask
))
175 sys_sigaltstack(const stack_t __user
*uss
, stack_t __user
*uoss
,
176 unsigned long r4
, unsigned long r5
, unsigned long r6
,
178 struct pt_regs
* regs
)
180 return do_sigaltstack(uss
, uoss
, REF_REG_SP
);
184 * Do a signal return; undo the signal stack.
187 struct sigcontext sc
;
188 unsigned long extramask
[_NSIG_WORDS
-1];
189 long long retcode
[2];
193 struct siginfo __user
*pinfo
;
197 long long retcode
[2];
202 restore_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
207 err
|= __get_user (fpvalid
, &sc
->sc_fpvalid
);
208 conditional_used_math(fpvalid
);
212 if (current
== last_task_used_math
) {
213 last_task_used_math
= NULL
;
217 err
|= __copy_from_user(¤t
->thread
.xstate
->hardfpu
, &sc
->sc_fpregs
[0],
218 (sizeof(long long) * 32) + (sizeof(int) * 1));
224 setup_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
229 fpvalid
= !!used_math();
230 err
|= __put_user(fpvalid
, &sc
->sc_fpvalid
);
234 if (current
== last_task_used_math
) {
238 last_task_used_math
= NULL
;
242 err
|= __copy_to_user(&sc
->sc_fpregs
[0], ¤t
->thread
.xstate
->hardfpu
,
243 (sizeof(long long) * 32) + (sizeof(int) * 1));
250 restore_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
255 setup_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
262 restore_sigcontext(struct pt_regs
*regs
, struct sigcontext __user
*sc
, long long *r2_p
)
264 unsigned int err
= 0;
265 unsigned long long current_sr
, new_sr
;
266 #define SR_MASK 0xffff8cfd
268 #define COPY(x) err |= __get_user(regs->x, &sc->sc_##x)
270 COPY(regs
[0]); COPY(regs
[1]); COPY(regs
[2]); COPY(regs
[3]);
271 COPY(regs
[4]); COPY(regs
[5]); COPY(regs
[6]); COPY(regs
[7]);
272 COPY(regs
[8]); COPY(regs
[9]); COPY(regs
[10]); COPY(regs
[11]);
273 COPY(regs
[12]); COPY(regs
[13]); COPY(regs
[14]); COPY(regs
[15]);
274 COPY(regs
[16]); COPY(regs
[17]); COPY(regs
[18]); COPY(regs
[19]);
275 COPY(regs
[20]); COPY(regs
[21]); COPY(regs
[22]); COPY(regs
[23]);
276 COPY(regs
[24]); COPY(regs
[25]); COPY(regs
[26]); COPY(regs
[27]);
277 COPY(regs
[28]); COPY(regs
[29]); COPY(regs
[30]); COPY(regs
[31]);
278 COPY(regs
[32]); COPY(regs
[33]); COPY(regs
[34]); COPY(regs
[35]);
279 COPY(regs
[36]); COPY(regs
[37]); COPY(regs
[38]); COPY(regs
[39]);
280 COPY(regs
[40]); COPY(regs
[41]); COPY(regs
[42]); COPY(regs
[43]);
281 COPY(regs
[44]); COPY(regs
[45]); COPY(regs
[46]); COPY(regs
[47]);
282 COPY(regs
[48]); COPY(regs
[49]); COPY(regs
[50]); COPY(regs
[51]);
283 COPY(regs
[52]); COPY(regs
[53]); COPY(regs
[54]); COPY(regs
[55]);
284 COPY(regs
[56]); COPY(regs
[57]); COPY(regs
[58]); COPY(regs
[59]);
285 COPY(regs
[60]); COPY(regs
[61]); COPY(regs
[62]);
286 COPY(tregs
[0]); COPY(tregs
[1]); COPY(tregs
[2]); COPY(tregs
[3]);
287 COPY(tregs
[4]); COPY(tregs
[5]); COPY(tregs
[6]); COPY(tregs
[7]);
289 /* Prevent the signal handler manipulating SR in a way that can
290 crash the kernel. i.e. only allow S, Q, M, PR, SZ, FR to be
292 current_sr
= regs
->sr
;
293 err
|= __get_user(new_sr
, &sc
->sc_sr
);
295 regs
->sr
|= (new_sr
& ~SR_MASK
);
301 /* Must do this last in case it sets regs->sr.fd (i.e. after rest of sr
302 * has been restored above.) */
303 err
|= restore_sigcontext_fpu(regs
, sc
);
305 regs
->syscall_nr
= -1; /* disable syscall checks */
306 err
|= __get_user(*r2_p
, &sc
->sc_regs
[REG_RET
]);
310 asmlinkage
int sys_sigreturn(unsigned long r2
, unsigned long r3
,
311 unsigned long r4
, unsigned long r5
,
312 unsigned long r6
, unsigned long r7
,
313 struct pt_regs
* regs
)
315 struct sigframe __user
*frame
= (struct sigframe __user
*) (long) REF_REG_SP
;
319 /* Always make any pending restarted system calls return -EINTR */
320 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
322 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
325 if (__get_user(set
.sig
[0], &frame
->sc
.oldmask
)
327 && __copy_from_user(&set
.sig
[1], &frame
->extramask
,
328 sizeof(frame
->extramask
))))
331 set_current_blocked(&set
);
333 if (restore_sigcontext(regs
, &frame
->sc
, &ret
))
340 force_sig(SIGSEGV
, current
);
344 asmlinkage
int sys_rt_sigreturn(unsigned long r2
, unsigned long r3
,
345 unsigned long r4
, unsigned long r5
,
346 unsigned long r6
, unsigned long r7
,
347 struct pt_regs
* regs
)
349 struct rt_sigframe __user
*frame
= (struct rt_sigframe __user
*) (long) REF_REG_SP
;
354 /* Always make any pending restarted system calls return -EINTR */
355 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
357 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
360 if (__copy_from_user(&set
, &frame
->uc
.uc_sigmask
, sizeof(set
)))
363 set_current_blocked(&set
);
365 if (restore_sigcontext(regs
, &frame
->uc
.uc_mcontext
, &ret
))
369 if (__copy_from_user(&st
, &frame
->uc
.uc_stack
, sizeof(st
)))
371 /* It is more difficult to avoid calling this function than to
372 call it and ignore errors. */
373 do_sigaltstack(&st
, NULL
, REF_REG_SP
);
378 force_sig(SIGSEGV
, current
);
383 * Set up a signal frame.
386 setup_sigcontext(struct sigcontext __user
*sc
, struct pt_regs
*regs
,
391 /* Do this first, otherwise is this sets sr->fd, that value isn't preserved. */
392 err
|= setup_sigcontext_fpu(regs
, sc
);
394 #define COPY(x) err |= __put_user(regs->x, &sc->sc_##x)
396 COPY(regs
[0]); COPY(regs
[1]); COPY(regs
[2]); COPY(regs
[3]);
397 COPY(regs
[4]); COPY(regs
[5]); COPY(regs
[6]); COPY(regs
[7]);
398 COPY(regs
[8]); COPY(regs
[9]); COPY(regs
[10]); COPY(regs
[11]);
399 COPY(regs
[12]); COPY(regs
[13]); COPY(regs
[14]); COPY(regs
[15]);
400 COPY(regs
[16]); COPY(regs
[17]); COPY(regs
[18]); COPY(regs
[19]);
401 COPY(regs
[20]); COPY(regs
[21]); COPY(regs
[22]); COPY(regs
[23]);
402 COPY(regs
[24]); COPY(regs
[25]); COPY(regs
[26]); COPY(regs
[27]);
403 COPY(regs
[28]); COPY(regs
[29]); COPY(regs
[30]); COPY(regs
[31]);
404 COPY(regs
[32]); COPY(regs
[33]); COPY(regs
[34]); COPY(regs
[35]);
405 COPY(regs
[36]); COPY(regs
[37]); COPY(regs
[38]); COPY(regs
[39]);
406 COPY(regs
[40]); COPY(regs
[41]); COPY(regs
[42]); COPY(regs
[43]);
407 COPY(regs
[44]); COPY(regs
[45]); COPY(regs
[46]); COPY(regs
[47]);
408 COPY(regs
[48]); COPY(regs
[49]); COPY(regs
[50]); COPY(regs
[51]);
409 COPY(regs
[52]); COPY(regs
[53]); COPY(regs
[54]); COPY(regs
[55]);
410 COPY(regs
[56]); COPY(regs
[57]); COPY(regs
[58]); COPY(regs
[59]);
411 COPY(regs
[60]); COPY(regs
[61]); COPY(regs
[62]);
412 COPY(tregs
[0]); COPY(tregs
[1]); COPY(tregs
[2]); COPY(tregs
[3]);
413 COPY(tregs
[4]); COPY(tregs
[5]); COPY(tregs
[6]); COPY(tregs
[7]);
418 err
|= __put_user(mask
, &sc
->oldmask
);
424 * Determine which stack to use..
426 static inline void __user
*
427 get_sigframe(struct k_sigaction
*ka
, unsigned long sp
, size_t frame_size
)
429 if ((ka
->sa
.sa_flags
& SA_ONSTACK
) != 0 && ! sas_ss_flags(sp
))
430 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
432 return (void __user
*)((sp
- frame_size
) & -8ul);
435 void sa_default_restorer(void); /* See comments below */
436 void sa_default_rt_restorer(void); /* See comments below */
438 static int setup_frame(int sig
, struct k_sigaction
*ka
,
439 sigset_t
*set
, struct pt_regs
*regs
)
441 struct sigframe __user
*frame
;
445 frame
= get_sigframe(ka
, regs
->regs
[REG_SP
], sizeof(*frame
));
447 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
450 signal
= current_thread_info()->exec_domain
451 && current_thread_info()->exec_domain
->signal_invmap
453 ? current_thread_info()->exec_domain
->signal_invmap
[sig
]
456 err
|= setup_sigcontext(&frame
->sc
, regs
, set
->sig
[0]);
458 /* Give up earlier as i386, in case */
462 if (_NSIG_WORDS
> 1) {
463 err
|= __copy_to_user(frame
->extramask
, &set
->sig
[1],
464 sizeof(frame
->extramask
)); }
466 /* Give up earlier as i386, in case */
470 /* Set up to return from userspace. If provided, use a stub
471 already in userspace. */
472 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
474 * On SH5 all edited pointers are subject to NEFF
476 DEREF_REG_PR
= neff_sign_extend((unsigned long)
477 ka
->sa
.sa_restorer
| 0x1);
480 * Different approach on SH5.
481 * . Endianness independent asm code gets placed in entry.S .
482 * This is limited to four ASM instructions corresponding
483 * to two long longs in size.
484 * . err checking is done on the else branch only
485 * . flush_icache_range() is called upon __put_user() only
486 * . all edited pointers are subject to NEFF
487 * . being code, linker turns ShMedia bit on, always
488 * dereference index -1.
490 DEREF_REG_PR
= neff_sign_extend((unsigned long)
491 frame
->retcode
| 0x01);
493 if (__copy_to_user(frame
->retcode
,
494 (void *)((unsigned long)sa_default_restorer
& (~1)), 16) != 0)
497 /* Cohere the trampoline with the I-cache. */
498 flush_cache_sigtramp(DEREF_REG_PR
-1);
502 * Set up registers for signal handler.
503 * All edited pointers are subject to NEFF.
505 regs
->regs
[REG_SP
] = neff_sign_extend((unsigned long)frame
);
506 regs
->regs
[REG_ARG1
] = signal
; /* Arg for signal handler */
509 The glibc profiling support for SH-5 needs to be passed a sigcontext
510 so it can retrieve the PC. At some point during 2003 the glibc
511 support was changed to receive the sigcontext through the 2nd
512 argument, but there are still versions of libc.so in use that use
513 the 3rd argument. Until libc.so is stabilised, pass the sigcontext
514 through both 2nd and 3rd arguments.
517 regs
->regs
[REG_ARG2
] = (unsigned long long)(unsigned long)(signed long)&frame
->sc
;
518 regs
->regs
[REG_ARG3
] = (unsigned long long)(unsigned long)(signed long)&frame
->sc
;
520 regs
->pc
= neff_sign_extend((unsigned long)ka
->sa
.sa_handler
);
525 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
526 signal
, current
->comm
, current
->pid
, frame
,
527 regs
->pc
>> 32, regs
->pc
& 0xffffffff,
528 DEREF_REG_PR
>> 32, DEREF_REG_PR
& 0xffffffff);
533 force_sigsegv(sig
, current
);
537 static int setup_rt_frame(int sig
, struct k_sigaction
*ka
, siginfo_t
*info
,
538 sigset_t
*set
, struct pt_regs
*regs
)
540 struct rt_sigframe __user
*frame
;
544 frame
= get_sigframe(ka
, regs
->regs
[REG_SP
], sizeof(*frame
));
546 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
549 signal
= current_thread_info()->exec_domain
550 && current_thread_info()->exec_domain
->signal_invmap
552 ? current_thread_info()->exec_domain
->signal_invmap
[sig
]
555 err
|= __put_user(&frame
->info
, &frame
->pinfo
);
556 err
|= __put_user(&frame
->uc
, &frame
->puc
);
557 err
|= copy_siginfo_to_user(&frame
->info
, info
);
559 /* Give up earlier as i386, in case */
563 /* Create the ucontext. */
564 err
|= __put_user(0, &frame
->uc
.uc_flags
);
565 err
|= __put_user(0, &frame
->uc
.uc_link
);
566 err
|= __put_user((void *)current
->sas_ss_sp
,
567 &frame
->uc
.uc_stack
.ss_sp
);
568 err
|= __put_user(sas_ss_flags(regs
->regs
[REG_SP
]),
569 &frame
->uc
.uc_stack
.ss_flags
);
570 err
|= __put_user(current
->sas_ss_size
, &frame
->uc
.uc_stack
.ss_size
);
571 err
|= setup_sigcontext(&frame
->uc
.uc_mcontext
,
573 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
575 /* Give up earlier as i386, in case */
579 /* Set up to return from userspace. If provided, use a stub
580 already in userspace. */
581 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
583 * On SH5 all edited pointers are subject to NEFF
585 DEREF_REG_PR
= neff_sign_extend((unsigned long)
586 ka
->sa
.sa_restorer
| 0x1);
589 * Different approach on SH5.
590 * . Endianness independent asm code gets placed in entry.S .
591 * This is limited to four ASM instructions corresponding
592 * to two long longs in size.
593 * . err checking is done on the else branch only
594 * . flush_icache_range() is called upon __put_user() only
595 * . all edited pointers are subject to NEFF
596 * . being code, linker turns ShMedia bit on, always
597 * dereference index -1.
599 DEREF_REG_PR
= neff_sign_extend((unsigned long)
600 frame
->retcode
| 0x01);
602 if (__copy_to_user(frame
->retcode
,
603 (void *)((unsigned long)sa_default_rt_restorer
& (~1)), 16) != 0)
606 /* Cohere the trampoline with the I-cache. */
607 flush_icache_range(DEREF_REG_PR
-1, DEREF_REG_PR
-1+15);
611 * Set up registers for signal handler.
612 * All edited pointers are subject to NEFF.
614 regs
->regs
[REG_SP
] = neff_sign_extend((unsigned long)frame
);
615 regs
->regs
[REG_ARG1
] = signal
; /* Arg for signal handler */
616 regs
->regs
[REG_ARG2
] = (unsigned long long)(unsigned long)(signed long)&frame
->info
;
617 regs
->regs
[REG_ARG3
] = (unsigned long long)(unsigned long)(signed long)&frame
->uc
.uc_mcontext
;
618 regs
->pc
= neff_sign_extend((unsigned long)ka
->sa
.sa_handler
);
622 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
623 signal
, current
->comm
, current
->pid
, frame
,
624 regs
->pc
>> 32, regs
->pc
& 0xffffffff,
625 DEREF_REG_PR
>> 32, DEREF_REG_PR
& 0xffffffff);
630 force_sigsegv(sig
, current
);
635 * OK, we're invoking a handler
638 handle_signal(unsigned long sig
, siginfo_t
*info
, struct k_sigaction
*ka
,
639 struct pt_regs
* regs
)
641 sigset_t
*oldset
= sigmask_to_save();
644 /* Set up the stack frame */
645 if (ka
->sa
.sa_flags
& SA_SIGINFO
)
646 ret
= setup_rt_frame(sig
, ka
, info
, oldset
, regs
);
648 ret
= setup_frame(sig
, ka
, oldset
, regs
);
653 signal_delivered(sig
, info
, ka
, regs
,
654 test_thread_flag(TIF_SINGLESTEP
));
657 asmlinkage
void do_notify_resume(struct pt_regs
*regs
, unsigned long thread_info_flags
)
659 if (thread_info_flags
& _TIF_SIGPENDING
)
662 if (thread_info_flags
& _TIF_NOTIFY_RESUME
) {
663 clear_thread_flag(TIF_NOTIFY_RESUME
);
664 tracehook_notify_resume(regs
);