• Maxim Levitsky's avatar
    KVM: nVMX: don't use vcpu->arch.efer when checking host state on nested state load · af957eeb
    Maxim Levitsky authored
    When loading nested state, don't use check vcpu->arch.efer to get the
    L1 host's 64-bit vs. 32-bit state and don't check it for consistency
    with respect to VM_EXIT_HOST_ADDR_SPACE_SIZE, as register state in vCPU
    may be stale when KVM_SET_NESTED_STATE is called---and architecturally
    does not exist.  When restoring L2 state in KVM, the CPU is placed in
    non-root where nested VMX code has no snapshot of L1 host state: VMX
    (conditionally) loads host state fields loaded on VM-exit, but they need
    not correspond to the state before entry.  A simple case occurs in KVM
    itself, where the host RIP field points to vmx_vmexit rather than the
    instruction following vmlaunch/vmresume.
    
    However, for the particular case of L1 being in 32- or 64-bit mode
    on entry, the exit controls can be treated instead as the source of
    truth regarding the state of L1 on entry, and can be used to check
    that vmcs12.VM_EXIT_HOST_ADDR_SPACE_SIZE matches vmcs12.HOST_EFER if
    vmcs12.VM_EXIT_LOAD_IA32_EFER is set.  The consistency check on CPU
    EFER vs. vmcs12.VM_EXIT_HOST_ADDR_SPACE_SIZE, instead, happens only
    on VM-Enter.  That's because, again, there's conceptually no "current"
    L1 EFER to check on KVM_SET_NESTED_STATE.
    Suggested-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Message-Id: <20211115131837.195527-2-mlevitsk@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    af957eeb
nested.c 206 KB