On Thu, Oct 01, 2020 at 01:34:53AM +0200, Paolo Bonzini wrote: > On 01/10/20 01:20, Eric van Tassell wrote: > >> > >> +int is_shadow_present_pte(u64 pte) > >> { > >> return (pte != 0) && !is_mmio_spte(pte); > > From <Figure 28-1: Formats of EPTP and EPT Paging-Structure Entries" of > > the manual I don't have at my fingertips right now, I believe you should > > only check the low 3 bits(mask = 0x7). Since the upper bits are ignored, > > might that not mean they're not guaranteed to be 0? > > No, this a property of the KVM MMU (and how it builds its PTEs) rather > than the hardware present check. Ya, I found out the hard way that "present" in is_shadow_present_pte() really means "valid", or "may be present". The most notable case is EPT without A/D bits (I think this is the only case where a valid SPTE can be fully not-present in hardware). Accessed tracking will clear all RWX bits to make the EPT entry not-present, but from KVM's perspective it's treated as valid/present because it can be made present in hardware without taking the MMU lock.