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/compat.h>
21 #include <linux/errno.h>
22 #include <linux/signal.h>
23 #include <linux/personality.h>
24 #include <linux/freezer.h>
25 #include <linux/uaccess.h>
26 #include <linux/tracehook.h>
27 #include <linux/ratelimit.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_preserve_current_state();
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 */
90 fpsimd_update_current_state(&fpsimd
);
92 return err
? -EFAULT
: 0;
95 static int restore_sigframe(struct pt_regs
*regs
,
96 struct rt_sigframe __user
*sf
)
100 void *aux
= sf
->uc
.uc_mcontext
.__reserved
;
102 err
= __copy_from_user(&set
, &sf
->uc
.uc_sigmask
, sizeof(set
));
104 set_current_blocked(&set
);
106 for (i
= 0; i
< 31; i
++)
107 __get_user_error(regs
->regs
[i
], &sf
->uc
.uc_mcontext
.regs
[i
],
109 __get_user_error(regs
->sp
, &sf
->uc
.uc_mcontext
.sp
, err
);
110 __get_user_error(regs
->pc
, &sf
->uc
.uc_mcontext
.pc
, err
);
111 __get_user_error(regs
->pstate
, &sf
->uc
.uc_mcontext
.pstate
, err
);
114 * Avoid sys_rt_sigreturn() restarting.
116 regs
->syscallno
= ~0UL;
118 err
|= !valid_user_regs(®s
->user_regs
);
121 struct fpsimd_context
*fpsimd_ctx
=
122 container_of(aux
, struct fpsimd_context
, head
);
123 err
|= restore_fpsimd_context(fpsimd_ctx
);
129 asmlinkage
long sys_rt_sigreturn(struct pt_regs
*regs
)
131 struct rt_sigframe __user
*frame
;
133 /* Always make any pending restarted system calls return -EINTR */
134 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
137 * Since we stacked the signal on a 128-bit boundary, then 'sp' should
138 * be word aligned here.
143 frame
= (struct rt_sigframe __user
*)regs
->sp
;
145 if (!access_ok(VERIFY_READ
, frame
, sizeof (*frame
)))
148 if (restore_sigframe(regs
, frame
))
151 if (restore_altstack(&frame
->uc
.uc_stack
))
154 return regs
->regs
[0];
157 if (show_unhandled_signals
)
158 pr_info_ratelimited("%s[%d]: bad frame in %s: pc=%08llx sp=%08llx\n",
159 current
->comm
, task_pid_nr(current
), __func__
,
161 force_sig(SIGSEGV
, current
);
165 static int setup_sigframe(struct rt_sigframe __user
*sf
,
166 struct pt_regs
*regs
, sigset_t
*set
)
169 void *aux
= sf
->uc
.uc_mcontext
.__reserved
;
170 struct _aarch64_ctx
*end
;
172 /* set up the stack frame for unwinding */
173 __put_user_error(regs
->regs
[29], &sf
->fp
, err
);
174 __put_user_error(regs
->regs
[30], &sf
->lr
, err
);
176 for (i
= 0; i
< 31; i
++)
177 __put_user_error(regs
->regs
[i
], &sf
->uc
.uc_mcontext
.regs
[i
],
179 __put_user_error(regs
->sp
, &sf
->uc
.uc_mcontext
.sp
, err
);
180 __put_user_error(regs
->pc
, &sf
->uc
.uc_mcontext
.pc
, err
);
181 __put_user_error(regs
->pstate
, &sf
->uc
.uc_mcontext
.pstate
, err
);
183 __put_user_error(current
->thread
.fault_address
, &sf
->uc
.uc_mcontext
.fault_address
, err
);
185 err
|= __copy_to_user(&sf
->uc
.uc_sigmask
, set
, sizeof(*set
));
188 struct fpsimd_context
*fpsimd_ctx
=
189 container_of(aux
, struct fpsimd_context
, head
);
190 err
|= preserve_fpsimd_context(fpsimd_ctx
);
191 aux
+= sizeof(*fpsimd_ctx
);
194 /* fault information, if valid */
195 if (current
->thread
.fault_code
) {
196 struct esr_context
*esr_ctx
=
197 container_of(aux
, struct esr_context
, head
);
198 __put_user_error(ESR_MAGIC
, &esr_ctx
->head
.magic
, err
);
199 __put_user_error(sizeof(*esr_ctx
), &esr_ctx
->head
.size
, err
);
200 __put_user_error(current
->thread
.fault_code
, &esr_ctx
->esr
, err
);
201 aux
+= sizeof(*esr_ctx
);
204 /* set the "end" magic */
206 __put_user_error(0, &end
->magic
, err
);
207 __put_user_error(0, &end
->size
, err
);
212 static struct rt_sigframe __user
*get_sigframe(struct k_sigaction
*ka
,
213 struct pt_regs
*regs
)
215 unsigned long sp
, sp_top
;
216 struct rt_sigframe __user
*frame
;
218 sp
= sp_top
= regs
->sp
;
221 * This is the X/Open sanctioned signal stack switching.
223 if ((ka
->sa
.sa_flags
& SA_ONSTACK
) && !sas_ss_flags(sp
))
224 sp
= sp_top
= current
->sas_ss_sp
+ current
->sas_ss_size
;
226 sp
= (sp
- sizeof(struct rt_sigframe
)) & ~15;
227 frame
= (struct rt_sigframe __user
*)sp
;
230 * Check that we can actually write to the signal frame.
232 if (!access_ok(VERIFY_WRITE
, frame
, sp_top
- sp
))
238 static void setup_return(struct pt_regs
*regs
, struct k_sigaction
*ka
,
239 void __user
*frame
, int usig
)
241 __sigrestore_t sigtramp
;
243 regs
->regs
[0] = usig
;
244 regs
->sp
= (unsigned long)frame
;
245 regs
->regs
[29] = regs
->sp
+ offsetof(struct rt_sigframe
, fp
);
246 regs
->pc
= (unsigned long)ka
->sa
.sa_handler
;
248 if (ka
->sa
.sa_flags
& SA_RESTORER
)
249 sigtramp
= ka
->sa
.sa_restorer
;
251 sigtramp
= VDSO_SYMBOL(current
->mm
->context
.vdso
, sigtramp
);
253 regs
->regs
[30] = (unsigned long)sigtramp
;
256 static int setup_rt_frame(int usig
, struct k_sigaction
*ka
, siginfo_t
*info
,
257 sigset_t
*set
, struct pt_regs
*regs
)
259 struct rt_sigframe __user
*frame
;
262 frame
= get_sigframe(ka
, regs
);
266 __put_user_error(0, &frame
->uc
.uc_flags
, err
);
267 __put_user_error(NULL
, &frame
->uc
.uc_link
, err
);
269 err
|= __save_altstack(&frame
->uc
.uc_stack
, regs
->sp
);
270 err
|= setup_sigframe(frame
, regs
, set
);
272 setup_return(regs
, ka
, frame
, usig
);
273 if (ka
->sa
.sa_flags
& SA_SIGINFO
) {
274 err
|= copy_siginfo_to_user(&frame
->info
, info
);
275 regs
->regs
[1] = (unsigned long)&frame
->info
;
276 regs
->regs
[2] = (unsigned long)&frame
->uc
;
283 static void setup_restart_syscall(struct pt_regs
*regs
)
285 if (is_compat_task())
286 compat_setup_restart_syscall(regs
);
288 regs
->regs
[8] = __NR_restart_syscall
;
292 * OK, we're invoking a handler
294 static void handle_signal(unsigned long sig
, struct k_sigaction
*ka
,
295 siginfo_t
*info
, struct pt_regs
*regs
)
297 struct thread_info
*thread
= current_thread_info();
298 struct task_struct
*tsk
= current
;
299 sigset_t
*oldset
= sigmask_to_save();
304 * translate the signal
306 if (usig
< 32 && thread
->exec_domain
&& thread
->exec_domain
->signal_invmap
)
307 usig
= thread
->exec_domain
->signal_invmap
[usig
];
310 * Set up the stack frame
312 if (is_compat_task()) {
313 if (ka
->sa
.sa_flags
& SA_SIGINFO
)
314 ret
= compat_setup_rt_frame(usig
, ka
, info
, oldset
,
317 ret
= compat_setup_frame(usig
, ka
, oldset
, regs
);
319 ret
= setup_rt_frame(usig
, ka
, info
, oldset
, regs
);
323 * Check that the resulting registers are actually sane.
325 ret
|= !valid_user_regs(®s
->user_regs
);
328 force_sigsegv(sig
, tsk
);
333 * Fast forward the stepping logic so we step into the signal
336 user_fastforward_single_step(tsk
);
338 signal_delivered(sig
, info
, ka
, regs
, 0);
342 * Note that 'init' is a special process: it doesn't get signals it doesn't
343 * want to handle. Thus you cannot kill init even with a SIGKILL even by
346 * Note that we go through the signals twice: once to check the signals that
347 * the kernel can handle, and then we build all the user-level signal handling
348 * stack-frames in one go after that.
350 static void do_signal(struct pt_regs
*regs
)
352 unsigned long continue_addr
= 0, restart_addr
= 0;
353 struct k_sigaction ka
;
355 int signr
, retval
= 0;
356 int syscall
= (int)regs
->syscallno
;
359 * If we were from a system call, check for system call restarting...
362 continue_addr
= regs
->pc
;
363 restart_addr
= continue_addr
- (compat_thumb_mode(regs
) ? 2 : 4);
364 retval
= regs
->regs
[0];
367 * Avoid additional syscall restarting via ret_to_user.
369 regs
->syscallno
= ~0UL;
372 * Prepare for system call restart. We do this here so that a
373 * debugger will see the already changed PC.
376 case -ERESTARTNOHAND
:
378 case -ERESTARTNOINTR
:
379 case -ERESTART_RESTARTBLOCK
:
380 regs
->regs
[0] = regs
->orig_x0
;
381 regs
->pc
= restart_addr
;
387 * Get the signal to deliver. When running under ptrace, at this point
388 * the debugger may change all of our registers.
390 signr
= get_signal_to_deliver(&info
, &ka
, regs
, NULL
);
393 * Depending on the signal settings, we may need to revert the
394 * decision to restart the system call, but skip this if a
395 * debugger has chosen to restart at a different PC.
397 if (regs
->pc
== restart_addr
&&
398 (retval
== -ERESTARTNOHAND
||
399 retval
== -ERESTART_RESTARTBLOCK
||
400 (retval
== -ERESTARTSYS
&&
401 !(ka
.sa
.sa_flags
& SA_RESTART
)))) {
402 regs
->regs
[0] = -EINTR
;
403 regs
->pc
= continue_addr
;
406 handle_signal(signr
, &ka
, &info
, regs
);
411 * Handle restarting a different system call. As above, if a debugger
412 * has chosen to restart at a different PC, ignore the restart.
414 if (syscall
>= 0 && regs
->pc
== restart_addr
) {
415 if (retval
== -ERESTART_RESTARTBLOCK
)
416 setup_restart_syscall(regs
);
417 user_rewind_single_step(current
);
420 restore_saved_sigmask();
423 asmlinkage
void do_notify_resume(struct pt_regs
*regs
,
424 unsigned int thread_flags
)
426 if (thread_flags
& _TIF_SIGPENDING
)
429 if (thread_flags
& _TIF_NOTIFY_RESUME
) {
430 clear_thread_flag(TIF_NOTIFY_RESUME
);
431 tracehook_notify_resume(regs
);
434 if (thread_flags
& _TIF_FOREIGN_FPSTATE
)
435 fpsimd_restore_current_state();