|
|
@@ -126,7 +126,7 @@ static int intel_is_valid_msr_idx(struct kvm_vcpu *vcpu, unsigned idx)
|
|
|
}
|
|
|
|
|
|
static struct kvm_pmc *intel_msr_idx_to_pmc(struct kvm_vcpu *vcpu,
|
|
|
- unsigned idx)
|
|
|
+ unsigned idx, u64 *mask)
|
|
|
{
|
|
|
struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
|
|
|
bool fixed = idx & (1u << 30);
|
|
|
@@ -138,6 +138,7 @@ static struct kvm_pmc *intel_msr_idx_to_pmc(struct kvm_vcpu *vcpu,
|
|
|
if (fixed && idx >= pmu->nr_arch_fixed_counters)
|
|
|
return NULL;
|
|
|
counters = fixed ? pmu->fixed_counters : pmu->gp_counters;
|
|
|
+ *mask &= pmu->counter_bitmask[fixed ? KVM_PMC_FIXED : KVM_PMC_GP];
|
|
|
|
|
|
return &counters[idx];
|
|
|
}
|
|
|
@@ -183,9 +184,13 @@ static int intel_pmu_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *data)
|
|
|
*data = pmu->global_ovf_ctrl;
|
|
|
return 0;
|
|
|
default:
|
|
|
- if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0)) ||
|
|
|
- (pmc = get_fixed_pmc(pmu, msr))) {
|
|
|
- *data = pmc_read_counter(pmc);
|
|
|
+ if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0))) {
|
|
|
+ u64 val = pmc_read_counter(pmc);
|
|
|
+ *data = val & pmu->counter_bitmask[KVM_PMC_GP];
|
|
|
+ return 0;
|
|
|
+ } else if ((pmc = get_fixed_pmc(pmu, msr))) {
|
|
|
+ u64 val = pmc_read_counter(pmc);
|
|
|
+ *data = val & pmu->counter_bitmask[KVM_PMC_FIXED];
|
|
|
return 0;
|
|
|
} else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) {
|
|
|
*data = pmc->eventsel;
|