From: Haozhong Zhang <haozhong.zhang@intel.com>
To: xen-devel@lists.xen.org, Jan Beulich <jbeulich@suse.com>,
Boris Ostrovsky <boris.ostrovsky@oracle.com>,
Kevin Tian <kevin.tian@intel.com>
Cc: Haozhong Zhang <haozhong.zhang@intel.com>,
Keir Fraser <keir@xen.org>,
Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Aravind Gopalakrishnan <Aravind.Gopalakrishnan@amd.com>,
Jun Nakajima <jun.nakajima@intel.com>
Subject: [PATCH v3 12/13] vmx: Add VMX RDTSC(P) scaling support
Date: Thu, 31 Dec 2015 11:03:39 +0800 [thread overview]
Message-ID: <1451531020-29964-13-git-send-email-haozhong.zhang@intel.com> (raw)
In-Reply-To: <1451531020-29964-1-git-send-email-haozhong.zhang@intel.com>
This patch adds the initialization and setup code for VMX TSC scaling.
Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
Acked-by: Kevin Tian <kevin.tian@intel.com>
---
xen/arch/x86/hvm/vmx/vmcs.c | 12 +++++++++---
xen/arch/x86/hvm/vmx/vmx.c | 15 +++++++++++++++
xen/include/asm-x86/hvm/vmx/vmcs.h | 7 +++++++
3 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
index edd4c8d..8f16c3a 100644
--- a/xen/arch/x86/hvm/vmx/vmcs.c
+++ b/xen/arch/x86/hvm/vmx/vmcs.c
@@ -149,6 +149,7 @@ static void __init vmx_display_features(void)
P(cpu_has_vmx_vmfunc, "VM Functions");
P(cpu_has_vmx_virt_exceptions, "Virtualisation Exceptions");
P(cpu_has_vmx_pml, "Page Modification Logging");
+ P(cpu_has_vmx_tsc_scaling, "TSC Scaling");
#undef P
if ( !printed )
@@ -242,7 +243,8 @@ static int vmx_init_vmcs_config(void)
SECONDARY_EXEC_ENABLE_INVPCID |
SECONDARY_EXEC_ENABLE_VM_FUNCTIONS |
SECONDARY_EXEC_ENABLE_VIRT_EXCEPTIONS |
- SECONDARY_EXEC_XSAVES);
+ SECONDARY_EXEC_XSAVES |
+ SECONDARY_EXEC_TSC_SCALING);
rdmsrl(MSR_IA32_VMX_MISC, _vmx_misc_cap);
if ( _vmx_misc_cap & VMX_MISC_VMWRITE_ALL )
opt |= SECONDARY_EXEC_ENABLE_VMCS_SHADOWING;
@@ -999,7 +1001,7 @@ static int construct_vmcs(struct vcpu *v)
__vmwrite(PIN_BASED_VM_EXEC_CONTROL, vmx_pin_based_exec_control);
v->arch.hvm_vmx.exec_control = vmx_cpu_based_exec_control;
- if ( d->arch.vtsc )
+ if ( d->arch.vtsc && !cpu_has_vmx_tsc_scaling )
v->arch.hvm_vmx.exec_control |= CPU_BASED_RDTSC_EXITING;
v->arch.hvm_vmx.secondary_exec_control = vmx_secondary_exec_control;
@@ -1281,6 +1283,9 @@ static int construct_vmcs(struct vcpu *v)
if ( cpu_has_vmx_xsaves )
__vmwrite(XSS_EXIT_BITMAP, 0);
+ if ( cpu_has_vmx_tsc_scaling )
+ __vmwrite(TSC_MULTIPLIER, v->arch.hvm_vcpu.tsc_scaling_ratio);
+
vmx_vmcs_exit(v);
/* PVH: paging mode is updated by arch_set_info_guest(). */
@@ -1863,7 +1868,8 @@ void vmcs_dump_vcpu(struct vcpu *v)
vmr32(VM_EXIT_REASON), vmr(EXIT_QUALIFICATION));
printk("IDTVectoring: info=%08x errcode=%08x\n",
vmr32(IDT_VECTORING_INFO), vmr32(IDT_VECTORING_ERROR_CODE));
- printk("TSC Offset = 0x%016lx\n", vmr(TSC_OFFSET));
+ printk("TSC Offset = 0x%016lx TSC Multiplier = 0x%016lx\n",
+ vmr(TSC_OFFSET), vmr(TSC_MULTIPLIER));
if ( (v->arch.hvm_vmx.exec_control & CPU_BASED_TPR_SHADOW) ||
(vmx_pin_based_exec_control & PIN_BASED_POSTED_INTERRUPT) )
printk("TPR Threshold = 0x%02x PostedIntrVec = 0x%02x\n",
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index f26a1bc..4c7214d 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -115,6 +115,7 @@ static int vmx_vcpu_initialise(struct vcpu *v)
v->arch.schedule_tail = vmx_do_resume;
v->arch.ctxt_switch_from = vmx_ctxt_switch_from;
v->arch.ctxt_switch_to = vmx_ctxt_switch_to;
+ v->arch.hvm_vcpu.tsc_scaling_ratio = VMX_TSC_MULTIPLIER_DEFAULT;
if ( (rc = vmx_create_vmcs(v)) != 0 )
{
@@ -1105,6 +1106,13 @@ static void vmx_handle_cd(struct vcpu *v, unsigned long value)
}
}
+static void vmx_setup_tsc_scaling(struct vcpu *v)
+{
+ vmx_vmcs_enter(v);
+ __vmwrite(TSC_MULTIPLIER, v->arch.hvm_vcpu.tsc_scaling_ratio);
+ vmx_vmcs_exit(v);
+}
+
static void vmx_set_tsc_offset(struct vcpu *v, u64 offset, u64 at_tsc)
{
vmx_vmcs_enter(v);
@@ -2003,6 +2011,10 @@ static struct hvm_function_table __initdata vmx_function_table = {
.altp2m_vcpu_update_vmfunc_ve = vmx_vcpu_update_vmfunc_ve,
.altp2m_vcpu_emulate_ve = vmx_vcpu_emulate_ve,
.altp2m_vcpu_emulate_vmfunc = vmx_vcpu_emulate_vmfunc,
+ .default_tsc_scaling_ratio = VMX_TSC_MULTIPLIER_DEFAULT,
+ .max_tsc_scaling_ratio = VMX_TSC_MULTIPLIER_MAX,
+ .tsc_scaling_ratio_frac_bits = 48,
+ .setup_tsc_scaling = vmx_setup_tsc_scaling,
};
/* Handle VT-d posted-interrupt when VCPU is running. */
@@ -2107,6 +2119,9 @@ const struct hvm_function_table * __init start_vmx(void)
&& cpu_has_vmx_secondary_exec_control )
vmx_function_table.pvh_supported = 1;
+ if ( cpu_has_vmx_tsc_scaling )
+ vmx_function_table.tsc_scaling_supported = 1;
+
setup_vmcs_dump();
return &vmx_function_table;
diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h
index d1496b8..fdece44 100644
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h
@@ -236,6 +236,7 @@ extern u32 vmx_vmentry_control;
#define SECONDARY_EXEC_ENABLE_PML 0x00020000
#define SECONDARY_EXEC_ENABLE_VIRT_EXCEPTIONS 0x00040000
#define SECONDARY_EXEC_XSAVES 0x00100000
+#define SECONDARY_EXEC_TSC_SCALING 0x02000000
extern u32 vmx_secondary_exec_control;
#define VMX_EPT_EXEC_ONLY_SUPPORTED 0x00000001
@@ -258,6 +259,9 @@ extern u64 vmx_ept_vpid_cap;
#define VMX_MISC_CR3_TARGET 0x01ff0000
#define VMX_MISC_VMWRITE_ALL 0x20000000
+#define VMX_TSC_MULTIPLIER_DEFAULT 0x0001000000000000ULL
+#define VMX_TSC_MULTIPLIER_MAX 0xffffffffffffffffULL
+
#define cpu_has_wbinvd_exiting \
(vmx_secondary_exec_control & SECONDARY_EXEC_WBINVD_EXITING)
#define cpu_has_vmx_virtualize_apic_accesses \
@@ -303,6 +307,8 @@ extern u64 vmx_ept_vpid_cap;
(vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_PML)
#define cpu_has_vmx_xsaves \
(vmx_secondary_exec_control & SECONDARY_EXEC_XSAVES)
+#define cpu_has_vmx_tsc_scaling \
+ (vmx_secondary_exec_control & SECONDARY_EXEC_TSC_SCALING)
#define VMCS_RID_TYPE_MASK 0x80000000
@@ -378,6 +384,7 @@ enum vmcs_field {
VMWRITE_BITMAP = 0x00002028,
VIRT_EXCEPTION_INFO = 0x0000202a,
XSS_EXIT_BITMAP = 0x0000202c,
+ TSC_MULTIPLIER = 0x00002032,
GUEST_PHYSICAL_ADDRESS = 0x00002400,
VMCS_LINK_POINTER = 0x00002800,
GUEST_IA32_DEBUGCTL = 0x00002802,
--
2.4.8
next prev parent reply other threads:[~2015-12-31 3:03 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-31 3:03 [PATCH v3 00/13] Add VMX TSC scaling support Haozhong Zhang
2015-12-31 3:03 ` [PATCH v3 01/13] x86/time.c: Use correct guest TSC frequency in tsc_set_info() Haozhong Zhang
2016-01-04 17:44 ` Boris Ostrovsky
2015-12-31 3:03 ` [PATCH v3 02/13] x86/time.c: Use correct guest TSC frequency in tsc_get_info() Haozhong Zhang
2016-01-04 17:48 ` Boris Ostrovsky
2016-01-05 0:32 ` Haozhong Zhang
2016-01-08 9:05 ` Jan Beulich
2016-01-08 9:12 ` Haozhong Zhang
2015-12-31 3:03 ` [PATCH v3 03/13] x86/hvm: Scale host TSC when setting/getting guest TSC Haozhong Zhang
2016-01-08 9:15 ` Jan Beulich
2016-01-08 14:04 ` Haozhong Zhang
2015-12-31 3:03 ` [PATCH v3 04/13] x86/time.c: Scale host TSC in pvclock properly Haozhong Zhang
2016-01-04 18:09 ` Boris Ostrovsky
2016-01-05 0:59 ` Haozhong Zhang
2016-01-05 16:15 ` Boris Ostrovsky
2016-01-06 0:56 ` Haozhong Zhang
2016-01-08 9:20 ` Jan Beulich
2016-01-08 13:22 ` Haozhong Zhang
2016-01-08 13:43 ` Jan Beulich
2016-01-08 13:50 ` Haozhong Zhang
2015-12-31 3:03 ` [PATCH v3 05/13] svm: Remove redundant TSC scaling in svm_set_tsc_offset() Haozhong Zhang
2016-01-08 9:22 ` Jan Beulich
2016-01-08 13:24 ` Haozhong Zhang
2015-12-31 3:03 ` [PATCH v3 06/13] x86/hvm: Collect information of TSC scaling ratio Haozhong Zhang
2015-12-31 3:03 ` [PATCH v3 07/13] x86: Add functions for 64-bit integer arithmetic Haozhong Zhang
2016-01-04 18:26 ` Boris Ostrovsky
2016-01-05 1:15 ` Haozhong Zhang
2016-01-05 16:21 ` Boris Ostrovsky
2016-01-08 9:34 ` Jan Beulich
2016-01-08 13:48 ` Haozhong Zhang
2015-12-31 3:03 ` [PATCH v3 08/13] x86/hvm: Setup TSC scaling ratio Haozhong Zhang
2016-01-04 18:40 ` Boris Ostrovsky
2016-01-05 1:20 ` Haozhong Zhang
2016-01-08 9:44 ` Jan Beulich
2016-01-08 13:55 ` Haozhong Zhang
2016-01-08 14:04 ` Jan Beulich
2016-01-08 14:10 ` Haozhong Zhang
2015-12-31 3:03 ` [PATCH v3 09/13] x86/hvm: Replace architecture TSC scaling by a common function Haozhong Zhang
2016-01-04 18:42 ` Boris Ostrovsky
2016-01-12 16:44 ` Jan Beulich
2015-12-31 3:03 ` [PATCH v3 10/13] x86/hvm: Move saving/loading vcpu's TSC to common code Haozhong Zhang
2015-12-31 3:03 ` [PATCH v3 11/13] x86/hvm: Detect TSC scaling through hvm_funcs Haozhong Zhang
2015-12-31 3:03 ` Haozhong Zhang [this message]
2016-01-12 16:48 ` [PATCH v3 12/13] vmx: Add VMX RDTSC(P) scaling support Jan Beulich
2016-01-14 4:52 ` Haozhong Zhang
2016-01-14 9:05 ` Jan Beulich
2016-01-14 9:47 ` Haozhong Zhang
2015-12-31 3:03 ` [PATCH v3 13/13] docs: Add descriptions of TSC scaling in xl.cfg and tscmode.txt Haozhong Zhang
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=1451531020-29964-13-git-send-email-haozhong.zhang@intel.com \
--to=haozhong.zhang@intel.com \
--cc=Aravind.Gopalakrishnan@amd.com \
--cc=andrew.cooper3@citrix.com \
--cc=boris.ostrovsky@oracle.com \
--cc=jbeulich@suse.com \
--cc=jun.nakajima@intel.com \
--cc=keir@xen.org \
--cc=kevin.tian@intel.com \
--cc=suravee.suthikulpanit@amd.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.