aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/vmx.c
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2015-03-23 14:27:19 -0400
committerMarcelo Tosatti <mtosatti@redhat.com>2015-03-26 21:33:48 -0400
commitb3a2a9076d3149781c8622d6a98a51045ff946e4 (patch)
tree06274a7539be9a341986e4678edf6b90e702c672 /arch/x86/kvm/vmx.c
parenta123374ff3c6850e1340b6da010bb43668d710e1 (diff)
KVM: nVMX: Add support for rdtscp
If the guest CPU is supposed to support rdtscp and the host has rdtscp enabled in the secondary execution controls, we can also expose this feature to L1. Just extend nested_vmx_exit_handled to properly route EXIT_REASON_RDTSCP. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm/vmx.c')
-rw-r--r--arch/x86/kvm/vmx.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 50c675b46901..fdd9f8b88e10 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -2467,6 +2467,7 @@ static void nested_vmx_setup_ctls_msrs(struct vcpu_vmx *vmx)
2467 vmx->nested.nested_vmx_secondary_ctls_low = 0; 2467 vmx->nested.nested_vmx_secondary_ctls_low = 0;
2468 vmx->nested.nested_vmx_secondary_ctls_high &= 2468 vmx->nested.nested_vmx_secondary_ctls_high &=
2469 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 2469 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2470 SECONDARY_EXEC_RDTSCP |
2470 SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 2471 SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2471 SECONDARY_EXEC_APIC_REGISTER_VIRT | 2472 SECONDARY_EXEC_APIC_REGISTER_VIRT |
2472 SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 2473 SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
@@ -7510,7 +7511,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)
7510 return nested_cpu_has(vmcs12, CPU_BASED_INVLPG_EXITING); 7511 return nested_cpu_has(vmcs12, CPU_BASED_INVLPG_EXITING);
7511 case EXIT_REASON_RDPMC: 7512 case EXIT_REASON_RDPMC:
7512 return nested_cpu_has(vmcs12, CPU_BASED_RDPMC_EXITING); 7513 return nested_cpu_has(vmcs12, CPU_BASED_RDPMC_EXITING);
7513 case EXIT_REASON_RDTSC: 7514 case EXIT_REASON_RDTSC: case EXIT_REASON_RDTSCP:
7514 return nested_cpu_has(vmcs12, CPU_BASED_RDTSC_EXITING); 7515 return nested_cpu_has(vmcs12, CPU_BASED_RDTSC_EXITING);
7515 case EXIT_REASON_VMCALL: case EXIT_REASON_VMCLEAR: 7516 case EXIT_REASON_VMCALL: case EXIT_REASON_VMCLEAR:
7516 case EXIT_REASON_VMLAUNCH: case EXIT_REASON_VMPTRLD: 7517 case EXIT_REASON_VMLAUNCH: case EXIT_REASON_VMPTRLD:
@@ -8517,6 +8518,9 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
8517 exec_control); 8518 exec_control);
8518 } 8519 }
8519 } 8520 }
8521 if (nested && !vmx->rdtscp_enabled)
8522 vmx->nested.nested_vmx_secondary_ctls_high &=
8523 ~SECONDARY_EXEC_RDTSCP;
8520 } 8524 }
8521 8525
8522 /* Exposing INVPCID only when PCID is exposed */ 8526 /* Exposing INVPCID only when PCID is exposed */
@@ -9146,8 +9150,9 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
9146 exec_control &= ~SECONDARY_EXEC_RDTSCP; 9150 exec_control &= ~SECONDARY_EXEC_RDTSCP;
9147 /* Take the following fields only from vmcs12 */ 9151 /* Take the following fields only from vmcs12 */
9148 exec_control &= ~(SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 9152 exec_control &= ~(SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
9153 SECONDARY_EXEC_RDTSCP |
9149 SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 9154 SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
9150 SECONDARY_EXEC_APIC_REGISTER_VIRT); 9155 SECONDARY_EXEC_APIC_REGISTER_VIRT);
9151 if (nested_cpu_has(vmcs12, 9156 if (nested_cpu_has(vmcs12,
9152 CPU_BASED_ACTIVATE_SECONDARY_CONTROLS)) 9157 CPU_BASED_ACTIVATE_SECONDARY_CONTROLS))
9153 exec_control |= vmcs12->secondary_vm_exec_control; 9158 exec_control |= vmcs12->secondary_vm_exec_control;