[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC V4 3/5] xen: Force-enable relevant MSR events; optimize the number of sent MSR events
Vmx_disable_intercept_for_msr() will now refuse to disable interception of MSRs needed for memory introspection. It is not possible to gate this on mem_access being active for the domain, since by the time mem_access does become active the interception for the interesting MSRs has already been disabled (vmx_disable_intercept_for_msr() runs very early on). Changes since V1: - Replaced printk() with gdprintk(XENLOG_DEBUG, ...). Changes since V2: - Split a log line differently to keep it grepable. - Interception for relevant MSRs will be disabled only if mem_access is not enabled. - Since they end up being disabled early on (when mem_access is not enabled yet), re-enable interception when mem_access becomes active. Changes since V3: - Removed log line stating that MSR interception cannot be disabled. - Removed superfluous #include <asm/hvm/vmx/vmcs.h>. - Moved VMX-specific code to vmx.c (as a new hvm_funcs member). Signed-off-by: Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx> --- xen/arch/x86/hvm/vmx/vmcs.c | 20 ++++++++++++++++++++ xen/arch/x86/hvm/vmx/vmx.c | 17 +++++++++++++++++ xen/arch/x86/mm/mem_event.c | 3 +++ xen/include/asm-x86/hvm/hvm.h | 2 ++ 4 files changed, 42 insertions(+) diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index 8ffc562..2703c58 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -39,6 +39,7 @@ #include <xen/keyhandler.h> #include <asm/shadow.h> #include <asm/tboot.h> +#include <asm/mem_event.h> static bool_t __read_mostly opt_vpid_enabled = 1; boolean_param("vpid", opt_vpid_enabled); @@ -695,11 +696,30 @@ static void vmx_set_host_env(struct vcpu *v) void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr, int type) { unsigned long *msr_bitmap = v->arch.hvm_vmx.msr_bitmap; + struct domain *d = v->domain; /* VMX MSR bitmap supported? */ if ( msr_bitmap == NULL ) return; + if ( mem_event_check_ring(&d->mem_event->access) ) + { + /* Filter out MSR-s needed for memory introspection */ + switch ( msr ) + { + case MSR_IA32_SYSENTER_EIP: + case MSR_IA32_SYSENTER_ESP: + case MSR_IA32_SYSENTER_CS: + case MSR_IA32_MC0_CTL: + case MSR_STAR: + case MSR_LSTAR: + return; + + default: + break; + } + } + /* * See Intel PRM Vol. 3, 20.6.9 (MSR-Bitmap Address). Early manuals * have the write-low and read-high bitmap offsets the wrong way round. diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 2caa04a..dfb0c95 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -1682,6 +1682,22 @@ void vmx_hypervisor_cpuid_leaf(uint32_t sub_idx, *eax |= XEN_HVM_CPUID_X2APIC_VIRT; } +static void vmx_enable_intro_msr_interception(struct domain *d) +{ + struct vcpu *v; + + /* Enable interception for MSRs needed for memory introspection. */ + for_each_vcpu ( d, v ) + { + vmx_enable_intercept_for_msr(v, MSR_IA32_SYSENTER_EIP, MSR_TYPE_W); + vmx_enable_intercept_for_msr(v, MSR_IA32_SYSENTER_ESP, MSR_TYPE_W); + vmx_enable_intercept_for_msr(v, MSR_IA32_SYSENTER_CS, MSR_TYPE_W); + vmx_enable_intercept_for_msr(v, MSR_IA32_MC0_CTL, MSR_TYPE_W); + vmx_enable_intercept_for_msr(v, MSR_STAR, MSR_TYPE_W); + vmx_enable_intercept_for_msr(v, MSR_LSTAR, MSR_TYPE_W); + } +} + static struct hvm_function_table __initdata vmx_function_table = { .name = "VMX", .cpu_up_prepare = vmx_cpu_up_prepare, @@ -1740,6 +1756,7 @@ static struct hvm_function_table __initdata vmx_function_table = { .handle_eoi = vmx_handle_eoi, .nhvm_hap_walk_L1_p2m = nvmx_hap_walk_L1_p2m, .hypervisor_cpuid_leaf = vmx_hypervisor_cpuid_leaf, + .enable_intro_msr_interception = vmx_enable_intro_msr_interception, }; const struct hvm_function_table * __init start_vmx(void) diff --git a/xen/arch/x86/mm/mem_event.c b/xen/arch/x86/mm/mem_event.c index ba7e71e..d5959d9 100644 --- a/xen/arch/x86/mm/mem_event.c +++ b/xen/arch/x86/mm/mem_event.c @@ -600,6 +600,9 @@ int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec, rc = mem_event_enable(d, mec, med, _VPF_mem_access, HVM_PARAM_ACCESS_RING_PFN, mem_access_notification); + + if ( rc == 0 && hvm_funcs.enable_intro_msr_interception ) + hvm_funcs.enable_intro_msr_interception(d); } break; diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h index 0ebd478..2a87e9b 100644 --- a/xen/include/asm-x86/hvm/hvm.h +++ b/xen/include/asm-x86/hvm/hvm.h @@ -205,6 +205,8 @@ struct hvm_function_table { void (*hypervisor_cpuid_leaf)(uint32_t sub_idx, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx); + + void (*enable_intro_msr_interception)(struct domain *d); }; extern struct hvm_function_table hvm_funcs; -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |