diff options
| -rw-r--r-- | arch/x86/include/asm/vmx.h | 3 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx.c | 17 |
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; | |||
| 107 | static bool __read_mostly enable_pml = 1; | 107 | static bool __read_mostly enable_pml = 1; |
| 108 | module_param_named(pml, enable_pml, bool, S_IRUGO); | 108 | module_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 | ||
| 1177 | static 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 | |||
| 1175 | static inline bool report_flexpriority(void) | 1183 | static 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 { |
