lkml.org 
[lkml]   [2022]   [Jan]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 037/200] Revert "KVM: SVM: avoid infinite loop on NPF from bad address"
    Date
    From: Sean Christopherson <seanjc@google.com>

    commit 31c25585695abdf03d6160aa6d829e855b256329 upstream.

    Revert a completely broken check on an "invalid" RIP in SVM's workaround
    for the DecodeAssists SMAP errata. kvm_vcpu_gfn_to_memslot() obviously
    expects a gfn, i.e. operates in the guest physical address space, whereas
    RIP is a virtual (not even linear) address. The "fix" worked for the
    problematic KVM selftest because the test identity mapped RIP.

    Fully revert the hack instead of trying to translate RIP to a GPA, as the
    non-SEV case is now handled earlier, and KVM cannot access guest page
    tables to translate RIP.

    This reverts commit e72436bc3a5206f95bb384e741154166ddb3202e.

    Fixes: e72436bc3a52 ("KVM: SVM: avoid infinite loop on NPF from bad address")
    Reported-by: Liam Merwick <liam.merwick@oracle.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
    Message-Id: <20220120010719.711476-3-seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/kvm/svm/svm.c | 7 -------
    virt/kvm/kvm_main.c | 1 -
    2 files changed, 8 deletions(-)

    --- a/arch/x86/kvm/svm/svm.c
    +++ b/arch/x86/kvm/svm/svm.c
    @@ -4513,13 +4513,6 @@ static bool svm_can_emulate_instruction(
    if (likely(!insn || insn_len))
    return true;

    - /*
    - * If RIP is invalid, go ahead with emulation which will cause an
    - * internal error exit.
    - */
    - if (!kvm_vcpu_gfn_to_memslot(vcpu, kvm_rip_read(vcpu) >> PAGE_SHIFT))
    - return true;
    -
    cr4 = kvm_read_cr4(vcpu);
    smep = cr4 & X86_CR4_SMEP;
    smap = cr4 & X86_CR4_SMAP;
    --- a/virt/kvm/kvm_main.c
    +++ b/virt/kvm/kvm_main.c
    @@ -2112,7 +2112,6 @@ struct kvm_memory_slot *kvm_vcpu_gfn_to_

    return NULL;
    }
    -EXPORT_SYMBOL_GPL(kvm_vcpu_gfn_to_memslot);

    bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn)
    {

    \
     
     \ /
      Last update: 2022-01-31 13:09    [W:4.839 / U:0.884 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site