|
@@ -827,6 +827,24 @@ static int kvmppc_handle_exit_hv(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
|
|
|
vcpu->stat.sum_exits++;
|
|
|
|
|
|
+ /*
|
|
|
+ * This can happen if an interrupt occurs in the last stages
|
|
|
+ * of guest entry or the first stages of guest exit (i.e. after
|
|
|
+ * setting paca->kvm_hstate.in_guest to KVM_GUEST_MODE_GUEST_HV
|
|
|
+ * and before setting it to KVM_GUEST_MODE_HOST_HV).
|
|
|
+ * That can happen due to a bug, or due to a machine check
|
|
|
+ * occurring at just the wrong time.
|
|
|
+ */
|
|
|
+ if (vcpu->arch.shregs.msr & MSR_HV) {
|
|
|
+ printk(KERN_EMERG "KVM trap in HV mode!\n");
|
|
|
+ printk(KERN_EMERG "trap=0x%x | pc=0x%lx | msr=0x%llx\n",
|
|
|
+ vcpu->arch.trap, kvmppc_get_pc(vcpu),
|
|
|
+ vcpu->arch.shregs.msr);
|
|
|
+ kvmppc_dump_regs(vcpu);
|
|
|
+ run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
|
|
+ run->hw.hardware_exit_reason = vcpu->arch.trap;
|
|
|
+ return RESUME_HOST;
|
|
|
+ }
|
|
|
run->exit_reason = KVM_EXIT_UNKNOWN;
|
|
|
run->ready_for_interrupt_injection = 1;
|
|
|
switch (vcpu->arch.trap) {
|