• Sean Christopherson's avatar
    KVM: nVMX: Use fast PGD switch when emulating VMFUNC[EPTP_SWITCH] · 39353ab5
    Sean Christopherson authored
    Use __kvm_mmu_new_pgd() via kvm_init_shadow_ept_mmu() to emulate
    VMFUNC[EPTP_SWITCH] instead of nuking all MMUs.  EPTP_SWITCH is the EPT
    equivalent of MOV to CR3, i.e. is a perfect fit for the common PGD flow,
    the only hiccup being that A/D enabling is buried in the EPTP.  But, that
    is easily handled by bouncing through kvm_init_shadow_ept_mmu().
    
    Explicitly request a guest TLB flush if VPID is disabled.  Per Intel's
    SDM, if VPID is disabled, "an EPTP-switching VMFUNC invalidates combined
    mappings associated with VPID 0000H (for all PCIDs and for all EP4TA
    values, where EP4TA is the value of bits 51:12 of EPTP)".
    
    Note, this technically is a very bizarre bug fix of sorts if L2 is using
    PAE paging, as avoiding the full MMU reload also avoids incorrectly
    reloading the PDPTEs, which the SDM explicitly states are not touched:
    
      If PAE paging is in use, an EPTP-switching VMFUNC does not load the
      four page-directory-pointer-table entries (PDPTEs) from the
      guest-physical address in CR3. The logical processor continues to use
      the four guest-physical addresses already present in the PDPTEs. The
      guest-physical address in CR3 is not translated through the new EPT
      paging structures (until some operation that would load the PDPTEs).
    
    In addition to optimizing L2's MMU shenanigans, avoiding the full reload
    also optimizes L1's MMU as KVM_REQ_MMU_RELOAD wipes out all roots in both
    root_mmu and guest_mmu.
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20210609234235.1244004-12-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    39353ab5
nested.c 204 KB