Message ID | 20210225204749.1512652-22-seanjc@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: x86/mmu: Introduce MMU_PRESENT and fix bugs | expand |
On Thu, 25 Feb 2021 12:47:46 -0800 Sean Christopherson <seanjc@google.com> wrote: > Tweak the MMU_WARN that guards against weirdness when querying A/D > status to fire on a !MMU_PRESENT SPTE, as opposed to a MMIO SPTE. > Attempting to query A/D status on any kind of !MMU_PRESENT SPTE, MMIO > or otherwise, indicates a KVM bug. Case in point, several now-fixed > bugs were identified by enabling this new WARN. > > Signed-off-by: Sean Christopherson <seanjc@google.com> You made the 1.000.000th commit, congrats! $ git log --oneline --reverse |sed '1000000!d' 8f366ae6d8c5 KVM: x86/mmu: Tweak auditing WARN for A/D bits to !PRESENT (was MMIO) Cheers,
On 07/05/21 01:05, Matteo Croce wrote: > On Thu, 25 Feb 2021 12:47:46 -0800 > Sean Christopherson <seanjc@google.com> wrote: > >> Tweak the MMU_WARN that guards against weirdness when querying A/D >> status to fire on a !MMU_PRESENT SPTE, as opposed to a MMIO SPTE. >> Attempting to query A/D status on any kind of !MMU_PRESENT SPTE, MMIO >> or otherwise, indicates a KVM bug. Case in point, several now-fixed >> bugs were identified by enabling this new WARN. >> >> Signed-off-by: Sean Christopherson <seanjc@google.com> > > You made the 1.000.000th commit, congrats! > > $ git log --oneline --reverse |sed '1000000!d' > 8f366ae6d8c5 KVM: x86/mmu: Tweak auditing WARN for A/D bits to !PRESENT (was MMIO)
diff --git a/arch/x86/kvm/mmu/spte.h b/arch/x86/kvm/mmu/spte.h index 645e9bc2d4a2..2fad4ccd3679 100644 --- a/arch/x86/kvm/mmu/spte.h +++ b/arch/x86/kvm/mmu/spte.h @@ -209,6 +209,11 @@ static inline bool is_mmio_spte(u64 spte) likely(shadow_mmio_value); } +static inline bool is_shadow_present_pte(u64 pte) +{ + return !!(pte & SPTE_MMU_PRESENT_MASK); +} + static inline bool sp_ad_disabled(struct kvm_mmu_page *sp) { return sp->role.ad_disabled; @@ -216,13 +221,13 @@ static inline bool sp_ad_disabled(struct kvm_mmu_page *sp) static inline bool spte_ad_enabled(u64 spte) { - MMU_WARN_ON(is_mmio_spte(spte)); + MMU_WARN_ON(!is_shadow_present_pte(spte)); return (spte & SPTE_TDP_AD_MASK) != SPTE_TDP_AD_DISABLED_MASK; } static inline bool spte_ad_need_write_protect(u64 spte) { - MMU_WARN_ON(is_mmio_spte(spte)); + MMU_WARN_ON(!is_shadow_present_pte(spte)); /* * This is benign for non-TDP SPTEs as SPTE_TDP_AD_ENABLED_MASK is '0', * and non-TDP SPTEs will never set these bits. Optimize for 64-bit @@ -233,13 +238,13 @@ static inline bool spte_ad_need_write_protect(u64 spte) static inline u64 spte_shadow_accessed_mask(u64 spte) { - MMU_WARN_ON(is_mmio_spte(spte)); + MMU_WARN_ON(!is_shadow_present_pte(spte)); return spte_ad_enabled(spte) ? shadow_accessed_mask : 0; } static inline u64 spte_shadow_dirty_mask(u64 spte) { - MMU_WARN_ON(is_mmio_spte(spte)); + MMU_WARN_ON(!is_shadow_present_pte(spte)); return spte_ad_enabled(spte) ? shadow_dirty_mask : 0; } @@ -248,11 +253,6 @@ static inline bool is_access_track_spte(u64 spte) return !spte_ad_enabled(spte) && (spte & shadow_acc_track_mask) == 0; } -static inline bool is_shadow_present_pte(u64 pte) -{ - return !!(pte & SPTE_MMU_PRESENT_MASK); -} - static inline bool is_large_pte(u64 pte) { return pte & PT_PAGE_SIZE_MASK;
Tweak the MMU_WARN that guards against weirdness when querying A/D status to fire on a !MMU_PRESENT SPTE, as opposed to a MMIO SPTE. Attempting to query A/D status on any kind of !MMU_PRESENT SPTE, MMIO or otherwise, indicates a KVM bug. Case in point, several now-fixed bugs were identified by enabling this new WARN. Signed-off-by: Sean Christopherson <seanjc@google.com> --- arch/x86/kvm/mmu/spte.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)