diff options
Diffstat (limited to 'arch/openrisc/kernel/signal.c')
| -rw-r--r-- | arch/openrisc/kernel/signal.c | 47 | 
1 files changed, 20 insertions, 27 deletions
| diff --git a/arch/openrisc/kernel/signal.c b/arch/openrisc/kernel/signal.c index 95207ab0c99e..e970743251ae 100644 --- a/arch/openrisc/kernel/signal.c +++ b/arch/openrisc/kernel/signal.c @@ -102,10 +102,7 @@ asmlinkage long _sys_rt_sigreturn(struct pt_regs *regs)  		goto badframe;  	sigdelsetmask(&set, ~_BLOCKABLE); -	spin_lock_irq(¤t->sighand->siglock); -	current->blocked = set; -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); +	set_current_blocked(&set);  	if (restore_sigcontext(regs, &frame->uc.uc_mcontext))  		goto badframe; @@ -189,8 +186,8 @@ static inline void __user *get_sigframe(struct k_sigaction *ka,   * trampoline which performs the syscall sigreturn, or a provided   * user-mode trampoline.   */ -static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, -			   sigset_t *set, struct pt_regs *regs) +static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, +			  sigset_t *set, struct pt_regs *regs)  {  	struct rt_sigframe *frame;  	unsigned long return_ip; @@ -247,31 +244,27 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	/* actually move the usp to reflect the stacked frame */  	regs->sp = (unsigned long)frame; -	return; +	return 0;  give_sigsegv: -	if (sig == SIGSEGV) -		ka->sa.sa_handler = SIG_DFL; -	force_sig(SIGSEGV, current); +	force_sigsegv(sig, current); +	return -EFAULT;  } -static inline void +static inline int  handle_signal(unsigned long sig,  	      siginfo_t *info, struct k_sigaction *ka,  	      sigset_t *oldset, struct pt_regs *regs)  { -	setup_rt_frame(sig, ka, info, oldset, regs); +	int ret; -	if (ka->sa.sa_flags & SA_ONESHOT) -		ka->sa.sa_handler = SIG_DFL; +	ret = setup_rt_frame(sig, ka, info, oldset, regs); +	if (ret) +		return ret; -	spin_lock_irq(¤t->sighand->siglock); -	sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); -	if (!(ka->sa.sa_flags & SA_NODEFER)) -		sigaddset(¤t->blocked, sig); -	recalc_sigpending(); +	block_sigmask(ka, sig); -	spin_unlock_irq(¤t->sighand->siglock); +	return 0;  }  /* @@ -312,7 +305,7 @@ void do_signal(struct pt_regs *regs)  	 * below mean that the syscall executed to completion and no  	 * restart is necessary.  	 */ -	if (regs->syscallno) { +	if (regs->orig_gpr11) {  		int restart = 0;  		switch (regs->gpr[11]) { @@ -360,13 +353,13 @@ void do_signal(struct pt_regs *regs)  			oldset = ¤t->blocked;  		/* Whee!  Actually deliver the signal.  */ -		handle_signal(signr, &info, &ka, oldset, regs); -		/* a signal was successfully delivered; the saved -		 * sigmask will have been stored in the signal frame, -		 * and will be restored by sigreturn, so we can simply -		 * clear the TIF_RESTORE_SIGMASK flag */ -		if (test_thread_flag(TIF_RESTORE_SIGMASK)) +		if (!handle_signal(signr, &info, &ka, oldset, regs)) { +			/* a signal was successfully delivered; the saved +			 * sigmask will have been stored in the signal frame, +			 * and will be restored by sigreturn, so we can simply +			 * clear the TIF_RESTORE_SIGMASK flag */  			clear_thread_flag(TIF_RESTORE_SIGMASK); +		}  		tracehook_signal_handler(signr, &info, &ka, regs,  					 test_thread_flag(TIF_SINGLESTEP)); | 
