diff options
Diffstat (limited to 'arch/mips/kernel/signal_n32.c')
| -rw-r--r-- | arch/mips/kernel/signal_n32.c | 69 | 
1 files changed, 8 insertions, 61 deletions
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index 3574c145511..b2241bb9cac 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c @@ -50,20 +50,12 @@  extern int setup_sigcontext(struct pt_regs *, struct sigcontext __user *);  extern int restore_sigcontext(struct pt_regs *, struct sigcontext __user *); - -/* IRIX compatible stack_t  */ -typedef struct sigaltstack32 { -	s32 ss_sp; -	compat_size_t ss_size; -	int ss_flags; -} stack32_t; -  struct ucontextn32 { -	u32                 uc_flags; -	s32                 uc_link; -	stack32_t           uc_stack; +	u32		    uc_flags; +	s32		    uc_link; +	compat_stack_t      uc_stack;  	struct sigcontext   uc_mcontext; -	compat_sigset_t     uc_sigmask;   /* mask last for extensibility */ +	compat_sigset_t	    uc_sigmask;	  /* mask last for extensibility */  };  struct rt_sigframe_n32 { @@ -73,34 +65,10 @@ struct rt_sigframe_n32 {  	struct ucontextn32 rs_uc;  }; -extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); - -asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) -{ -	compat_sigset_t __user *unewset; -	compat_sigset_t uset; -	size_t sigsetsize; -	sigset_t newset; - -	/* XXX Don't preclude handling different sized sigset_t's.  */ -	sigsetsize = regs.regs[5]; -	if (sigsetsize != sizeof(sigset_t)) -		return -EINVAL; - -	unewset = (compat_sigset_t __user *) regs.regs[4]; -	if (copy_from_user(&uset, unewset, sizeof(uset))) -		return -EFAULT; -	sigset_from_compat(&newset, &uset); -	return sigsuspend(&newset); -} -  asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)  {  	struct rt_sigframe_n32 __user *frame; -	mm_segment_t old_fs;  	sigset_t set; -	stack_t st; -	s32 sp;  	int sig;  	frame = (struct rt_sigframe_n32 __user *) regs.regs[29]; @@ -117,22 +85,8 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)  	else if (sig)  		force_sig(sig, current); -	/* The ucontext contains a stack32_t, so we must convert!  */ -	if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp)) -		goto badframe; -	st.ss_sp = (void __user *)(long) sp; -	if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size)) +	if (compat_restore_altstack(&frame->rs_uc.uc_stack))  		goto badframe; -	if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags)) -		goto badframe; - -	/* It is more difficult to avoid calling this function than to -	   call it and ignore errors.  */ -	old_fs = get_fs(); -	set_fs(KERNEL_DS); -	do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); -	set_fs(old_fs); -  	/*  	 * Don't let your children do this ... @@ -153,7 +107,6 @@ static int setup_rt_frame_n32(void *sig_return, struct k_sigaction *ka,  {  	struct rt_sigframe_n32 __user *frame;  	int err = 0; -	s32 sp;  	frame = get_sigframe(ka, regs, sizeof(*frame));  	if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) @@ -162,16 +115,10 @@ static int setup_rt_frame_n32(void *sig_return, struct k_sigaction *ka,  	/* Create siginfo.  */  	err |= copy_siginfo_to_user32(&frame->rs_info, info); -	/* Create the ucontext.  */ +	/* Create the ucontext.	 */  	err |= __put_user(0, &frame->rs_uc.uc_flags);  	err |= __put_user(0, &frame->rs_uc.uc_link); -	sp = (int) (long) current->sas_ss_sp; -	err |= __put_user(sp, -	                  &frame->rs_uc.uc_stack.ss_sp); -	err |= __put_user(sas_ss_flags(regs->regs[29]), -	                  &frame->rs_uc.uc_stack.ss_flags); -	err |= __put_user(current->sas_ss_size, -	                  &frame->rs_uc.uc_stack.ss_size); +	err |= __compat_save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]);  	err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);  	err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set); @@ -207,7 +154,7 @@ give_sigsegv:  }  struct mips_abi mips_abi_n32 = { -	.setup_rt_frame	= setup_rt_frame_n32, +	.setup_rt_frame = setup_rt_frame_n32,  	.rt_signal_return_offset =  		offsetof(struct mips_vdso, n32_rt_signal_trampoline),  	.restart	= __NR_N32_restart_syscall  |