aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/vmx.h3
-rw-r--r--arch/x86/kvm/vmx.c17
2 files changed, 19 insertions, 1 deletions
diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h
index aa336ff3e03e..14c63c7e8337 100644
--- a/arch/x86/include/asm/vmx.h
+++ b/arch/x86/include/asm/vmx.h
@@ -73,6 +73,7 @@
73#define SECONDARY_EXEC_ENABLE_PML 0x00020000 73#define SECONDARY_EXEC_ENABLE_PML 0x00020000
74#define SECONDARY_EXEC_XSAVES 0x00100000 74#define SECONDARY_EXEC_XSAVES 0x00100000
75#define SECONDARY_EXEC_PCOMMIT 0x00200000 75#define SECONDARY_EXEC_PCOMMIT 0x00200000
76#define SECONDARY_EXEC_TSC_SCALING 0x02000000
76 77
77#define PIN_BASED_EXT_INTR_MASK 0x00000001 78#define PIN_BASED_EXT_INTR_MASK 0x00000001
78#define PIN_BASED_NMI_EXITING 0x00000008 79#define PIN_BASED_NMI_EXITING 0x00000008
@@ -167,6 +168,8 @@ enum vmcs_field {
167 VMWRITE_BITMAP = 0x00002028, 168 VMWRITE_BITMAP = 0x00002028,
168 XSS_EXIT_BITMAP = 0x0000202C, 169 XSS_EXIT_BITMAP = 0x0000202C,
169 XSS_EXIT_BITMAP_HIGH = 0x0000202D, 170 XSS_EXIT_BITMAP_HIGH = 0x0000202D,
171 TSC_MULTIPLIER = 0x00002032,
172 TSC_MULTIPLIER_HIGH = 0x00002033,
170 GUEST_PHYSICAL_ADDRESS = 0x00002400, 173 GUEST_PHYSICAL_ADDRESS = 0x00002400,
171 GUEST_PHYSICAL_ADDRESS_HIGH = 0x00002401, 174 GUEST_PHYSICAL_ADDRESS_HIGH = 0x00002401,
172 VMCS_LINK_POINTER = 0x00002800, 175 VMCS_LINK_POINTER = 0x00002800,
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index c0fb398ac50e..e45b03ed5c52 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -107,6 +107,8 @@ static u64 __read_mostly host_xss;
107static bool __read_mostly enable_pml = 1; 107static bool __read_mostly enable_pml = 1;
108module_param_named(pml, enable_pml, bool, S_IRUGO); 108module_param_named(pml, enable_pml, bool, S_IRUGO);
109 109
110#define KVM_VMX_TSC_MULTIPLIER_MAX 0xffffffffffffffffULL
111
110#define KVM_GUEST_CR0_MASK (X86_CR0_NW | X86_CR0_CD) 112#define KVM_GUEST_CR0_MASK (X86_CR0_NW | X86_CR0_CD)
111#define KVM_VM_CR0_ALWAYS_ON_UNRESTRICTED_GUEST (X86_CR0_WP | X86_CR0_NE) 113#define KVM_VM_CR0_ALWAYS_ON_UNRESTRICTED_GUEST (X86_CR0_WP | X86_CR0_NE)
112#define KVM_VM_CR0_ALWAYS_ON \ 114#define KVM_VM_CR0_ALWAYS_ON \
@@ -1172,6 +1174,12 @@ static inline bool cpu_has_vmx_pml(void)
1172 return vmcs_config.cpu_based_2nd_exec_ctrl & SECONDARY_EXEC_ENABLE_PML; 1174 return vmcs_config.cpu_based_2nd_exec_ctrl & SECONDARY_EXEC_ENABLE_PML;
1173} 1175}
1174 1176
1177static inline bool cpu_has_vmx_tsc_scaling(void)
1178{
1179 return vmcs_config.cpu_based_2nd_exec_ctrl &
1180 SECONDARY_EXEC_TSC_SCALING;
1181}
1182
1175static inline bool report_flexpriority(void) 1183static inline bool report_flexpriority(void)
1176{ 1184{
1177 return flexpriority_enabled; 1185 return flexpriority_enabled;
@@ -3133,7 +3141,8 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf)
3133 SECONDARY_EXEC_SHADOW_VMCS | 3141 SECONDARY_EXEC_SHADOW_VMCS |
3134 SECONDARY_EXEC_XSAVES | 3142 SECONDARY_EXEC_XSAVES |
3135 SECONDARY_EXEC_ENABLE_PML | 3143 SECONDARY_EXEC_ENABLE_PML |
3136 SECONDARY_EXEC_PCOMMIT; 3144 SECONDARY_EXEC_PCOMMIT |
3145 SECONDARY_EXEC_TSC_SCALING;
3137 if (adjust_vmx_controls(min2, opt2, 3146 if (adjust_vmx_controls(min2, opt2,
3138 MSR_IA32_VMX_PROCBASED_CTLS2, 3147 MSR_IA32_VMX_PROCBASED_CTLS2,
3139 &_cpu_based_2nd_exec_control) < 0) 3148 &_cpu_based_2nd_exec_control) < 0)
@@ -6178,6 +6187,12 @@ static __init int hardware_setup(void)
6178 if (!cpu_has_vmx_apicv()) 6187 if (!cpu_has_vmx_apicv())
6179 enable_apicv = 0; 6188 enable_apicv = 0;
6180 6189
6190 if (cpu_has_vmx_tsc_scaling()) {
6191 kvm_has_tsc_control = true;
6192 kvm_max_tsc_scaling_ratio = KVM_VMX_TSC_MULTIPLIER_MAX;
6193 kvm_tsc_scaling_ratio_frac_bits = 48;
6194 }
6195
6181 if (enable_apicv) 6196 if (enable_apicv)
6182 kvm_x86_ops->update_cr8_intercept = NULL; 6197 kvm_x86_ops->update_cr8_intercept = NULL;
6183 else { 6198 else {