• Sean Christopherson's avatar
    KVM: nVMX: Copy PDPTRs to/from vmcs12 only when necessary · c7554efc
    Sean Christopherson authored
    Per Intel's SDM:
    
      ... the logical processor uses PAE paging if CR0.PG=1, CR4.PAE=1 and
      IA32_EFER.LME=0.  A VM entry to a guest that uses PAE paging loads the
      PDPTEs into internal, non-architectural registers based on the setting
      of the "enable EPT" VM-execution control.
    
    and:
    
      [GUEST_PDPTR] values are saved into the four PDPTE fields as follows:
    
        - If the "enable EPT" VM-execution control is 0 or the logical
          processor was not using PAE paging at the time of the VM exit,
          the values saved are undefined.
    
    In other words, if EPT is disabled or the guest isn't using PAE paging,
    then the PDPTRS aren't consumed by hardware on VM-Entry and are loaded
    with junk on VM-Exit.  From a nesting perspective, all of the above hold
    true, i.e. KVM can effectively ignore the VMCS PDPTRs.  E.g. KVM already
    loads the PDPTRs from memory when nested EPT is disabled (see
    nested_vmx_load_cr3()).
    
    Because KVM intercepts setting CR4.PAE, there is no danger of consuming
    a stale value or crushing L1's VMWRITEs regardless of whether L1
    intercepts CR4.PAE. The vmcs12's values are unchanged up until the
    VM-Exit where L2 sets CR4.PAE, i.e. L0 will see the new PAE state on the
    subsequent VM-Entry and propagate the PDPTRs from vmcs12 to vmcs02.
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    c7554efc
nested.c 179 KB