[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v1 2/5] x86/msr: introduce struct msr_vcpu_policy
The new structure contains information about guest's MSRs that are unique to each vCPU. It starts with only 1 MSR: MSR_INTEL_MISC_FEATURES_ENABLES Which currently has only 1 usable bit: cpuid_faulting. Add 2 global policy objects: hvm_max and pv_max that are inited during boot up. Availability of MSR_INTEL_MISC_FEATURES_ENABLES depends on availability of MSR_INTEL_PLATFORM_INFO. Add init_vcpu_msr_policy() which sets initial MSR policy for every vCPU during domain creation with a special case for Dom0. Signed-off-by: Sergey Dyasli <sergey.dyasli@xxxxxxxxxx> --- xen/arch/x86/domain.c | 18 ++++++++++++++++-- xen/arch/x86/msr.c | 33 +++++++++++++++++++++++++++++++++ xen/include/asm-x86/domain.h | 2 ++ xen/include/asm-x86/msr.h | 11 +++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 620666b33a..1667d2ad57 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -344,13 +344,27 @@ int vcpu_initialise(struct vcpu *v) /* Idle domain */ v->arch.cr3 = __pa(idle_pg_table); rc = 0; + v->arch.msr = ZERO_BLOCK_PTR; /* Catch stray misuses */ } if ( rc ) - vcpu_destroy_fpu(v); - else if ( !is_idle_domain(v->domain) ) + goto fail; + + if ( !is_idle_domain(v->domain) ) + { vpmu_initialise(v); + if ( (rc = init_vcpu_msr_policy(v)) ) + goto fail; + } + + return rc; + + fail: + vcpu_destroy_fpu(v); + xfree(v->arch.msr); + v->arch.msr = NULL; + return rc; } diff --git a/xen/arch/x86/msr.c b/xen/arch/x86/msr.c index eac50ec897..b5ad97d3c8 100644 --- a/xen/arch/x86/msr.c +++ b/xen/arch/x86/msr.c @@ -27,9 +27,13 @@ struct msr_domain_policy __read_mostly hvm_max_msr_domain_policy, __read_mostly pv_max_msr_domain_policy; +struct msr_vcpu_policy __read_mostly hvm_max_msr_vcpu_policy, + __read_mostly pv_max_msr_vcpu_policy; + static void __init calculate_hvm_max_policy(void) { struct msr_domain_policy *dp = &hvm_max_msr_domain_policy; + struct msr_vcpu_policy *vp = &hvm_max_msr_vcpu_policy; if ( !hvm_enabled ) return; @@ -40,11 +44,15 @@ static void __init calculate_hvm_max_policy(void) dp->plaform_info.available = true; dp->plaform_info.cpuid_faulting = true; } + + /* 0x00000140 MSR_INTEL_MISC_FEATURES_ENABLES */ + vp->misc_features_enables.available = dp->plaform_info.available; } static void __init calculate_pv_max_policy(void) { struct msr_domain_policy *dp = &pv_max_msr_domain_policy; + struct msr_vcpu_policy *vp = &pv_max_msr_vcpu_policy; /* 0x000000ce MSR_INTEL_PLATFORM_INFO */ if ( cpu_has_cpuid_faulting ) @@ -52,6 +60,9 @@ static void __init calculate_pv_max_policy(void) dp->plaform_info.available = true; dp->plaform_info.cpuid_faulting = true; } + + /* 0x00000140 MSR_INTEL_MISC_FEATURES_ENABLES */ + vp->misc_features_enables.available = dp->plaform_info.available; } void __init init_guest_msr_policy(void) @@ -84,6 +95,28 @@ int init_domain_msr_policy(struct domain *d) return 0; } +int init_vcpu_msr_policy(struct vcpu *v) +{ + struct domain *d = v->domain; + struct msr_vcpu_policy *vp; + + vp = xmalloc(struct msr_vcpu_policy); + + if ( !vp ) + return -ENOMEM; + + *vp = is_pv_domain(d) ? pv_max_msr_vcpu_policy : + hvm_max_msr_vcpu_policy; + + /* See comment in intel_ctxt_switch_levelling() */ + if ( is_control_domain(d) ) + vp->misc_features_enables.available = false; + + v->arch.msr = vp; + + return 0; +} + /* * Local variables: * mode: C diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index f08ede3a05..866a03b508 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -575,6 +575,8 @@ struct arch_vcpu struct arch_vm_event *vm_event; + struct msr_vcpu_policy *msr; + struct { bool next_interrupt_enabled; } monitor; diff --git a/xen/include/asm-x86/msr.h b/xen/include/asm-x86/msr.h index 5cf7be1821..7c8395b9b3 100644 --- a/xen/include/asm-x86/msr.h +++ b/xen/include/asm-x86/msr.h @@ -212,8 +212,19 @@ struct msr_domain_policy } plaform_info; }; +/* MSR policy object for per-vCPU MSRs */ +struct msr_vcpu_policy +{ + /* 0x00000140 MSR_INTEL_MISC_FEATURES_ENABLES */ + struct { + bool available; /* This MSR is non-architectural */ + bool cpuid_faulting; + } misc_features_enables; +}; + void init_guest_msr_policy(void); int init_domain_msr_policy(struct domain *d); +int init_vcpu_msr_policy(struct vcpu *v); #endif /* !__ASSEMBLY__ */ -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |