Lines Matching full:pmu
3 * KVM PMU support for AMD
20 #include "pmu.h"
28 static struct kvm_pmc *amd_pmu_get_pmc(struct kvm_pmu *pmu, int pmc_idx)
30 unsigned int num_counters = pmu->nr_arch_gp_counters;
35 return &pmu->gp_counters[array_index_nospec(pmc_idx, num_counters)];
38 static inline struct kvm_pmc *get_gp_pmc_amd(struct kvm_pmu *pmu, u32 msr,
41 struct kvm_vcpu *vcpu = pmu_to_vcpu(pmu);
52 * Each PMU counter has a pair of CTL and CTR MSRs. CTLn
73 return amd_pmu_get_pmc(pmu, idx);
78 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
80 if (idx >= pmu->nr_arch_gp_counters)
95 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
98 pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_COUNTER);
99 pmc = pmc ? pmc : get_gp_pmc_amd(pmu, msr, PMU_TYPE_EVNTSEL);
106 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
110 return pmu->version > 0;
116 return pmu->version > 1;
119 msr < MSR_F15H_PERF_CTL0 + 2 * pmu->nr_arch_gp_counters)
120 return pmu->version > 1;
129 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
134 pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_COUNTER);
140 pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_EVNTSEL);
151 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
157 pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_COUNTER);
163 pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_EVNTSEL);
165 data &= ~pmu->reserved_bits;
178 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
181 pmu->version = 1;
183 pmu->version = 2;
191 pmu->nr_arch_gp_counters = ebx.split.num_core_pmc;
193 pmu->nr_arch_gp_counters = AMD64_NUM_COUNTERS_CORE;
195 pmu->nr_arch_gp_counters = AMD64_NUM_COUNTERS;
198 pmu->nr_arch_gp_counters = min_t(unsigned int, pmu->nr_arch_gp_counters,
201 if (pmu->version > 1) {
202 pmu->global_ctrl_rsvd = ~((1ull << pmu->nr_arch_gp_counters) - 1);
203 pmu->global_status_rsvd = pmu->global_ctrl_rsvd;
206 pmu->counter_bitmask[KVM_PMC_GP] = ((u64)1 << 48) - 1;
207 pmu->reserved_bits = 0xfffffff000280000ull;
208 pmu->raw_event_mask = AMD64_RAW_EVENT_MASK;
210 pmu->counter_bitmask[KVM_PMC_FIXED] = 0;
211 pmu->nr_arch_fixed_counters = 0;
212 bitmap_set(pmu->all_valid_pmc_idx, 0, pmu->nr_arch_gp_counters);
217 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
223 pmu->gp_counters[i].type = KVM_PMC_GP;
224 pmu->gp_counters[i].vcpu = vcpu;
225 pmu->gp_counters[i].idx = i;
226 pmu->gp_counters[i].current_config = 0;