@@ -1589,7 +1589,7 @@ void fp_unavailable_tm(struct pt_regs *regs)
* If VMX is in use, the VRs now hold checkpointed values,
* so we don't want to load the VRs from the thread_struct.
*/
- tm_recheckpoint(¤t->thread, MSR_FP);
+ tm_recheckpoint(¤t->thread, regs->msr);
/* If VMX is in use, get the transactional values back */
if (regs->msr & MSR_VEC) {
@@ -1611,7 +1611,7 @@ void altivec_unavailable_tm(struct pt_regs *regs)
regs->nip, regs->msr);
tm_reclaim_current(TM_CAUSE_FAC_UNAV);
regs->msr |= MSR_VEC;
- tm_recheckpoint(¤t->thread, MSR_VEC);
+ tm_recheckpoint(¤t->thread, regs->msr );
current->thread.used_vr = 1;
if (regs->msr & MSR_FP) {
@@ -1653,7 +1653,7 @@ void vsx_unavailable_tm(struct pt_regs *regs)
/* This loads & recheckpoints FP and VRs; but we have
* to be sure not to overwrite previously-valid state.
*/
- tm_recheckpoint(¤t->thread, regs->msr & ~orig_msr);
+ tm_recheckpoint(¤t->thread, regs->msr);
msr_check_and_set(orig_msr & (MSR_FP | MSR_VEC));
@@ -880,10 +880,10 @@ static void tm_reclaim_thread(struct thread_struct *thr,
* not. So either this will write the checkpointed registers,
* or reclaim will. Similarly for VMX.
*/
- if ((thr->ckpt_regs.msr & MSR_FP) == 0)
+ if ((thr->regs->msr & MSR_FP) == 0)
memcpy(&thr->ckfp_state, &thr->fp_state,
sizeof(struct thread_fp_state));
- if ((thr->ckpt_regs.msr & MSR_VEC) == 0)
+ if ((thr->regs->msr & MSR_VEC) == 0)
memcpy(&thr->ckvr_state, &thr->vr_state,
sizeof(struct thread_vr_state));