diff options
Diffstat (limited to 'arch/powerpc/kernel/signal_32.c')
| -rw-r--r-- | arch/powerpc/kernel/signal_32.c | 28 | 
1 files changed, 14 insertions, 14 deletions
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 98600b276f76..1b090a76b444 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c @@ -489,19 +489,11 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,   */  static int save_tm_user_regs(struct pt_regs *regs,  			     struct mcontext __user *frame, -			     struct mcontext __user *tm_frame, int sigret) +			     struct mcontext __user *tm_frame, int sigret, +			     unsigned long msr)  { -	unsigned long msr = regs->msr; -  	WARN_ON(tm_suspend_disabled); -	/* Remove TM bits from thread's MSR.  The MSR in the sigcontext -	 * just indicates to userland that we were doing a transaction, but we -	 * don't want to return in transactional state.  This also ensures -	 * that flush_fp_to_thread won't set TIF_RESTORE_TM again. -	 */ -	regs->msr &= ~MSR_TS_MASK; -  	/* Save both sets of general registers */  	if (save_general_regs(¤t->thread.ckpt_regs, frame)  	    || save_general_regs(regs, tm_frame)) @@ -912,6 +904,10 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,  	int sigret;  	unsigned long tramp;  	struct pt_regs *regs = tsk->thread.regs; +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM +	/* Save the thread's msr before get_tm_stackpointer() changes it */ +	unsigned long msr = regs->msr; +#endif  	BUG_ON(tsk != current); @@ -944,13 +940,13 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,  #ifdef CONFIG_PPC_TRANSACTIONAL_MEM  	tm_frame = &rt_sf->uc_transact.uc_mcontext; -	if (MSR_TM_ACTIVE(regs->msr)) { +	if (MSR_TM_ACTIVE(msr)) {  		if (__put_user((unsigned long)&rt_sf->uc_transact,  			       &rt_sf->uc.uc_link) ||  		    __put_user((unsigned long)tm_frame,  			       &rt_sf->uc_transact.uc_regs))  			goto badframe; -		if (save_tm_user_regs(regs, frame, tm_frame, sigret)) +		if (save_tm_user_regs(regs, frame, tm_frame, sigret, msr))  			goto badframe;  	}  	else @@ -1369,6 +1365,10 @@ int handle_signal32(struct ksignal *ksig, sigset_t *oldset,  	int sigret;  	unsigned long tramp;  	struct pt_regs *regs = tsk->thread.regs; +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM +	/* Save the thread's msr before get_tm_stackpointer() changes it */ +	unsigned long msr = regs->msr; +#endif  	BUG_ON(tsk != current); @@ -1402,9 +1402,9 @@ int handle_signal32(struct ksignal *ksig, sigset_t *oldset,  #ifdef CONFIG_PPC_TRANSACTIONAL_MEM  	tm_mctx = &frame->mctx_transact; -	if (MSR_TM_ACTIVE(regs->msr)) { +	if (MSR_TM_ACTIVE(msr)) {  		if (save_tm_user_regs(regs, &frame->mctx, &frame->mctx_transact, -				      sigret)) +				      sigret, msr))  			goto badframe;  	}  	else  |