2 * Based on arch/arm/kernel/signal.c
4 * Copyright (C) 1995-2009 Russell King
5 * Copyright (C) 2012 ARM Ltd.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include <linux/errno.h>
21 #include <linux/signal.h>
22 #include <linux/personality.h>
23 #include <linux/freezer.h>
24 #include <linux/uaccess.h>
25 #include <linux/tracehook.h>
26 #include <linux/ratelimit.h>
28 #include <asm/compat.h>
29 #include <asm/debug-monitors.h>
31 #include <asm/cacheflush.h>
32 #include <asm/ucontext.h>
33 #include <asm/unistd.h>
34 #include <asm/fpsimd.h>
35 #include <asm/signal32.h>
39 * Do a signal return; undo the signal stack. These are aligned to 128-bit.
48 static int preserve_fpsimd_context(struct fpsimd_context __user
*ctx
)
50 struct fpsimd_state
*fpsimd
= ¤t
->thread
.fpsimd_state
;
53 /* dump the hardware registers to the fpsimd_state structure */
54 fpsimd_save_state(fpsimd
);
56 /* copy the FP and status/control registers */
57 err
= __copy_to_user(ctx
->vregs
, fpsimd
->vregs
, sizeof(fpsimd
->vregs
));
58 __put_user_error(fpsimd
->fpsr
, &ctx
->fpsr
, err
);
59 __put_user_error(fpsimd
->fpcr
, &ctx
->fpcr
, err
);
61 /* copy the magic/size information */
62 __put_user_error(FPSIMD_MAGIC
, &ctx
->head
.magic
, err
);
63 __put_user_error(sizeof(struct fpsimd_context
), &ctx
->head
.size
, err
);
65 return err
? -EFAULT
: 0;
68 static int restore_fpsimd_context(struct fpsimd_context __user
*ctx
)
70 struct fpsimd_state fpsimd
;
74 /* check the magic/size information */
75 __get_user_error(magic
, &ctx
->head
.magic
, err
);
76 __get_user_error(size
, &ctx
->head
.size
, err
);
79 if (magic
!= FPSIMD_MAGIC
|| size
!= sizeof(struct fpsimd_context
))
82 /* copy the FP and status/control registers */
83 err
= __copy_from_user(fpsimd
.vregs
, ctx
->vregs
,
84 sizeof(fpsimd
.vregs
));
85 __get_user_error(fpsimd
.fpsr
, &ctx
->fpsr
, err
);
86 __get_user_error(fpsimd
.fpcr
, &ctx
->fpcr
, err
);
88 /* load the hardware registers from the fpsimd_state structure */
91 fpsimd_load_state(&fpsimd
);
95 return err
? -EFAULT
: 0;
98 static int restore_sigframe(struct pt_regs
*regs
,
99 struct rt_sigframe __user
*sf
)
103 struct aux_context __user
*aux
=
104 (struct aux_context __user
*)sf
->uc
.uc_mcontext
.__reserved
;
106 err
= __copy_from_user(&set
, &sf
->uc
.uc_sigmask
, sizeof(set
));
108 set_current_blocked(&set
);
110 for (i
= 0; i
< 31; i
++)
111 __get_user_error(regs
->regs
[i
], &sf
->uc
.uc_mcontext
.regs
[i
],
113 __get_user_error(regs
->sp
, &sf
->uc
.uc_mcontext
.sp
, err
);
114 __get_user_error(regs
->pc
, &sf
->uc
.uc_mcontext
.pc
, err
);
115 __get_user_error(regs
->pstate
, &sf
->uc
.uc_mcontext
.pstate
, err
);
118 * Avoid sys_rt_sigreturn() restarting.
120 regs
->syscallno
= ~0UL;
122 err
|= !valid_user_regs(®s
->user_regs
);
125 err
|= restore_fpsimd_context(&aux
->fpsimd
);
130 asmlinkage
long sys_rt_sigreturn(struct pt_regs
*regs
)
132 struct rt_sigframe __user
*frame
;
134 /* Always make any pending restarted system calls return -EINTR */
135 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
138 * Since we stacked the signal on a 128-bit boundary, then 'sp' should
139 * be word aligned here.
144 frame
= (struct rt_sigframe __user
*)regs
->sp
;
146 if (!access_ok(VERIFY_READ
, frame
, sizeof (*frame
)))
149 if (restore_sigframe(regs
, frame
))
152 if (do_sigaltstack(&frame
->uc
.uc_stack
,
153 NULL
, regs
->sp
) == -EFAULT
)
156 return regs
->regs
[0];
159 if (show_unhandled_signals
)
160 pr_info_ratelimited("%s[%d]: bad frame in %s: pc=%08llx sp=%08llx\n",
161 current
->comm
, task_pid_nr(current
), __func__
,
163 force_sig(SIGSEGV
, current
);
167 asmlinkage
long sys_sigaltstack(const stack_t __user
*uss
, stack_t __user
*uoss
,
170 return do_sigaltstack(uss
, uoss
, sp
);
173 static int setup_sigframe(struct rt_sigframe __user
*sf
,
174 struct pt_regs
*regs
, sigset_t
*set
)
177 struct aux_context __user
*aux
=
178 (struct aux_context __user
*)sf
->uc
.uc_mcontext
.__reserved
;
180 /* set up the stack frame for unwinding */
181 __put_user_error(regs
->regs
[29], &sf
->fp
, err
);
182 __put_user_error(regs
->regs
[30], &sf
->lr
, err
);
184 for (i
= 0; i
< 31; i
++)
185 __put_user_error(regs
->regs
[i
], &sf
->uc
.uc_mcontext
.regs
[i
],
187 __put_user_error(regs
->sp
, &sf
->uc
.uc_mcontext
.sp
, err
);
188 __put_user_error(regs
->pc
, &sf
->uc
.uc_mcontext
.pc
, err
);
189 __put_user_error(regs
->pstate
, &sf
->uc
.uc_mcontext
.pstate
, err
);
191 __put_user_error(current
->thread
.fault_address
, &sf
->uc
.uc_mcontext
.fault_address
, err
);
193 err
|= __copy_to_user(&sf
->uc
.uc_sigmask
, set
, sizeof(*set
));
196 err
|= preserve_fpsimd_context(&aux
->fpsimd
);
198 /* set the "end" magic */
199 __put_user_error(0, &aux
->end
.magic
, err
);
200 __put_user_error(0, &aux
->end
.size
, err
);
205 static struct rt_sigframe __user
*get_sigframe(struct k_sigaction
*ka
,
206 struct pt_regs
*regs
)
208 unsigned long sp
, sp_top
;
209 struct rt_sigframe __user
*frame
;
211 sp
= sp_top
= regs
->sp
;
214 * This is the X/Open sanctioned signal stack switching.
216 if ((ka
->sa
.sa_flags
& SA_ONSTACK
) && !sas_ss_flags(sp
))
217 sp
= sp_top
= current
->sas_ss_sp
+ current
->sas_ss_size
;
219 sp
= (sp
- sizeof(struct rt_sigframe
)) & ~15;
220 frame
= (struct rt_sigframe __user
*)sp
;
223 * Check that we can actually write to the signal frame.
225 if (!access_ok(VERIFY_WRITE
, frame
, sp_top
- sp
))
231 static void setup_return(struct pt_regs
*regs
, struct k_sigaction
*ka
,
232 void __user
*frame
, int usig
)
234 __sigrestore_t sigtramp
;
236 regs
->regs
[0] = usig
;
237 regs
->sp
= (unsigned long)frame
;
238 regs
->regs
[29] = regs
->sp
+ offsetof(struct rt_sigframe
, fp
);
239 regs
->pc
= (unsigned long)ka
->sa
.sa_handler
;
241 if (ka
->sa
.sa_flags
& SA_RESTORER
)
242 sigtramp
= ka
->sa
.sa_restorer
;
244 sigtramp
= VDSO_SYMBOL(current
->mm
->context
.vdso
, sigtramp
);
246 regs
->regs
[30] = (unsigned long)sigtramp
;
249 static int setup_rt_frame(int usig
, struct k_sigaction
*ka
, siginfo_t
*info
,
250 sigset_t
*set
, struct pt_regs
*regs
)
252 struct rt_sigframe __user
*frame
;
256 frame
= get_sigframe(ka
, regs
);
260 __put_user_error(0, &frame
->uc
.uc_flags
, err
);
261 __put_user_error(NULL
, &frame
->uc
.uc_link
, err
);
263 memset(&stack
, 0, sizeof(stack
));
264 stack
.ss_sp
= (void __user
*)current
->sas_ss_sp
;
265 stack
.ss_flags
= sas_ss_flags(regs
->sp
);
266 stack
.ss_size
= current
->sas_ss_size
;
267 err
|= __copy_to_user(&frame
->uc
.uc_stack
, &stack
, sizeof(stack
));
269 err
|= setup_sigframe(frame
, regs
, set
);
271 setup_return(regs
, ka
, frame
, usig
);
272 if (ka
->sa
.sa_flags
& SA_SIGINFO
) {
273 err
|= copy_siginfo_to_user(&frame
->info
, info
);
274 regs
->regs
[1] = (unsigned long)&frame
->info
;
275 regs
->regs
[2] = (unsigned long)&frame
->uc
;
282 static void setup_restart_syscall(struct pt_regs
*regs
)
284 if (is_compat_task())
285 compat_setup_restart_syscall(regs
);
287 regs
->regs
[8] = __NR_restart_syscall
;
291 * OK, we're invoking a handler
293 static void handle_signal(unsigned long sig
, struct k_sigaction
*ka
,
294 siginfo_t
*info
, struct pt_regs
*regs
)
296 struct thread_info
*thread
= current_thread_info();
297 struct task_struct
*tsk
= current
;
298 sigset_t
*oldset
= sigmask_to_save();
303 * translate the signal
305 if (usig
< 32 && thread
->exec_domain
&& thread
->exec_domain
->signal_invmap
)
306 usig
= thread
->exec_domain
->signal_invmap
[usig
];
309 * Set up the stack frame
311 if (is_compat_task()) {
312 if (ka
->sa
.sa_flags
& SA_SIGINFO
)
313 ret
= compat_setup_rt_frame(usig
, ka
, info
, oldset
,
316 ret
= compat_setup_frame(usig
, ka
, oldset
, regs
);
318 ret
= setup_rt_frame(usig
, ka
, info
, oldset
, regs
);
322 * Check that the resulting registers are actually sane.
324 ret
|= !valid_user_regs(®s
->user_regs
);
327 force_sigsegv(sig
, tsk
);
332 * Fast forward the stepping logic so we step into the signal
335 user_fastforward_single_step(tsk
);
337 signal_delivered(sig
, info
, ka
, regs
, 0);
341 * Note that 'init' is a special process: it doesn't get signals it doesn't
342 * want to handle. Thus you cannot kill init even with a SIGKILL even by
345 * Note that we go through the signals twice: once to check the signals that
346 * the kernel can handle, and then we build all the user-level signal handling
347 * stack-frames in one go after that.
349 static void do_signal(struct pt_regs
*regs
)
351 unsigned long continue_addr
= 0, restart_addr
= 0;
352 struct k_sigaction ka
;
354 int signr
, retval
= 0;
355 int syscall
= (int)regs
->syscallno
;
358 * If we were from a system call, check for system call restarting...
361 continue_addr
= regs
->pc
;
362 restart_addr
= continue_addr
- (compat_thumb_mode(regs
) ? 2 : 4);
363 retval
= regs
->regs
[0];
366 * Avoid additional syscall restarting via ret_to_user.
368 regs
->syscallno
= ~0UL;
371 * Prepare for system call restart. We do this here so that a
372 * debugger will see the already changed PC.
375 case -ERESTARTNOHAND
:
377 case -ERESTARTNOINTR
:
378 case -ERESTART_RESTARTBLOCK
:
379 regs
->regs
[0] = regs
->orig_x0
;
380 regs
->pc
= restart_addr
;
386 * Get the signal to deliver. When running under ptrace, at this point
387 * the debugger may change all of our registers.
389 signr
= get_signal_to_deliver(&info
, &ka
, regs
, NULL
);
392 * Depending on the signal settings, we may need to revert the
393 * decision to restart the system call, but skip this if a
394 * debugger has chosen to restart at a different PC.
396 if (regs
->pc
== restart_addr
&&
397 (retval
== -ERESTARTNOHAND
||
398 retval
== -ERESTART_RESTARTBLOCK
||
399 (retval
== -ERESTARTSYS
&&
400 !(ka
.sa
.sa_flags
& SA_RESTART
)))) {
401 regs
->regs
[0] = -EINTR
;
402 regs
->pc
= continue_addr
;
405 handle_signal(signr
, &ka
, &info
, regs
);
410 * Handle restarting a different system call. As above, if a debugger
411 * has chosen to restart at a different PC, ignore the restart.
413 if (syscall
>= 0 && regs
->pc
== restart_addr
) {
414 if (retval
== -ERESTART_RESTARTBLOCK
)
415 setup_restart_syscall(regs
);
416 user_rewind_single_step(current
);
419 restore_saved_sigmask();
422 asmlinkage
void do_notify_resume(struct pt_regs
*regs
,
423 unsigned int thread_flags
)
425 if (thread_flags
& _TIF_SIGPENDING
)
428 if (thread_flags
& _TIF_NOTIFY_RESUME
) {
429 clear_thread_flag(TIF_NOTIFY_RESUME
);
430 tracehook_notify_resume(regs
);