diff options
Diffstat (limited to 'arch/powerpc/kernel')
| -rw-r--r-- | arch/powerpc/kernel/entry_64.S | 4 | ||||
| -rw-r--r-- | arch/powerpc/kernel/process.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/signal_32.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/signal_64.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/tm.S | 2 | 
5 files changed, 10 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 256c5bf0adb..04d69c4a5ac 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S @@ -304,7 +304,7 @@ syscall_exit_work:  	subi	r12,r12,TI_FLAGS  4:	/* Anything else left to do? */ -	SET_DEFAULT_THREAD_PPR(r3, r9)		/* Set thread.ppr = 3 */ +	SET_DEFAULT_THREAD_PPR(r3, r10)		/* Set thread.ppr = 3 */  	andi.	r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)  	beq	.ret_from_except_lite @@ -657,7 +657,7 @@ resume_kernel:  	/* Clear _TIF_EMULATE_STACK_STORE flag */  	lis	r11,_TIF_EMULATE_STACK_STORE@h  	addi	r5,r9,TI_FLAGS -	ldarx	r4,0,r5 +0:	ldarx	r4,0,r5  	andc	r4,r4,r11  	stdcx.	r4,0,r5  	bne-	0b diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 59dd545fdde..16e77a81ab4 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -555,10 +555,12 @@ static inline void tm_recheckpoint_new_task(struct task_struct *new)  		new->thread.regs->msr |=  			(MSR_FP | new->thread.fpexc_mode);  	} +#ifdef CONFIG_ALTIVEC  	if (msr & MSR_VEC) {  		do_load_up_transact_altivec(&new->thread);  		new->thread.regs->msr |= MSR_VEC;  	} +#endif  	/* We may as well turn on VSX too since all the state is restored now */  	if (msr & MSR_VSX)  		new->thread.regs->msr |= MSR_VSX; diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 3acb28e245b..95068bf569a 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c @@ -866,10 +866,12 @@ static long restore_tm_user_regs(struct pt_regs *regs,  		do_load_up_transact_fpu(¤t->thread);  		regs->msr |= (MSR_FP | current->thread.fpexc_mode);  	} +#ifdef CONFIG_ALTIVEC  	if (msr & MSR_VEC) {  		do_load_up_transact_altivec(¤t->thread);  		regs->msr |= MSR_VEC;  	} +#endif  	return 0;  } diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index 995f8543cb5..c1794286098 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c @@ -522,10 +522,12 @@ static long restore_tm_sigcontexts(struct pt_regs *regs,  		do_load_up_transact_fpu(¤t->thread);  		regs->msr |= (MSR_FP | current->thread.fpexc_mode);  	} +#ifdef CONFIG_ALTIVEC  	if (msr & MSR_VEC) {  		do_load_up_transact_altivec(¤t->thread);  		regs->msr |= MSR_VEC;  	} +#endif  	return err;  } diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S index 84dbace657c..2da67e7a16d 100644 --- a/arch/powerpc/kernel/tm.S +++ b/arch/powerpc/kernel/tm.S @@ -309,6 +309,7 @@ _GLOBAL(tm_recheckpoint)  	or	r5, r6, r5			/* Set MSR.FP+.VSX/.VEC */  	mtmsr	r5 +#ifdef CONFIG_ALTIVEC  	/* FP and VEC registers:  These are recheckpointed from thread.fpr[]  	 * and thread.vr[] respectively.  The thread.transact_fpr[] version  	 * is more modern, and will be loaded subsequently by any FPUnavailable @@ -323,6 +324,7 @@ _GLOBAL(tm_recheckpoint)  	REST_32VRS(0, r5, r3)			/* r5 scratch, r3 THREAD ptr */  	ld	r5, THREAD_VRSAVE(r3)  	mtspr	SPRN_VRSAVE, r5 +#endif  dont_restore_vec:  	andi.	r0, r4, MSR_FP  |