Linux Audio

Check our new training course

Loading...
v4.17
  1// SPDX-License-Identifier: GPL-2.0
  2/*  arch/sparc64/kernel/signal32.c
  3 *
  4 *  Copyright (C) 1991, 1992  Linus Torvalds
  5 *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  6 *  Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
  7 *  Copyright (C) 1997 Eddie C. Dost   (ecd@skynet.be)
  8 *  Copyright (C) 1997,1998 Jakub Jelinek   (jj@sunsite.mff.cuni.cz)
  9 */
 10
 11#include <linux/sched.h>
 12#include <linux/kernel.h>
 13#include <linux/signal.h>
 14#include <linux/errno.h>
 15#include <linux/wait.h>
 16#include <linux/ptrace.h>
 17#include <linux/unistd.h>
 18#include <linux/mm.h>
 19#include <linux/tty.h>
 20#include <linux/binfmts.h>
 21#include <linux/compat.h>
 22#include <linux/bitops.h>
 23#include <linux/tracehook.h>
 24
 25#include <linux/uaccess.h>
 26#include <asm/ptrace.h>
 27#include <asm/pgtable.h>
 28#include <asm/psrcompat.h>
 29#include <asm/fpumacro.h>
 30#include <asm/visasm.h>
 31#include <asm/compat_signal.h>
 32#include <asm/switch_to.h>
 33
 34#include "sigutil.h"
 35#include "kernel.h"
 36
 37/* This magic should be in g_upper[0] for all upper parts
 38 * to be valid.
 39 */
 40#define SIGINFO_EXTRA_V8PLUS_MAGIC	0x130e269
 41typedef struct {
 42	unsigned int g_upper[8];
 43	unsigned int o_upper[8];
 44	unsigned int asi;
 45} siginfo_extra_v8plus_t;
 46
 47struct signal_frame32 {
 48	struct sparc_stackf32	ss;
 49	__siginfo32_t		info;
 50	/* __siginfo_fpu_t * */ u32 fpu_save;
 51	unsigned int		insns[2];
 52	unsigned int		extramask[_COMPAT_NSIG_WORDS - 1];
 53	unsigned int		extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
 54	/* Only valid if (info.si_regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
 55	siginfo_extra_v8plus_t	v8plus;
 56	/* __siginfo_rwin_t * */u32 rwin_save;
 57} __attribute__((aligned(8)));
 58
 59struct rt_signal_frame32 {
 60	struct sparc_stackf32	ss;
 61	compat_siginfo_t	info;
 62	struct pt_regs32	regs;
 63	compat_sigset_t		mask;
 64	/* __siginfo_fpu_t * */ u32 fpu_save;
 65	unsigned int		insns[2];
 66	compat_stack_t		stack;
 67	unsigned int		extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
 68	/* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
 69	siginfo_extra_v8plus_t	v8plus;
 70	/* __siginfo_rwin_t * */u32 rwin_save;
 71} __attribute__((aligned(8)));
 72
 73/* Checks if the fp is valid.  We always build signal frames which are
 74 * 16-byte aligned, therefore we can always enforce that the restore
 75 * frame has that property as well.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 76 */
 77static bool invalid_frame_pointer(void __user *fp, int fplen)
 78{
 79	if ((((unsigned long) fp) & 15) ||
 80	    ((unsigned long)fp) > 0x100000000ULL - fplen)
 81		return true;
 82	return false;
 
 
 
 
 
 83}
 84
 85void do_sigreturn32(struct pt_regs *regs)
 86{
 87	struct signal_frame32 __user *sf;
 88	compat_uptr_t fpu_save;
 89	compat_uptr_t rwin_save;
 90	unsigned int psr, ufp;
 91	unsigned int pc, npc;
 92	sigset_t set;
 93	compat_sigset_t seta;
 94	int err, i;
 95	
 96	/* Always make any pending restarted system calls return -EINTR */
 97	current->restart_block.fn = do_no_restart_syscall;
 98
 99	synchronize_user_stack();
100
101	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
102	sf = (struct signal_frame32 __user *) regs->u_regs[UREG_FP];
103
104	/* 1. Make sure we are not getting garbage from the user */
105	if (invalid_frame_pointer(sf, sizeof(*sf)))
106		goto segv;
107
108	if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP]))
109		goto segv;
110
111	if (ufp & 0x7)
112		goto segv;
113
114	if (__get_user(pc, &sf->info.si_regs.pc) ||
115	    __get_user(npc, &sf->info.si_regs.npc))
116		goto segv;
117
118	if ((pc | npc) & 3)
119		goto segv;
120
121	if (test_thread_flag(TIF_32BIT)) {
122		pc &= 0xffffffff;
123		npc &= 0xffffffff;
124	}
125	regs->tpc = pc;
126	regs->tnpc = npc;
127
128	/* 2. Restore the state */
129	err = __get_user(regs->y, &sf->info.si_regs.y);
130	err |= __get_user(psr, &sf->info.si_regs.psr);
131
132	for (i = UREG_G1; i <= UREG_I7; i++)
133		err |= __get_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
134	if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
135		err |= __get_user(i, &sf->v8plus.g_upper[0]);
136		if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
137			unsigned long asi;
138
139			for (i = UREG_G1; i <= UREG_I7; i++)
140				err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
141			err |= __get_user(asi, &sf->v8plus.asi);
142			regs->tstate &= ~TSTATE_ASI;
143			regs->tstate |= ((asi & 0xffUL) << 24UL);
144		}
145	}
146
147	/* User can only change condition codes in %tstate. */
148	regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
149	regs->tstate |= psr_to_tstate_icc(psr);
150
151	/* Prevent syscall restart.  */
152	pt_regs_clear_syscall(regs);
153
154	err |= __get_user(fpu_save, &sf->fpu_save);
155	if (!err && fpu_save)
156		err |= restore_fpu_state(regs, compat_ptr(fpu_save));
157	err |= __get_user(rwin_save, &sf->rwin_save);
158	if (!err && rwin_save) {
159		if (restore_rwin_state(compat_ptr(rwin_save)))
160			goto segv;
161	}
162	err |= __get_user(seta.sig[0], &sf->info.si_mask);
163	err |= copy_from_user(&seta.sig[1], &sf->extramask,
164			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
165	if (err)
166	    	goto segv;
167
168	set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);
169	set_current_blocked(&set);
170	return;
171
172segv:
173	force_sig(SIGSEGV, current);
174}
175
176asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
177{
178	struct rt_signal_frame32 __user *sf;
179	unsigned int psr, pc, npc, ufp;
180	compat_uptr_t fpu_save;
181	compat_uptr_t rwin_save;
182	sigset_t set;
 
183	int err, i;
184	
185	/* Always make any pending restarted system calls return -EINTR */
186	current->restart_block.fn = do_no_restart_syscall;
187
188	synchronize_user_stack();
189	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
190	sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP];
191
192	/* 1. Make sure we are not getting garbage from the user */
193	if (invalid_frame_pointer(sf, sizeof(*sf)))
194		goto segv;
195
196	if (get_user(ufp, &sf->regs.u_regs[UREG_FP]))
197		goto segv;
198
199	if (ufp & 0x7)
200		goto segv;
201
202	if (__get_user(pc, &sf->regs.pc) || 
203	    __get_user(npc, &sf->regs.npc))
204		goto segv;
205
206	if ((pc | npc) & 3)
207		goto segv;
208
209	if (test_thread_flag(TIF_32BIT)) {
210		pc &= 0xffffffff;
211		npc &= 0xffffffff;
212	}
213	regs->tpc = pc;
214	regs->tnpc = npc;
215
216	/* 2. Restore the state */
217	err = __get_user(regs->y, &sf->regs.y);
218	err |= __get_user(psr, &sf->regs.psr);
219	
220	for (i = UREG_G1; i <= UREG_I7; i++)
221		err |= __get_user(regs->u_regs[i], &sf->regs.u_regs[i]);
222	if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
223		err |= __get_user(i, &sf->v8plus.g_upper[0]);
224		if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
225			unsigned long asi;
226
227			for (i = UREG_G1; i <= UREG_I7; i++)
228				err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
229			err |= __get_user(asi, &sf->v8plus.asi);
230			regs->tstate &= ~TSTATE_ASI;
231			regs->tstate |= ((asi & 0xffUL) << 24UL);
232		}
233	}
234
235	/* User can only change condition codes in %tstate. */
236	regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
237	regs->tstate |= psr_to_tstate_icc(psr);
238
239	/* Prevent syscall restart.  */
240	pt_regs_clear_syscall(regs);
241
242	err |= __get_user(fpu_save, &sf->fpu_save);
243	if (!err && fpu_save)
244		err |= restore_fpu_state(regs, compat_ptr(fpu_save));
245	err |= get_compat_sigset(&set, &sf->mask);
246	err |= compat_restore_altstack(&sf->stack);
247	if (err)
248		goto segv;
249		
250	err |= __get_user(rwin_save, &sf->rwin_save);
251	if (!err && rwin_save) {
252		if (restore_rwin_state(compat_ptr(rwin_save)))
253			goto segv;
254	}
255
 
