u64 perf_counter_read(struct perf_event *pevent){ u64 enabled = 0; u64 running = 0; if(pevent != NULL){ //return local64_read(&pevent->count); return perf_event_read_value(pevent, &enabled, &running); }else{ printk(KERN_CRIT "***** PERFCT: event in task structure is null\n"); BUG(); return -1; //FIXME figure out how to handle this case } }
/** * kvm_pmu_get_counter_value - get PMU counter value * @vcpu: The vcpu pointer * @select_idx: The counter index */ u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx) { u64 counter, reg, enabled, running; struct kvm_pmu *pmu = &vcpu->arch.pmu; struct kvm_pmc *pmc = &pmu->pmc[select_idx]; reg = (select_idx == ARMV8_PMU_CYCLE_IDX) ? PMCCNTR_EL0 : PMEVCNTR0_EL0 + select_idx; counter = __vcpu_sys_reg(vcpu, reg); /* The real counter value is equal to the value of counter register plus * the value perf event counts. */ if (pmc->perf_event) counter += perf_event_read_value(pmc->perf_event, &enabled, &running); return counter & pmc->bitmask; }