Lines Matching refs:pmu

50 	struct kvm_pmu *pmu = &pmc->vcpu->arch.pmu;  in pmc_bitmask()  local
52 return pmu->counter_bitmask[pmc->type]; in pmc_bitmask()
57 struct kvm_pmu *pmu = &pmc->vcpu->arch.pmu; in pmc_enabled() local
58 return test_bit(pmc->idx, (unsigned long *)&pmu->global_ctrl); in pmc_enabled()
61 static inline struct kvm_pmc *get_gp_pmc(struct kvm_pmu *pmu, u32 msr, in get_gp_pmc() argument
64 if (msr >= base && msr < base + pmu->nr_arch_gp_counters) in get_gp_pmc()
65 return &pmu->gp_counters[msr - base]; in get_gp_pmc()
69 static inline struct kvm_pmc *get_fixed_pmc(struct kvm_pmu *pmu, u32 msr) in get_fixed_pmc() argument
72 if (msr >= base && msr < base + pmu->nr_arch_fixed_counters) in get_fixed_pmc()
73 return &pmu->fixed_counters[msr - base]; in get_fixed_pmc()
77 static inline struct kvm_pmc *get_fixed_pmc_idx(struct kvm_pmu *pmu, int idx) in get_fixed_pmc_idx() argument
79 return get_fixed_pmc(pmu, MSR_CORE_PERF_FIXED_CTR0 + idx); in get_fixed_pmc_idx()
82 static struct kvm_pmc *global_idx_to_pmc(struct kvm_pmu *pmu, int idx) in global_idx_to_pmc() argument
85 return get_gp_pmc(pmu, MSR_P6_EVNTSEL0 + idx, MSR_P6_EVNTSEL0); in global_idx_to_pmc()
87 return get_fixed_pmc_idx(pmu, idx - INTEL_PMC_IDX_FIXED); in global_idx_to_pmc()
98 struct kvm_pmu *pmu = container_of(irq_work, struct kvm_pmu, in trigger_pmi() local
100 struct kvm_vcpu *vcpu = container_of(pmu, struct kvm_vcpu, in trigger_pmi()
101 arch.pmu); in trigger_pmi()
111 struct kvm_pmu *pmu = &pmc->vcpu->arch.pmu; in kvm_perf_overflow() local
112 if (!test_and_set_bit(pmc->idx, (unsigned long *)&pmu->reprogram_pmi)) { in kvm_perf_overflow()
113 __set_bit(pmc->idx, (unsigned long *)&pmu->global_status); in kvm_perf_overflow()
122 struct kvm_pmu *pmu = &pmc->vcpu->arch.pmu; in kvm_perf_overflow_intr() local
123 if (!test_and_set_bit(pmc->idx, (unsigned long *)&pmu->reprogram_pmi)) { in kvm_perf_overflow_intr()
124 __set_bit(pmc->idx, (unsigned long *)&pmu->global_status); in kvm_perf_overflow_intr()
135 irq_work_queue(&pmc->vcpu->arch.pmu.irq_work); in kvm_perf_overflow_intr()
197 clear_bit(pmc->idx, (unsigned long*)&pmc->vcpu->arch.pmu.reprogram_pmi); in reprogram_counter()
200 static unsigned find_arch_event(struct kvm_pmu *pmu, u8 event_select, in find_arch_event() argument
208 && (pmu->available_event_types & (1 << i))) in find_arch_event()
240 config = find_arch_event(&pmc->vcpu->arch.pmu, event_select, in reprogram_gp_counter()
279 static void reprogram_fixed_counters(struct kvm_pmu *pmu, u64 data) in reprogram_fixed_counters() argument
283 for (i = 0; i < pmu->nr_arch_fixed_counters; i++) { in reprogram_fixed_counters()
285 struct kvm_pmc *pmc = get_fixed_pmc_idx(pmu, i); in reprogram_fixed_counters()
287 if (fixed_en_pmi(pmu->fixed_ctr_ctrl, i) == en_pmi) in reprogram_fixed_counters()
293 pmu->fixed_ctr_ctrl = data; in reprogram_fixed_counters()
296 static void reprogram_idx(struct kvm_pmu *pmu, int idx) in reprogram_idx() argument
298 struct kvm_pmc *pmc = global_idx_to_pmc(pmu, idx); in reprogram_idx()
308 fixed_en_pmi(pmu->fixed_ctr_ctrl, fidx), fidx); in reprogram_idx()
312 static void global_ctrl_changed(struct kvm_pmu *pmu, u64 data) in global_ctrl_changed() argument
315 u64 diff = pmu->global_ctrl ^ data; in global_ctrl_changed()
317 pmu->global_ctrl = data; in global_ctrl_changed()
320 reprogram_idx(pmu, bit); in global_ctrl_changed()
325 struct kvm_pmu *pmu = &vcpu->arch.pmu; in kvm_pmu_msr() local
333 ret = pmu->version > 1; in kvm_pmu_msr()
336 ret = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0) in kvm_pmu_msr()
337 || get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0) in kvm_pmu_msr()
338 || get_fixed_pmc(pmu, msr); in kvm_pmu_msr()
346 struct kvm_pmu *pmu = &vcpu->arch.pmu; in kvm_pmu_get_msr() local
351 *data = pmu->fixed_ctr_ctrl; in kvm_pmu_get_msr()
354 *data = pmu->global_status; in kvm_pmu_get_msr()
357 *data = pmu->global_ctrl; in kvm_pmu_get_msr()
360 *data = pmu->global_ovf_ctrl; in kvm_pmu_get_msr()
363 if ((pmc = get_gp_pmc(pmu, index, MSR_IA32_PERFCTR0)) || in kvm_pmu_get_msr()
364 (pmc = get_fixed_pmc(pmu, index))) { in kvm_pmu_get_msr()
367 } else if ((pmc = get_gp_pmc(pmu, index, MSR_P6_EVNTSEL0))) { in kvm_pmu_get_msr()
377 struct kvm_pmu *pmu = &vcpu->arch.pmu; in kvm_pmu_set_msr() local
384 if (pmu->fixed_ctr_ctrl == data) in kvm_pmu_set_msr()
387 reprogram_fixed_counters(pmu, data); in kvm_pmu_set_msr()
393 pmu->global_status = data; in kvm_pmu_set_msr()
398 if (pmu->global_ctrl == data) in kvm_pmu_set_msr()
400 if (!(data & pmu->global_ctrl_mask)) { in kvm_pmu_set_msr()
401 global_ctrl_changed(pmu, data); in kvm_pmu_set_msr()
406 if (!(data & (pmu->global_ctrl_mask & ~(3ull<<62)))) { in kvm_pmu_set_msr()
408 pmu->global_status &= ~data; in kvm_pmu_set_msr()
409 pmu->global_ovf_ctrl = data; in kvm_pmu_set_msr()
414 if ((pmc = get_gp_pmc(pmu, index, MSR_IA32_PERFCTR0)) || in kvm_pmu_set_msr()
415 (pmc = get_fixed_pmc(pmu, index))) { in kvm_pmu_set_msr()
420 } else if ((pmc = get_gp_pmc(pmu, index, MSR_P6_EVNTSEL0))) { in kvm_pmu_set_msr()
423 if (!(data & pmu->reserved_bits)) { in kvm_pmu_set_msr()
434 struct kvm_pmu *pmu = &vcpu->arch.pmu; in kvm_pmu_check_pmc() local
437 return (!fixed && pmc >= pmu->nr_arch_gp_counters) || in kvm_pmu_check_pmc()
438 (fixed && pmc >= pmu->nr_arch_fixed_counters); in kvm_pmu_check_pmc()
443 struct kvm_pmu *pmu = &vcpu->arch.pmu; in kvm_pmu_read_pmc() local
450 if (!fixed && pmc >= pmu->nr_arch_gp_counters) in kvm_pmu_read_pmc()
452 if (fixed && pmc >= pmu->nr_arch_fixed_counters) in kvm_pmu_read_pmc()
454 counters = fixed ? pmu->fixed_counters : pmu->gp_counters; in kvm_pmu_read_pmc()
465 struct kvm_pmu *pmu = &vcpu->arch.pmu; in kvm_pmu_cpuid_update() local
470 pmu->nr_arch_gp_counters = 0; in kvm_pmu_cpuid_update()
471 pmu->nr_arch_fixed_counters = 0; in kvm_pmu_cpuid_update()
472 pmu->counter_bitmask[KVM_PMC_GP] = 0; in kvm_pmu_cpuid_update()
473 pmu->counter_bitmask[KVM_PMC_FIXED] = 0; in kvm_pmu_cpuid_update()
474 pmu->version = 0; in kvm_pmu_cpuid_update()
475 pmu->reserved_bits = 0xffffffff00200000ull; in kvm_pmu_cpuid_update()
483 pmu->version = eax.split.version_id; in kvm_pmu_cpuid_update()
484 if (!pmu->version) in kvm_pmu_cpuid_update()
487 pmu->nr_arch_gp_counters = min_t(int, eax.split.num_counters, in kvm_pmu_cpuid_update()
489 pmu->counter_bitmask[KVM_PMC_GP] = ((u64)1 << eax.split.bit_width) - 1; in kvm_pmu_cpuid_update()
490 pmu->available_event_types = ~entry->ebx & in kvm_pmu_cpuid_update()
493 if (pmu->version == 1) { in kvm_pmu_cpuid_update()
494 pmu->nr_arch_fixed_counters = 0; in kvm_pmu_cpuid_update()
496 pmu->nr_arch_fixed_counters = in kvm_pmu_cpuid_update()
499 pmu->counter_bitmask[KVM_PMC_FIXED] = in kvm_pmu_cpuid_update()
503 pmu->global_ctrl = ((1 << pmu->nr_arch_gp_counters) - 1) | in kvm_pmu_cpuid_update()
504 (((1ull << pmu->nr_arch_fixed_counters) - 1) << INTEL_PMC_IDX_FIXED); in kvm_pmu_cpuid_update()
505 pmu->global_ctrl_mask = ~pmu->global_ctrl; in kvm_pmu_cpuid_update()
511 pmu->reserved_bits ^= HSW_IN_TX|HSW_IN_TX_CHECKPOINTED; in kvm_pmu_cpuid_update()
517 struct kvm_pmu *pmu = &vcpu->arch.pmu; in kvm_pmu_init() local
519 memset(pmu, 0, sizeof(*pmu)); in kvm_pmu_init()
521 pmu->gp_counters[i].type = KVM_PMC_GP; in kvm_pmu_init()
522 pmu->gp_counters[i].vcpu = vcpu; in kvm_pmu_init()
523 pmu->gp_counters[i].idx = i; in kvm_pmu_init()
526 pmu->fixed_counters[i].type = KVM_PMC_FIXED; in kvm_pmu_init()
527 pmu->fixed_counters[i].vcpu = vcpu; in kvm_pmu_init()
528 pmu->fixed_counters[i].idx = i + INTEL_PMC_IDX_FIXED; in kvm_pmu_init()
530 init_irq_work(&pmu->irq_work, trigger_pmi); in kvm_pmu_init()
536 struct kvm_pmu *pmu = &vcpu->arch.pmu; in kvm_pmu_reset() local
539 irq_work_sync(&pmu->irq_work); in kvm_pmu_reset()
541 struct kvm_pmc *pmc = &pmu->gp_counters[i]; in kvm_pmu_reset()
547 stop_counter(&pmu->fixed_counters[i]); in kvm_pmu_reset()
549 pmu->fixed_ctr_ctrl = pmu->global_ctrl = pmu->global_status = in kvm_pmu_reset()
550 pmu->global_ovf_ctrl = 0; in kvm_pmu_reset()
560 struct kvm_pmu *pmu = &vcpu->arch.pmu; in kvm_handle_pmu_event() local
564 bitmask = pmu->reprogram_pmi; in kvm_handle_pmu_event()
567 struct kvm_pmc *pmc = global_idx_to_pmc(pmu, bit); in kvm_handle_pmu_event()
570 clear_bit(bit, (unsigned long *)&pmu->reprogram_pmi); in kvm_handle_pmu_event()
574 reprogram_idx(pmu, bit); in kvm_handle_pmu_event()