• Vitaly Kuznetsov's avatar
    KVM: nSVM: implement nested_svm_load_cr3() and use it for host->guest switch · a506fdd2
    Vitaly Kuznetsov authored
    Undesired triple fault gets injected to L1 guest on SVM when L2 is
    launched with certain CR3 values. #TF is raised by mmu_check_root()
    check in fast_pgd_switch() and the root cause is that when
    kvm_set_cr3() is called from nested_prepare_vmcb_save() with NPT
    enabled CR3 points to a nGPA so we can't check it with
    kvm_is_visible_gfn().
    
    Using generic kvm_set_cr3() when switching to nested guest is not
    a great idea as we'll have to distinguish between 'real' CR3s and
    'nested' CR3s to e.g. not call kvm_mmu_new_pgd() with nGPA. Following
    nVMX implement nested-specific nested_svm_load_cr3() doing the job.
    
    To support the change, nested_svm_load_cr3() needs to be re-ordered
    with nested_svm_init_mmu_context().
    
    Note: the current implementation is sub-optimal as we always do TLB
    flush/MMU sync but this is still an improvement as we at least stop doing
    kvm_mmu_reset_context().
    
    Fixes: 7c390d35 ("kvm: x86: Add fast CR3 switch code path")
    Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Message-Id: <20200710141157.1640173-8-vkuznets@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    a506fdd2
mmu.c 169 KB