KVM: x86/mmu: WARN on any reserved SPTE value when making a valid SPTE
authorSean Christopherson <seanjc@google.com>
Tue, 22 Jun 2021 17:57:33 +0000 (10:57 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 24 Jun 2021 22:00:46 +0000 (18:00 -0400)
Replace make_spte()'s WARN on a collision with the magic MMIO value with
a generic WARN on reserved bits being set (including EPT's reserved WX
combination).  Warning on any reserved bits covers MMIO, A/D tracking
bits with PAE paging, and in theory any future goofs that are introduced.

Opportunistically convert to ONCE behavior to avoid spamming the kernel
log, odds are very good that if KVM screws up one SPTE, it will botch all
SPTEs for the same MMU.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20210622175739.3610207-49-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/mmu/spte.c

index 246e61e0771e42f97c0242ae3b6aa7bc5f417bc8..3e97cdb13eb7e3c63d32c8a657ec6d2f258ef279 100644 (file)
@@ -175,7 +175,10 @@ int make_spte(struct kvm_vcpu *vcpu, unsigned int pte_access, int level,
                spte = mark_spte_for_access_track(spte);
 
 out:
-       WARN_ON(is_mmio_spte(spte));
+       WARN_ONCE(is_rsvd_spte(&vcpu->arch.mmu->shadow_zero_check, spte, level),
+                 "spte = 0x%llx, level = %d, rsvd bits = 0x%llx", spte, level,
+                 get_rsvd_bits(&vcpu->arch.mmu->shadow_zero_check, spte, level));
+
        *new_spte = spte;
        return ret;
 }