summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiran Alon <liran.alon@oracle.com>2019-03-25 15:10:17 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2019-04-16 09:37:34 -0400
commit672ff6cff80ca43bf3258410d2b887036969df5f (patch)
treef0d20fbf2e1af6a187d742b9c67b448d3cca50a3
parent1811d979c71621aafc7b879477202d286f7e863b (diff)
KVM: x86: Raise #GP when guest vCPU do not support PMU
Before this change, reading a VMware pseduo PMC will succeed even when PMU is not supported by guest. This can easily be seen by running kvm-unit-test vmware_backdoors with "-cpu host,-pmu" option. Reviewed-by: Mihai Carabas <mihai.carabas@oracle.com> Signed-off-by: Liran Alon <liran.alon@oracle.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--arch/x86/kvm/pmu.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c
index 58ead7db71a3..e39741997893 100644
--- a/arch/x86/kvm/pmu.c
+++ b/arch/x86/kvm/pmu.c
@@ -281,9 +281,13 @@ static int kvm_pmu_rdpmc_vmware(struct kvm_vcpu *vcpu, unsigned idx, u64 *data)
281int kvm_pmu_rdpmc(struct kvm_vcpu *vcpu, unsigned idx, u64 *data) 281int kvm_pmu_rdpmc(struct kvm_vcpu *vcpu, unsigned idx, u64 *data)
282{ 282{
283 bool fast_mode = idx & (1u << 31); 283 bool fast_mode = idx & (1u << 31);
284 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
284 struct kvm_pmc *pmc; 285 struct kvm_pmc *pmc;
285 u64 ctr_val; 286 u64 ctr_val;
286 287
288 if (!pmu->version)
289 return 1;
290
287 if (is_vmware_backdoor_pmc(idx)) 291 if (is_vmware_backdoor_pmc(idx))
288 return kvm_pmu_rdpmc_vmware(vcpu, idx, data); 292 return kvm_pmu_rdpmc_vmware(vcpu, idx, data);
289 293