256	set_current_blocked(&set);
257	return;
258segv:
259	force_sig(SIGSEGV, current);
260}
261
 
 
 
 
 
 
 
 
262static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
263{
264	unsigned long sp;
265	
266	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
267	sp = regs->u_regs[UREG_FP];
268	
269	/*
270	 * If we are on the alternate signal stack and would overflow it, don't.
271	 * Return an always-bogus address instead so we will die with SIGSEGV.
272	 */
273	if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
274		return (void __user *) -1L;
275
276	/* This is the X/Open sanctioned signal stack switching.  */
277	sp = sigsp(sp, ksig) - framesize;
278
279	/* Always align the stack frame.  This handles two cases.  First,
280	 * sigaltstack need not be mindful of platform specific stack
281	 * alignment.  Second, if we took this signal because the stack
282	 * is not aligned properly, we'd like to take the signal cleanly
283	 * and report that.
284	 */
285	sp &= ~15UL;
286
287	return (void __user *) sp;
288}
289
290/* The I-cache flush instruction only works in the primary ASI, which
291 * right now is the nucleus, aka. kernel space.
292 *
293 * Therefore we have to kick the instructions out using the kernel
294 * side linear mapping of the physical address backing the user
295 * instructions.
296 */
297static void flush_signal_insns(unsigned long address)
298{
299	unsigned long pstate, paddr;
300	pte_t *ptep, pte;
301	pgd_t *pgdp;
302	pud_t *pudp;
303	pmd_t *pmdp;
304
305	/* Commit all stores of the instructions we are about to flush.  */
306	wmb();
307
308	/* Disable cross-call reception.  In this way even a very wide
309	 * munmap() on another cpu can't tear down the page table
310	 * hierarchy from underneath us, since that can't complete
311	 * until the IPI tlb flush returns.
312	 */
313
314	__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
315	__asm__ __volatile__("wrpr %0, %1, %%pstate"
316				: : "r" (pstate), "i" (PSTATE_IE));
317
318	pgdp = pgd_offset(current->mm, address);
319	if (pgd_none(*pgdp))
320		goto out_irqs_on;
321	pudp = pud_offset(pgdp, address);
322	if (pud_none(*pudp))
323		goto out_irqs_on;
324	pmdp = pmd_offset(pudp, address);
325	if (pmd_none(*pmdp))
326		goto out_irqs_on;
327
328	ptep = pte_offset_map(pmdp, address);
329	pte = *ptep;
330	if (!pte_present(pte))
331		goto out_unmap;
332
333	paddr = (unsigned long) page_address(pte_page(pte));
334
335	__asm__ __volatile__("flush	%0 + %1"
336			     : /* no outputs */
337			     : "r" (paddr),
338			       "r" (address & (PAGE_SIZE - 1))
339			     : "memory");
340
341out_unmap:
342	pte_unmap(ptep);
343out_irqs_on:
344	__asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate));
345
346}
347
348static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs,
349			 sigset_t *oldset)
350{
351	struct signal_frame32 __user *sf;
352	int i, err, wsaved;
353	void __user *tail;
354	int sigframe_size;
355	u32 psr;
356	compat_sigset_t seta;
357
358	/* 1. Make sure everything is clean */
359	synchronize_user_stack();
360	save_and_clear_fpu();
361	
362	wsaved = get_thread_wsaved();
363
364	sigframe_size = sizeof(*sf);
365	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
366		sigframe_size += sizeof(__siginfo_fpu_t);
367	if (wsaved)
368		sigframe_size += sizeof(__siginfo_rwin_t);
369
370	sf = (struct signal_frame32 __user *)
371		get_sigframe(ksig, regs, sigframe_size);
372	
373	if (invalid_frame_pointer(sf, sigframe_size)) {
374		do_exit(SIGILL);
375		return -EINVAL;
376	}
377
378	tail = (sf + 1);
379
380	/* 2. Save the current process state */
381	if (test_thread_flag(TIF_32BIT)) {
382		regs->tpc &= 0xffffffff;
383		regs->tnpc &= 0xffffffff;
384	}
385	err  = put_user(regs->tpc, &sf->info.si_regs.pc);
386	err |= __put_user(regs->tnpc, &sf->info.si_regs.npc);
387	err |= __put_user(regs->y, &sf->info.si_regs.y);
388	psr = tstate_to_psr(regs->tstate);
389	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
390		psr |= PSR_EF;
391	err |= __put_user(psr, &sf->info.si_regs.psr);
392	for (i = 0; i < 16; i++)
393		err |= __put_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
394	err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
395	err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
396	for (i = 1; i < 16; i++)
397		err |= __put_user(((u32 *)regs->u_regs)[2*i],
398				  &sf->v8plus.g_upper[i]);
399	err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL,
400			  &sf->v8plus.asi);
401
402	if (psr & PSR_EF) {
403		__siginfo_fpu_t __user *fp = tail;
404		tail += sizeof(*fp);
405		err |= save_fpu_state(regs, fp);
406		err |= __put_user((u64)fp, &sf->fpu_save);
407	} else {
408		err |= __put_user(0, &sf->fpu_save);
409	}
410	if (wsaved) {
411		__siginfo_rwin_t __user *rwp = tail;
412		tail += sizeof(*rwp);
413		err |= save_rwin_state(wsaved, rwp);
414		err |= __put_user((u64)rwp, &sf->rwin_save);
415		set_thread_wsaved(0);
416	} else {
417		err |= __put_user(0, &sf->rwin_save);
418	}
419
420	/* If these change we need to know - assignments to seta relies on these sizes */
421	BUILD_BUG_ON(_NSIG_WORDS != 1);
422	BUILD_BUG_ON(_COMPAT_NSIG_WORDS != 2);
423	seta.sig[1] = (oldset->sig[0] >> 32);
424	seta.sig[0] = oldset->sig[0];
425
426	err |= __put_user(seta.sig[0], &sf->info.si_mask);
427	err |= __copy_to_user(sf->extramask, &seta.sig[1],
428			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
429
430	if (!wsaved) {
431		err |= copy_in_user((u32 __user *)sf,
432				    (u32 __user *)(regs->u_regs[UREG_FP]),
433				    sizeof(struct reg_window32));
434	} else {
435		struct reg_window *rp;
436
437		rp = &current_thread_info()->reg_window[wsaved - 1];
438		for (i = 0; i < 8; i++)
439			err |= __put_user(rp->locals[i], &sf->ss.locals[i]);
440		for (i = 0; i < 6; i++)
441			err |= __put_user(rp->ins[i], &sf->ss.ins[i]);
442		err |= __put_user(rp->ins[6], &sf->ss.fp);
443		err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
444	}	
445	if (err)
446		return err;
447
448	/* 3. signal handler back-trampoline and parameters */
449	regs->u_regs[UREG_FP] = (unsigned long) sf;
450	regs->u_regs[UREG_I0] = ksig->sig;
451	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
452	regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
453
454	/* 4. signal handler */
455	regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
456	regs->tnpc = (regs->tpc + 4);
457	if (test_thread_flag(TIF_32BIT)) {
458		regs->tpc &= 0xffffffff;
459		regs->tnpc &= 0xffffffff;
460	}
461
462	/* 5. return to kernel instructions */
463	if (ksig->ka.ka_restorer) {
464		regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
465	} else {
466		unsigned long address = ((unsigned long)&(sf->insns[0]));
467
468		regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
469	
470		err  = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/
471		err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/
472		if (err)
473			return err;
474		flush_signal_insns(address);
475	}
476	return 0;
477}
478
479static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs,
480			    sigset_t *oldset)
481{
482	struct rt_signal_frame32 __user *sf;
483	int i, err, wsaved;
484	void __user *tail;
485	int sigframe_size;
486	u32 psr;
 
487
488	/* 1. Make sure everything is clean */
489	synchronize_user_stack();
490	save_and_clear_fpu();
491	
492	wsaved = get_thread_wsaved();
493
494	sigframe_size = sizeof(*sf);
495	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
496		sigframe_size += sizeof(__siginfo_fpu_t);
497	if (wsaved)
498		sigframe_size += sizeof(__siginfo_rwin_t);
499
500	sf = (struct rt_signal_frame32 __user *)
501		get_sigframe(ksig, regs, sigframe_size);
502	
503	if (invalid_frame_pointer(sf, sigframe_size)) {
504		do_exit(SIGILL);
505		return -EINVAL;
506	}
507
508	tail = (sf + 1);
509
510	/* 2. Save the current process state */
511	if (test_thread_flag(TIF_32BIT)) {
512		regs->tpc &= 0xffffffff;
513		regs->tnpc &= 0xffffffff;
514	}
515	err  = put_user(regs->tpc, &sf->regs.pc);
516	err |= __put_user(regs->tnpc, &sf->regs.npc);
517	err |= __put_user(regs->y, &sf->regs.y);
518	psr = tstate_to_psr(regs->tstate);
519	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
520		psr |= PSR_EF;
521	err |= __put_user(psr, &sf->regs.psr);
522	for (i = 0; i < 16; i++)
523		err |= __put_user(regs->u_regs[i], &sf->regs.u_regs[i]);
524	err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
525	err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
526	for (i = 1; i < 16; i++)
527		err |= __put_user(((u32 *)regs->u_regs)[2*i],
528				  &sf->v8plus.g_upper[i]);
529	err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL,
530			  &sf->v8plus.asi);
531
532	if (psr & PSR_EF) {
533		__siginfo_fpu_t __user *fp = tail;
534		tail += sizeof(*fp);
535		err |= save_fpu_state(regs, fp);
536		err |= __put_user((u64)fp, &sf->fpu_save);
537	} else {
538		err |= __put_user(0, &sf->fpu_save);
539	}
540	if (wsaved) {
541		__siginfo_rwin_t __user *rwp = tail;
542		tail += sizeof(*rwp);
543		err |= save_rwin_state(wsaved, rwp);
544		err |= __put_user((u64)rwp, &sf->rwin_save);
545		set_thread_wsaved(0);
546	} else {
547		err |= __put_user(0, &sf->rwin_save);
548	}
549
550	/* Update the siginfo structure.  */
551	err |= copy_siginfo_to_user32(&sf->info, &ksig->info);
552	
553	/* Setup sigaltstack */
554	err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
555
556	err |= put_compat_sigset(&sf->mask, oldset, sizeof(compat_sigset_t));
 
 
557
558	if (!wsaved) {
559		err |= copy_in_user((u32 __user *)sf,
560				    (u32 __user *)(regs->u_regs[UREG_FP]),
561				    sizeof(struct reg_window32));
562	} else {
563		struct reg_window *rp;
564
565		rp = &current_thread_info()->reg_window[wsaved - 1];
566		for (i = 0; i < 8; i++)
567			err |= __put_user(rp->locals[i], &sf->ss.locals[i]);
568		for (i = 0; i < 6; i++)
569			err |= __put_user(rp->ins[i], &sf->ss.ins[i]);
570		err |= __put_user(rp->ins[6], &sf->ss.fp);
571		err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
572	}
573	if (err)
574		return err;
575	
576	/* 3. signal handler back-trampoline and parameters */
577	regs->u_regs[UREG_FP] = (unsigned long) sf;
578	regs->u_regs[UREG_I0] = ksig->sig;
579	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
580	regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
581
582	/* 4. signal handler */
583	regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
584	regs->tnpc = (regs->tpc + 4);
585	if (test_thread_flag(TIF_32BIT)) {
586		regs->tpc &= 0xffffffff;
587		regs->tnpc &= 0xffffffff;
588	}
589
590	/* 5. return to kernel instructions */
591	if (ksig->ka.ka_restorer)
592		regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
593	else {
594		unsigned long address = ((unsigned long)&(sf->insns[0]));
595
596		regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
597	
598		/* mov __NR_rt_sigreturn, %g1 */
599		err |= __put_user(0x82102065, &sf->insns[0]);
600
601		/* t 0x10 */
602		err |= __put_user(0x91d02010, &sf->insns[1]);
603		if (err)
604			return err;
605
606		flush_signal_insns(address);
607	}
608	return 0;
609}
610
611static inline void handle_signal32(struct ksignal *ksig, 
612				  struct pt_regs *regs)
613{
614	sigset_t *oldset = sigmask_to_save();
615	int err;
616
617	if (ksig->ka.sa.sa_flags & SA_SIGINFO)
618		err = setup_rt_frame32(ksig, regs, oldset);
619	else
620		err = setup_frame32(ksig, regs, oldset);
621
622	signal_setup_done(err, ksig, 0);
623}
624
625static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs,
626				     struct sigaction *sa)
627{
628	switch (regs->u_regs[UREG_I0]) {
629	case ERESTART_RESTARTBLOCK:
630	case ERESTARTNOHAND:
631	no_system_call_restart:
632		regs->u_regs[UREG_I0] = EINTR;
633		regs->tstate |= TSTATE_ICARRY;
634		break;
635	case ERESTARTSYS:
636		if (!(sa->sa_flags & SA_RESTART))
637			goto no_system_call_restart;
638		/* fallthrough */
639	case ERESTARTNOINTR:
640		regs->u_regs[UREG_I0] = orig_i0;
641		regs->tpc -= 4;
642		regs->tnpc -= 4;
643	}
644}
645
646/* Note that 'init' is a special process: it doesn't get signals it doesn't
647 * want to handle. Thus you cannot kill init even with a SIGKILL even by
648 * mistake.
649 */
650void do_signal32(struct pt_regs * regs)
651{
652	struct ksignal ksig;
653	unsigned long orig_i0 = 0;
654	int restart_syscall = 0;
655	bool has_handler = get_signal(&ksig);
656
657	if (pt_regs_is_syscall(regs) &&
658	    (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {
659		restart_syscall = 1;
660		orig_i0 = regs->u_regs[UREG_G6];
661	}
662
663	if (has_handler) {
664		if (restart_syscall)
665			syscall_restart32(orig_i0, regs, &ksig.ka.sa);
666		handle_signal32(&ksig, regs);
667	} else {
668		if (restart_syscall) {
669			switch (regs->u_regs[UREG_I0]) {
670			case ERESTARTNOHAND:
671	     		case ERESTARTSYS:
672			case ERESTARTNOINTR:
673				/* replay the system call when we are done */
674				regs->u_regs[UREG_I0] = orig_i0;
675				regs->tpc -= 4;
676				regs->tnpc -= 4;
677				pt_regs_clear_syscall(regs);
678			case ERESTART_RESTARTBLOCK:
679				regs->u_regs[UREG_G1] = __NR_restart_syscall;
680				regs->tpc -= 4;
681				regs->tnpc -= 4;
682				pt_regs_clear_syscall(regs);
683			}
684		}
685		restore_saved_sigmask();
686	}
687}
688
689struct sigstack32 {
690	u32 the_stack;
691	int cur_status;
692};
693
694asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
695{
696	struct sigstack32 __user *ssptr =
697		(struct sigstack32 __user *)((unsigned long)(u_ssptr));
698	struct sigstack32 __user *ossptr =
699		(struct sigstack32 __user *)((unsigned long)(u_ossptr));
700	int ret = -EFAULT;
701
702	/* First see if old state is wanted. */
703	if (ossptr) {
704		if (put_user(current->sas_ss_sp + current->sas_ss_size,
705			     &ossptr->the_stack) ||
706		    __put_user(on_sig_stack(sp), &ossptr->cur_status))
707			goto out;
708	}
709	
710	/* Now see if we want to update the new state. */
711	if (ssptr) {
712		u32 ss_sp;
713
714		if (get_user(ss_sp, &ssptr->the_stack))
715			goto out;
716
717		/* If the current stack was set with sigaltstack, don't
718		 * swap stacks while we are on it.
719		 */
720		ret = -EPERM;
721		if (current->sas_ss_sp && on_sig_stack(sp))
722			goto out;
723			
724		/* Since we don't know the extent of the stack, and we don't
725		 * track onstack-ness, but rather calculate it, we must
726		 * presume a size.  Ho hum this interface is lossy.
727		 */
728		current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
729		current->sas_ss_size = SIGSTKSZ;
730	}
731	
732	ret = 0;
733out:
734	return ret;
735}
v4.6
 
  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#include <asm/switch_to.h>
 32
 33#include "sigutil.h"
 34#include "kernel.h"
 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
 40typedef struct {
 41	unsigned int g_upper[8];
 42	unsigned int o_upper[8];
 43	unsigned int asi;
 44} siginfo_extra_v8plus_t;
 45
 46struct 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
 58struct rt_signal_frame32 {
 59	struct sparc_stackf32	ss;
 60	compat_siginfo_t	info;
 61	struct pt_regs32	regs;
 62	compat_sigset_t		mask;
 63	/* __siginfo_fpu_t * */ u32 fpu_save;
 64	unsigned int		insns[2];
 65	compat_stack_t		stack;
 66	unsigned int		extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
 67	/* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
 68	siginfo_extra_v8plus_t	v8plus;
 69	/* __siginfo_rwin_t * */u32 rwin_save;
 70} __attribute__((aligned(8)));
 71
 72int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
 73{
 74	int err;
 75
 76	if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
 77		return -EFAULT;
 78
 79	/* If you change siginfo_t structure, please be sure
 80	   this code is fixed accordingly.
 81	   It should never copy any pad contained in the structure
 82	   to avoid security leaks, but must copy the generic
 83	   3 ints plus the relevant union member.
 84	   This routine must convert siginfo from 64bit to 32bit as well
 85	   at the same time.  */
 86	err = __put_user(from->si_signo, &to->si_signo);
 87	err |= __put_user(from->si_errno, &to->si_errno);
 88	err |= __put_user((short)from->si_code, &to->si_code);
 89	if (from->si_code < 0)
 90		err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
 91	else {
 92		switch (from->si_code >> 16) {
 93		case __SI_TIMER >> 16:
 94			err |= __put_user(from->si_tid, &to->si_tid);
 95			err |= __put_user(from->si_overrun, &to->si_overrun);
 96			err |= __put_user(from->si_int, &to->si_int);
 97			break;
 98		case __SI_CHLD >> 16:
 99			err |= __put_user(from->si_utime, &to->si_utime);
100			err |= __put_user(from->si_stime, &to->si_stime);
101			err |= __put_user(from->si_status, &to->si_status);
102		default:
103			err |= __put_user(from->si_pid, &to->si_pid);
104			err |= __put_user(from->si_uid, &to->si_uid);
105			break;
106		case __SI_FAULT >> 16:
107			err |= __put_user(from->si_trapno, &to->si_trapno);
108			err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
109			break;
110		case __SI_POLL >> 16:
111			err |= __put_user(from->si_band, &to->si_band);
112			err |= __put_user(from->si_fd, &to->si_fd);
113			break;
114		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
115		case __SI_MESGQ >> 16:
116			err |= __put_user(from->si_pid, &to->si_pid);
117			err |= __put_user(from->si_uid, &to->si_uid);
118			err |= __put_user(from->si_int, &to->si_int);
119			break;
120		}
121	}
122	return err;
123}
124
125/* CAUTION: This is just a very minimalist implementation for the
126 *          sake of compat_sys_rt_sigqueueinfo()
127 */
128int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
129{
130	if (!access_ok(VERIFY_WRITE, from, sizeof(compat_siginfo_t)))
131		return -EFAULT;
132
133	if (copy_from_user(to, from, 3*sizeof(int)) ||
134	    copy_from_user(to->_sifields._pad, from->_sifields._pad,
135			   SI_PAD_SIZE))
136		return -EFAULT;
137
138	return 0;
139}
140
141void do_sigreturn32(struct pt_regs *regs)
142{
143	struct signal_frame32 __user *sf;
144	compat_uptr_t fpu_save;
145	compat_uptr_t rwin_save;
146	unsigned int psr;
147	unsigned int pc, npc;
148	sigset_t set;
149	compat_sigset_t seta;
150	int err, i;
151	
152	/* Always make any pending restarted system calls return -EINTR */
153	current->restart_block.fn = do_no_restart_syscall;
154
155	synchronize_user_stack();
156
157	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
158	sf = (struct signal_frame32 __user *) regs->u_regs[UREG_FP];
159
160	/* 1. Make sure we are not getting garbage from the user */
161	if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
162	    (((unsigned long) sf) & 3))
 
 
 
 
 
163		goto segv;
164
165	if (get_user(pc, &sf->info.si_regs.pc) ||
166	    __get_user(npc, &sf->info.si_regs.npc))
167		goto segv;
168
169	if ((pc | npc) & 3)
170		goto segv;
171
172	if (test_thread_flag(TIF_32BIT)) {
173		pc &= 0xffffffff;
174		npc &= 0xffffffff;
175	}
176	regs->tpc = pc;
177	regs->tnpc = npc;
178
179	/* 2. Restore the state */
180	err = __get_user(regs->y, &sf->info.si_regs.y);
181	err |= __get_user(psr, &sf->info.si_regs.psr);
182
183	for (i = UREG_G1; i <= UREG_I7; i++)
184		err |= __get_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
185	if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
186		err |= __get_user(i, &sf->v8plus.g_upper[0]);
187		if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
188			unsigned long asi;
189
190			for (i = UREG_G1; i <= UREG_I7; i++)
191				err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
192			err |= __get_user(asi, &sf->v8plus.asi);
193			regs->tstate &= ~TSTATE_ASI;
194			regs->tstate |= ((asi & 0xffUL) << 24UL);
195		}
196	}
197
198	/* User can only change condition codes in %tstate. */
199	regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
200	regs->tstate |= psr_to_tstate_icc(psr);
201
202	/* Prevent syscall restart.  */
203	pt_regs_clear_syscall(regs);
204
205	err |= __get_user(fpu_save, &sf->fpu_save);
206	if (!err && fpu_save)
207		err |= restore_fpu_state(regs, compat_ptr(fpu_save));
208	err |= __get_user(rwin_save, &sf->rwin_save);
209	if (!err && rwin_save) {
210		if (restore_rwin_state(compat_ptr(rwin_save)))
211			goto segv;
212	}
213	err |= __get_user(seta.sig[0], &sf->info.si_mask);
214	err |= copy_from_user(&seta.sig[1], &sf->extramask,
215			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
216	if (err)
217	    	goto segv;
218
219	set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);
220	set_current_blocked(&set);
221	return;
222
223segv:
224	force_sig(SIGSEGV, current);
225}
226
227asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
228{
229	struct rt_signal_frame32 __user *sf;
230	unsigned int psr, pc, npc;
231	compat_uptr_t fpu_save;
232	compat_uptr_t rwin_save;
233	sigset_t set;
234	compat_sigset_t seta;
235	int err, i;
236	
237	/* Always make any pending restarted system calls return -EINTR */
238	current->restart_block.fn = do_no_restart_syscall;
239
240	synchronize_user_stack();
241	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
242	sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP];
243
244	/* 1. Make sure we are not getting garbage from the user */
245	if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
246	    (((unsigned long) sf) & 3))
 
 
247		goto segv;
248
249	if (get_user(pc, &sf->regs.pc) || 
 
 
 
250	    __get_user(npc, &sf->regs.npc))
251		goto segv;
252
253	if ((pc | npc) & 3)
254		goto segv;
255
256	if (test_thread_flag(TIF_32BIT)) {
257		pc &= 0xffffffff;
258		npc &= 0xffffffff;
259	}
260	regs->tpc = pc;
261	regs->tnpc = npc;
262
263	/* 2. Restore the state */
264	err = __get_user(regs->y, &sf->regs.y);
265	err |= __get_user(psr, &sf->regs.psr);
266	
267	for (i = UREG_G1; i <= UREG_I7; i++)
268		err |= __get_user(regs->u_regs[i], &sf->regs.u_regs[i]);
269	if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
270		err |= __get_user(i, &sf->v8plus.g_upper[0]);
271		if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
272			unsigned long asi;
273
274			for (i = UREG_G1; i <= UREG_I7; i++)
275				err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
276			err |= __get_user(asi, &sf->v8plus.asi);
277			regs->tstate &= ~TSTATE_ASI;
278			regs->tstate |= ((asi & 0xffUL) << 24UL);
279		}
280	}
281
282	/* User can only change condition codes in %tstate. */
283	regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
284	regs->tstate |= psr_to_tstate_icc(psr);
285
286	/* Prevent syscall restart.  */
287	pt_regs_clear_syscall(regs);
288
289	err |= __get_user(fpu_save, &sf->fpu_save);
290	if (!err && fpu_save)
291		err |= restore_fpu_state(regs, compat_ptr(fpu_save));
292	err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t));
293	err |= compat_restore_altstack(&sf->stack);
294	if (err)
295		goto segv;
296		
297	err |= __get_user(rwin_save, &sf->rwin_save);
298	if (!err && rwin_save) {
299		if (restore_rwin_state(compat_ptr(rwin_save)))
300			goto segv;
301	}
302
303	set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);
304	set_current_blocked(&set);
305	return;
306segv:
307	force_sig(SIGSEGV, current);
308}
309
310/* Checks if the fp is valid */
311static int invalid_frame_pointer(void __user *fp, int fplen)
312{
313	if ((((unsigned long) fp) & 7) || ((unsigned long)fp) > 0x100000000ULL - fplen)
314		return 1;
315	return 0;
316}
317
318static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
319{
320	unsigned long sp;
321	
322	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
323	sp = regs->u_regs[UREG_FP];
324	
325	/*
326	 * If we are on the alternate signal stack and would overflow it, don't.
327	 * Return an always-bogus address instead so we will die with SIGSEGV.
328	 */
329	if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
330		return (void __user *) -1L;
331
332	/* This is the X/Open sanctioned signal stack switching.  */
333	sp = sigsp(sp, ksig) - framesize;
334
335	/* Always align the stack frame.  This handles two cases.  First,
336	 * sigaltstack need not be mindful of platform specific stack
337	 * alignment.  Second, if we took this signal because the stack
338	 * is not aligned properly, we'd like to take the signal cleanly
339	 * and report that.
340	 */
341	sp &= ~15UL;
342
343	return (void __user *) sp;
344}
345
346/* The I-cache flush instruction only works in the primary ASI, which
347 * right now is the nucleus, aka. kernel space.
348 *
349 * Therefore we have to kick the instructions out using the kernel
350 * side linear mapping of the physical address backing the user
351 * instructions.
352 */
353static void flush_signal_insns(unsigned long address)
354{
355	unsigned long pstate, paddr;
356	pte_t *ptep, pte;
357	pgd_t *pgdp;
358	pud_t *pudp;
359	pmd_t *pmdp;
360
361	/* Commit all stores of the instructions we are about to flush.  */
362	wmb();
363
364	/* Disable cross-call reception.  In this way even a very wide
365	 * munmap() on another cpu can't tear down the page table
366	 * hierarchy from underneath us, since that can't complete
367	 * until the IPI tlb flush returns.
368	 */
369
370	__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
371	__asm__ __volatile__("wrpr %0, %1, %%pstate"
372				: : "r" (pstate), "i" (PSTATE_IE));
373
374	pgdp = pgd_offset(current->mm, address);
375	if (pgd_none(*pgdp))
376		goto out_irqs_on;
377	pudp = pud_offset(pgdp, address);
378	if (pud_none(*pudp))
379		goto out_irqs_on;
380	pmdp = pmd_offset(pudp, address);
381	if (pmd_none(*pmdp))
382		goto out_irqs_on;
383
384	ptep = pte_offset_map(pmdp, address);
385	pte = *ptep;
386	if (!pte_present(pte))
387		goto out_unmap;
388
389	paddr = (unsigned long) page_address(pte_page(pte));
390
391	__asm__ __volatile__("flush	%0 + %1"
392			     : /* no outputs */
393			     : "r" (paddr),
394			       "r" (address & (PAGE_SIZE - 1))
395			     : "memory");
396
397out_unmap:
398	pte_unmap(ptep);
399out_irqs_on:
400	__asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate));
401
402}
403
404static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs,
405			 sigset_t *oldset)
406{
407	struct signal_frame32 __user *sf;
408	int i, err, wsaved;
409	void __user *tail;
410	int sigframe_size;
411	u32 psr;
412	compat_sigset_t seta;
413
414	/* 1. Make sure everything is clean */
415	synchronize_user_stack();
416	save_and_clear_fpu();
417	
418	wsaved = get_thread_wsaved();
419
420	sigframe_size = sizeof(*sf);
421	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
422		sigframe_size += sizeof(__siginfo_fpu_t);
423	if (wsaved)
424		sigframe_size += sizeof(__siginfo_rwin_t);
425
426	sf = (struct signal_frame32 __user *)
427		get_sigframe(ksig, regs, sigframe_size);
428	
429	if (invalid_frame_pointer(sf, sigframe_size)) {
430		do_exit(SIGILL);
431		return -EINVAL;
432	}
433
434	tail = (sf + 1);
435
436	/* 2. Save the current process state */
437	if (test_thread_flag(TIF_32BIT)) {
438		regs->tpc &= 0xffffffff;
439		regs->tnpc &= 0xffffffff;
440	}
441	err  = put_user(regs->tpc, &sf->info.si_regs.pc);
442	err |= __put_user(regs->tnpc, &sf->info.si_regs.npc);
443	err |= __put_user(regs->y, &sf->info.si_regs.y);
444	psr = tstate_to_psr(regs->tstate);
445	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
446		psr |= PSR_EF;
447	err |= __put_user(psr, &sf->info.si_regs.psr);
448	for (i = 0; i < 16; i++)
449		err |= __put_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
450	err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
451	err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
452	for (i = 1; i < 16; i++)
453		err |= __put_user(((u32 *)regs->u_regs)[2*i],
454				  &sf->v8plus.g_upper[i]);
455	err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL,
456			  &sf->v8plus.asi);
457
458	if (psr & PSR_EF) {
459		__siginfo_fpu_t __user *fp = tail;
460		tail += sizeof(*fp);
461		err |= save_fpu_state(regs, fp);
462		err |= __put_user((u64)fp, &sf->fpu_save);
463	} else {
464		err |= __put_user(0, &sf->fpu_save);
465	}
466	if (wsaved) {
467		__siginfo_rwin_t __user *rwp = tail;
468		tail += sizeof(*rwp);
469		err |= save_rwin_state(wsaved, rwp);
470		err |= __put_user((u64)rwp, &sf->rwin_save);
471		set_thread_wsaved(0);
472	} else {
473		err |= __put_user(0, &sf->rwin_save);
474	}
475
476	/* If these change we need to know - assignments to seta relies on these sizes */
477	BUILD_BUG_ON(_NSIG_WORDS != 1);
478	BUILD_BUG_ON(_COMPAT_NSIG_WORDS != 2);
479	seta.sig[1] = (oldset->sig[0] >> 32);
480	seta.sig[0] = oldset->sig[0];
481
482	err |= __put_user(seta.sig[0], &sf->info.si_mask);
483	err |= __copy_to_user(sf->extramask, &seta.sig[1],
484			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
485
486	if (!wsaved) {
487		err |= copy_in_user((u32 __user *)sf,
488				    (u32 __user *)(regs->u_regs[UREG_FP]),
489				    sizeof(struct reg_window32));
490	} else {
491		struct reg_window *rp;
492
493		rp = &current_thread_info()->reg_window[wsaved - 1];
494		for (i = 0; i < 8; i++)
495			err |= __put_user(rp->locals[i], &sf->ss.locals[i]);
496		for (i = 0; i < 6; i++)
497			err |= __put_user(rp->ins[i], &sf->ss.ins[i]);
498		err |= __put_user(rp->ins[6], &sf->ss.fp);
499		err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
500	}	
501	if (err)
502		return err;
503
504	/* 3. signal handler back-trampoline and parameters */
505	regs->u_regs[UREG_FP] = (unsigned long) sf;
506	regs->u_regs[UREG_I0] = ksig->sig;
507	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
508	regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
509
510	/* 4. signal handler */
511	regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
512	regs->tnpc = (regs->tpc + 4);
513	if (test_thread_flag(TIF_32BIT)) {
514		regs->tpc &= 0xffffffff;
515		regs->tnpc &= 0xffffffff;
516	}
517
518	/* 5. return to kernel instructions */
519	if (ksig->ka.ka_restorer) {
520		regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
521	} else {
522		unsigned long address = ((unsigned long)&(sf->insns[0]));
523
524		regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
525	
526		err  = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/
527		err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/
528		if (err)
529			return err;
530		flush_signal_insns(address);
531	}
532	return 0;
533}
534
535static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs,
536			    sigset_t *oldset)
537{
538	struct rt_signal_frame32 __user *sf;
539	int i, err, wsaved;
540	void __user *tail;
541	int sigframe_size;
542	u32 psr;
543	compat_sigset_t seta;
544
545	/* 1. Make sure everything is clean */
546	synchronize_user_stack();
547	save_and_clear_fpu();
548	
549	wsaved = get_thread_wsaved();
550
551	sigframe_size = sizeof(*sf);
552	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
553		sigframe_size += sizeof(__siginfo_fpu_t);
554	if (wsaved)
555		sigframe_size += sizeof(__siginfo_rwin_t);
556
557	sf = (struct rt_signal_frame32 __user *)
558		get_sigframe(ksig, regs, sigframe_size);
559	
560	if (invalid_frame_pointer(sf, sigframe_size)) {
561		do_exit(SIGILL);
562		return -EINVAL;
563	}
564
565	tail = (sf + 1);
566
567	/* 2. Save the current process state */
568	if (test_thread_flag(TIF_32BIT)) {
569		regs->tpc &= 0xffffffff;
570		regs->tnpc &= 0xffffffff;
571	}
572	err  = put_user(regs->tpc, &sf->regs.pc);
573	err |= __put_user(regs->tnpc, &sf->regs.npc);
574	err |= __put_user(regs->y, &sf->regs.y);
575	psr = tstate_to_psr(regs->tstate);
576	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
577		psr |= PSR_EF;
578	err |= __put_user(psr, &sf->regs.psr);
579	for (i = 0; i < 16; i++)
580		err |= __put_user(regs->u_regs[i], &sf->regs.u_regs[i]);
581	err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
582	err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
583	for (i = 1; i < 16; i++)
584		err |= __put_user(((u32 *)regs->u_regs)[2*i],
585				  &sf->v8plus.g_upper[i]);
586	err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL,
587			  &sf->v8plus.asi);
588
589	if (psr & PSR_EF) {
590		__siginfo_fpu_t __user *fp = tail;
591		tail += sizeof(*fp);
592		err |= save_fpu_state(regs, fp);
593		err |= __put_user((u64)fp, &sf->fpu_save);
594	} else {
595		err |= __put_user(0, &sf->fpu_save);
596	}
597	if (wsaved) {
598		__siginfo_rwin_t __user *rwp = tail;
599		tail += sizeof(*rwp);
600		err |= save_rwin_state(wsaved, rwp);
601		err |= __put_user((u64)rwp, &sf->rwin_save);
602		set_thread_wsaved(0);
603	} else {
604		err |= __put_user(0, &sf->rwin_save);
605	}
606
607	/* Update the siginfo structure.  */
608	err |= copy_siginfo_to_user32(&sf->info, &ksig->info);
609	
610	/* Setup sigaltstack */
611	err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
612
613	seta.sig[1] = (oldset->sig[0] >> 32);
614	seta.sig[0] = oldset->sig[0];
615	err |= __copy_to_user(&sf->mask, &seta, sizeof(compat_sigset_t));
616
617	if (!wsaved) {
618		err |= copy_in_user((u32 __user *)sf,
619				    (u32 __user *)(regs->u_regs[UREG_FP]),
620				    sizeof(struct reg_window32));
621	} else {
622		struct reg_window *rp;
623
624		rp = &current_thread_info()->reg_window[wsaved - 1];
625		for (i = 0; i < 8; i++)
626			err |= __put_user(rp->locals[i], &sf->ss.locals[i]);
627		for (i = 0; i < 6; i++)
628			err |= __put_user(rp->ins[i], &sf->ss.ins[i]);
629		err |= __put_user(rp->ins[6], &sf->ss.fp);
630		err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
631	}
632	if (err)
633		return err;
634	
635	/* 3. signal handler back-trampoline and parameters */
636	regs->u_regs[UREG_FP] = (unsigned long) sf;
637	regs->u_regs[UREG_I0] = ksig->sig;
638	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
639	regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
640
641	/* 4. signal handler */
642	regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
643	regs->tnpc = (regs->tpc + 4);
644	if (test_thread_flag(TIF_32BIT)) {
645		regs->tpc &= 0xffffffff;
646		regs->tnpc &= 0xffffffff;
647	}
648
649	/* 5. return to kernel instructions */
650	if (ksig->ka.ka_restorer)
651		regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
652	else {
653		unsigned long address = ((unsigned long)&(sf->insns[0]));
654
655		regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
656	
657		/* mov __NR_rt_sigreturn, %g1 */
658		err |= __put_user(0x82102065, &sf->insns[0]);
659
660		/* t 0x10 */
661		err |= __put_user(0x91d02010, &sf->insns[1]);
662		if (err)
663			return err;
664
665		flush_signal_insns(address);
666	}
667	return 0;
668}
669
670static inline void handle_signal32(struct ksignal *ksig, 
671				  struct pt_regs *regs)
672{
673	sigset_t *oldset = sigmask_to_save();
674	int err;
675
676	if (ksig->ka.sa.sa_flags & SA_SIGINFO)
677		err = setup_rt_frame32(ksig, regs, oldset);
678	else
679		err = setup_frame32(ksig, regs, oldset);
680
681	signal_setup_done(err, ksig, 0);
682}
683
684static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs,
685				     struct sigaction *sa)
686{
687	switch (regs->u_regs[UREG_I0]) {
688	case ERESTART_RESTARTBLOCK:
689	case ERESTARTNOHAND:
690	no_system_call_restart:
691		regs->u_regs[UREG_I0] = EINTR;
692		regs->tstate |= TSTATE_ICARRY;
693		break;
694	case ERESTARTSYS:
695		if (!(sa->sa_flags & SA_RESTART))
696			goto no_system_call_restart;
697		/* fallthrough */
698	case ERESTARTNOINTR:
699		regs->u_regs[UREG_I0] = orig_i0;
700		regs->tpc -= 4;
701		regs->tnpc -= 4;
702	}
703}
704
705/* Note that 'init' is a special process: it doesn't get signals it doesn't
706 * want to handle. Thus you cannot kill init even with a SIGKILL even by
707 * mistake.
708 */
709void do_signal32(struct pt_regs * regs)
710{
711	struct ksignal ksig;
712	unsigned long orig_i0 = 0;
713	int restart_syscall = 0;
714	bool has_handler = get_signal(&ksig);
715
716	if (pt_regs_is_syscall(regs) &&
717	    (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {
718		restart_syscall = 1;
719		orig_i0 = regs->u_regs[UREG_G6];
720	}
721
722	if (has_handler) {
723		if (restart_syscall)
724			syscall_restart32(orig_i0, regs, &ksig.ka.sa);
725		handle_signal32(&ksig, regs);
726	} else {
727		if (restart_syscall) {
728			switch (regs->u_regs[UREG_I0]) {
729			case ERESTARTNOHAND:
730	     		case ERESTARTSYS:
731			case ERESTARTNOINTR:
732				/* replay the system call when we are done */
733				regs->u_regs[UREG_I0] = orig_i0;
734				regs->tpc -= 4;
735				regs->tnpc -= 4;
736				pt_regs_clear_syscall(regs);
737			case ERESTART_RESTARTBLOCK:
738				regs->u_regs[UREG_G1] = __NR_restart_syscall;
739				regs->tpc -= 4;
740				regs->tnpc -= 4;
741				pt_regs_clear_syscall(regs);
742			}
743		}
744		restore_saved_sigmask();
745	}
746}
747
748struct sigstack32 {
749	u32 the_stack;
750	int cur_status;
751};
752
753asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
754{
755	struct sigstack32 __user *ssptr =
756		(struct sigstack32 __user *)((unsigned long)(u_ssptr));
757	struct sigstack32 __user *ossptr =
758		(struct sigstack32 __user *)((unsigned long)(u_ossptr));
759	int ret = -EFAULT;
760
761	/* First see if old state is wanted. */
762	if (ossptr) {
763		if (put_user(current->sas_ss_sp + current->sas_ss_size,
764			     &ossptr->the_stack) ||
765		    __put_user(on_sig_stack(sp), &ossptr->cur_status))
766			goto out;
767	}
768	
769	/* Now see if we want to update the new state. */
770	if (ssptr) {
771		u32 ss_sp;
772
773		if (get_user(ss_sp, &ssptr->the_stack))
774			goto out;
775
776		/* If the current stack was set with sigaltstack, don't
777		 * swap stacks while we are on it.
778		 */
779		ret = -EPERM;
780		if (current->sas_ss_sp && on_sig_stack(sp))
781			goto out;
782			
783		/* Since we don't know the extent of the stack, and we don't
784		 * track onstack-ness, but rather calculate it, we must
785		 * presume a size.  Ho hum this interface is lossy.
786		 */
787		current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
788		current->sas_ss_size = SIGSTKSZ;
789	}
790	
791	ret = 0;
792out:
793	return ret;
794}