Skip to content

Commit b060ca3

Browse files
jsmattsonjrbonzini
authored andcommitted
kvm: vmx: Handle VMLAUNCH/VMRESUME failure properly
On an early VMLAUNCH/VMRESUME failure (i.e. one which sets the VM-instruction error field of the current VMCS), the launch state of the current VMCS is not set to "launched," and the VM-exit information fields of the current VMCS (including IDT-vectoring information and exit reason) are stale. On a late VMLAUNCH/VMRESUME failure (i.e. one which sets the high bit of the exit reason field), the launch state of the current VMCS is not set to "launched," and only two of the VM-exit information fields of the current VMCS are modified (exit reason and exit qualification). The remaining VM-exit information fields of the current VMCS (including IDT-vectoring information, in particular) are stale. Signed-off-by: Jim Mattson <jmattson@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent 7881f96 commit b060ca3

1 file changed

Lines changed: 8 additions & 6 deletions

File tree

arch/x86/kvm/vmx.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9424,12 +9424,6 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
94249424
| (1 << VCPU_EXREG_CR3));
94259425
vcpu->arch.regs_dirty = 0;
94269426

9427-
vmx->idt_vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD);
9428-
9429-
vmx->loaded_vmcs->launched = 1;
9430-
9431-
vmx->exit_reason = vmcs_read32(VM_EXIT_REASON);
9432-
94339427
/*
94349428
* eager fpu is enabled if PKEY is supported and CR4 is switched
94359429
* back on host, so it is safe to read guest PKRU from current
@@ -9451,6 +9445,14 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
94519445
kvm_make_request(KVM_REQ_EVENT, vcpu);
94529446

94539447
vmx->nested.nested_run_pending = 0;
9448+
vmx->idt_vectoring_info = 0;
9449+
9450+
vmx->exit_reason = vmx->fail ? 0xdead : vmcs_read32(VM_EXIT_REASON);
9451+
if (vmx->fail || (vmx->exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY))
9452+
return;
9453+
9454+
vmx->loaded_vmcs->launched = 1;
9455+
vmx->idt_vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD);
94549456

94559457
vmx_complete_atomic_exit(vmx);
94569458
vmx_recover_nmi_blocking(vmx);

0 commit comments

Comments
 (0)