• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/arch/sparc/kernel/
1/*  arch/sparc64/kernel/signal32.c
2 *
3 *  Copyright (C) 1991, 1992  Linus Torvalds
4 *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
5 *  Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
6 *  Copyright (C) 1997 Eddie C. Dost   (ecd@skynet.be)
7 *  Copyright (C) 1997,1998 Jakub Jelinek   (jj@sunsite.mff.cuni.cz)
8 */
9
10#include <linux/sched.h>
11#include <linux/kernel.h>
12#include <linux/signal.h>
13#include <linux/errno.h>
14#include <linux/wait.h>
15#include <linux/ptrace.h>
16#include <linux/unistd.h>
17#include <linux/mm.h>
18#include <linux/tty.h>
19#include <linux/binfmts.h>
20#include <linux/compat.h>
21#include <linux/bitops.h>
22#include <linux/tracehook.h>
23
24#include <asm/uaccess.h>
25#include <asm/ptrace.h>
26#include <asm/pgtable.h>
27#include <asm/psrcompat.h>
28#include <asm/fpumacro.h>
29#include <asm/visasm.h>
30#include <asm/compat_signal.h>
31
32#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
33
34/* This magic should be in g_upper[0] for all upper parts
35 * to be valid.
36 */
37#define SIGINFO_EXTRA_V8PLUS_MAGIC	0x130e269
38typedef struct {
39	unsigned int g_upper[8];
40	unsigned int o_upper[8];
41	unsigned int asi;
42} siginfo_extra_v8plus_t;
43
44struct signal_frame32 {
45	struct sparc_stackf32	ss;
46	__siginfo32_t		info;
47	/* __siginfo_fpu32_t * */ u32 fpu_save;
48	unsigned int		insns[2];
49	unsigned int		extramask[_COMPAT_NSIG_WORDS - 1];
50	unsigned int		extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
51	/* Only valid if (info.si_regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
52	siginfo_extra_v8plus_t	v8plus;
53	__siginfo_fpu_t		fpu_state;
54};
55
56typedef struct compat_siginfo{
57	int si_signo;
58	int si_errno;
59	int si_code;
60
61	union {
62		int _pad[SI_PAD_SIZE32];
63
64		/* kill() */
65		struct {
66			compat_pid_t _pid;		/* sender's pid */
67			unsigned int _uid;		/* sender's uid */
68		} _kill;
69
70		/* POSIX.1b timers */
71		struct {
72			compat_timer_t _tid;			/* timer id */
73			int _overrun;			/* overrun count */
74			compat_sigval_t _sigval;		/* same as below */
75			int _sys_private;		/* not to be passed to user */
76		} _timer;
77
78		/* POSIX.1b signals */
79		struct {
80			compat_pid_t _pid;		/* sender's pid */
81			unsigned int _uid;		/* sender's uid */
82			compat_sigval_t _sigval;
83		} _rt;
84
85		/* SIGCHLD */
86		struct {
87			compat_pid_t _pid;		/* which child */
88			unsigned int _uid;		/* sender's uid */
89			int _status;			/* exit code */
90			compat_clock_t _utime;
91			compat_clock_t _stime;
92		} _sigchld;
93
94		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGEMT */
95		struct {
96			u32 _addr; /* faulting insn/memory ref. */
97			int _trapno;
98		} _sigfault;
99
100		/* SIGPOLL */
101		struct {
102			int _band;	/* POLL_IN, POLL_OUT, POLL_MSG */
103			int _fd;
104		} _sigpoll;
105	} _sifields;
106}compat_siginfo_t;
107
108struct rt_signal_frame32 {
109	struct sparc_stackf32	ss;
110	compat_siginfo_t	info;
111	struct pt_regs32	regs;
112	compat_sigset_t		mask;
113	/* __siginfo_fpu32_t * */ u32 fpu_save;
114	unsigned int		insns[2];
115	stack_t32		stack;
116	unsigned int		extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
117	/* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
118	siginfo_extra_v8plus_t	v8plus;
119	__siginfo_fpu_t		fpu_state;
120};
121
122/* Align macros */
123#define SF_ALIGNEDSZ  (((sizeof(struct signal_frame32) + 15) & (~15)))
124#define RT_ALIGNEDSZ  (((sizeof(struct rt_signal_frame32) + 15) & (~15)))
125
126int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
127{
128	int err;
129
130	if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
131		return -EFAULT;
132
133	/* If you change siginfo_t structure, please be sure
134	   this code is fixed accordingly.
135	   It should never copy any pad contained in the structure
136	   to avoid security leaks, but must copy the generic
137	   3 ints plus the relevant union member.
138	   This routine must convert siginfo from 64bit to 32bit as well
139	   at the same time.  */
140	err = __put_user(from->si_signo, &to->si_signo);
141	err |= __put_user(from->si_errno, &to->si_errno);
142	err |= __put_user((short)from->si_code, &to->si_code);
143	if (from->si_code < 0)
144		err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
145	else {
146		switch (from->si_code >> 16) {
147		case __SI_TIMER >> 16:
148			err |= __put_user(from->si_tid, &to->si_tid);
149			err |= __put_user(from->si_overrun, &to->si_overrun);
150			err |= __put_user(from->si_int, &to->si_int);
151			break;
152		case __SI_CHLD >> 16:
153			err |= __put_user(from->si_utime, &to->si_utime);
154			err |= __put_user(from->si_stime, &to->si_stime);
155			err |= __put_user(from->si_status, &to->si_status);
156		default:
157			err |= __put_user(from->si_pid, &to->si_pid);
158			err |= __put_user(from->si_uid, &to->si_uid);
159			break;
160		case __SI_FAULT >> 16:
161			err |= __put_user(from->si_trapno, &to->si_trapno);
162			err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
163			break;
164		case __SI_POLL >> 16:
165			err |= __put_user(from->si_band, &to->si_band);
166			err |= __put_user(from->si_fd, &to->si_fd);
167			break;
168		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
169		case __SI_MESGQ >> 16:
170			err |= __put_user(from->si_pid, &to->si_pid);
171			err |= __put_user(from->si_uid, &to->si_uid);
172			err |= __put_user(from->si_int, &to->si_int);
173			break;
174		}
175	}
176	return err;
177}
178
179/* CAUTION: This is just a very minimalist implementation for the
180 *          sake of compat_sys_rt_sigqueueinfo()
181 */
182int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
183{
184	if (!access_ok(VERIFY_WRITE, from, sizeof(compat_siginfo_t)))
185		return -EFAULT;
186
187	if (copy_from_user(to, from, 3*sizeof(int)) ||
188	    copy_from_user(to->_sifields._pad, from->_sifields._pad,
189			   SI_PAD_SIZE))
190		return -EFAULT;
191
192	return 0;
193}
194
195static int restore_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
196{
197	unsigned long *fpregs = current_thread_info()->fpregs;
198	unsigned long fprs;
199	int err;
200
201	err = __get_user(fprs, &fpu->si_fprs);
202	fprs_write(0);
203	regs->tstate &= ~TSTATE_PEF;
204	if (fprs & FPRS_DL)
205		err |= copy_from_user(fpregs, &fpu->si_float_regs[0], (sizeof(unsigned int) * 32));
206	if (fprs & FPRS_DU)
207		err |= copy_from_user(fpregs+16, &fpu->si_float_regs[32], (sizeof(unsigned int) * 32));
208	err |= __get_user(current_thread_info()->xfsr[0], &fpu->si_fsr);
209	err |= __get_user(current_thread_info()->gsr[0], &fpu->si_gsr);
210	current_thread_info()->fpsaved[0] |= fprs;
211	return err;
212}
213
214void do_sigreturn32(struct pt_regs *regs)
215{
216	struct signal_frame32 __user *sf;
217	unsigned int psr;
218	unsigned pc, npc, fpu_save;
219	sigset_t set;
220	unsigned seta[_COMPAT_NSIG_WORDS];
221	int err, i;
222
223	/* Always make any pending restarted system calls return -EINTR */
224	current_thread_info()->restart_block.fn = do_no_restart_syscall;
225
226	synchronize_user_stack();
227
228	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
229	sf = (struct signal_frame32 __user *) regs->u_regs[UREG_FP];
230
231	/* 1. Make sure we are not getting garbage from the user */
232	if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
233	    (((unsigned long) sf) & 3))
234		goto segv;
235
236	get_user(pc, &sf->info.si_regs.pc);
237	__get_user(npc, &sf->info.si_regs.npc);
238
239	if ((pc | npc) & 3)
240		goto segv;
241
242	if (test_thread_flag(TIF_32BIT)) {
243		pc &= 0xffffffff;
244		npc &= 0xffffffff;
245	}
246	regs->tpc = pc;
247	regs->tnpc = npc;
248
249	/* 2. Restore the state */
250	err = __get_user(regs->y, &sf->info.si_regs.y);
251	err |= __get_user(psr, &sf->info.si_regs.psr);
252
253	for (i = UREG_G1; i <= UREG_I7; i++)
254		err |= __get_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
255	if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
256		err |= __get_user(i, &sf->v8plus.g_upper[0]);
257		if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
258			unsigned long asi;
259
260			for (i = UREG_G1; i <= UREG_I7; i++)
261				err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
262			err |= __get_user(asi, &sf->v8plus.asi);
263			regs->tstate &= ~TSTATE_ASI;
264			regs->tstate |= ((asi & 0xffUL) << 24UL);
265		}
266	}
267
268	/* User can only change condition codes in %tstate. */
269	regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
270	regs->tstate |= psr_to_tstate_icc(psr);
271
272	/* Prevent syscall restart.  */
273	pt_regs_clear_syscall(regs);
274
275	err |= __get_user(fpu_save, &sf->fpu_save);
276	if (fpu_save)
277		err |= restore_fpu_state32(regs, &sf->fpu_state);
278	err |= __get_user(seta[0], &sf->info.si_mask);
279	err |= copy_from_user(seta+1, &sf->extramask,
280			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
281	if (err)
282	    	goto segv;
283	switch (_NSIG_WORDS) {
284		case 4: set.sig[3] = seta[6] + (((long)seta[7]) << 32);
285		case 3: set.sig[2] = seta[4] + (((long)seta[5]) << 32);
286		case 2: set.sig[1] = seta[2] + (((long)seta[3]) << 32);
287		case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32);
288	}
289	sigdelsetmask(&set, ~_BLOCKABLE);
290	spin_lock_irq(&current->sighand->siglock);
291	current->blocked = set;
292	recalc_sigpending();
293	spin_unlock_irq(&current->sighand->siglock);
294	return;
295
296segv:
297	force_sig(SIGSEGV, current);
298}
299
300asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
301{
302	struct rt_signal_frame32 __user *sf;
303	unsigned int psr, pc, npc, fpu_save, u_ss_sp;
304	mm_segment_t old_fs;
305	sigset_t set;
306	compat_sigset_t seta;
307	stack_t st;
308	int err, i;
309
310	/* Always make any pending restarted system calls return -EINTR */
311	current_thread_info()->restart_block.fn = do_no_restart_syscall;
312
313	synchronize_user_stack();
314	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
315	sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP];
316
317	/* 1. Make sure we are not getting garbage from the user */
318	if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
319	    (((unsigned long) sf) & 3))
320		goto segv;
321
322	get_user(pc, &sf->regs.pc);
323	__get_user(npc, &sf->regs.npc);
324
325	if ((pc | npc) & 3)
326		goto segv;
327
328	if (test_thread_flag(TIF_32BIT)) {
329		pc &= 0xffffffff;
330		npc &= 0xffffffff;
331	}
332	regs->tpc = pc;
333	regs->tnpc = npc;
334
335	/* 2. Restore the state */
336	err = __get_user(regs->y, &sf->regs.y);
337	err |= __get_user(psr, &sf->regs.psr);
338
339	for (i = UREG_G1; i <= UREG_I7; i++)
340		err |= __get_user(regs->u_regs[i], &sf->regs.u_regs[i]);
341	if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
342		err |= __get_user(i, &sf->v8plus.g_upper[0]);
343		if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
344			unsigned long asi;
345
346			for (i = UREG_G1; i <= UREG_I7; i++)
347				err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
348			err |= __get_user(asi, &sf->v8plus.asi);
349			regs->tstate &= ~TSTATE_ASI;
350			regs->tstate |= ((asi & 0xffUL) << 24UL);
351		}
352	}
353
354	/* User can only change condition codes in %tstate. */
355	regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
356	regs->tstate |= psr_to_tstate_icc(psr);
357
358	/* Prevent syscall restart.  */
359	pt_regs_clear_syscall(regs);
360
361	err |= __get_user(fpu_save, &sf->fpu_save);
362	if (fpu_save)
363		err |= restore_fpu_state32(regs, &sf->fpu_state);
364	err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t));
365	err |= __get_user(u_ss_sp, &sf->stack.ss_sp);
366	st.ss_sp = compat_ptr(u_ss_sp);
367	err |= __get_user(st.ss_flags, &sf->stack.ss_flags);
368	err |= __get_user(st.ss_size, &sf->stack.ss_size);
369	if (err)
370		goto segv;
371
372	/* It is more difficult to avoid calling this function than to
373	   call it and ignore errors.  */
374	old_fs = get_fs();
375	set_fs(KERNEL_DS);
376	do_sigaltstack((stack_t __user *) &st, NULL, (unsigned long)sf);
377	set_fs(old_fs);
378
379	switch (_NSIG_WORDS) {
380		case 4: set.sig[3] = seta.sig[6] + (((long)seta.sig[7]) << 32);
381		case 3: set.sig[2] = seta.sig[4] + (((long)seta.sig[5]) << 32);
382		case 2: set.sig[1] = seta.sig[2] + (((long)seta.sig[3]) << 32);
383		case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);
384	}
385	sigdelsetmask(&set, ~_BLOCKABLE);
386	spin_lock_irq(&current->sighand->siglock);
387	current->blocked = set;
388	recalc_sigpending();
389	spin_unlock_irq(&current->sighand->siglock);
390	return;
391segv:
392	force_sig(SIGSEGV, current);
393}
394
395/* Checks if the fp is valid */
396static int invalid_frame_pointer(void __user *fp, int fplen)
397{
398	if ((((unsigned long) fp) & 7) || ((unsigned long)fp) > 0x100000000ULL - fplen)
399		return 1;
400	return 0;
401}
402
403static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
404{
405	unsigned long sp;
406
407	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
408	sp = regs->u_regs[UREG_FP];
409
410	/*
411	 * If we are on the alternate signal stack and would overflow it, don't.
412	 * Return an always-bogus address instead so we will die with SIGSEGV.
413	 */
414	if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
415		return (void __user *) -1L;
416
417	/* This is the X/Open sanctioned signal stack switching.  */
418	if (sa->sa_flags & SA_ONSTACK) {
419		if (sas_ss_flags(sp) == 0)
420			sp = current->sas_ss_sp + current->sas_ss_size;
421	}
422
423	sp -= framesize;
424
425	/* Always align the stack frame.  This handles two cases.  First,
426	 * sigaltstack need not be mindful of platform specific stack
427	 * alignment.  Second, if we took this signal because the stack
428	 * is not aligned properly, we'd like to take the signal cleanly
429	 * and report that.
430	 */
431	sp &= ~15UL;
432
433	return (void __user *) sp;
434}
435
436static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
437{
438	unsigned long *fpregs = current_thread_info()->fpregs;
439	unsigned long fprs;
440	int err = 0;
441
442	fprs = current_thread_info()->fpsaved[0];
443	if (fprs & FPRS_DL)
444		err |= copy_to_user(&fpu->si_float_regs[0], fpregs,
445				    (sizeof(unsigned int) * 32));
446	if (fprs & FPRS_DU)
447		err |= copy_to_user(&fpu->si_float_regs[32], fpregs+16,
448				    (sizeof(unsigned int) * 32));
449	err |= __put_user(current_thread_info()->xfsr[0], &fpu->si_fsr);
450	err |= __put_user(current_thread_info()->gsr[0], &fpu->si_gsr);
451	err |= __put_user(fprs, &fpu->si_fprs);
452
453	return err;
454}
455
456/* The I-cache flush instruction only works in the primary ASI, which
457 * right now is the nucleus, aka. kernel space.
458 *
459 * Therefore we have to kick the instructions out using the kernel
460 * side linear mapping of the physical address backing the user
461 * instructions.
462 */
463static void flush_signal_insns(unsigned long address)
464{
465	unsigned long pstate, paddr;
466	pte_t *ptep, pte;
467	pgd_t *pgdp;
468	pud_t *pudp;
469	pmd_t *pmdp;
470
471	/* Commit all stores of the instructions we are about to flush.  */
472	wmb();
473
474	/* Disable cross-call reception.  In this way even a very wide
475	 * munmap() on another cpu can't tear down the page table
476	 * hierarchy from underneath us, since that can't complete
477	 * until the IPI tlb flush returns.
478	 */
479
480	__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
481	__asm__ __volatile__("wrpr %0, %1, %%pstate"
482				: : "r" (pstate), "i" (PSTATE_IE));
483
484	pgdp = pgd_offset(current->mm, address);
485	if (pgd_none(*pgdp))
486		goto out_irqs_on;
487	pudp = pud_offset(pgdp, address);
488	if (pud_none(*pudp))
489		goto out_irqs_on;
490	pmdp = pmd_offset(pudp, address);
491	if (pmd_none(*pmdp))
492		goto out_irqs_on;
493
494	ptep = pte_offset_map(pmdp, address);
495	pte = *ptep;
496	if (!pte_present(pte))
497		goto out_unmap;
498
499	paddr = (unsigned long) page_address(pte_page(pte));
500
501	__asm__ __volatile__("flush	%0 + %1"
502			     : /* no outputs */
503			     : "r" (paddr),
504			       "r" (address & (PAGE_SIZE - 1))
505			     : "memory");
506
507out_unmap:
508	pte_unmap(ptep);
509out_irqs_on:
510	__asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate));
511
512}
513
514static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
515			 int signo, sigset_t *oldset)
516{
517	struct signal_frame32 __user *sf;
518	int sigframe_size;
519	u32 psr;
520	int i, err;
521	unsigned int seta[_COMPAT_NSIG_WORDS];
522
523	/* 1. Make sure everything is clean */
524	synchronize_user_stack();
525	save_and_clear_fpu();
526
527	sigframe_size = SF_ALIGNEDSZ;
528	if (!(current_thread_info()->fpsaved[0] & FPRS_FEF))
529		sigframe_size -= sizeof(__siginfo_fpu_t);
530
531	sf = (struct signal_frame32 __user *)
532		get_sigframe(&ka->sa, regs, sigframe_size);
533
534	if (invalid_frame_pointer(sf, sigframe_size))
535		goto sigill;
536
537	if (get_thread_wsaved() != 0)
538		goto sigill;
539
540	/* 2. Save the current process state */
541	if (test_thread_flag(TIF_32BIT)) {
542		regs->tpc &= 0xffffffff;
543		regs->tnpc &= 0xffffffff;
544	}
545	err  = put_user(regs->tpc, &sf->info.si_regs.pc);
546	err |= __put_user(regs->tnpc, &sf->info.si_regs.npc);
547	err |= __put_user(regs->y, &sf->info.si_regs.y);
548	psr = tstate_to_psr(regs->tstate);
549	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
550		psr |= PSR_EF;
551	err |= __put_user(psr, &sf->info.si_regs.psr);
552	for (i = 0; i < 16; i++)
553		err |= __put_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
554	err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
555	err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
556	for (i = 1; i < 16; i++)
557		err |= __put_user(((u32 *)regs->u_regs)[2*i],
558				  &sf->v8plus.g_upper[i]);
559	err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL,
560			  &sf->v8plus.asi);
561
562	if (psr & PSR_EF) {
563		err |= save_fpu_state32(regs, &sf->fpu_state);
564		err |= __put_user((u64)&sf->fpu_state, &sf->fpu_save);
565	} else {
566		err |= __put_user(0, &sf->fpu_save);
567	}
568
569	switch (_NSIG_WORDS) {
570	case 4: seta[7] = (oldset->sig[3] >> 32);
571	        seta[6] = oldset->sig[3];
572	case 3: seta[5] = (oldset->sig[2] >> 32);
573	        seta[4] = oldset->sig[2];
574	case 2: seta[3] = (oldset->sig[1] >> 32);
575	        seta[2] = oldset->sig[1];
576	case 1: seta[1] = (oldset->sig[0] >> 32);
577	        seta[0] = oldset->sig[0];
578	}
579	err |= __put_user(seta[0], &sf->info.si_mask);
580	err |= __copy_to_user(sf->extramask, seta + 1,
581			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
582
583	err |= copy_in_user((u32 __user *)sf,
584			    (u32 __user *)(regs->u_regs[UREG_FP]),
585			    sizeof(struct reg_window32));
586
587	if (err)
588		goto sigsegv;
589
590	/* 3. signal handler back-trampoline and parameters */
591	regs->u_regs[UREG_FP] = (unsigned long) sf;
592	regs->u_regs[UREG_I0] = signo;
593	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
594	regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
595
596	/* 4. signal handler */
597	regs->tpc = (unsigned long) ka->sa.sa_handler;
598	regs->tnpc = (regs->tpc + 4);
599	if (test_thread_flag(TIF_32BIT)) {
600		regs->tpc &= 0xffffffff;
601		regs->tnpc &= 0xffffffff;
602	}
603
604	/* 5. return to kernel instructions */
605	if (ka->ka_restorer) {
606		regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
607	} else {
608		unsigned long address = ((unsigned long)&(sf->insns[0]));
609
610		regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
611
612		err  = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/
613		err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/
614		if (err)
615			goto sigsegv;
616
617		flush_signal_insns(address);
618	}
619	return 0;
620
621sigill:
622	do_exit(SIGILL);
623	return -EINVAL;
624
625sigsegv:
626	force_sigsegv(signo, current);
627	return -EFAULT;
628}
629
630static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
631			    unsigned long signr, sigset_t *oldset,
632			    siginfo_t *info)
633{
634	struct rt_signal_frame32 __user *sf;
635	int sigframe_size;
636	u32 psr;
637	int i, err;
638	compat_sigset_t seta;
639
640	/* 1. Make sure everything is clean */
641	synchronize_user_stack();
642	save_and_clear_fpu();
643
644	sigframe_size = RT_ALIGNEDSZ;
645	if (!(current_thread_info()->fpsaved[0] & FPRS_FEF))
646		sigframe_size -= sizeof(__siginfo_fpu_t);
647
648	sf = (struct rt_signal_frame32 __user *)
649		get_sigframe(&ka->sa, regs, sigframe_size);
650
651	if (invalid_frame_pointer(sf, sigframe_size))
652		goto sigill;
653
654	if (get_thread_wsaved() != 0)
655		goto sigill;
656
657	/* 2. Save the current process state */
658	if (test_thread_flag(TIF_32BIT)) {
659		regs->tpc &= 0xffffffff;
660		regs->tnpc &= 0xffffffff;
661	}
662	err  = put_user(regs->tpc, &sf->regs.pc);
663	err |= __put_user(regs->tnpc, &sf->regs.npc);
664	err |= __put_user(regs->y, &sf->regs.y);
665	psr = tstate_to_psr(regs->tstate);
666	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
667		psr |= PSR_EF;
668	err |= __put_user(psr, &sf->regs.psr);
669	for (i = 0; i < 16; i++)
670		err |= __put_user(regs->u_regs[i], &sf->regs.u_regs[i]);
671	err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
672	err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
673	for (i = 1; i < 16; i++)
674		err |= __put_user(((u32 *)regs->u_regs)[2*i],
675				  &sf->v8plus.g_upper[i]);
676	err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL,
677			  &sf->v8plus.asi);
678
679	if (psr & PSR_EF) {
680		err |= save_fpu_state32(regs, &sf->fpu_state);
681		err |= __put_user((u64)&sf->fpu_state, &sf->fpu_save);
682	} else {
683		err |= __put_user(0, &sf->fpu_save);
684	}
685
686	/* Update the siginfo structure.  */
687	err |= copy_siginfo_to_user32(&sf->info, info);
688
689	/* Setup sigaltstack */
690	err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
691	err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
692	err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
693
694	switch (_NSIG_WORDS) {
695	case 4: seta.sig[7] = (oldset->sig[3] >> 32);
696		seta.sig[6] = oldset->sig[3];
697	case 3: seta.sig[5] = (oldset->sig[2] >> 32);
698		seta.sig[4] = oldset->sig[2];
699	case 2: seta.sig[3] = (oldset->sig[1] >> 32);
700		seta.sig[2] = oldset->sig[1];
701	case 1: seta.sig[1] = (oldset->sig[0] >> 32);
702		seta.sig[0] = oldset->sig[0];
703	}
704	err |= __copy_to_user(&sf->mask, &seta, sizeof(compat_sigset_t));
705
706	err |= copy_in_user((u32 __user *)sf,
707			    (u32 __user *)(regs->u_regs[UREG_FP]),
708			    sizeof(struct reg_window32));
709	if (err)
710		goto sigsegv;
711
712	/* 3. signal handler back-trampoline and parameters */
713	regs->u_regs[UREG_FP] = (unsigned long) sf;
714	regs->u_regs[UREG_I0] = signr;
715	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
716	regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
717
718	/* 4. signal handler */
719	regs->tpc = (unsigned long) ka->sa.sa_handler;
720	regs->tnpc = (regs->tpc + 4);
721	if (test_thread_flag(TIF_32BIT)) {
722		regs->tpc &= 0xffffffff;
723		regs->tnpc &= 0xffffffff;
724	}
725
726	/* 5. return to kernel instructions */
727	if (ka->ka_restorer)
728		regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
729	else {
730		unsigned long address = ((unsigned long)&(sf->insns[0]));
731
732		regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
733
734		/* mov __NR_rt_sigreturn, %g1 */
735		err |= __put_user(0x82102065, &sf->insns[0]);
736
737		/* t 0x10 */
738		err |= __put_user(0x91d02010, &sf->insns[1]);
739		if (err)
740			goto sigsegv;
741
742		flush_signal_insns(address);
743	}
744	return 0;
745
746sigill:
747	do_exit(SIGILL);
748	return -EINVAL;
749
750sigsegv:
751	force_sigsegv(signr, current);
752	return -EFAULT;
753}
754
755static inline int handle_signal32(unsigned long signr, struct k_sigaction *ka,
756				  siginfo_t *info,
757				  sigset_t *oldset, struct pt_regs *regs)
758{
759	int err;
760
761	if (ka->sa.sa_flags & SA_SIGINFO)
762		err = setup_rt_frame32(ka, regs, signr, oldset, info);
763	else
764		err = setup_frame32(ka, regs, signr, oldset);
765
766	if (err)
767		return err;
768
769	spin_lock_irq(&current->sighand->siglock);
770	sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
771	if (!(ka->sa.sa_flags & SA_NOMASK))
772		sigaddset(&current->blocked,signr);
773	recalc_sigpending();
774	spin_unlock_irq(&current->sighand->siglock);
775
776	tracehook_signal_handler(signr, info, ka, regs, 0);
777
778	return 0;
779}
780
781static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs,
782				     struct sigaction *sa)
783{
784	switch (regs->u_regs[UREG_I0]) {
785	case ERESTART_RESTARTBLOCK:
786	case ERESTARTNOHAND:
787	no_system_call_restart:
788		regs->u_regs[UREG_I0] = EINTR;
789		regs->tstate |= TSTATE_ICARRY;
790		break;
791	case ERESTARTSYS:
792		if (!(sa->sa_flags & SA_RESTART))
793			goto no_system_call_restart;
794		/* fallthrough */
795	case ERESTARTNOINTR:
796		regs->u_regs[UREG_I0] = orig_i0;
797		regs->tpc -= 4;
798		regs->tnpc -= 4;
799	}
800}
801
802/* Note that 'init' is a special process: it doesn't get signals it doesn't
803 * want to handle. Thus you cannot kill init even with a SIGKILL even by
804 * mistake.
805 */
806void do_signal32(sigset_t *oldset, struct pt_regs * regs,
807		 int restart_syscall, unsigned long orig_i0)
808{
809	struct k_sigaction ka;
810	siginfo_t info;
811	int signr;
812
813	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
814
815	/* If the debugger messes with the program counter, it clears
816	 * the "in syscall" bit, directing us to not perform a syscall
817	 * restart.
818	 */
819	if (restart_syscall && !pt_regs_is_syscall(regs))
820		restart_syscall = 0;
821
822	if (signr > 0) {
823		if (restart_syscall)
824			syscall_restart32(orig_i0, regs, &ka.sa);
825		if (handle_signal32(signr, &ka, &info, oldset, regs) == 0) {
826			/* A signal was successfully delivered; the saved
827			 * sigmask will have been stored in the signal frame,
828			 * and will be restored by sigreturn, so we can simply
829			 * clear the TS_RESTORE_SIGMASK flag.
830			 */
831			current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
832		}
833		return;
834	}
835	if (restart_syscall &&
836	    (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
837	     regs->u_regs[UREG_I0] == ERESTARTSYS ||
838	     regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
839		/* replay the system call when we are done */
840		regs->u_regs[UREG_I0] = orig_i0;
841		regs->tpc -= 4;
842		regs->tnpc -= 4;
843		pt_regs_clear_syscall(regs);
844	}
845	if (restart_syscall &&
846	    regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
847		regs->u_regs[UREG_G1] = __NR_restart_syscall;
848		regs->tpc -= 4;
849		regs->tnpc -= 4;
850		pt_regs_clear_syscall(regs);
851	}
852
853	/* If there's no signal to deliver, we just put the saved sigmask
854	 * back
855	 */
856	if (current_thread_info()->status & TS_RESTORE_SIGMASK) {
857		current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
858		sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
859	}
860}
861
862struct sigstack32 {
863	u32 the_stack;
864	int cur_status;
865};
866
867asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
868{
869	struct sigstack32 __user *ssptr =
870		(struct sigstack32 __user *)((unsigned long)(u_ssptr));
871	struct sigstack32 __user *ossptr =
872		(struct sigstack32 __user *)((unsigned long)(u_ossptr));
873	int ret = -EFAULT;
874
875	/* First see if old state is wanted. */
876	if (ossptr) {
877		if (put_user(current->sas_ss_sp + current->sas_ss_size,
878			     &ossptr->the_stack) ||
879		    __put_user(on_sig_stack(sp), &ossptr->cur_status))
880			goto out;
881	}
882
883	/* Now see if we want to update the new state. */
884	if (ssptr) {
885		u32 ss_sp;
886
887		if (get_user(ss_sp, &ssptr->the_stack))
888			goto out;
889
890		/* If the current stack was set with sigaltstack, don't
891		 * swap stacks while we are on it.
892		 */
893		ret = -EPERM;
894		if (current->sas_ss_sp && on_sig_stack(sp))
895			goto out;
896
897		/* Since we don't know the extent of the stack, and we don't
898		 * track onstack-ness, but rather calculate it, we must
899		 * presume a size.  Ho hum this interface is lossy.
900		 */
901		current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
902		current->sas_ss_size = SIGSTKSZ;
903	}
904
905	ret = 0;
906out:
907	return ret;
908}
909
910asmlinkage long do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp)
911{
912	stack_t uss, uoss;
913	u32 u_ss_sp = 0;
914	int ret;
915	mm_segment_t old_fs;
916	stack_t32 __user *uss32 = compat_ptr(ussa);
917	stack_t32 __user *uoss32 = compat_ptr(uossa);
918
919	if (ussa && (get_user(u_ss_sp, &uss32->ss_sp) ||
920		    __get_user(uss.ss_flags, &uss32->ss_flags) ||
921		    __get_user(uss.ss_size, &uss32->ss_size)))
922		return -EFAULT;
923	uss.ss_sp = compat_ptr(u_ss_sp);
924	old_fs = get_fs();
925	set_fs(KERNEL_DS);
926	ret = do_sigaltstack(ussa ? (stack_t __user *) &uss : NULL,
927			     uossa ? (stack_t __user *) &uoss : NULL, sp);
928	set_fs(old_fs);
929	if (!ret && uossa && (put_user(ptr_to_compat(uoss.ss_sp), &uoss32->ss_sp) ||
930		    __put_user(uoss.ss_flags, &uoss32->ss_flags) ||
931		    __put_user(uoss.ss_size, &uoss32->ss_size)))
932		return -EFAULT;
933	return ret;
934}
935