• Sean Christopherson's avatar
    Revert "KVM: X86: Fix SMRAM accessing even if VM is shutdown" · 2c151b25
    Sean Christopherson authored
    The bug that led to commit 95e057e2
    was a benign warning (no adverse affects other than the warning
    itself) that was detected by syzkaller.  Further inspection shows
    that the WARN_ON in question, in handle_ept_misconfig(), is
    unnecessary and flawed (this was also briefly discussed in the
    original patch: https://patchwork.kernel.org/patch/10204649).
    
      * The WARN_ON is unnecessary as kvm_mmu_page_fault() will WARN
        if reserved bits are set in the SPTEs, i.e. it covers the case
        where an EPT misconfig occurred because of a KVM bug.
    
      * The WARN_ON is flawed because it will fire on any system error
        code that is hit while handling the fault, e.g. -ENOMEM can be
        returned by mmu_topup_memory_caches() while handling a legitmate
        MMIO EPT misconfig.
    
    The original behavior of returning -EFAULT when userspace munmaps
    an HVA without first removing the memslot is correct and desirable,
    i.e. KVM is letting userspace know it has generated a bad address.
    Returning RET_PF_EMULATE masks the WARN_ON in the EPT misconfig path,
    but does not fix the underlying bug, i.e. the WARN_ON is bogus.
    
    Furthermore, returning RET_PF_EMULATE has the unwanted side effect of
    causing KVM to attempt to emulate an instruction on any page fault
    with an invalid HVA translation, e.g. a not-present EPT violation
    on a VM_PFNMAP VMA whose fault handler failed to insert a PFN.
    
      * There is no guarantee that the fault is directly related to the
        instruction, i.e. the fault could have been triggered by a side
        effect memory access in the guest, e.g. while vectoring a #DB or
        writing a tracing record.  This could cause KVM to effectively
        mask the fault if KVM doesn't model the behavior leading to the
        fault, i.e. emulation could succeed and resume the guest.
    
      * If emulation does fail, KVM will return EMULATION_FAILED instead
        of -EFAULT, which is a red herring as the user will either debug
        a bogus emulation attempt or scratch their head wondering why we
        were attempting emulation in the first place.
    
    TL;DR: revert to returning -EFAULT and remove the bogus WARN_ON in
    handle_ept_misconfig in a future patch.
    
    This reverts commit 95e057e2.
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    2c151b25
mmu.c 142 KB