lkml.org 
[lkml]   [2021]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.13 009/351] KVM: SVM: Revert clearing of C-bit on GPA in #NPF handler
    Date
    From: Sean Christopherson <seanjc@google.com>

    commit 76ff371b67cb12fb635396234468abcf6a466f16 upstream.

    Don't clear the C-bit in the #NPF handler, as it is a legal GPA bit for
    non-SEV guests, and for SEV guests the C-bit is dropped before the GPA
    hits the NPT in hardware. Clearing the bit for non-SEV guests causes KVM
    to mishandle #NPFs with that collide with the host's C-bit.

    Although the APM doesn't explicitly state that the C-bit is not reserved
    for non-SEV, Tom Lendacky confirmed that the following snippet about the
    effective reduction due to the C-bit does indeed apply only to SEV guests.

    Note that because guest physical addresses are always translated
    through the nested page tables, the size of the guest physical address
    space is not impacted by any physical address space reduction indicated
    in CPUID 8000_001F[EBX]. If the C-bit is a physical address bit however,
    the guest physical address space is effectively reduced by 1 bit.

    And for SEV guests, the APM clearly states that the bit is dropped before
    walking the nested page tables.

    If the C-bit is an address bit, this bit is masked from the guest
    physical address when it is translated through the nested page tables.
    Consequently, the hypervisor does not need to be aware of which pages
    the guest has chosen to mark private.

    Note, the bogus C-bit clearing was removed from legacy #PF handler in
    commit 6d1b867d0456 ("KVM: SVM: Don't strip the C-bit from CR2 on #PF
    interception").

    Fixes: 0ede79e13224 ("KVM: SVM: Clear C-bit from the page fault address")
    Cc: Peter Gonda <pgonda@google.com>
    Cc: Brijesh Singh <brijesh.singh@amd.com>
    Cc: Tom Lendacky <thomas.lendacky@amd.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Message-Id: <20210625020354.431829-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 | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/arch/x86/kvm/svm/svm.c
    +++ b/arch/x86/kvm/svm/svm.c
    @@ -1897,7 +1897,7 @@ static int npf_interception(struct kvm_v
    {
    struct vcpu_svm *svm = to_svm(vcpu);

    - u64 fault_address = __sme_clr(svm->vmcb->control.exit_info_2);
    + u64 fault_address = svm->vmcb->control.exit_info_2;
    u64 error_code = svm->vmcb->control.exit_info_1;

    trace_kvm_page_fault(fault_address, error_code);

    \
     
     \ /
      Last update: 2021-07-19 19:41    [W:4.059 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site