Commit 41aac14a authored by Wei Huang's avatar Wei Huang Committed by Paolo Bonzini

KVM: x86/vPMU: introduce kvm_pmu_msr_idx_to_pmc

This function will be part of the kvm_pmu_ops interface.  Introduce
it already.
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent e5af058a
...@@ -348,22 +348,34 @@ int kvm_pmu_is_valid_msr_idx(struct kvm_vcpu *vcpu, unsigned idx) ...@@ -348,22 +348,34 @@ int kvm_pmu_is_valid_msr_idx(struct kvm_vcpu *vcpu, unsigned idx)
(fixed && idx >= pmu->nr_arch_fixed_counters); (fixed && idx >= pmu->nr_arch_fixed_counters);
} }
int kvm_pmu_rdpmc(struct kvm_vcpu *vcpu, unsigned idx, u64 *data) static struct kvm_pmc *kvm_pmu_msr_idx_to_pmc(struct kvm_vcpu *vcpu,
unsigned idx)
{ {
struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
bool fast_mode = idx & (1u << 31);
bool fixed = idx & (1u << 30); bool fixed = idx & (1u << 30);
struct kvm_pmc *counters; struct kvm_pmc *counters;
u64 ctr_val;
idx &= ~(3u << 30); idx &= ~(3u << 30);
if (!fixed && idx >= pmu->nr_arch_gp_counters) if (!fixed && idx >= pmu->nr_arch_gp_counters)
return 1; return NULL;
if (fixed && idx >= pmu->nr_arch_fixed_counters) if (fixed && idx >= pmu->nr_arch_fixed_counters)
return 1; return NULL;
counters = fixed ? pmu->fixed_counters : pmu->gp_counters; counters = fixed ? pmu->fixed_counters : pmu->gp_counters;
ctr_val = pmc_read_counter(&counters[idx]); return &counters[idx];
}
int kvm_pmu_rdpmc(struct kvm_vcpu *vcpu, unsigned idx, u64 *data)
{
bool fast_mode = idx & (1u << 31);
struct kvm_pmc *pmc;
u64 ctr_val;
pmc = kvm_pmu_msr_idx_to_pmc(vcpu, idx);
if (!pmc)
return 1;
ctr_val = pmc_read_counter(pmc);
if (fast_mode) if (fast_mode)
ctr_val = (u32)ctr_val; ctr_val = (u32)ctr_val;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment