Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:15-SP6
xen.8389
5b3cab8f-4-VMX-pass-MSR-value-into-vmx_msr_add....
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5b3cab8f-4-VMX-pass-MSR-value-into-vmx_msr_add.patch of Package xen.8389
# Commit ee7689b94ac7094b975ab4a023cfeae209da0a36 # Date 2018-07-04 12:12:15 +0100 # Author Andrew Cooper <andrew.cooper3@citrix.com> # Committer Andrew Cooper <andrew.cooper3@citrix.com> x86/vmx: Pass an MSR value into vmx_msr_add() The main purpose of this change is to allow us to set a specific MSR value, without needing to know whether there is already a load/save list slot for it. Previously, callers wanting this property needed to call both vmx_add_*_msr() and vmx_write_*_msr() to cover both cases, and there are no callers which want the old behaviour of being a no-op if an entry already existed for the MSR. As a result of this API improvement, the default value for guest MSRs need not be 0, and the default for host MSRs need not be passed via hardware register. In practice, this cleans up the VPMU allocation logic, and avoids an MSR read as part of vcpu construction. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> --- a/xen/arch/x86/cpu/vpmu_intel.c +++ b/xen/arch/x86/cpu/vpmu_intel.c @@ -454,13 +454,11 @@ static int core2_vpmu_alloc_resource(str if ( is_hvm_vcpu(v) ) { - wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0); - if ( vmx_add_host_load_msr(v, MSR_CORE_PERF_GLOBAL_CTRL) ) + if ( vmx_add_host_load_msr(v, MSR_CORE_PERF_GLOBAL_CTRL, 0) ) goto out_err; - if ( vmx_add_guest_msr(v, MSR_CORE_PERF_GLOBAL_CTRL) ) + if ( vmx_add_guest_msr(v, MSR_CORE_PERF_GLOBAL_CTRL, 0) ) goto out_err; - vmx_write_guest_msr(v, MSR_CORE_PERF_GLOBAL_CTRL, 0); } core2_vpmu_cxt = xzalloc_bytes(sizeof(*core2_vpmu_cxt) + --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -1342,7 +1342,8 @@ struct vmx_msr_entry *vmx_find_msr(const return ((ent < end) && (ent->index == msr)) ? ent : NULL; } -int vmx_add_msr(struct vcpu *v, uint32_t msr, enum vmx_msr_list_type type) +int vmx_add_msr(struct vcpu *v, uint32_t msr, uint64_t val, + enum vmx_msr_list_type type) { struct arch_vmx_struct *vmx = &v->arch.hvm_vmx; struct vmx_msr_entry **ptr, *start = NULL, *ent, *end; @@ -1401,11 +1402,9 @@ int vmx_add_msr(struct vcpu *v, uint32_t ent = locate_msr_entry(start, end, msr); if ( (ent < end) && (ent->index == msr) ) - { - rc = 0; - goto out; - } + goto found; + /* If there isn't an existing entry for msr, insert room for one. */ if ( total == (PAGE_SIZE / sizeof(*ent)) ) { rc = -ENOSPC; @@ -1420,17 +1419,18 @@ int vmx_add_msr(struct vcpu *v, uint32_t switch ( type ) { case VMX_MSR_HOST: - rdmsrl(msr, ent->data); __vmwrite(VM_EXIT_MSR_LOAD_COUNT, ++vmx->host_msr_count); break; case VMX_MSR_GUEST: - ent->data = 0; __vmwrite(VM_EXIT_MSR_STORE_COUNT, ++vmx->msr_count); __vmwrite(VM_ENTRY_MSR_LOAD_COUNT, vmx->msr_count); break; } + /* Set the msr's value. */ + found: + ent->data = val; rc = 0; out: --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -3164,7 +3164,7 @@ static int vmx_msr_write_intercept(unsig for ( i = 0; i < lbr->count; i++ ) { - int rc = vmx_add_guest_msr(v, lbr->base + i); + int rc = vmx_add_guest_msr(v, lbr->base + i, 0); if ( unlikely(rc) ) { --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -541,16 +541,24 @@ enum vmx_msr_list_type { VMX_MSR_GUEST, /* MSRs saved on VMExit, loaded on VMEntry. */ }; -int vmx_add_msr(struct vcpu *v, uint32_t msr, enum vmx_msr_list_type type); +/** + * Add an MSR to an MSR list (inserting space for the entry if necessary), and + * set the MSRs value. + * + * May fail if unable to allocate memory for the list, or the total number of + * entries exceeds the memory allocated. + */ +int vmx_add_msr(struct vcpu *v, uint32_t msr, uint64_t val, + enum vmx_msr_list_type type); -static inline int vmx_add_guest_msr(struct vcpu *v, uint32_t msr) +static inline int vmx_add_guest_msr(struct vcpu *v, uint32_t msr, uint64_t val) { - return vmx_add_msr(v, msr, VMX_MSR_GUEST); + return vmx_add_msr(v, msr, val, VMX_MSR_GUEST); } - -static inline int vmx_add_host_load_msr(struct vcpu *v, uint32_t msr) +static inline int vmx_add_host_load_msr(struct vcpu *v, uint32_t msr, + uint64_t val) { - return vmx_add_msr(v, msr, VMX_MSR_HOST); + return vmx_add_msr(v, msr, val, VMX_MSR_HOST); } struct vmx_msr_entry *vmx_find_msr(const struct vcpu *v, uint32_t msr,
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor