|
@@ -4314,13 +4314,19 @@ EXPORT_SYMBOL_GPL(kvm_inject_realmode_interrupt);
|
|
|
|
|
|
static int handle_emulation_failure(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
+ int r = EMULATE_DONE;
|
|
|
+
|
|
|
++vcpu->stat.insn_emulation_fail;
|
|
|
trace_kvm_emulate_insn_failed(vcpu);
|
|
|
- vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
|
|
- vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION;
|
|
|
- vcpu->run->internal.ndata = 0;
|
|
|
+ if (!is_guest_mode(vcpu)) {
|
|
|
+ vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
|
|
+ vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION;
|
|
|
+ vcpu->run->internal.ndata = 0;
|
|
|
+ r = EMULATE_FAIL;
|
|
|
+ }
|
|
|
kvm_queue_exception(vcpu, UD_VECTOR);
|
|
|
- return EMULATE_FAIL;
|
|
|
+
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t gva)
|