Linux Audio

Check our new training course

Linux kernel drivers training

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