1 /*
2  *  linux/arch/arm/kernel/signal.c
3  *
4  *  Copyright (C) 1995-2009 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 #include <linux/errno.h>
11 #include <linux/signal.h>
12 #include <linux/personality.h>
13 #include <linux/freezer.h>
14 #include <linux/uaccess.h>
15 #include <linux/tracehook.h>
16 
17 #include <asm/elf.h>
18 #include <asm/cacheflush.h>
19 #include <asm/ucontext.h>
20 #include <asm/unistd.h>
21 #include <asm/vfp.h>
22 
23 #include "signal.h"
24 
25 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
26 
27 /*
28  * For ARM syscalls, we encode the syscall number into the instruction.
29  */
30 #define SWI_SYS_SIGRETURN	(0xef000000|(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE))
31 #define SWI_SYS_RT_SIGRETURN	(0xef000000|(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE))
32 #define SWI_SYS_RESTART		(0xef000000|__NR_restart_syscall|__NR_OABI_SYSCALL_BASE)
33 
34 /*
35  * With EABI, the syscall number has to be loaded into r7.
36  */
37 #define MOV_R7_NR_SIGRETURN	(0xe3a07000 | (__NR_sigreturn - __NR_SYSCALL_BASE))
38 #define MOV_R7_NR_RT_SIGRETURN	(0xe3a07000 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE))
39 
40 /*
41  * For Thumb syscalls, we pass the syscall number via r7.  We therefore
42  * need two 16-bit instructions.
43  */
44 #define SWI_THUMB_SIGRETURN	(0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE))
45 #define SWI_THUMB_RT_SIGRETURN	(0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE))
46 
47 const unsigned long sigreturn_codes[7] = {
48 	MOV_R7_NR_SIGRETURN,    SWI_SYS_SIGRETURN,    SWI_THUMB_SIGRETURN,
49 	MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN,
50 };
51 
52 /*
53  * Either we support OABI only, or we have EABI with the OABI
54  * compat layer enabled.  In the later case we don't know if
55  * user space is EABI or not, and if not we must not clobber r7.
56  * Always using the OABI syscall solves that issue and works for
57  * all those cases.
58  */
59 const unsigned long syscall_restart_code[2] = {
60 	SWI_SYS_RESTART,	/* swi	__NR_restart_syscall */
61 	0xe49df004,		/* ldr	pc, [sp], #4 */
62 };
63 
64 /*
65  * atomically swap in the new signal mask, and wait for a signal.
66  */
sys_sigsuspend(int restart,unsigned long oldmask,old_sigset_t mask)67 asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask)
68 {
69 	mask &= _BLOCKABLE;
70 	spin_lock_irq(&current->sighand->siglock);
71 	current->saved_sigmask = current->blocked;
72 	siginitset(&current->blocked, mask);
73 	recalc_sigpending();
74 	spin_unlock_irq(&current->sighand->siglock);
75 
76 	current->state = TASK_INTERRUPTIBLE;
77 	schedule();
78 	set_restore_sigmask();
79 	return -ERESTARTNOHAND;
80 }
81 
82 asmlinkage int
sys_sigaction(int sig,const struct old_sigaction __user * act,struct old_sigaction __user * oact)83 sys_sigaction(int sig, const struct old_sigaction __user *act,
84 	      struct old_sigaction __user *oact)
85 {
86 	struct k_sigaction new_ka, old_ka;
87 	int ret;
88 
89 	if (act) {
90 		old_sigset_t mask;
91 		if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
92 		    __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
93 		    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
94 			return -EFAULT;
95 		__get_user(new_ka.sa.sa_flags, &act->sa_flags);
96 		__get_user(mask, &act->sa_mask);
97 		siginitset(&new_ka.sa.sa_mask, mask);
98 	}
99 
100 	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
101 
102 	if (!ret && oact) {
103 		if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
104 		    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
105 		    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
106 			return -EFAULT;
107 		__put_user(old_ka.sa.sa_flags, &oact->sa_flags);
108 		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
109 	}
110 
111 	return ret;
112 }
113 
114 #ifdef CONFIG_CRUNCH
preserve_crunch_context(struct crunch_sigframe __user * frame)115 static int preserve_crunch_context(struct crunch_sigframe __user *frame)
116 {
117 	char kbuf[sizeof(*frame) + 8];
118 	struct crunch_sigframe *kframe;
119 
120 	/* the crunch context must be 64 bit aligned */
121 	kframe = (struct crunch_sigframe *)((unsigned long)(kbuf + 8) & ~7);
122 	kframe->magic = CRUNCH_MAGIC;
123 	kframe->size = CRUNCH_STORAGE_SIZE;
124 	crunch_task_copy(current_thread_info(), &kframe->storage);
125 	return __copy_to_user(frame, kframe, sizeof(*frame));
126 }
127 
restore_crunch_context(struct crunch_sigframe __user * frame)128 static int restore_crunch_context(struct crunch_sigframe __user *frame)
129 {
130 	char kbuf[sizeof(*frame) + 8];
131 	struct crunch_sigframe *kframe;
132 
133 	/* the crunch context must be 64 bit aligned */
134 	kframe = (struct crunch_sigframe *)((unsigned long)(kbuf + 8) & ~7);
135 	if (__copy_from_user(kframe, frame, sizeof(*frame)))
136 		return -1;
137 	if (kframe->magic != CRUNCH_MAGIC ||
138 	    kframe->size != CRUNCH_STORAGE_SIZE)
139 		return -1;
140 	crunch_task_restore(current_thread_info(), &kframe->storage);
141 	return 0;
142 }
143 #endif
144 
145 #ifdef CONFIG_IWMMXT
146 
preserve_iwmmxt_context(struct iwmmxt_sigframe * frame)147 static int preserve_iwmmxt_context(struct iwmmxt_sigframe *frame)
148 {
149 	char kbuf[sizeof(*frame) + 8];
150 	struct iwmmxt_sigframe *kframe;
151 
152 	/* the iWMMXt context must be 64 bit aligned */
153 	kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7);
154 	kframe->magic = IWMMXT_MAGIC;
155 	kframe->size = IWMMXT_STORAGE_SIZE;
156 	iwmmxt_task_copy(current_thread_info(), &kframe->storage);
157 	return __copy_to_user(frame, kframe, sizeof(*frame));
158 }
159 
restore_iwmmxt_context(struct iwmmxt_sigframe * frame)160 static int restore_iwmmxt_context(struct iwmmxt_sigframe *frame)
161 {
162 	char kbuf[sizeof(*frame) + 8];
163 	struct iwmmxt_sigframe *kframe;
164 
165 	/* the iWMMXt context must be 64 bit aligned */
166 	kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7);
167 	if (__copy_from_user(kframe, frame, sizeof(*frame)))
168 		return -1;
169 	if (kframe->magic != IWMMXT_MAGIC ||
170 	    kframe->size != IWMMXT_STORAGE_SIZE)
171 		return -1;
172 	iwmmxt_task_restore(current_thread_info(), &kframe->storage);
173 	return 0;
174 }
175 
176 #endif
177 
178 #ifdef CONFIG_VFP
179 
preserve_vfp_context(struct vfp_sigframe __user * frame)180 static int preserve_vfp_context(struct vfp_sigframe __user *frame)
181 {
182 	struct thread_info *thread = current_thread_info();
183 	struct vfp_hard_struct *h = &thread->vfpstate.hard;
184 	const unsigned long magic = VFP_MAGIC;
185 	const unsigned long size = VFP_STORAGE_SIZE;
186 	int err = 0;
187 
188 	vfp_sync_hwstate(thread);
189 	__put_user_error(magic, &frame->magic, err);
190 	__put_user_error(size, &frame->size, err);
191 
192 	/*
193 	 * Copy the floating point registers. There can be unused
194 	 * registers see asm/hwcap.h for details.
195 	 */
196 	err |= __copy_to_user(&frame->ufp.fpregs, &h->fpregs,
197 			      sizeof(h->fpregs));
198 	/*
199 	 * Copy the status and control register.
200 	 */
201 	__put_user_error(h->fpscr, &frame->ufp.fpscr, err);
202 
203 	/*
204 	 * Copy the exception registers.
205 	 */
206 	__put_user_error(h->fpexc, &frame->ufp_exc.fpexc, err);
207 	__put_user_error(h->fpinst, &frame->ufp_exc.fpinst, err);
208 	__put_user_error(h->fpinst2, &frame->ufp_exc.fpinst2, err);
209 
210 	return err ? -EFAULT : 0;
211 }
212 
restore_vfp_context(struct vfp_sigframe __user * frame)213 static int restore_vfp_context(struct vfp_sigframe __user *frame)
214 {
215 	struct thread_info *thread = current_thread_info();
216 	struct vfp_hard_struct *h = &thread->vfpstate.hard;
217 	unsigned long magic;
218 	unsigned long size;
219 	unsigned long fpexc;
220 	int err = 0;
221 
222 	__get_user_error(magic, &frame->magic, err);
223 	__get_user_error(size, &frame->size, err);
224 
225 	if (err)
226 		return -EFAULT;
227 	if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE)
228 		return -EINVAL;
229 
230 	vfp_flush_hwstate(thread);
231 
232 	/*
233 	 * Copy the floating point registers. There can be unused
234 	 * registers see asm/hwcap.h for details.
235 	 */
236 	err |= __copy_from_user(&h->fpregs, &frame->ufp.fpregs,
237 				sizeof(h->fpregs));
238 	/*
239 	 * Copy the status and control register.
240 	 */
241 	__get_user_error(h->fpscr, &frame->ufp.fpscr, err);
242 
243 	/*
244 	 * Sanitise and restore the exception registers.
245 	 */
246 	__get_user_error(fpexc, &frame->ufp_exc.fpexc, err);
247 	/* Ensure the VFP is enabled. */
248 	fpexc |= FPEXC_EN;
249 	/* Ensure FPINST2 is invalid and the exception flag is cleared. */
250 	fpexc &= ~(FPEXC_EX | FPEXC_FP2V);
251 	h->fpexc = fpexc;
252 
253 	__get_user_error(h->fpinst, &frame->ufp_exc.fpinst, err);
254 	__get_user_error(h->fpinst2, &frame->ufp_exc.fpinst2, err);
255 
256 	return err ? -EFAULT : 0;
257 }
258 
259 #endif
260 
261 /*
262  * Do a signal return; undo the signal stack.  These are aligned to 64-bit.
263  */
264 struct sigframe {
265 	struct ucontext uc;
266 	unsigned long retcode[2];
267 };
268 
269 struct rt_sigframe {
270 	struct siginfo info;
271 	struct sigframe sig;
272 };
273 
restore_sigframe(struct pt_regs * regs,struct sigframe __user * sf)274 static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf)
275 {
276 	struct aux_sigframe __user *aux;
277 	sigset_t set;
278 	int err;
279 
280 	err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set));
281 	if (err == 0) {
282 		sigdelsetmask(&set, ~_BLOCKABLE);
283 		spin_lock_irq(&current->sighand->siglock);
284 		current->blocked = set;
285 		recalc_sigpending();
286 		spin_unlock_irq(&current->sighand->siglock);
287 	}
288 
289 	__get_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err);
290 	__get_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err);
291 	__get_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err);
292 	__get_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err);
293 	__get_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err);
294 	__get_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err);
295 	__get_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err);
296 	__get_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err);
297 	__get_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err);
298 	__get_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err);
299 	__get_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err);
300 	__get_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err);
301 	__get_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err);
302 	__get_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err);
303 	__get_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err);
304 	__get_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err);
305 	__get_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err);
306 
307 	err |= !valid_user_regs(regs);
308 
309 	aux = (struct aux_sigframe __user *) sf->uc.uc_regspace;
310 #ifdef CONFIG_CRUNCH
311 	if (err == 0)
312 		err |= restore_crunch_context(&aux->crunch);
313 #endif
314 #ifdef CONFIG_IWMMXT
315 	if (err == 0 && test_thread_flag(TIF_USING_IWMMXT))
316 		err |= restore_iwmmxt_context(&aux->iwmmxt);
317 #endif
318 #ifdef CONFIG_VFP
319 	if (err == 0)
320 		err |= restore_vfp_context(&aux->vfp);
321 #endif
322 
323 	return err;
324 }
325 
sys_sigreturn(struct pt_regs * regs)326 asmlinkage int sys_sigreturn(struct pt_regs *regs)
327 {
328 	struct sigframe __user *frame;
329 
330 	/* Always make any pending restarted system calls return -EINTR */
331 	current_thread_info()->restart_block.fn = do_no_restart_syscall;
332 
333 	/*
334 	 * Since we stacked the signal on a 64-bit boundary,
335 	 * then 'sp' should be word aligned here.  If it's
336 	 * not, then the user is trying to mess with us.
337 	 */
338 	if (regs->ARM_sp & 7)
339 		goto badframe;
340 
341 	frame = (struct sigframe __user *)regs->ARM_sp;
342 
343 	if (!access_ok(VERIFY_READ, frame, sizeof (*frame)))
344 		goto badframe;
345 
346 	if (restore_sigframe(regs, frame))
347 		goto badframe;
348 
349 	return regs->ARM_r0;
350 
351 badframe:
352 	force_sig(SIGSEGV, current);
353 	return 0;
354 }
355 
sys_rt_sigreturn(struct pt_regs * regs)356 asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
357 {
358 	struct rt_sigframe __user *frame;
359 
360 	/* Always make any pending restarted system calls return -EINTR */
361 	current_thread_info()->restart_block.fn = do_no_restart_syscall;
362 
363 	/*
364 	 * Since we stacked the signal on a 64-bit boundary,
365 	 * then 'sp' should be word aligned here.  If it's
366 	 * not, then the user is trying to mess with us.
367 	 */
368 	if (regs->ARM_sp & 7)
369 		goto badframe;
370 
371 	frame = (struct rt_sigframe __user *)regs->ARM_sp;
372 
373 	if (!access_ok(VERIFY_READ, frame, sizeof (*frame)))
374 		goto badframe;
375 
376 	if (restore_sigframe(regs, &frame->sig))
377 		goto badframe;
378 
379 	if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT)
380 		goto badframe;
381 
382 	return regs->ARM_r0;
383 
384 badframe:
385 	force_sig(SIGSEGV, current);
386 	return 0;
387 }
388 
389 static int
setup_sigframe(struct sigframe __user * sf,struct pt_regs * regs,sigset_t * set)390 setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set)
391 {
392 	struct aux_sigframe __user *aux;
393 	int err = 0;
394 
395 	__put_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err);
396 	__put_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err);
397 	__put_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err);
398 	__put_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err);
399 	__put_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err);
400 	__put_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err);
401 	__put_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err);
402 	__put_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err);
403 	__put_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err);
404 	__put_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err);
405 	__put_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err);
406 	__put_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err);
407 	__put_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err);
408 	__put_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err);
409 	__put_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err);
410 	__put_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err);
411 	__put_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err);
412 
413 	__put_user_error(current->thread.trap_no, &sf->uc.uc_mcontext.trap_no, err);
414 	__put_user_error(current->thread.error_code, &sf->uc.uc_mcontext.error_code, err);
415 	__put_user_error(current->thread.address, &sf->uc.uc_mcontext.fault_address, err);
416 	__put_user_error(set->sig[0], &sf->uc.uc_mcontext.oldmask, err);
417 
418 	err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set));
419 
420 	aux = (struct aux_sigframe __user *) sf->uc.uc_regspace;
421 #ifdef CONFIG_CRUNCH
422 	if (err == 0)
423 		err |= preserve_crunch_context(&aux->crunch);
424 #endif
425 #ifdef CONFIG_IWMMXT
426 	if (err == 0 && test_thread_flag(TIF_USING_IWMMXT))
427 		err |= preserve_iwmmxt_context(&aux->iwmmxt);
428 #endif
429 #ifdef CONFIG_VFP
430 	if (err == 0)
431 		err |= preserve_vfp_context(&aux->vfp);
432 #endif
433 	__put_user_error(0, &aux->end_magic, err);
434 
435 	return err;
436 }
437 
438 static inline void __user *
get_sigframe(struct k_sigaction * ka,struct pt_regs * regs,int framesize)439 get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize)
440 {
441 	unsigned long sp = regs->ARM_sp;
442 	void __user *frame;
443 
444 	/*
445 	 * This is the X/Open sanctioned signal stack switching.
446 	 */
447 	if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
448 		sp = current->sas_ss_sp + current->sas_ss_size;
449 
450 	/*
451 	 * ATPCS B01 mandates 8-byte alignment
452 	 */
453 	frame = (void __user *)((sp - framesize) & ~7);
454 
455 	/*
456 	 * Check that we can actually write to the signal frame.
457 	 */
458 	if (!access_ok(VERIFY_WRITE, frame, framesize))
459 		frame = NULL;
460 
461 	return frame;
462 }
463 
464 static int
setup_return(struct pt_regs * regs,struct k_sigaction * ka,unsigned long __user * rc,void __user * frame,int usig)465 setup_return(struct pt_regs *regs, struct k_sigaction *ka,
466 	     unsigned long __user *rc, void __user *frame, int usig)
467 {
468 	unsigned long handler = (unsigned long)ka->sa.sa_handler;
469 	unsigned long retcode;
470 	int thumb = 0;
471 	unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT);
472 
473 	cpsr |= PSR_ENDSTATE;
474 
475 	/*
476 	 * Maybe we need to deliver a 32-bit signal to a 26-bit task.
477 	 */
478 	if (ka->sa.sa_flags & SA_THIRTYTWO)
479 		cpsr = (cpsr & ~MODE_MASK) | USR_MODE;
480 
481 #ifdef CONFIG_ARM_THUMB
482 	if (elf_hwcap & HWCAP_THUMB) {
483 		/*
484 		 * The LSB of the handler determines if we're going to
485 		 * be using THUMB or ARM mode for this signal handler.
486 		 */
487 		thumb = handler & 1;
488 
489 		if (thumb) {
490 			cpsr |= PSR_T_BIT;
491 #if __LINUX_ARM_ARCH__ >= 7
492 			/* clear the If-Then Thumb-2 execution state */
493 			cpsr &= ~PSR_IT_MASK;
494 #endif
495 		} else
496 			cpsr &= ~PSR_T_BIT;
497 	}
498 #endif
499 
500 	if (ka->sa.sa_flags & SA_RESTORER) {
501 		retcode = (unsigned long)ka->sa.sa_restorer;
502 	} else {
503 		unsigned int idx = thumb << 1;
504 
505 		if (ka->sa.sa_flags & SA_SIGINFO)
506 			idx += 3;
507 
508 		if (__put_user(sigreturn_codes[idx],   rc) ||
509 		    __put_user(sigreturn_codes[idx+1], rc+1))
510 			return 1;
511 
512 		if (cpsr & MODE32_BIT) {
513 			/*
514 			 * 32-bit code can use the new high-page
515 			 * signal return code support.
516 			 */
517 			retcode = KERN_SIGRETURN_CODE + (idx << 2) + thumb;
518 		} else {
519 			/*
520 			 * Ensure that the instruction cache sees
521 			 * the return code written onto the stack.
522 			 */
523 			flush_icache_range((unsigned long)rc,
524 					   (unsigned long)(rc + 2));
525 
526 			retcode = ((unsigned long)rc) + thumb;
527 		}
528 	}
529 
530 	regs->ARM_r0 = usig;
531 	regs->ARM_sp = (unsigned long)frame;
532 	regs->ARM_lr = retcode;
533 	regs->ARM_pc = handler;
534 	regs->ARM_cpsr = cpsr;
535 
536 	return 0;
537 }
538 
539 static int
setup_frame(int usig,struct k_sigaction * ka,sigset_t * set,struct pt_regs * regs)540 setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs)
541 {
542 	struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
543 	int err = 0;
544 
545 	if (!frame)
546 		return 1;
547 
548 	/*
549 	 * Set uc.uc_flags to a value which sc.trap_no would never have.
550 	 */
551 	__put_user_error(0x5ac3c35a, &frame->uc.uc_flags, err);
552 
553 	err |= setup_sigframe(frame, regs, set);
554 	if (err == 0)
555 		err = setup_return(regs, ka, frame->retcode, frame, usig);
556 
557 	return err;
558 }
559 
560 static int
setup_rt_frame(int usig,struct k_sigaction * ka,siginfo_t * info,sigset_t * set,struct pt_regs * regs)561 setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
562 	       sigset_t *set, struct pt_regs *regs)
563 {
564 	struct rt_sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
565 	stack_t stack;
566 	int err = 0;
567 
568 	if (!frame)
569 		return 1;
570 
571 	err |= copy_siginfo_to_user(&frame->info, info);
572 
573 	__put_user_error(0, &frame->sig.uc.uc_flags, err);
574 	__put_user_error(NULL, &frame->sig.uc.uc_link, err);
575 
576 	memset(&stack, 0, sizeof(stack));
577 	stack.ss_sp = (void __user *)current->sas_ss_sp;
578 	stack.ss_flags = sas_ss_flags(regs->ARM_sp);
579 	stack.ss_size = current->sas_ss_size;
580 	err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack));
581 
582 	err |= setup_sigframe(&frame->sig, regs, set);
583 	if (err == 0)
584 		err = setup_return(regs, ka, frame->sig.retcode, frame, usig);
585 
586 	if (err == 0) {
587 		/*
588 		 * For realtime signals we must also set the second and third
589 		 * arguments for the signal handler.
590 		 *   -- Peter Maydell <pmaydell@chiark.greenend.org.uk> 2000-12-06
591 		 */
592 		regs->ARM_r1 = (unsigned long)&frame->info;
593 		regs->ARM_r2 = (unsigned long)&frame->sig.uc;
594 	}
595 
596 	return err;
597 }
598 
599 /*
600  * OK, we're invoking a handler
601  */
602 static int
handle_signal(unsigned long sig,struct k_sigaction * ka,siginfo_t * info,sigset_t * oldset,struct pt_regs * regs)603 handle_signal(unsigned long sig, struct k_sigaction *ka,
604 	      siginfo_t *info, sigset_t *oldset,
605 	      struct pt_regs * regs)
606 {
607 	struct thread_info *thread = current_thread_info();
608 	struct task_struct *tsk = current;
609 	int usig = sig;
610 	int ret;
611 
612 	/*
613 	 * translate the signal
614 	 */
615 	if (usig < 32 && thread->exec_domain && thread->exec_domain->signal_invmap)
616 		usig = thread->exec_domain->signal_invmap[usig];
617 
618 	/*
619 	 * Set up the stack frame
620 	 */
621 	if (ka->sa.sa_flags & SA_SIGINFO)
622 		ret = setup_rt_frame(usig, ka, info, oldset, regs);
623 	else
624 		ret = setup_frame(usig, ka, oldset, regs);
625 
626 	/*
627 	 * Check that the resulting registers are actually sane.
628 	 */
629 	ret |= !valid_user_regs(regs);
630 
631 	if (ret != 0) {
632 		force_sigsegv(sig, tsk);
633 		return ret;
634 	}
635 
636 	/*
637 	 * Block the signal if we were successful.
638 	 */
639 	spin_lock_irq(&tsk->sighand->siglock);
640 	sigorsets(&tsk->blocked, &tsk->blocked,
641 		  &ka->sa.sa_mask);
642 	if (!(ka->sa.sa_flags & SA_NODEFER))
643 		sigaddset(&tsk->blocked, sig);
644 	recalc_sigpending();
645 	spin_unlock_irq(&tsk->sighand->siglock);
646 
647 	return 0;
648 }
649 
650 /*
651  * Note that 'init' is a special process: it doesn't get signals it doesn't
652  * want to handle. Thus you cannot kill init even with a SIGKILL even by
653  * mistake.
654  *
655  * Note that we go through the signals twice: once to check the signals that
656  * the kernel can handle, and then we build all the user-level signal handling
657  * stack-frames in one go after that.
658  */
do_signal(struct pt_regs * regs,int syscall)659 static void do_signal(struct pt_regs *regs, int syscall)
660 {
661 	unsigned int retval = 0, continue_addr = 0, restart_addr = 0;
662 	struct k_sigaction ka;
663 	siginfo_t info;
664 	int signr;
665 
666 	/*
667 	 * We want the common case to go fast, which
668 	 * is why we may in certain cases get here from
669 	 * kernel mode. Just return without doing anything
670 	 * if so.
671 	 */
672 	if (!user_mode(regs))
673 		return;
674 
675 	/*
676 	 * If we were from a system call, check for system call restarting...
677 	 */
678 	if (syscall) {
679 		continue_addr = regs->ARM_pc;
680 		restart_addr = continue_addr - (thumb_mode(regs) ? 2 : 4);
681 		retval = regs->ARM_r0;
682 
683 		/*
684 		 * Prepare for system call restart.  We do this here so that a
685 		 * debugger will see the already changed PSW.
686 		 */
687 		switch (retval) {
688 		case -ERESTARTNOHAND:
689 		case -ERESTARTSYS:
690 		case -ERESTARTNOINTR:
691 			regs->ARM_r0 = regs->ARM_ORIG_r0;
692 			regs->ARM_pc = restart_addr;
693 			break;
694 		case -ERESTART_RESTARTBLOCK:
695 			regs->ARM_r0 = -EINTR;
696 			break;
697 		}
698 	}
699 
700 	if (try_to_freeze())
701 		goto no_signal;
702 
703 	/*
704 	 * Get the signal to deliver.  When running under ptrace, at this
705 	 * point the debugger may change all our registers ...
706 	 */
707 	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
708 	if (signr > 0) {
709 		sigset_t *oldset;
710 
711 		/*
712 		 * Depending on the signal settings we may need to revert the
713 		 * decision to restart the system call.  But skip this if a
714 		 * debugger has chosen to restart at a different PC.
715 		 */
716 		if (regs->ARM_pc == restart_addr) {
717 			if (retval == -ERESTARTNOHAND
718 			    || (retval == -ERESTARTSYS
719 				&& !(ka.sa.sa_flags & SA_RESTART))) {
720 				regs->ARM_r0 = -EINTR;
721 				regs->ARM_pc = continue_addr;
722 			}
723 		}
724 
725 		if (test_thread_flag(TIF_RESTORE_SIGMASK))
726 			oldset = &current->saved_sigmask;
727 		else
728 			oldset = &current->blocked;
729 		if (handle_signal(signr, &ka, &info, oldset, regs) == 0) {
730 			/*
731 			 * A signal was successfully delivered; the saved
732 			 * sigmask will have been stored in the signal frame,
733 			 * and will be restored by sigreturn, so we can simply
734 			 * clear the TIF_RESTORE_SIGMASK flag.
735 			 */
736 			if (test_thread_flag(TIF_RESTORE_SIGMASK))
737 				clear_thread_flag(TIF_RESTORE_SIGMASK);
738 		}
739 		return;
740 	}
741 
742  no_signal:
743 	if (syscall) {
744 		/*
745 		 * Handle restarting a different system call.  As above,
746 		 * if a debugger has chosen to restart at a different PC,
747 		 * ignore the restart.
748 		 */
749 		if (retval == -ERESTART_RESTARTBLOCK
750 		    && regs->ARM_pc == continue_addr) {
751 			if (thumb_mode(regs)) {
752 				regs->ARM_r7 = __NR_restart_syscall - __NR_SYSCALL_BASE;
753 				regs->ARM_pc -= 2;
754 			} else {
755 #if defined(CONFIG_AEABI) && !defined(CONFIG_OABI_COMPAT)
756 				regs->ARM_r7 = __NR_restart_syscall;
757 				regs->ARM_pc -= 4;
758 #else
759 				u32 __user *usp;
760 
761 				regs->ARM_sp -= 4;
762 				usp = (u32 __user *)regs->ARM_sp;
763 
764 				if (put_user(regs->ARM_pc, usp) == 0) {
765 					regs->ARM_pc = KERN_RESTART_CODE;
766 				} else {
767 					regs->ARM_sp += 4;
768 					force_sigsegv(0, current);
769 				}
770 #endif
771 			}
772 		}
773 
774 		/* If there's no signal to deliver, we just put the saved sigmask
775 		 * back.
776 		 */
777 		if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
778 			clear_thread_flag(TIF_RESTORE_SIGMASK);
779 			sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
780 		}
781 	}
782 }
783 
784 asmlinkage void
do_notify_resume(struct pt_regs * regs,unsigned int thread_flags,int syscall)785 do_notify_resume(struct pt_regs *regs, unsigned int thread_flags, int syscall)
786 {
787 	if (thread_flags & _TIF_SIGPENDING)
788 		do_signal(regs, syscall);
789 
790 	if (thread_flags & _TIF_NOTIFY_RESUME) {
791 		clear_thread_flag(TIF_NOTIFY_RESUME);
792 		tracehook_notify_resume(regs);
793 		if (current->replacement_session_keyring)
794 			key_replace_session_keyring();
795 	}
796 }
797