Re: [RFC PATCH v6 76/92] kvm: x86: disable EPT A/D bits if introspection is present

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2019-08-13 at 23:05 +0200, Paolo Bonzini wrote:
> On 13/08/19 20:36, Mihai Donțu wrote:
> > > Why?
> > When EPT A/D is enabled, all guest page table walks are treated as
> > writes (like AMD's NPT). Thus, an introspection tool hooking the guest
> > page tables would trigger a flood of VMEXITs (EPT write violations)
> > that will get the introspected VM into an unusable state.
> > 
> > Our implementation of such an introspection tool builds a cache of
> > {cr3, gva} -> gpa, which is why it needs to monitor all guest PTs by
> > hooking them for write.
> 
> Please include the kvm list too.

I apologize. I did not notice I trimmed the CC list.

> One issue here is that it changes the nested VMX ABI.  Can you leave EPT
> A/D in place for the shadow EPT MMU, but not for "regular" EPT pages?

I'm not sure I follow. Something like this?

diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index 48e3cdd7b009..569e8f4d5dd7 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -2853,7 +2853,7 @@ u64 construct_eptp(struct kvm_vcpu *vcpu, unsigned long root_hpa)
        eptp |= (get_ept_level(vcpu) == 5) ? VMX_EPTP_PWL_5 : VMX_EPTP_PWL_4;
 
        if (enable_ept_ad_bits &&
-           (!is_guest_mode(vcpu) || nested_ept_ad_enabled(vcpu)))
+           ((!is_guest_mode(vcpu) && !kvmi_is_present()) || nested_ept_ad_enabled(vcpu)))
                eptp |= VMX_EPTP_AD_ENABLE_BIT;
        eptp |= (root_hpa & PAGE_MASK);

> Also, what is the state of introspection support on AMD?

The way we'd like to do introspection is not currently possible on AMD
CPUs. The reasons being:
 * the NPT has the behavior I talked above (guest PT walks translate to
   writes)
 * it is not possible to mark a guest page as execute-only
 * there is no equivalent to Intel's MTF, though it can _probably_ be
   emulated using a creative trick involving the debug registers

If, however, none of the above are of importance for other users,
everything else should work. I have to admit, though, we have not done
any tests.

Regards,

-- 
Mihai Donțu





[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux