Lines Matching full:pmu

3  * KVM PMU support for Intel CPUs
18 #include "pmu.h"
35 static void reprogram_fixed_counters(struct kvm_pmu *pmu, u64 data) in reprogram_fixed_counters() argument
39 for (i = 0; i < pmu->nr_arch_fixed_counters; i++) { in reprogram_fixed_counters()
41 u8 old_ctrl = fixed_ctrl_field(pmu->fixed_ctr_ctrl, i); in reprogram_fixed_counters()
44 pmc = get_fixed_pmc(pmu, MSR_CORE_PERF_FIXED_CTR0 + i); in reprogram_fixed_counters()
52 pmu->fixed_ctr_ctrl = data; in reprogram_fixed_counters()
56 static void global_ctrl_changed(struct kvm_pmu *pmu, u64 data) in global_ctrl_changed() argument
59 u64 diff = pmu->global_ctrl ^ data; in global_ctrl_changed()
61 pmu->global_ctrl = data; in global_ctrl_changed()
64 reprogram_counter(pmu, bit); in global_ctrl_changed()
67 static unsigned intel_find_arch_event(struct kvm_pmu *pmu, in intel_find_arch_event() argument
76 && (pmu->available_event_types & (1 << i))) in intel_find_arch_event()
96 struct kvm_pmu *pmu = pmc_to_pmu(pmc); in intel_pmc_is_enabled() local
98 return test_bit(pmc->idx, (unsigned long *)&pmu->global_ctrl); in intel_pmc_is_enabled()
101 static struct kvm_pmc *intel_pmc_idx_to_pmc(struct kvm_pmu *pmu, int pmc_idx) in intel_pmc_idx_to_pmc() argument
104 return get_gp_pmc(pmu, MSR_P6_EVNTSEL0 + pmc_idx, in intel_pmc_idx_to_pmc()
109 return get_fixed_pmc(pmu, idx + MSR_CORE_PERF_FIXED_CTR0); in intel_pmc_idx_to_pmc()
116 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); in intel_is_valid_msr_idx() local
121 return (!fixed && idx >= pmu->nr_arch_gp_counters) || in intel_is_valid_msr_idx()
122 (fixed && idx >= pmu->nr_arch_fixed_counters); in intel_is_valid_msr_idx()
128 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); in intel_msr_idx_to_pmc() local
133 if (!fixed && idx >= pmu->nr_arch_gp_counters) in intel_msr_idx_to_pmc()
135 if (fixed && idx >= pmu->nr_arch_fixed_counters) in intel_msr_idx_to_pmc()
137 counters = fixed ? pmu->fixed_counters : pmu->gp_counters; in intel_msr_idx_to_pmc()
138 *mask &= pmu->counter_bitmask[fixed ? KVM_PMC_FIXED : KVM_PMC_GP]; in intel_msr_idx_to_pmc()
145 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); in intel_is_valid_msr() local
153 ret = pmu->version > 1; in intel_is_valid_msr()
156 ret = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0) || in intel_is_valid_msr()
157 get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0) || in intel_is_valid_msr()
158 get_fixed_pmc(pmu, msr); in intel_is_valid_msr()
167 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); in intel_pmu_get_msr() local
172 *data = pmu->fixed_ctr_ctrl; in intel_pmu_get_msr()
175 *data = pmu->global_status; in intel_pmu_get_msr()
178 *data = pmu->global_ctrl; in intel_pmu_get_msr()
181 *data = pmu->global_ovf_ctrl; in intel_pmu_get_msr()
184 if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0))) { in intel_pmu_get_msr()
186 *data = val & pmu->counter_bitmask[KVM_PMC_GP]; in intel_pmu_get_msr()
188 } else if ((pmc = get_fixed_pmc(pmu, msr))) { in intel_pmu_get_msr()
190 *data = val & pmu->counter_bitmask[KVM_PMC_FIXED]; in intel_pmu_get_msr()
192 } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) { in intel_pmu_get_msr()
203 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); in intel_pmu_set_msr() local
210 if (pmu->fixed_ctr_ctrl == data) in intel_pmu_set_msr()
213 reprogram_fixed_counters(pmu, data); in intel_pmu_set_msr()
219 pmu->global_status = data; in intel_pmu_set_msr()
224 if (pmu->global_ctrl == data) in intel_pmu_set_msr()
226 if (!(data & pmu->global_ctrl_mask)) { in intel_pmu_set_msr()
227 global_ctrl_changed(pmu, data); in intel_pmu_set_msr()
232 if (!(data & pmu->global_ovf_ctrl_mask)) { in intel_pmu_set_msr()
234 pmu->global_status &= ~data; in intel_pmu_set_msr()
235 pmu->global_ovf_ctrl = data; in intel_pmu_set_msr()
240 if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0))) { in intel_pmu_set_msr()
246 } else if ((pmc = get_fixed_pmc(pmu, msr))) { in intel_pmu_set_msr()
249 } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) { in intel_pmu_set_msr()
252 if (!(data & pmu->reserved_bits)) { in intel_pmu_set_msr()
264 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); in intel_pmu_refresh() local
270 pmu->nr_arch_gp_counters = 0; in intel_pmu_refresh()
271 pmu->nr_arch_fixed_counters = 0; in intel_pmu_refresh()
272 pmu->counter_bitmask[KVM_PMC_GP] = 0; in intel_pmu_refresh()
273 pmu->counter_bitmask[KVM_PMC_FIXED] = 0; in intel_pmu_refresh()
274 pmu->version = 0; in intel_pmu_refresh()
275 pmu->reserved_bits = 0xffffffff00200000ull; in intel_pmu_refresh()
283 pmu->version = eax.split.version_id; in intel_pmu_refresh()
284 if (!pmu->version) in intel_pmu_refresh()
289 pmu->nr_arch_gp_counters = min_t(int, eax.split.num_counters, in intel_pmu_refresh()
291 pmu->counter_bitmask[KVM_PMC_GP] = ((u64)1 << eax.split.bit_width) - 1; in intel_pmu_refresh()
292 pmu->available_event_types = ~entry->ebx & in intel_pmu_refresh()
295 if (pmu->version == 1) { in intel_pmu_refresh()
296 pmu->nr_arch_fixed_counters = 0; in intel_pmu_refresh()
298 pmu->nr_arch_fixed_counters = in intel_pmu_refresh()
301 pmu->counter_bitmask[KVM_PMC_FIXED] = in intel_pmu_refresh()
305 pmu->global_ctrl = ((1ull << pmu->nr_arch_gp_counters) - 1) | in intel_pmu_refresh()
306 (((1ull << pmu->nr_arch_fixed_counters) - 1) << INTEL_PMC_IDX_FIXED); in intel_pmu_refresh()
307 pmu->global_ctrl_mask = ~pmu->global_ctrl; in intel_pmu_refresh()
308 pmu->global_ovf_ctrl_mask = pmu->global_ctrl_mask in intel_pmu_refresh()
312 pmu->global_ovf_ctrl_mask &= in intel_pmu_refresh()
319 pmu->reserved_bits ^= HSW_IN_TX|HSW_IN_TX_CHECKPOINTED; in intel_pmu_refresh()
325 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); in intel_pmu_init() local
328 pmu->gp_counters[i].type = KVM_PMC_GP; in intel_pmu_init()
329 pmu->gp_counters[i].vcpu = vcpu; in intel_pmu_init()
330 pmu->gp_counters[i].idx = i; in intel_pmu_init()
334 pmu->fixed_counters[i].type = KVM_PMC_FIXED; in intel_pmu_init()
335 pmu->fixed_counters[i].vcpu = vcpu; in intel_pmu_init()
336 pmu->fixed_counters[i].idx = i + INTEL_PMC_IDX_FIXED; in intel_pmu_init()
342 struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); in intel_pmu_reset() local
347 pmc = &pmu->gp_counters[i]; in intel_pmu_reset()
354 pmc = &pmu->fixed_counters[i]; in intel_pmu_reset()
360 pmu->fixed_ctr_ctrl = pmu->global_ctrl = pmu->global_status = in intel_pmu_reset()
361 pmu->global_ovf_ctrl = 0; in intel_pmu_reset()