@@ -1079,6 +1079,12 @@ static inline void __switch_to_tm(struct task_struct *prev,
if (!MSR_TM_ACTIVE(prev->thread.regs->msr) && prev->thread.load_tm == 0)
prev->thread.regs->msr &= ~MSR_TM;
}
+
+ /*
+ * Now that we're reclaiming on kernel entry, we should never
+ * get here still with user checkpointed state on the CPU
+ */
+ BUG_ON(MSR_TM_ACTIVE(mfmsr()));
}
/*
@@ -1326,7 +1332,17 @@ struct task_struct *__switch_to(struct task_struct *prev,
}
if (current_thread_info()->task->thread.regs) {
- restore_math(current_thread_info()->task->thread.regs);
+ /*
+ * Calling this now has reloaded the live state, which
+ * gets overwritten with the checkpointed state right
+ * before the trecheckpoint. BUT the MSR still has
+ * that the live state is on the CPU, which it isn't.
+ *
+ * restore_math(current_thread_info()->task->thread.regs);
+ * Therefore:
+ */
+ if (!MSR_TM_ACTIVE(current_thread_info()->task->thread.regs->msr))
+ restore_math(current_thread_info()->task->thread.regs);
/*
* The copy-paste buffer can only store into foreign real