From 32a3ef748182e26847bcf1853241d0bba21ea79f Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Mon, 10 Sep 2007 17:27:03 +0300 Subject: [PATCH] --- yaml --- r: 68427 b: refs/heads/master c: 29bd8a78082f2d7e2165a735f50b5c716ef3213b h: refs/heads/master i: 68425: 36e45564b3d76c707747fe178820cec6a53e4e16 68423: ce0e9654c4023abfd13f4009334f1bf337b2c743 v: v3 --- [refs] | 2 +- trunk/drivers/kvm/vmx.c | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index 33913f502927..83da046f2560 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2e3e5882dca3ab409aa8c9c96f47610b576719f8 +refs/heads/master: 29bd8a78082f2d7e2165a735f50b5c716ef3213b diff --git a/trunk/drivers/kvm/vmx.c b/trunk/drivers/kvm/vmx.c index 57a6055ffb0b..713f78a89595 100644 --- a/trunk/drivers/kvm/vmx.c +++ b/trunk/drivers/kvm/vmx.c @@ -43,6 +43,7 @@ struct vmcs { struct vcpu_vmx { struct kvm_vcpu vcpu; int launched; + u8 fail; struct kvm_msr_entry *guest_msrs; struct kvm_msr_entry *host_msrs; int nmsrs; @@ -2099,6 +2100,14 @@ static int kvm_handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) { u32 vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD); u32 exit_reason = vmcs_read32(VM_EXIT_REASON); + struct vcpu_vmx *vmx = to_vmx(vcpu); + + if (unlikely(vmx->fail)) { + kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY; + kvm_run->fail_entry.hardware_entry_failure_reason + = vmcs_read32(VM_INSTRUCTION_ERROR); + return 0; + } if ( (vectoring_info & VECTORING_INFO_VALID_MASK) && exit_reason != EXIT_REASON_EXCEPTION_NMI ) @@ -2208,7 +2217,6 @@ static void vmx_intr_assist(struct kvm_vcpu *vcpu) static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) { struct vcpu_vmx *vmx = to_vmx(vcpu); - u8 fail; int r; if (unlikely(vcpu->mp_state == VCPU_MP_STATE_SIPI_RECEIVED)) { @@ -2352,7 +2360,7 @@ static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) "pop %%ecx; popa \n\t" #endif "setbe %0 \n\t" - : "=q" (fail) + : "=q" (vmx->fail) : "r"(vmx->launched), "d"((unsigned long)HOST_RSP), "c"(vcpu), [rax]"i"(offsetof(struct kvm_vcpu, regs[VCPU_REGS_RAX])), @@ -2387,13 +2395,6 @@ static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) preempt_enable(); - if (unlikely(fail)) { - kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY; - kvm_run->fail_entry.hardware_entry_failure_reason - = vmcs_read32(VM_INSTRUCTION_ERROR); - r = 0; - goto out; - } /* * Profile KVM exit RIPs: */