diff options
Diffstat (limited to 'arch/mips/kernel/signal32.c')
| -rw-r--r-- | arch/mips/kernel/signal32.c | 39 | 
1 files changed, 15 insertions, 24 deletions
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index bae2e6ee2109..d69179c0d49d 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c @@ -490,21 +490,21 @@ badframe:  	force_sig(SIGSEGV, current);  } -static int setup_frame_32(void *sig_return, struct k_sigaction *ka, -			  struct pt_regs *regs, int signr, sigset_t *set) +static int setup_frame_32(void *sig_return, struct ksignal *ksig, +			  struct pt_regs *regs, sigset_t *set)  {  	struct sigframe32 __user *frame;  	int err = 0; -	frame = get_sigframe(ka, regs, sizeof(*frame)); +	frame = get_sigframe(ksig, regs, sizeof(*frame));  	if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) -		goto give_sigsegv; +		return -EFAULT;  	err |= setup_sigcontext32(regs, &frame->sf_sc);  	err |= __copy_conv_sigset_to_user(&frame->sf_mask, set);  	if (err) -		goto give_sigsegv; +		return -EFAULT;  	/*  	 * Arguments to signal handler: @@ -516,37 +516,32 @@ static int setup_frame_32(void *sig_return, struct k_sigaction *ka,  	 * $25 and c0_epc point to the signal handler, $29 points to the  	 * struct sigframe.  	 */ -	regs->regs[ 4] = signr; +	regs->regs[ 4] = ksig->sig;  	regs->regs[ 5] = 0;  	regs->regs[ 6] = (unsigned long) &frame->sf_sc;  	regs->regs[29] = (unsigned long) frame;  	regs->regs[31] = (unsigned long) sig_return; -	regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler; +	regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;  	DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",  	       current->comm, current->pid,  	       frame, regs->cp0_epc, regs->regs[31]);  	return 0; - -give_sigsegv: -	force_sigsegv(signr, current); -	return -EFAULT;  } -static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka, -			     struct pt_regs *regs, int signr, sigset_t *set, -			     siginfo_t *info) +static int setup_rt_frame_32(void *sig_return, struct ksignal *ksig, +			     struct pt_regs *regs, sigset_t *set)  {  	struct rt_sigframe32 __user *frame;  	int err = 0; -	frame = get_sigframe(ka, regs, sizeof(*frame)); +	frame = get_sigframe(ksig, regs, sizeof(*frame));  	if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) -		goto give_sigsegv; +		return -EFAULT;  	/* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */ -	err |= copy_siginfo_to_user32(&frame->rs_info, info); +	err |= copy_siginfo_to_user32(&frame->rs_info, &ksig->info);  	/* Create the ucontext.	 */  	err |= __put_user(0, &frame->rs_uc.uc_flags); @@ -556,7 +551,7 @@ static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka,  	err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);  	if (err) -		goto give_sigsegv; +		return -EFAULT;  	/*  	 * Arguments to signal handler: @@ -568,22 +563,18 @@ static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka,  	 * $25 and c0_epc point to the signal handler, $29 points to  	 * the struct rt_sigframe32.  	 */ -	regs->regs[ 4] = signr; +	regs->regs[ 4] = ksig->sig;  	regs->regs[ 5] = (unsigned long) &frame->rs_info;  	regs->regs[ 6] = (unsigned long) &frame->rs_uc;  	regs->regs[29] = (unsigned long) frame;  	regs->regs[31] = (unsigned long) sig_return; -	regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler; +	regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;  	DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",  	       current->comm, current->pid,  	       frame, regs->cp0_epc, regs->regs[31]);  	return 0; - -give_sigsegv: -	force_sigsegv(signr, current); -	return -EFAULT;  }  /*  |