• Sean Christopherson's avatar
    Revert "KVM: x86/mmu: Drop kvm_mmu_extended_role.cr4_la57 hack" · f71a53d1
    Sean Christopherson authored
    Restore CR4.LA57 to the mmu_role to fix an amusing edge case with nested
    virtualization.  When KVM (L0) is using TDP, CR4.LA57 is not reflected in
    mmu_role.base.level because that tracks the shadow root level, i.e. TDP
    level.  Normally, this is not an issue because LA57 can't be toggled
    while long mode is active, i.e. the guest has to first disable paging,
    then toggle LA57, then re-enable paging, thus ensuring an MMU
    reinitialization.
    
    But if L1 is crafty, it can load a new CR4 on VM-Exit and toggle LA57
    without having to bounce through an unpaged section.  L1 can also load a
    new CR3 on exit, i.e. it doesn't even need to play crazy paging games, a
    single entry PML5 is sufficient.  Such shenanigans are only problematic
    if L0 and L1 use TDP, otherwise L1 and L2 share an MMU that gets
    reinitialized on nested VM-Enter/VM-Exit due to mmu_role.base.guest_mode.
    
    Note, in the L2 case with nested TDP, even though L1 can switch between
    L2s with different LA57 settings, thus bypassing the paging requirement,
    in that case KVM's nested_mmu will track LA57 in base.level.
    
    This reverts commit 8053f924.
    
    Fixes: 8053f924 ("KVM: x86/mmu: Drop kvm_mmu_extended_role.cr4_la57 hack")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20210622175739.3610207-6-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    f71a53d1
mmu.c 161 KB