Linux Audio

Check our new training course

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