diff options
-rw-r--r-- | arch/x86/kvm/vmx.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 51aa827e3bb..f95f48b2600 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -3902,6 +3902,7 @@ static void vmx_complete_atomic_exit(struct vcpu_vmx *vmx) | |||
3902 | || vmx->exit_reason == EXIT_REASON_EXCEPTION_NMI)) | 3902 | || vmx->exit_reason == EXIT_REASON_EXCEPTION_NMI)) |
3903 | return; | 3903 | return; |
3904 | 3904 | ||
3905 | vmx->exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); | ||
3905 | exit_intr_info = vmx->exit_intr_info; | 3906 | exit_intr_info = vmx->exit_intr_info; |
3906 | 3907 | ||
3907 | /* Handle machine checks before interrupts are enabled */ | 3908 | /* Handle machine checks before interrupts are enabled */ |
@@ -3919,7 +3920,7 @@ static void vmx_complete_atomic_exit(struct vcpu_vmx *vmx) | |||
3919 | 3920 | ||
3920 | static void vmx_recover_nmi_blocking(struct vcpu_vmx *vmx) | 3921 | static void vmx_recover_nmi_blocking(struct vcpu_vmx *vmx) |
3921 | { | 3922 | { |
3922 | u32 exit_intr_info = vmx->exit_intr_info; | 3923 | u32 exit_intr_info; |
3923 | bool unblock_nmi; | 3924 | bool unblock_nmi; |
3924 | u8 vector; | 3925 | u8 vector; |
3925 | bool idtv_info_valid; | 3926 | bool idtv_info_valid; |
@@ -3929,6 +3930,11 @@ static void vmx_recover_nmi_blocking(struct vcpu_vmx *vmx) | |||
3929 | if (cpu_has_virtual_nmis()) { | 3930 | if (cpu_has_virtual_nmis()) { |
3930 | if (vmx->nmi_known_unmasked) | 3931 | if (vmx->nmi_known_unmasked) |
3931 | return; | 3932 | return; |
3933 | /* | ||
3934 | * Can't use vmx->exit_intr_info since we're not sure what | ||
3935 | * the exit reason is. | ||
3936 | */ | ||
3937 | exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); | ||
3932 | unblock_nmi = (exit_intr_info & INTR_INFO_UNBLOCK_NMI) != 0; | 3938 | unblock_nmi = (exit_intr_info & INTR_INFO_UNBLOCK_NMI) != 0; |
3933 | vector = exit_intr_info & INTR_INFO_VECTOR_MASK; | 3939 | vector = exit_intr_info & INTR_INFO_VECTOR_MASK; |
3934 | /* | 3940 | /* |
@@ -4176,7 +4182,6 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) | |||
4176 | vmx->launched = 1; | 4182 | vmx->launched = 1; |
4177 | 4183 | ||
4178 | vmx->exit_reason = vmcs_read32(VM_EXIT_REASON); | 4184 | vmx->exit_reason = vmcs_read32(VM_EXIT_REASON); |
4179 | vmx->exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); | ||
4180 | 4185 | ||
4181 | vmx_complete_atomic_exit(vmx); | 4186 | vmx_complete_atomic_exit(vmx); |
4182 | vmx_recover_nmi_blocking(vmx); | 4187 | vmx_recover_nmi_blocking(vmx); |