|
@@ -2916,6 +2916,27 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Don't allow entry with a suspended transaction, because
|
|
|
+ * the guest entry/exit code will lose it.
|
|
|
+ * If the guest has TM enabled, save away their TM-related SPRs
|
|
|
+ * (they will get restored by the TM unavailable interrupt).
|
|
|
+ */
|
|
|
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
|
|
+ if (cpu_has_feature(CPU_FTR_TM) && current->thread.regs &&
|
|
|
+ (current->thread.regs->msr & MSR_TM)) {
|
|
|
+ if (MSR_TM_ACTIVE(current->thread.regs->msr)) {
|
|
|
+ run->exit_reason = KVM_EXIT_FAIL_ENTRY;
|
|
|
+ run->fail_entry.hardware_entry_failure_reason = 0;
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ current->thread.tm_tfhar = mfspr(SPRN_TFHAR);
|
|
|
+ current->thread.tm_tfiar = mfspr(SPRN_TFIAR);
|
|
|
+ current->thread.tm_texasr = mfspr(SPRN_TEXASR);
|
|
|
+ current->thread.regs->msr &= ~MSR_TM;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
kvmppc_core_prepare_to_enter(vcpu);
|
|
|
|
|
|
/* No need to go into the guest when all we'll do is come back out */
|