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