diff options
Diffstat (limited to 'arch/arm/kernel/signal.c')
| -rw-r--r-- | arch/arm/kernel/signal.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 80b8b5c7e07..93bb4247b7e 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -426,9 +426,13 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,  		 */  		thumb = handler & 1; -		if (thumb) +		if (thumb) {  			cpsr |= PSR_T_BIT; -		else +#if __LINUX_ARM_ARCH__ >= 7 +			/* clear the If-Then Thumb-2 execution state */ +			cpsr &= ~PSR_IT_MASK; +#endif +		} else  			cpsr &= ~PSR_T_BIT;  	}  #endif @@ -532,7 +536,7 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,  	return err;  } -static inline void restart_syscall(struct pt_regs *regs) +static inline void setup_syscall_restart(struct pt_regs *regs)  {  	regs->ARM_r0 = regs->ARM_ORIG_r0;  	regs->ARM_pc -= thumb_mode(regs) ? 2 : 4; @@ -567,7 +571,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,  			}  			/* fallthrough */  		case -ERESTARTNOINTR: -			restart_syscall(regs); +			setup_syscall_restart(regs);  		}  	} @@ -691,7 +695,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)  		if (regs->ARM_r0 == -ERESTARTNOHAND ||  		    regs->ARM_r0 == -ERESTARTSYS ||  		    regs->ARM_r0 == -ERESTARTNOINTR) { -			restart_syscall(regs); +			setup_syscall_restart(regs);  		}  	}  	single_step_set(current);  |