diff options
author | Liran Alon <liran.alon@oracle.com> | 2019-03-25 15:10:17 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2019-04-16 09:37:34 -0400 |
commit | 672ff6cff80ca43bf3258410d2b887036969df5f (patch) | |
tree | f0d20fbf2e1af6a187d742b9c67b448d3cca50a3 | |
parent | 1811d979c71621aafc7b879477202d286f7e863b (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.c | 4 |
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) | |||
281 | int kvm_pmu_rdpmc(struct kvm_vcpu *vcpu, unsigned idx, u64 *data) | 281 | int 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 | ||