• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/arch/sh/kernel/
1/*
2 * arch/sh/kernel/signal_64.c
3 *
4 * Copyright (C) 2000, 2001  Paolo Alberelli
5 * Copyright (C) 2003 - 2008  Paul Mundt
6 * Copyright (C) 2004  Richard Curnow
7 *
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
10 * for more details.
11 */
12#include <linux/rwsem.h>
13#include <linux/sched.h>
14#include <linux/mm.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>
30#include <asm/fpu.h>
31
32#define REG_RET 9
33#define REG_ARG1 2
34#define REG_ARG2 3
35#define REG_ARG3 4
36#define REG_SP 15
37#define REG_PR 18
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]
41
42#define DEBUG_SIG 0
43
44#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
45
46static int
47handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
48		sigset_t *oldset, struct pt_regs * regs);
49
50static inline void
51handle_syscall_restart(struct pt_regs *regs, struct sigaction *sa)
52{
53	/* If we're not from a syscall, bail out */
54	if (regs->syscall_nr < 0)
55		return;
56
57	/* check for system call restart.. */
58	switch (regs->regs[REG_RET]) {
59		case -ERESTART_RESTARTBLOCK:
60		case -ERESTARTNOHAND:
61		no_system_call_restart:
62			regs->regs[REG_RET] = -EINTR;
63			break;
64
65		case -ERESTARTSYS:
66			if (!(sa->sa_flags & SA_RESTART))
67				goto no_system_call_restart;
68		/* fallthrough */
69		case -ERESTARTNOINTR:
70			/* Decode syscall # */
71			regs->regs[REG_RET] = regs->syscall_nr;
72			regs->pc -= 4;
73			break;
74	}
75}
76
77/*
78 * Note that 'init' is a special process: it doesn't get signals it doesn't
79 * want to handle. Thus you cannot kill init even with a SIGKILL even by
80 * mistake.
81 *
82 * Note that we go through the signals twice: once to check the signals that
83 * the kernel can handle, and then we build all the user-level signal handling
84 * stack-frames in one go after that.
85 */
86static int do_signal(struct pt_regs *regs, sigset_t *oldset)
87{
88	siginfo_t info;
89	int signr;
90	struct k_sigaction ka;
91
92	/*
93	 * We want the common case to go fast, which
94	 * is why we may in certain cases get here from
95	 * kernel mode. Just return without doing anything
96	 * if so.
97	 */
98	if (!user_mode(regs))
99		return 1;
100
101	if (try_to_freeze())
102		goto no_signal;
103
104	if (current_thread_info()->status & TS_RESTORE_SIGMASK)
105		oldset = &current->saved_sigmask;
106	else if (!oldset)
107		oldset = &current->blocked;
108
109	signr = get_signal_to_deliver(&info, &ka, regs, 0);
110	if (signr > 0) {
111		handle_syscall_restart(regs, &ka.sa);
112
113		/* Whee!  Actually deliver the signal.  */
114		if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
115			/*
116			 * If a signal was successfully delivered, the
117			 * saved sigmask is in its frame, and we can
118			 * clear the TS_RESTORE_SIGMASK flag.
119			 */
120			current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
121
122			tracehook_signal_handler(signr, &info, &ka, regs,
123					test_thread_flag(TIF_SINGLESTEP));
124			return 1;
125		}
126	}
127
128no_signal:
129	/* Did we come from a system call? */
130	if (regs->syscall_nr >= 0) {
131		/* Restart the system call - no handlers present */
132		switch (regs->regs[REG_RET]) {
133		case -ERESTARTNOHAND:
134		case -ERESTARTSYS:
135		case -ERESTARTNOINTR:
136			/* Decode Syscall # */
137			regs->regs[REG_RET] = regs->syscall_nr;
138			regs->pc -= 4;
139			break;
140
141		case -ERESTART_RESTARTBLOCK:
142			regs->regs[REG_RET] = __NR_restart_syscall;
143			regs->pc -= 4;
144			break;
145		}
146	}
147
148	/* No signal to deliver -- put the saved sigmask back */
149	if (current_thread_info()->status & TS_RESTORE_SIGMASK) {
150		current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
151		sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
152	}
153
154	return 0;
155}
156
157/*
158 * Atomically swap in the new signal mask, and wait for a signal.
159 */
160asmlinkage int
161sys_sigsuspend(old_sigset_t mask,
162	       unsigned long r3, unsigned long r4, unsigned long r5,
163	       unsigned long r6, unsigned long r7,
164	       struct pt_regs * regs)
165{
166	sigset_t saveset;
167
168	mask &= _BLOCKABLE;
169	spin_lock_irq(&current->sighand->siglock);
170	saveset = current->blocked;
171	siginitset(&current->blocked, mask);
172	recalc_sigpending();
173	spin_unlock_irq(&current->sighand->siglock);
174
175	REF_REG_RET = -EINTR;
176	while (1) {
177		current->state = TASK_INTERRUPTIBLE;
178		schedule();
179		set_restore_sigmask();
180		regs->pc += 4;    /* because sys_sigreturn decrements the pc */
181		if (do_signal(regs, &saveset)) {
182			/* pc now points at signal handler. Need to decrement
183			   it because entry.S will increment it. */
184			regs->pc -= 4;
185			return -EINTR;
186		}
187	}
188}
189
190asmlinkage int
191sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize,
192	          unsigned long r4, unsigned long r5, unsigned long r6,
193	          unsigned long r7,
194	          struct pt_regs * regs)
195{
196	sigset_t saveset, newset;
197
198	if (sigsetsize != sizeof(sigset_t))
199		return -EINVAL;
200
201	if (copy_from_user(&newset, unewset, sizeof(newset)))
202		return -EFAULT;
203	sigdelsetmask(&newset, ~_BLOCKABLE);
204	spin_lock_irq(&current->sighand->siglock);
205	saveset = current->blocked;
206	current->blocked = newset;
207	recalc_sigpending();
208	spin_unlock_irq(&current->sighand->siglock);
209
210	REF_REG_RET = -EINTR;
211	while (1) {
212		current->state = TASK_INTERRUPTIBLE;
213		schedule();
214		regs->pc += 4;    /* because sys_sigreturn decrements the pc */
215		if (do_signal(regs, &saveset)) {
216			/* pc now points at signal handler. Need to decrement
217			   it because entry.S will increment it. */
218			regs->pc -= 4;
219			return -EINTR;
220		}
221	}
222}
223
224asmlinkage int
225sys_sigaction(int sig, const struct old_sigaction __user *act,
226	      struct old_sigaction __user *oact)
227{
228	struct k_sigaction new_ka, old_ka;
229	int ret;
230
231	if (act) {
232		old_sigset_t mask;
233		if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
234		    __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
235		    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
236			return -EFAULT;
237		__get_user(new_ka.sa.sa_flags, &act->sa_flags);
238		__get_user(mask, &act->sa_mask);
239		siginitset(&new_ka.sa.sa_mask, mask);
240	}
241
242	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
243
244	if (!ret && oact) {
245		if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
246		    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
247		    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
248			return -EFAULT;
249		__put_user(old_ka.sa.sa_flags, &oact->sa_flags);
250		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
251	}
252
253	return ret;
254}
255
256asmlinkage int
257sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
258	        unsigned long r4, unsigned long r5, unsigned long r6,
259	        unsigned long r7,
260	        struct pt_regs * regs)
261{
262	return do_sigaltstack(uss, uoss, REF_REG_SP);
263}
264
265/*
266 * Do a signal return; undo the signal stack.
267 */
268struct sigframe {
269	struct sigcontext sc;
270	unsigned long extramask[_NSIG_WORDS-1];
271	long long retcode[2];
272};
273
274struct rt_sigframe {
275	struct siginfo __user *pinfo;
276	void *puc;
277	struct siginfo info;
278	struct ucontext uc;
279	long long retcode[2];
280};
281
282#ifdef CONFIG_SH_FPU
283static inline int
284restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
285{
286	int err = 0;
287	int fpvalid;
288
289	err |= __get_user (fpvalid, &sc->sc_fpvalid);
290	conditional_used_math(fpvalid);
291	if (! fpvalid)
292		return err;
293
294	if (current == last_task_used_math) {
295		last_task_used_math = NULL;
296		regs->sr |= SR_FD;
297	}
298
299	err |= __copy_from_user(&current->thread.xstate->hardfpu, &sc->sc_fpregs[0],
300				(sizeof(long long) * 32) + (sizeof(int) * 1));
301
302	return err;
303}
304
305static inline int
306setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
307{
308	int err = 0;
309	int fpvalid;
310
311	fpvalid = !!used_math();
312	err |= __put_user(fpvalid, &sc->sc_fpvalid);
313	if (! fpvalid)
314		return err;
315
316	if (current == last_task_used_math) {
317		enable_fpu();
318		save_fpu(current);
319		disable_fpu();
320		last_task_used_math = NULL;
321		regs->sr |= SR_FD;
322	}
323
324	err |= __copy_to_user(&sc->sc_fpregs[0], &current->thread.xstate->hardfpu,
325			      (sizeof(long long) * 32) + (sizeof(int) * 1));
326	clear_used_math();
327
328	return err;
329}
330#else
331static inline int
332restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
333{
334	return 0;
335}
336static inline int
337setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
338{
339	return 0;
340}
341#endif
342
343static int
344restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, long long *r2_p)
345{
346	unsigned int err = 0;
347        unsigned long long current_sr, new_sr;
348#define SR_MASK 0xffff8cfd
349
350#define COPY(x)		err |= __get_user(regs->x, &sc->sc_##x)
351
352	COPY(regs[0]);	COPY(regs[1]);	COPY(regs[2]);	COPY(regs[3]);
353	COPY(regs[4]);	COPY(regs[5]);	COPY(regs[6]);	COPY(regs[7]);
354	COPY(regs[8]);	COPY(regs[9]);  COPY(regs[10]);	COPY(regs[11]);
355	COPY(regs[12]);	COPY(regs[13]);	COPY(regs[14]);	COPY(regs[15]);
356	COPY(regs[16]);	COPY(regs[17]);	COPY(regs[18]);	COPY(regs[19]);
357	COPY(regs[20]);	COPY(regs[21]);	COPY(regs[22]);	COPY(regs[23]);
358	COPY(regs[24]);	COPY(regs[25]);	COPY(regs[26]);	COPY(regs[27]);
359	COPY(regs[28]);	COPY(regs[29]);	COPY(regs[30]);	COPY(regs[31]);
360	COPY(regs[32]);	COPY(regs[33]);	COPY(regs[34]);	COPY(regs[35]);
361	COPY(regs[36]);	COPY(regs[37]);	COPY(regs[38]);	COPY(regs[39]);
362	COPY(regs[40]);	COPY(regs[41]);	COPY(regs[42]);	COPY(regs[43]);
363	COPY(regs[44]);	COPY(regs[45]);	COPY(regs[46]);	COPY(regs[47]);
364	COPY(regs[48]);	COPY(regs[49]);	COPY(regs[50]);	COPY(regs[51]);
365	COPY(regs[52]);	COPY(regs[53]);	COPY(regs[54]);	COPY(regs[55]);
366	COPY(regs[56]);	COPY(regs[57]);	COPY(regs[58]);	COPY(regs[59]);
367	COPY(regs[60]);	COPY(regs[61]);	COPY(regs[62]);
368	COPY(tregs[0]);	COPY(tregs[1]);	COPY(tregs[2]);	COPY(tregs[3]);
369	COPY(tregs[4]);	COPY(tregs[5]);	COPY(tregs[6]);	COPY(tregs[7]);
370
371        /* Prevent the signal handler manipulating SR in a way that can
372           crash the kernel. i.e. only allow S, Q, M, PR, SZ, FR to be
373           modified */
374        current_sr = regs->sr;
375        err |= __get_user(new_sr, &sc->sc_sr);
376        regs->sr &= SR_MASK;
377        regs->sr |= (new_sr & ~SR_MASK);
378
379	COPY(pc);
380
381#undef COPY
382
383	/* Must do this last in case it sets regs->sr.fd (i.e. after rest of sr
384	 * has been restored above.) */
385	err |= restore_sigcontext_fpu(regs, sc);
386
387	regs->syscall_nr = -1;		/* disable syscall checks */
388	err |= __get_user(*r2_p, &sc->sc_regs[REG_RET]);
389	return err;
390}
391
392asmlinkage int sys_sigreturn(unsigned long r2, unsigned long r3,
393				   unsigned long r4, unsigned long r5,
394				   unsigned long r6, unsigned long r7,
395				   struct pt_regs * regs)
396{
397	struct sigframe __user *frame = (struct sigframe __user *) (long) REF_REG_SP;
398	sigset_t set;
399	long long ret;
400
401	/* Always make any pending restarted system calls return -EINTR */
402	current_thread_info()->restart_block.fn = do_no_restart_syscall;
403
404	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
405		goto badframe;
406
407	if (__get_user(set.sig[0], &frame->sc.oldmask)
408	    || (_NSIG_WORDS > 1
409		&& __copy_from_user(&set.sig[1], &frame->extramask,
410				    sizeof(frame->extramask))))
411		goto badframe;
412
413	sigdelsetmask(&set, ~_BLOCKABLE);
414
415	spin_lock_irq(&current->sighand->siglock);
416	current->blocked = set;
417	recalc_sigpending();
418	spin_unlock_irq(&current->sighand->siglock);
419
420	if (restore_sigcontext(regs, &frame->sc, &ret))
421		goto badframe;
422	regs->pc -= 4;
423
424	return (int) ret;
425
426badframe:
427	force_sig(SIGSEGV, current);
428	return 0;
429}
430
431asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
432				unsigned long r4, unsigned long r5,
433				unsigned long r6, unsigned long r7,
434				struct pt_regs * regs)
435{
436	struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP;
437	sigset_t set;
438	stack_t __user st;
439	long long ret;
440
441	/* Always make any pending restarted system calls return -EINTR */
442	current_thread_info()->restart_block.fn = do_no_restart_syscall;
443
444	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
445		goto badframe;
446
447	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
448		goto badframe;
449
450	sigdelsetmask(&set, ~_BLOCKABLE);
451	spin_lock_irq(&current->sighand->siglock);
452	current->blocked = set;
453	recalc_sigpending();
454	spin_unlock_irq(&current->sighand->siglock);
455
456	if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret))
457		goto badframe;
458	regs->pc -= 4;
459
460	if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
461		goto badframe;
462	/* It is more difficult to avoid calling this function than to
463	   call it and ignore errors.  */
464	do_sigaltstack(&st, NULL, REF_REG_SP);
465
466	return (int) ret;
467
468badframe:
469	force_sig(SIGSEGV, current);
470	return 0;
471}
472
473/*
474 * Set up a signal frame.
475 */
476static int
477setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
478		 unsigned long mask)
479{
480	int err = 0;
481
482	/* Do this first, otherwise is this sets sr->fd, that value isn't preserved. */
483	err |= setup_sigcontext_fpu(regs, sc);
484
485#define COPY(x)		err |= __put_user(regs->x, &sc->sc_##x)
486
487	COPY(regs[0]);	COPY(regs[1]);	COPY(regs[2]);	COPY(regs[3]);
488	COPY(regs[4]);	COPY(regs[5]);	COPY(regs[6]);	COPY(regs[7]);
489	COPY(regs[8]);	COPY(regs[9]);	COPY(regs[10]);	COPY(regs[11]);
490	COPY(regs[12]);	COPY(regs[13]);	COPY(regs[14]);	COPY(regs[15]);
491	COPY(regs[16]);	COPY(regs[17]);	COPY(regs[18]);	COPY(regs[19]);
492	COPY(regs[20]);	COPY(regs[21]);	COPY(regs[22]);	COPY(regs[23]);
493	COPY(regs[24]);	COPY(regs[25]);	COPY(regs[26]);	COPY(regs[27]);
494	COPY(regs[28]);	COPY(regs[29]);	COPY(regs[30]);	COPY(regs[31]);
495	COPY(regs[32]);	COPY(regs[33]);	COPY(regs[34]);	COPY(regs[35]);
496	COPY(regs[36]);	COPY(regs[37]);	COPY(regs[38]);	COPY(regs[39]);
497	COPY(regs[40]);	COPY(regs[41]);	COPY(regs[42]);	COPY(regs[43]);
498	COPY(regs[44]);	COPY(regs[45]);	COPY(regs[46]);	COPY(regs[47]);
499	COPY(regs[48]);	COPY(regs[49]);	COPY(regs[50]);	COPY(regs[51]);
500	COPY(regs[52]);	COPY(regs[53]);	COPY(regs[54]);	COPY(regs[55]);
501	COPY(regs[56]);	COPY(regs[57]);	COPY(regs[58]);	COPY(regs[59]);
502	COPY(regs[60]);	COPY(regs[61]);	COPY(regs[62]);
503	COPY(tregs[0]);	COPY(tregs[1]);	COPY(tregs[2]);	COPY(tregs[3]);
504	COPY(tregs[4]);	COPY(tregs[5]);	COPY(tregs[6]);	COPY(tregs[7]);
505	COPY(sr);	COPY(pc);
506
507#undef COPY
508
509	err |= __put_user(mask, &sc->oldmask);
510
511	return err;
512}
513
514/*
515 * Determine which stack to use..
516 */
517static inline void __user *
518get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
519{
520	if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
521		sp = current->sas_ss_sp + current->sas_ss_size;
522
523	return (void __user *)((sp - frame_size) & -8ul);
524}
525
526void sa_default_restorer(void);		/* See comments below */
527void sa_default_rt_restorer(void);	/* See comments below */
528
529static int setup_frame(int sig, struct k_sigaction *ka,
530		       sigset_t *set, struct pt_regs *regs)
531{
532	struct sigframe __user *frame;
533	int err = 0;
534	int signal;
535
536	frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
537
538	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
539		goto give_sigsegv;
540
541	signal = current_thread_info()->exec_domain
542		&& current_thread_info()->exec_domain->signal_invmap
543		&& sig < 32
544		? current_thread_info()->exec_domain->signal_invmap[sig]
545		: sig;
546
547	err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
548
549	/* Give up earlier as i386, in case */
550	if (err)
551		goto give_sigsegv;
552
553	if (_NSIG_WORDS > 1) {
554		err |= __copy_to_user(frame->extramask, &set->sig[1],
555				      sizeof(frame->extramask)); }
556
557	/* Give up earlier as i386, in case */
558	if (err)
559		goto give_sigsegv;
560
561	/* Set up to return from userspace.  If provided, use a stub
562	   already in userspace.  */
563	if (ka->sa.sa_flags & SA_RESTORER) {
564		/*
565		 * On SH5 all edited pointers are subject to NEFF
566		 */
567		DEREF_REG_PR = neff_sign_extend((unsigned long)
568			ka->sa.sa_restorer | 0x1);
569	} else {
570		/*
571		 * Different approach on SH5.
572	         * . Endianness independent asm code gets placed in entry.S .
573		 *   This is limited to four ASM instructions corresponding
574		 *   to two long longs in size.
575		 * . err checking is done on the else branch only
576		 * . flush_icache_range() is called upon __put_user() only
577		 * . all edited pointers are subject to NEFF
578		 * . being code, linker turns ShMedia bit on, always
579		 *   dereference index -1.
580		 */
581		DEREF_REG_PR = neff_sign_extend((unsigned long)
582			frame->retcode | 0x01);
583
584		if (__copy_to_user(frame->retcode,
585			(void *)((unsigned long)sa_default_restorer & (~1)), 16) != 0)
586			goto give_sigsegv;
587
588		/* Cohere the trampoline with the I-cache. */
589		flush_cache_sigtramp(DEREF_REG_PR-1);
590	}
591
592	/*
593	 * Set up registers for signal handler.
594	 * All edited pointers are subject to NEFF.
595	 */
596	regs->regs[REG_SP] = neff_sign_extend((unsigned long)frame);
597	regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
598
599
600	regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
601	regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
602
603	regs->pc = neff_sign_extend((unsigned long)ka->sa.sa_handler);
604
605	set_fs(USER_DS);
606
607	/* Broken %016Lx */
608	pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
609		 signal, current->comm, current->pid, frame,
610		 regs->pc >> 32, regs->pc & 0xffffffff,
611		 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
612
613	return 0;
614
615give_sigsegv:
616	force_sigsegv(sig, current);
617	return -EFAULT;
618}
619
620static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
621			  sigset_t *set, struct pt_regs *regs)
622{
623	struct rt_sigframe __user *frame;
624	int err = 0;
625	int signal;
626
627	frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
628
629	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
630		goto give_sigsegv;
631
632	signal = current_thread_info()->exec_domain
633		&& current_thread_info()->exec_domain->signal_invmap
634		&& sig < 32
635		? current_thread_info()->exec_domain->signal_invmap[sig]
636		: sig;
637
638	err |= __put_user(&frame->info, &frame->pinfo);
639	err |= __put_user(&frame->uc, &frame->puc);
640	err |= copy_siginfo_to_user(&frame->info, info);
641
642	/* Give up earlier as i386, in case */
643	if (err)
644		goto give_sigsegv;
645
646	/* Create the ucontext.  */
647	err |= __put_user(0, &frame->uc.uc_flags);
648	err |= __put_user(0, &frame->uc.uc_link);
649	err |= __put_user((void *)current->sas_ss_sp,
650			  &frame->uc.uc_stack.ss_sp);
651	err |= __put_user(sas_ss_flags(regs->regs[REG_SP]),
652			  &frame->uc.uc_stack.ss_flags);
653	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
654	err |= setup_sigcontext(&frame->uc.uc_mcontext,
655			        regs, set->sig[0]);
656	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
657
658	/* Give up earlier as i386, in case */
659	if (err)
660		goto give_sigsegv;
661
662	/* Set up to return from userspace.  If provided, use a stub
663	   already in userspace.  */
664	if (ka->sa.sa_flags & SA_RESTORER) {
665		/*
666		 * On SH5 all edited pointers are subject to NEFF
667		 */
668		DEREF_REG_PR = neff_sign_extend((unsigned long)
669			ka->sa.sa_restorer | 0x1);
670	} else {
671		/*
672		 * Different approach on SH5.
673	         * . Endianness independent asm code gets placed in entry.S .
674		 *   This is limited to four ASM instructions corresponding
675		 *   to two long longs in size.
676		 * . err checking is done on the else branch only
677		 * . flush_icache_range() is called upon __put_user() only
678		 * . all edited pointers are subject to NEFF
679		 * . being code, linker turns ShMedia bit on, always
680		 *   dereference index -1.
681		 */
682		DEREF_REG_PR = neff_sign_extend((unsigned long)
683			frame->retcode | 0x01);
684
685		if (__copy_to_user(frame->retcode,
686			(void *)((unsigned long)sa_default_rt_restorer & (~1)), 16) != 0)
687			goto give_sigsegv;
688
689		/* Cohere the trampoline with the I-cache. */
690		flush_icache_range(DEREF_REG_PR-1, DEREF_REG_PR-1+15);
691	}
692
693	/*
694	 * Set up registers for signal handler.
695	 * All edited pointers are subject to NEFF.
696	 */
697	regs->regs[REG_SP] = neff_sign_extend((unsigned long)frame);
698	regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
699	regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->info;
700	regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->uc.uc_mcontext;
701	regs->pc = neff_sign_extend((unsigned long)ka->sa.sa_handler);
702
703	set_fs(USER_DS);
704
705	pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
706		 signal, current->comm, current->pid, frame,
707		 regs->pc >> 32, regs->pc & 0xffffffff,
708		 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
709
710	return 0;
711
712give_sigsegv:
713	force_sigsegv(sig, current);
714	return -EFAULT;
715}
716
717/*
718 * OK, we're invoking a handler
719 */
720static int
721handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
722		sigset_t *oldset, struct pt_regs * regs)
723{
724	int ret;
725
726	/* Set up the stack frame */
727	if (ka->sa.sa_flags & SA_SIGINFO)
728		ret = setup_rt_frame(sig, ka, info, oldset, regs);
729	else
730		ret = setup_frame(sig, ka, oldset, regs);
731
732	if (ka->sa.sa_flags & SA_ONESHOT)
733		ka->sa.sa_handler = SIG_DFL;
734
735	if (ret == 0) {
736		spin_lock_irq(&current->sighand->siglock);
737		sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
738		if (!(ka->sa.sa_flags & SA_NODEFER))
739			sigaddset(&current->blocked,sig);
740		recalc_sigpending();
741		spin_unlock_irq(&current->sighand->siglock);
742	}
743
744	return ret;
745}
746
747asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
748{
749	if (thread_info_flags & _TIF_SIGPENDING)
750		do_signal(regs, 0);
751
752	if (thread_info_flags & _TIF_NOTIFY_RESUME) {
753		clear_thread_flag(TIF_NOTIFY_RESUME);
754		tracehook_notify_resume(regs);
755		if (current->replacement_session_keyring)
756			key_replace_session_keyring();
757	}
758}
759