KVM: Return to userspace on emulation failure
authorAvi Kivity <avi@redhat.com>
Thu, 11 Jun 2009 12:43:28 +0000 (15:43 +0300)
committerAvi Kivity <avi@redhat.com>
Thu, 10 Sep 2009 05:32:52 +0000 (08:32 +0300)
Instead of mindlessly retrying to execute the instruction, report the
failure to userspace.

Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/mmu.c
include/linux/kvm.h

index 5f97dbd..b6e4cda 100644 (file)
@@ -2673,8 +2673,9 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u32 error_code)
                ++vcpu->stat.mmio_exits;
                return 0;
        case EMULATE_FAIL:
-               kvm_report_emulation_failure(vcpu, "pagetable");
-               return 1;
+               vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
+               vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION;
+               return 0;
        default:
                BUG();
        }
index 5037e17..6710518 100644 (file)
@@ -95,6 +95,10 @@ struct kvm_pit_config {
 #define KVM_EXIT_S390_RESET       14
 #define KVM_EXIT_DCR              15
 #define KVM_EXIT_NMI              16
+#define KVM_EXIT_INTERNAL_ERROR   17
+
+/* For KVM_EXIT_INTERNAL_ERROR */
+#define KVM_INTERNAL_ERROR_EMULATION 1
 
 /* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */
 struct kvm_run {
@@ -181,6 +185,9 @@ struct kvm_run {
                        __u32 data;
                        __u8  is_write;
                } dcr;
+               struct {
+                       __u32 suberror;
+               } internal;
                /* Fix the size of the union. */
                char padding[256];
        };