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/ptrace.h>
22 #include <linux/unistd.h>
23 #include <linux/stddef.h>
24 #include <linux/tracehook.h>
25 #include <asm/ucontext.h>
26 #include <asm/uaccess.h>
27 #include <asm/pgtable.h>
28 #include <asm/cacheflush.h>
37 #define REF_REG_RET regs->regs[REG_RET]
38 #define REF_REG_SP regs->regs[REG_SP]
39 #define DEREF_REG_PR regs->regs[REG_PR]
44 handle_signal(struct ksignal
*ksig
, struct pt_regs
*regs
);
47 handle_syscall_restart(struct pt_regs
*regs
, struct sigaction
*sa
)
49 /* If we're not from a syscall, bail out */
50 if (regs
->syscall_nr
< 0)
53 /* check for system call restart.. */
54 switch (regs
->regs
[REG_RET
]) {
55 case -ERESTART_RESTARTBLOCK
:
57 no_system_call_restart
:
58 regs
->regs
[REG_RET
] = -EINTR
;
62 if (!(sa
->sa_flags
& SA_RESTART
))
63 goto no_system_call_restart
;
66 /* Decode syscall # */
67 regs
->regs
[REG_RET
] = regs
->syscall_nr
;
74 * Note that 'init' is a special process: it doesn't get signals it doesn't
75 * want to handle. Thus you cannot kill init even with a SIGKILL even by
78 * Note that we go through the signals twice: once to check the signals that
79 * the kernel can handle, and then we build all the user-level signal handling
80 * stack-frames in one go after that.
82 static void do_signal(struct pt_regs
*regs
)
87 * We want the common case to go fast, which
88 * is why we may in certain cases get here from
89 * kernel mode. Just return without doing anything
95 if (get_signal(&ksig
)) {
96 handle_syscall_restart(regs
, &ksig
.ka
.sa
);
98 /* Whee! Actually deliver the signal. */
99 handle_signal(&ksig
, regs
);
103 /* Did we come from a system call? */
104 if (regs
->syscall_nr
>= 0) {
105 /* Restart the system call - no handlers present */
106 switch (regs
->regs
[REG_RET
]) {
107 case -ERESTARTNOHAND
:
109 case -ERESTARTNOINTR
:
110 /* Decode Syscall # */
111 regs
->regs
[REG_RET
] = regs
->syscall_nr
;
115 case -ERESTART_RESTARTBLOCK
:
116 regs
->regs
[REG_RET
] = __NR_restart_syscall
;
122 /* No signal to deliver -- put the saved sigmask back */
123 restore_saved_sigmask();
127 * Do a signal return; undo the signal stack.
130 struct sigcontext sc
;
131 unsigned long extramask
[_NSIG_WORDS
-1];
132 long long retcode
[2];
136 struct siginfo __user
*pinfo
;
140 long long retcode
[2];
145 restore_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
150 err
|= __get_user (fpvalid
, &sc
->sc_fpvalid
);
151 conditional_used_math(fpvalid
);
155 if (current
== last_task_used_math
) {
156 last_task_used_math
= NULL
;
160 err
|= __copy_from_user(¤t
->thread
.xstate
->hardfpu
, &sc
->sc_fpregs
[0],
161 (sizeof(long long) * 32) + (sizeof(int) * 1));
167 setup_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
172 fpvalid
= !!used_math();
173 err
|= __put_user(fpvalid
, &sc
->sc_fpvalid
);
177 if (current
== last_task_used_math
) {
181 last_task_used_math
= NULL
;
185 err
|= __copy_to_user(&sc
->sc_fpregs
[0], ¤t
->thread
.xstate
->hardfpu
,
186 (sizeof(long long) * 32) + (sizeof(int) * 1));
193 restore_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
198 setup_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
205 restore_sigcontext(struct pt_regs
*regs
, struct sigcontext __user
*sc
, long long *r2_p
)
207 unsigned int err
= 0;
208 unsigned long long current_sr
, new_sr
;
209 #define SR_MASK 0xffff8cfd
211 #define COPY(x) err |= __get_user(regs->x, &sc->sc_##x)
213 COPY(regs
[0]); COPY(regs
[1]); COPY(regs
[2]); COPY(regs
[3]);
214 COPY(regs
[4]); COPY(regs
[5]); COPY(regs
[6]); COPY(regs
[7]);
215 COPY(regs
[8]); COPY(regs
[9]); COPY(regs
[10]); COPY(regs
[11]);
216 COPY(regs
[12]); COPY(regs
[13]); COPY(regs
[14]); COPY(regs
[15]);
217 COPY(regs
[16]); COPY(regs
[17]); COPY(regs
[18]); COPY(regs
[19]);
218 COPY(regs
[20]); COPY(regs
[21]); COPY(regs
[22]); COPY(regs
[23]);
219 COPY(regs
[24]); COPY(regs
[25]); COPY(regs
[26]); COPY(regs
[27]);
220 COPY(regs
[28]); COPY(regs
[29]); COPY(regs
[30]); COPY(regs
[31]);
221 COPY(regs
[32]); COPY(regs
[33]); COPY(regs
[34]); COPY(regs
[35]);
222 COPY(regs
[36]); COPY(regs
[37]); COPY(regs
[38]); COPY(regs
[39]);
223 COPY(regs
[40]); COPY(regs
[41]); COPY(regs
[42]); COPY(regs
[43]);
224 COPY(regs
[44]); COPY(regs
[45]); COPY(regs
[46]); COPY(regs
[47]);
225 COPY(regs
[48]); COPY(regs
[49]); COPY(regs
[50]); COPY(regs
[51]);
226 COPY(regs
[52]); COPY(regs
[53]); COPY(regs
[54]); COPY(regs
[55]);
227 COPY(regs
[56]); COPY(regs
[57]); COPY(regs
[58]); COPY(regs
[59]);
228 COPY(regs
[60]); COPY(regs
[61]); COPY(regs
[62]);
229 COPY(tregs
[0]); COPY(tregs
[1]); COPY(tregs
[2]); COPY(tregs
[3]);
230 COPY(tregs
[4]); COPY(tregs
[5]); COPY(tregs
[6]); COPY(tregs
[7]);
232 /* Prevent the signal handler manipulating SR in a way that can
233 crash the kernel. i.e. only allow S, Q, M, PR, SZ, FR to be
235 current_sr
= regs
->sr
;
236 err
|= __get_user(new_sr
, &sc
->sc_sr
);
238 regs
->sr
|= (new_sr
& ~SR_MASK
);
244 /* Must do this last in case it sets regs->sr.fd (i.e. after rest of sr
245 * has been restored above.) */
246 err
|= restore_sigcontext_fpu(regs
, sc
);
248 regs
->syscall_nr
= -1; /* disable syscall checks */
249 err
|= __get_user(*r2_p
, &sc
->sc_regs
[REG_RET
]);
253 asmlinkage
int sys_sigreturn(unsigned long r2
, unsigned long r3
,
254 unsigned long r4
, unsigned long r5
,
255 unsigned long r6
, unsigned long r7
,
256 struct pt_regs
* regs
)
258 struct sigframe __user
*frame
= (struct sigframe __user
*) (long) REF_REG_SP
;
262 /* Always make any pending restarted system calls return -EINTR */
263 current
->restart_block
.fn
= do_no_restart_syscall
;
265 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
268 if (__get_user(set
.sig
[0], &frame
->sc
.oldmask
)
270 && __copy_from_user(&set
.sig
[1], &frame
->extramask
,
271 sizeof(frame
->extramask
))))
274 set_current_blocked(&set
);
276 if (restore_sigcontext(regs
, &frame
->sc
, &ret
))
283 force_sig(SIGSEGV
, current
);
287 asmlinkage
int sys_rt_sigreturn(unsigned long r2
, unsigned long r3
,
288 unsigned long r4
, unsigned long r5
,
289 unsigned long r6
, unsigned long r7
,
290 struct pt_regs
* regs
)
292 struct rt_sigframe __user
*frame
= (struct rt_sigframe __user
*) (long) REF_REG_SP
;
296 /* Always make any pending restarted system calls return -EINTR */
297 current
->restart_block
.fn
= do_no_restart_syscall
;
299 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
302 if (__copy_from_user(&set
, &frame
->uc
.uc_sigmask
, sizeof(set
)))
305 set_current_blocked(&set
);
307 if (restore_sigcontext(regs
, &frame
->uc
.uc_mcontext
, &ret
))
311 if (restore_altstack(&frame
->uc
.uc_stack
))
317 force_sig(SIGSEGV
, current
);
322 * Set up a signal frame.
325 setup_sigcontext(struct sigcontext __user
*sc
, struct pt_regs
*regs
,
330 /* Do this first, otherwise is this sets sr->fd, that value isn't preserved. */
331 err
|= setup_sigcontext_fpu(regs
, sc
);
333 #define COPY(x) err |= __put_user(regs->x, &sc->sc_##x)
335 COPY(regs
[0]); COPY(regs
[1]); COPY(regs
[2]); COPY(regs
[3]);
336 COPY(regs
[4]); COPY(regs
[5]); COPY(regs
[6]); COPY(regs
[7]);
337 COPY(regs
[8]); COPY(regs
[9]); COPY(regs
[10]); COPY(regs
[11]);
338 COPY(regs
[12]); COPY(regs
[13]); COPY(regs
[14]); COPY(regs
[15]);
339 COPY(regs
[16]); COPY(regs
[17]); COPY(regs
[18]); COPY(regs
[19]);
340 COPY(regs
[20]); COPY(regs
[21]); COPY(regs
[22]); COPY(regs
[23]);
341 COPY(regs
[24]); COPY(regs
[25]); COPY(regs
[26]); COPY(regs
[27]);
342 COPY(regs
[28]); COPY(regs
[29]); COPY(regs
[30]); COPY(regs
[31]);
343 COPY(regs
[32]); COPY(regs
[33]); COPY(regs
[34]); COPY(regs
[35]);
344 COPY(regs
[36]); COPY(regs
[37]); COPY(regs
[38]); COPY(regs
[39]);
345 COPY(regs
[40]); COPY(regs
[41]); COPY(regs
[42]); COPY(regs
[43]);
346 COPY(regs
[44]); COPY(regs
[45]); COPY(regs
[46]); COPY(regs
[47]);
347 COPY(regs
[48]); COPY(regs
[49]); COPY(regs
[50]); COPY(regs
[51]);
348 COPY(regs
[52]); COPY(regs
[53]); COPY(regs
[54]); COPY(regs
[55]);
349 COPY(regs
[56]); COPY(regs
[57]); COPY(regs
[58]); COPY(regs
[59]);
350 COPY(regs
[60]); COPY(regs
[61]); COPY(regs
[62]);
351 COPY(tregs
[0]); COPY(tregs
[1]); COPY(tregs
[2]); COPY(tregs
[3]);
352 COPY(tregs
[4]); COPY(tregs
[5]); COPY(tregs
[6]); COPY(tregs
[7]);
357 err
|= __put_user(mask
, &sc
->oldmask
);
363 * Determine which stack to use..
365 static inline void __user
*
366 get_sigframe(struct k_sigaction
*ka
, unsigned long sp
, size_t frame_size
)
368 if ((ka
->sa
.sa_flags
& SA_ONSTACK
) != 0 && ! sas_ss_flags(sp
))
369 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
371 return (void __user
*)((sp
- frame_size
) & -8ul);
374 void sa_default_restorer(void); /* See comments below */
375 void sa_default_rt_restorer(void); /* See comments below */
377 static int setup_frame(struct ksignal
*ksig
, sigset_t
*set
, struct pt_regs
*regs
)
379 struct sigframe __user
*frame
;
380 int err
= 0, sig
= ksig
->sig
;
383 frame
= get_sigframe(&ksig
->ka
, regs
->regs
[REG_SP
], sizeof(*frame
));
385 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
388 signal
= current_thread_info()->exec_domain
389 && current_thread_info()->exec_domain
->signal_invmap
391 ? current_thread_info()->exec_domain
->signal_invmap
[sig
]
394 err
|= setup_sigcontext(&frame
->sc
, regs
, set
->sig
[0]);
396 /* Give up earlier as i386, in case */
400 if (_NSIG_WORDS
> 1) {
401 err
|= __copy_to_user(frame
->extramask
, &set
->sig
[1],
402 sizeof(frame
->extramask
)); }
404 /* Give up earlier as i386, in case */
408 /* Set up to return from userspace. If provided, use a stub
409 already in userspace. */
410 if (ksig
->ka
.sa
.sa_flags
& SA_RESTORER
) {
412 * On SH5 all edited pointers are subject to NEFF
414 DEREF_REG_PR
= neff_sign_extend((unsigned long)
415 ksig
->ka
->sa
.sa_restorer
| 0x1);
418 * Different approach on SH5.
419 * . Endianness independent asm code gets placed in entry.S .
420 * This is limited to four ASM instructions corresponding
421 * to two long longs in size.
422 * . err checking is done on the else branch only
423 * . flush_icache_range() is called upon __put_user() only
424 * . all edited pointers are subject to NEFF
425 * . being code, linker turns ShMedia bit on, always
426 * dereference index -1.
428 DEREF_REG_PR
= neff_sign_extend((unsigned long)
429 frame
->retcode
| 0x01);
431 if (__copy_to_user(frame
->retcode
,
432 (void *)((unsigned long)sa_default_restorer
& (~1)), 16) != 0)
435 /* Cohere the trampoline with the I-cache. */
436 flush_cache_sigtramp(DEREF_REG_PR
-1);
440 * Set up registers for signal handler.
441 * All edited pointers are subject to NEFF.
443 regs
->regs
[REG_SP
] = neff_sign_extend((unsigned long)frame
);
444 regs
->regs
[REG_ARG1
] = signal
; /* Arg for signal handler */
447 The glibc profiling support for SH-5 needs to be passed a sigcontext
448 so it can retrieve the PC. At some point during 2003 the glibc
449 support was changed to receive the sigcontext through the 2nd
450 argument, but there are still versions of libc.so in use that use
451 the 3rd argument. Until libc.so is stabilised, pass the sigcontext
452 through both 2nd and 3rd arguments.
455 regs
->regs
[REG_ARG2
] = (unsigned long long)(unsigned long)(signed long)&frame
->sc
;
456 regs
->regs
[REG_ARG3
] = (unsigned long long)(unsigned long)(signed long)&frame
->sc
;
458 regs
->pc
= neff_sign_extend((unsigned long)ksig
->ka
.sa
.sa_handler
);
463 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
464 signal
, current
->comm
, current
->pid
, frame
,
465 regs
->pc
>> 32, regs
->pc
& 0xffffffff,
466 DEREF_REG_PR
>> 32, DEREF_REG_PR
& 0xffffffff);
471 static int setup_rt_frame(struct ksignal
*kig
, sigset_t
*set
,
472 struct pt_regs
*regs
)
474 struct rt_sigframe __user
*frame
;
475 int err
= 0, sig
= ksig
->sig
;
478 frame
= get_sigframe(&ksig
->ka
, regs
->regs
[REG_SP
], sizeof(*frame
));
480 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
483 signal
= current_thread_info()->exec_domain
484 && current_thread_info()->exec_domain
->signal_invmap
486 ? current_thread_info()->exec_domain
->signal_invmap
[sig
]
489 err
|= __put_user(&frame
->info
, &frame
->pinfo
);
490 err
|= __put_user(&frame
->uc
, &frame
->puc
);
491 err
|= copy_siginfo_to_user(&frame
->info
, &ksig
->info
);
493 /* Give up earlier as i386, in case */
497 /* Create the ucontext. */
498 err
|= __put_user(0, &frame
->uc
.uc_flags
);
499 err
|= __put_user(0, &frame
->uc
.uc_link
);
500 err
|= __save_altstack(&frame
->uc
.uc_stack
, regs
->regs
[REG_SP
]);
501 err
|= setup_sigcontext(&frame
->uc
.uc_mcontext
,
503 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
505 /* Give up earlier as i386, in case */
509 /* Set up to return from userspace. If provided, use a stub
510 already in userspace. */
511 if (ksig
->ka
.sa
.sa_flags
& SA_RESTORER
) {
513 * On SH5 all edited pointers are subject to NEFF
515 DEREF_REG_PR
= neff_sign_extend((unsigned long)
516 ksig
->ka
.sa
.sa_restorer
| 0x1);
519 * Different approach on SH5.
520 * . Endianness independent asm code gets placed in entry.S .
521 * This is limited to four ASM instructions corresponding
522 * to two long longs in size.
523 * . err checking is done on the else branch only
524 * . flush_icache_range() is called upon __put_user() only
525 * . all edited pointers are subject to NEFF
526 * . being code, linker turns ShMedia bit on, always
527 * dereference index -1.
529 DEREF_REG_PR
= neff_sign_extend((unsigned long)
530 frame
->retcode
| 0x01);
532 if (__copy_to_user(frame
->retcode
,
533 (void *)((unsigned long)sa_default_rt_restorer
& (~1)), 16) != 0)
536 /* Cohere the trampoline with the I-cache. */
537 flush_icache_range(DEREF_REG_PR
-1, DEREF_REG_PR
-1+15);
541 * Set up registers for signal handler.
542 * All edited pointers are subject to NEFF.
544 regs
->regs
[REG_SP
] = neff_sign_extend((unsigned long)frame
);
545 regs
->regs
[REG_ARG1
] = signal
; /* Arg for signal handler */
546 regs
->regs
[REG_ARG2
] = (unsigned long long)(unsigned long)(signed long)&frame
->info
;
547 regs
->regs
[REG_ARG3
] = (unsigned long long)(unsigned long)(signed long)&frame
->uc
.uc_mcontext
;
548 regs
->pc
= neff_sign_extend((unsigned long)ksig
->ka
.sa
.sa_handler
);
552 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
553 signal
, current
->comm
, current
->pid
, frame
,
554 regs
->pc
>> 32, regs
->pc
& 0xffffffff,
555 DEREF_REG_PR
>> 32, DEREF_REG_PR
& 0xffffffff);
561 * OK, we're invoking a handler
564 handle_signal(struct ksignal
*ksig
, struct pt_regs
*regs
)
566 sigset_t
*oldset
= sigmask_to_save();
569 /* Set up the stack frame */
570 if (ksig
->ka
.sa
.sa_flags
& SA_SIGINFO
)
571 ret
= setup_rt_frame(ksig
, oldset
, regs
);
573 ret
= setup_frame(ksig
, oldset
, regs
);
575 signal_setup_done(ret
, ksig
, test_thread_flag(TIF_SINGLESTEP
));
578 asmlinkage
void do_notify_resume(struct pt_regs
*regs
, unsigned long thread_info_flags
)
580 if (thread_info_flags
& _TIF_SIGPENDING
)
583 if (thread_info_flags
& _TIF_NOTIFY_RESUME
) {
584 clear_thread_flag(TIF_NOTIFY_RESUME
);
585 tracehook_notify_resume(regs
);