On 21/06/2016 05:12, Bandan Das wrote: > > static int is_shadow_present_pte(u64 pte) > { > - return pte & PT_PRESENT_MASK && !is_mmio_spte(pte); > + int xbit = shadow_xonly_valid ? pte & shadow_x_mask : 0; > + > + return (pte & PT_PRESENT_MASK) | xbit > + && !is_mmio_spte(pte); > } You can change this to just: return (pte & (PT_PRESENT_MASK | shadow_x_mask)) && !is_mmio_spte(pte); because you know this is only called on a valid spte. Reserved bits are checked elsewhere (and shouldn't be there anyway!). > static int is_large_pte(u64 pte) > diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h > index bc019f7..9f5bd06 100644 > --- a/arch/x86/kvm/paging_tmpl.h > +++ b/arch/x86/kvm/paging_tmpl.h > @@ -133,7 +133,12 @@ static inline int FNAME(is_present_gpte)(unsigned long pte) > #if PTTYPE != PTTYPE_EPT > return is_present_gpte(pte); > #else > - return pte & 7; > + /* > + * For EPT, bits [2:0] can be 001, 100 or 111 > + * Further, for 100, logical processor should support > + * execute-only. > + */ > + return (pte & 1) || (shadow_xonly_valid && (pte & 4)); > #endif Likewise, is_present_gpte is always followed by an is_rsvd_bits_set check, which does check for execute-only. Modify reset_tdp_shadow_zero_bits_mask to pass the right execonly value to __reset_rsvds_bits_mask_ept, and you can leave is_present_gpte as is. Paolo -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html