From: Boris Ostrovsky <boris.ostrovsky@oracle.com>
To: JBeulich@suse.com, kevin.tian@intel.com,
dietmar.hahn@ts.fujitsu.com, suravee.suthikulpanit@amd.com
Cc: tim@xen.org, boris.ostrovsky@oracle.com, keir@xen.org,
jun.nakajima@intel.com, xen-devel@lists.xen.org
Subject: [PATCH v7 06/19] vmx: Merge MSR management routines
Date: Fri, 6 Jun 2014 13:40:02 -0400 [thread overview]
Message-ID: <1402076415-26475-7-git-send-email-boris.ostrovsky@oracle.com> (raw)
In-Reply-To: <1402076415-26475-1-git-send-email-boris.ostrovsky@oracle.com>
vmx_add_host_load_msr()/vmx_rm_guest_msr() and vmx_add_guest_msr()/vmx_rm_guest_msr()
share fair amount of code. Merge them to simplify code maintenance.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Acked-by: Kevin Tian <kevin.tian@intel.com>
---
xen/arch/x86/hvm/vmx/vmcs.c | 156 +++++++++++++++++--------------------
xen/arch/x86/hvm/vmx/vmx.c | 4 +-
xen/arch/x86/hvm/vmx/vpmu_core2.c | 8 +-
xen/include/asm-x86/hvm/vmx/vmcs.h | 10 ++-
4 files changed, 85 insertions(+), 93 deletions(-)
diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
index 50259d3..436e8f4 100644
--- a/xen/arch/x86/hvm/vmx/vmcs.c
+++ b/xen/arch/x86/hvm/vmx/vmcs.c
@@ -1176,117 +1176,107 @@ int vmx_write_guest_msr(u32 msr, u64 val)
return -ESRCH;
}
-int vmx_add_guest_msr(u32 msr)
+int vmx_add_msr(u32 msr, u8 type)
{
struct vcpu *curr = current;
- unsigned int i, msr_count = curr->arch.hvm_vmx.msr_count;
- struct vmx_msr_entry *msr_area = curr->arch.hvm_vmx.msr_area;
+ unsigned int idx, *msr_count;
+ struct vmx_msr_entry **msr_area;
- if ( msr_area == NULL )
+ ASSERT( (type == VMX_GUEST_MSR) || (type == VMX_HOST_MSR) );
+
+ if ( type == VMX_GUEST_MSR )
{
- if ( (msr_area = alloc_xenheap_page()) == NULL )
- return -ENOMEM;
- curr->arch.hvm_vmx.msr_area = msr_area;
- __vmwrite(VM_EXIT_MSR_STORE_ADDR, virt_to_maddr(msr_area));
- __vmwrite(VM_ENTRY_MSR_LOAD_ADDR, virt_to_maddr(msr_area));
+ msr_count = &curr->arch.hvm_vmx.msr_count;
+ msr_area = &curr->arch.hvm_vmx.msr_area;
+ }
+ else
+ {
+ msr_count = &curr->arch.hvm_vmx.host_msr_count;
+ msr_area = &curr->arch.hvm_vmx.host_msr_area;
}
- for ( i = 0; i < msr_count; i++ )
- if ( msr_area[i].index == msr )
- return 0;
-
- if ( msr_count == (PAGE_SIZE / sizeof(struct vmx_msr_entry)) )
- return -ENOSPC;
-
- msr_area[msr_count].index = msr;
- msr_area[msr_count].mbz = 0;
- msr_area[msr_count].data = 0;
- curr->arch.hvm_vmx.msr_count = ++msr_count;
- __vmwrite(VM_EXIT_MSR_STORE_COUNT, msr_count);
- __vmwrite(VM_ENTRY_MSR_LOAD_COUNT, msr_count);
-
- return 0;
-}
-
-void vmx_rm_guest_msr(u32 msr)
-{
- struct vcpu *curr = current;
- unsigned int idx, msr_count = curr->arch.hvm_vmx.msr_count;
- struct vmx_msr_entry *msr_area = curr->arch.hvm_vmx.msr_area;
-
- if ( msr_area == NULL )
- return;
-
- for ( idx = 0; idx < msr_count; idx++ )
- if ( msr_area[idx].index == msr )
- break;
-
- if ( idx == msr_count )
- return;
-
- --msr_count;
- memmove(&msr_area[idx], &msr_area[idx + 1],
- sizeof(struct vmx_msr_entry) * (msr_count - idx));
- msr_area[msr_count].index = 0;
-
- curr->arch.hvm_vmx.msr_count = msr_count;
- __vmwrite(VM_EXIT_MSR_STORE_COUNT, msr_count);
- __vmwrite(VM_ENTRY_MSR_LOAD_COUNT, msr_count);
-}
-
-int vmx_add_host_load_msr(u32 msr)
-{
- struct vcpu *curr = current;
- unsigned int i, msr_count = curr->arch.hvm_vmx.host_msr_count;
- struct vmx_msr_entry *msr_area = curr->arch.hvm_vmx.host_msr_area;
-
- if ( msr_area == NULL )
+ if ( *msr_area == NULL )
{
- if ( (msr_area = alloc_xenheap_page()) == NULL )
+ if ( (*msr_area = alloc_xenheap_page()) == NULL )
return -ENOMEM;
- curr->arch.hvm_vmx.host_msr_area = msr_area;
- __vmwrite(VM_EXIT_MSR_LOAD_ADDR, virt_to_maddr(msr_area));
+
+ if ( type == VMX_GUEST_MSR )
+ {
+ __vmwrite(VM_EXIT_MSR_STORE_ADDR, virt_to_maddr(*msr_area));
+ __vmwrite(VM_ENTRY_MSR_LOAD_ADDR, virt_to_maddr(*msr_area));
+ }
+ else
+ __vmwrite(VM_EXIT_MSR_LOAD_ADDR, virt_to_maddr(*msr_area));
}
- for ( i = 0; i < msr_count; i++ )
- if ( msr_area[i].index == msr )
+ for ( idx = 0; idx < *msr_count; idx++ )
+ if ( (*msr_area)[idx].index == msr )
return 0;
- if ( msr_count == (PAGE_SIZE / sizeof(struct vmx_msr_entry)) )
+ if ( *msr_count == (PAGE_SIZE / sizeof(struct vmx_msr_entry)) )
return -ENOSPC;
- msr_area[msr_count].index = msr;
- msr_area[msr_count].mbz = 0;
- rdmsrl(msr, msr_area[msr_count].data);
- curr->arch.hvm_vmx.host_msr_count = ++msr_count;
- __vmwrite(VM_EXIT_MSR_LOAD_COUNT, msr_count);
+ (*msr_area)[*msr_count].index = msr;
+ (*msr_area)[*msr_count].mbz = 0;
+ (*msr_count)++;
+ if ( type == VMX_GUEST_MSR )
+ {
+ (*msr_area)[*msr_count - 1].data = 0;
+ __vmwrite(VM_EXIT_MSR_STORE_COUNT, *msr_count);
+ __vmwrite(VM_ENTRY_MSR_LOAD_COUNT, *msr_count);
+ }
+ else
+ {
+ rdmsrl(msr, (*msr_area)[*msr_count - 1].data);
+ __vmwrite(VM_EXIT_MSR_LOAD_COUNT, *msr_count);
+ }
return 0;
}
-void vmx_rm_host_load_msr(u32 msr)
+void vmx_rm_msr(u32 msr, u8 type)
{
struct vcpu *curr = current;
- unsigned int idx, msr_count = curr->arch.hvm_vmx.host_msr_count;
- struct vmx_msr_entry *msr_area = curr->arch.hvm_vmx.host_msr_area;
+ unsigned int idx, *msr_count;
+ struct vmx_msr_entry **msr_area;
- if ( msr_area == NULL )
+ ASSERT( (type == VMX_GUEST_MSR) || (type == VMX_HOST_MSR) );
+
+ if ( type == VMX_GUEST_MSR )
+ {
+ msr_count = &curr->arch.hvm_vmx.msr_count;
+ msr_area = &curr->arch.hvm_vmx.msr_area;
+ }
+ else
+ {
+ msr_count = &curr->arch.hvm_vmx.host_msr_count;
+ msr_area = &curr->arch.hvm_vmx.host_msr_area;
+ }
+
+ if ( *msr_area == NULL )
return;
- for ( idx = 0; idx < msr_count; idx++ )
- if ( msr_area[idx].index == msr )
+ for ( idx = 0; idx < *msr_count; idx++ )
+ if ( (*msr_area)[idx].index == msr )
break;
- if ( idx == msr_count )
+ if ( idx == *msr_count )
return;
- --msr_count;
- memmove(&msr_area[idx], &msr_area[idx + 1],
- sizeof(struct vmx_msr_entry) * (msr_count - idx));
- msr_area[msr_count].index = 0;
+ --(*msr_count);
+ memmove(&(*msr_area)[idx], &(*msr_area)[idx + 1],
+ sizeof(struct vmx_msr_entry) * (*msr_count - idx));
+ msr_area[(*msr_count)]->index = 0;
- curr->arch.hvm_vmx.host_msr_count = msr_count;
- __vmwrite(VM_EXIT_MSR_LOAD_COUNT, msr_count);
+ if ( type == VMX_GUEST_MSR )
+ {
+ __vmwrite(VM_EXIT_MSR_STORE_COUNT, *msr_count);
+ __vmwrite(VM_ENTRY_MSR_LOAD_COUNT, *msr_count);
+ }
+ else
+ {
+ __vmwrite(VM_EXIT_MSR_LOAD_COUNT, *msr_count);
+ }
}
void vmx_set_eoi_exit_bitmap(struct vcpu *v, u8 vector)
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index d45fb7f..6f55c9e 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -2254,12 +2254,12 @@ static int vmx_msr_write_intercept(unsigned int msr, uint64_t msr_content)
for ( ; (rc == 0) && lbr->count; lbr++ )
for ( i = 0; (rc == 0) && (i < lbr->count); i++ )
- if ( (rc = vmx_add_guest_msr(lbr->base + i)) == 0 )
+ if ( (rc = vmx_add_msr(lbr->base + i, VMX_GUEST_MSR)) == 0 )
vmx_disable_intercept_for_msr(v, lbr->base + i, MSR_TYPE_R | MSR_TYPE_W);
}
if ( (rc < 0) ||
- (vmx_add_host_load_msr(msr) < 0) )
+ (vmx_add_msr(msr, VMX_HOST_MSR) < 0) )
hvm_inject_hw_exception(TRAP_machine_check, 0);
else
{
diff --git a/xen/arch/x86/hvm/vmx/vpmu_core2.c b/xen/arch/x86/hvm/vmx/vpmu_core2.c
index 6df9f56..7c49f8a 100644
--- a/xen/arch/x86/hvm/vmx/vpmu_core2.c
+++ b/xen/arch/x86/hvm/vmx/vpmu_core2.c
@@ -370,10 +370,10 @@ static int core2_vpmu_alloc_resource(struct vcpu *v)
return 0;
wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0);
- if ( vmx_add_host_load_msr(MSR_CORE_PERF_GLOBAL_CTRL) )
+ if ( vmx_add_msr(MSR_CORE_PERF_GLOBAL_CTRL, VMX_HOST_MSR) )
goto out_err;
- if ( vmx_add_guest_msr(MSR_CORE_PERF_GLOBAL_CTRL) )
+ if ( vmx_add_msr(MSR_CORE_PERF_GLOBAL_CTRL, VMX_GUEST_MSR) )
goto out_err;
vmx_write_guest_msr(MSR_CORE_PERF_GLOBAL_CTRL,
core2_calc_intial_glb_ctrl_msr());
@@ -390,8 +390,8 @@ static int core2_vpmu_alloc_resource(struct vcpu *v)
return 1;
out_err:
- vmx_rm_host_load_msr(MSR_CORE_PERF_GLOBAL_CTRL);
- vmx_rm_guest_msr(MSR_CORE_PERF_GLOBAL_CTRL);
+ vmx_rm_msr(MSR_CORE_PERF_GLOBAL_CTRL, VMX_HOST_MSR);
+ vmx_rm_msr(MSR_CORE_PERF_GLOBAL_CTRL, VMX_GUEST_MSR);
release_pmu_ownship(PMU_OWNER_HVM);
printk("Failed to allocate VPMU resources for domain %u vcpu %u\n",
diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h
index 50befe1..dd34b2c 100644
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h
@@ -475,14 +475,16 @@ enum vmcs_field {
#define MSR_TYPE_R 1
#define MSR_TYPE_W 2
+
+#define VMX_GUEST_MSR 0
+#define VMX_HOST_MSR 1
+
void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr, int type);
void vmx_enable_intercept_for_msr(struct vcpu *v, u32 msr, int type);
int vmx_read_guest_msr(u32 msr, u64 *val);
int vmx_write_guest_msr(u32 msr, u64 val);
-int vmx_add_guest_msr(u32 msr);
-void vmx_rm_guest_msr(u32 msr);
-int vmx_add_host_load_msr(u32 msr);
-void vmx_rm_host_load_msr(u32 msr);
+int vmx_add_msr(u32 msr, u8 type);
+void vmx_rm_msr(u32 msr, u8 type);
void vmx_vmcs_switch(struct vmcs_struct *from, struct vmcs_struct *to);
void vmx_set_eoi_exit_bitmap(struct vcpu *v, u8 vector);
void vmx_clear_eoi_exit_bitmap(struct vcpu *v, u8 vector);
--
1.8.1.4
next prev parent reply other threads:[~2014-06-06 17:40 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-06 17:39 [PATCH v7 00/19] x86/PMU: Xen PMU PV(H) support Boris Ostrovsky
2014-06-06 17:39 ` [PATCH v7 01/19] common/symbols: Export hypervisor symbols to privileged guest Boris Ostrovsky
2014-06-06 17:57 ` Andrew Cooper
2014-06-06 19:05 ` Boris Ostrovsky
2014-06-06 19:13 ` Andrew Cooper
2014-06-10 11:31 ` Jan Beulich
2014-06-06 17:39 ` [PATCH v7 02/19] VPMU: Mark context LOADED before registers are loaded Boris Ostrovsky
2014-06-06 17:59 ` Andrew Cooper
2014-06-10 15:29 ` Jan Beulich
2014-06-10 15:40 ` Boris Ostrovsky
2014-06-06 17:39 ` [PATCH v7 03/19] x86/VPMU: Set MSR bitmaps only for HVM/PVH guests Boris Ostrovsky
2014-06-06 18:02 ` Andrew Cooper
2014-06-06 19:07 ` Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 04/19] x86/VPMU: Make vpmu marcos a bit more efficient Boris Ostrovsky
2014-06-06 18:13 ` Andrew Cooper
2014-06-06 19:28 ` Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 05/19] intel/VPMU: Clean up Intel VPMU code Boris Ostrovsky
2014-06-06 18:34 ` Andrew Cooper
2014-06-06 19:43 ` Boris Ostrovsky
2014-06-10 8:19 ` Jan Beulich
2014-06-06 17:40 ` Boris Ostrovsky [this message]
2014-06-11 9:55 ` [PATCH v7 06/19] vmx: Merge MSR management routines Jan Beulich
2014-06-06 17:40 ` [PATCH v7 07/19] x86/VPMU: Handle APIC_LVTPC accesses Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 08/19] intel/VPMU: MSR_CORE_PERF_GLOBAL_CTRL should be initialized to zero Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 09/19] x86/VPMU: Add public xenpmu.h Boris Ostrovsky
2014-06-06 19:32 ` Andrew Cooper
2014-06-11 10:03 ` Jan Beulich
2014-06-11 12:32 ` Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 10/19] x86/VPMU: Make vpmu not HVM-specific Boris Ostrovsky
2014-06-11 10:07 ` Jan Beulich
2014-06-11 13:57 ` Is: Reviewed-by, Acked-by rules. Was:Re: " Konrad Rzeszutek Wilk
2014-06-11 20:25 ` Jan Beulich
2014-06-12 11:10 ` George Dunlap
2014-06-12 16:21 ` Jan Beulich
2014-06-06 17:40 ` [PATCH v7 11/19] x86/VPMU: Interface for setting PMU mode and flags Boris Ostrovsky
2014-06-06 19:58 ` Andrew Cooper
2014-06-06 20:42 ` Boris Ostrovsky
2014-06-11 10:14 ` Jan Beulich
2014-06-17 15:01 ` Boris Ostrovsky
2014-06-17 15:14 ` Jan Beulich
2014-06-06 17:40 ` [PATCH v7 12/19] x86/VPMU: Initialize PMU for PV guests Boris Ostrovsky
2014-06-06 20:13 ` Andrew Cooper
2014-06-06 20:49 ` Boris Ostrovsky
2014-06-11 10:20 ` Jan Beulich
2014-06-11 12:49 ` Boris Ostrovsky
2014-06-11 12:53 ` Jan Beulich
2014-06-06 17:40 ` [PATCH v7 13/19] x86/VPMU: Add support for PMU register handling on " Boris Ostrovsky
2014-06-06 20:26 ` Andrew Cooper
2014-06-06 20:53 ` Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 14/19] x86/VPMU: Handle PMU interrupts for " Boris Ostrovsky
2014-06-06 20:40 ` Andrew Cooper
2014-06-06 21:21 ` Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 15/19] x86/VPMU: Merge vpmu_rdmsr and vpmu_wrmsr Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 16/19] x86/VPMU: Add privileged PMU mode Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 17/19] x86/VPMU: Save VPMU state for PV guests during context switch Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 18/19] x86/VPMU: NMI-based VPMU support Boris Ostrovsky
2014-06-06 17:40 ` [PATCH v7 19/19] x86/VPMU: Move VPMU files up from hvm/ directory Boris Ostrovsky
2014-06-06 21:05 ` Andrew Cooper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1402076415-26475-7-git-send-email-boris.ostrovsky@oracle.com \
--to=boris.ostrovsky@oracle.com \
--cc=JBeulich@suse.com \
--cc=dietmar.hahn@ts.fujitsu.com \
--cc=jun.nakajima@intel.com \
--cc=keir@xen.org \
--cc=kevin.tian@intel.com \
--cc=suravee.suthikulpanit@amd.com \
--cc=tim@xen.org \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).