/* * more or less obosleted by pfm_get_impl_counters() */ int pfm_get_num_counters(void) { if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; return pfm_config.current->get_num_counters(); }
int pfm_dispatch_events(pfmlib_param_t *evt) { int max_count; int i; if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (evt == NULL) return PFMLIB_ERR_INVAL; /* * the default priv level must be set to something */ if (evt->pfp_dfl_plm == 0) return PFMLIB_ERR_INVAL; if (evt->pfp_event_count >= PMU_MAX_PMCS) return PFMLIB_ERR_INVAL; /* * check that event descriptors are correct * * invalid plm bits are simply ignored */ max_count = pfm_current->pme_count; for (i=0; i < evt->pfp_event_count; i++) { if (evt->pfp_events[i].event < 0 || evt->pfp_events[i].event >= max_count) return PFMLIB_ERR_INVAL; } /* reset pc counter */ evt->pfp_pc_count = 0; return pfm_config.current->dispatch_events(evt); }
int pfm_get_impl_counters(unsigned long impl_counters[4]) { if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (impl_counters == NULL) return PFMLIB_ERR_INVAL; return pfm_config.current->get_impl_counters(impl_counters); }
int pfm_find_event(const char *str) { pfmlib_event_desc_t e; int ret; if (PFMLIB_INITIALIZED() == 0) return PFM_ERR_NOINIT; if (!str) return PFM_ERR_INVAL; memset(&e, 0, sizeof(e)); ret = pfmlib_parse_event(str, &e); if (ret == PFM_SUCCESS) { /* * save index so we can return it * and free the pattrs data that was * allocated in pfmlib_parse_event() */ ret = pfmlib_pidx2idx(e.pmu, e.event); pfmlib_release_event(&e); } return ret; }
/* * external opaque idx -> PMU + internal idx */ static pfmlib_pmu_t * pfmlib_idx2pidx(int idx, int *pidx) { pfmlib_pmu_t *pmu; pfm_pmu_t pmu_id; if (PFMLIB_INITIALIZED() == 0) return NULL; if (idx < 0) return NULL; pmu_id = idx2pmu(idx); pmu = pmu2pmuidx(pmu_id); if (!pmu) return NULL; *pidx = idx & PFMLIB_PMU_PIDX_MASK; if (!pmu->event_is_valid(pmu, *pidx)) return NULL; return pmu; }
int pfm_print_event_info_byindex(int v, int (*pf)(const char *fmt,...)) { unsigned long cmask[4]; long c; int i; if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (v <0 || v >= pfm_current->pme_count || pf == NULL) return PFMLIB_ERR_INVAL; (*pf)( "Name : %s\n" "VCode : 0x%lx\n" "Code : 0x%lx\n", pfm_current->get_event_name(v), pfm_current->get_event_vcode(v), pfm_current->get_event_code(v)); (*pf)( "PMD/PMC: [ "); pfm_current->get_event_counters(v, cmask); c = cmask[0]; for (i=0; c; i++, c>>=1 ) { if (c & 0x1) (*pf)("%d ", i); } (*pf)( "]\n"); /* print PMU specific information */ if (pfm_config.current->print_info) { pfm_config.current->print_info(v, pf); } return PFMLIB_SUCCESS; }
int pfm_get_next_event(int i) { if (PFMLIB_INITIALIZED() == 0) return -1; if (i < 0 || i >= pfm_current->pme_count) return -1; return i+1; }
int pfm_get_pmu_type(int *type) { if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (type == NULL) return PFMLIB_ERR_INVAL; *type = pfm_current->pmu_type; return PFMLIB_SUCCESS; }
int pfm_get_event_counters(int i, unsigned long counters[4]) { if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (i<0 || i >= pfm_current->pme_count) return PFMLIB_ERR_INVAL; pfm_current->get_event_counters(i, counters); return PFMLIB_SUCCESS; }
int pfm_get_event_code(int i, int *code) { if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (i<0 || i >= pfm_current->pme_count || code == NULL) return PFMLIB_ERR_INVAL; *code = pfm_current->get_event_code(i); return PFMLIB_SUCCESS; }
int pfm_get_event_name(int i, char **name) { if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (i<0 || i >= pfm_current->pme_count || name == NULL) return PFMLIB_ERR_INVAL; *name = pfm_current->get_event_name(i); return PFMLIB_SUCCESS; }
int pfm_get_pmu_name(char **name) { if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (name == NULL) return PFMLIB_ERR_INVAL; *name = pmu_names[pfm_current->pmu_type]; return PFMLIB_SUCCESS; }
int pfm_get_event_description(unsigned int i, char **str) { if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (i >= pfm_current->pme_count || str == NULL) return PFMLIB_ERR_INVAL; if (pfm_current->get_event_desc == NULL) { *str = NULL; return PFMLIB_SUCCESS; } return pfm_current->get_event_desc(i, str); }
/* * boolean return value */ int pfm_is_pmu_supported(int type) { pfm_pmu_support_t **p = pmus; if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; while (*p) { if ((*p)->pmu_type == type) return PFMLIB_SUCCESS; p++; } return PFMLIB_ERR_NOTSUPP; }
static int pfm_find_event_byvcode_next(unsigned long vcode, int i, int *next) { if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (next == NULL) return PFMLIB_ERR_INVAL; for(++i; i < pfm_current->pme_count; i++) { if (pfm_current->get_event_vcode(i) == vcode) goto found; } return PFMLIB_ERR_NOTFOUND; found: *next = i; return PFMLIB_SUCCESS; }
int pfm_find_event_bycode(int code, int *idx) { int i; if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (idx == NULL) return PFMLIB_ERR_INVAL; for(i=0; i < pfm_current->pme_count; i++) { if (pfm_current->get_event_code(i) == code) goto found; } return PFMLIB_ERR_NOTFOUND; found: *idx = i; return PFMLIB_SUCCESS; }
void pfm_terminate(void) { pfmlib_pmu_t *pmu; int i; if (PFMLIB_INITIALIZED() == 0) return; pfmlib_for_each_pmu(i) { pmu = pfmlib_pmus[i]; if (!pfmlib_pmu_active(pmu)) continue; if (pmu->pmu_terminate) pmu->pmu_terminate(pmu); } pfm_cfg.initdone = 0; }
int pfm_find_event_byname(char *n, int *idx) { int i; if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (n == NULL || idx == NULL) return PFMLIB_ERR_INVAL; /* we do case insensitive comparisons */ for(i=0; i < pfm_current->pme_count; i++) { if (!strcasecmp(pfm_current->get_event_name(i), n)) goto found; } return PFMLIB_ERR_NOTFOUND; found: *idx = i; return PFMLIB_SUCCESS; }
int pfm_find_event(char *v, int *ev) { int num; int ret; if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (v == NULL || ev == NULL) return PFMLIB_ERR_INVAL; if (isdigit(*v)) { if ((pfm_gen_event_code(v, &num)) != PFMLIB_SUCCESS) return PFMLIB_ERR_INVAL; ret = pfm_find_event_bycode(num, ev); } else { ret = pfm_find_event_byname(v, ev); } return ret; }
int pfm_find_event(const char *str) { pfmlib_event_desc_t e; int ret; if (PFMLIB_INITIALIZED() == 0) return PFM_ERR_NOINIT; if (!str) return PFM_ERR_INVAL; memset(&e, 0, sizeof(e)); ret = pfmlib_parse_event(str, &e); if (ret == PFM_SUCCESS) return pfmlib_pidx2idx(e.pmu, e.event); return ret; }
/* * Function used to print information about a specific events. More than * one event can be printed in case an event code is given rather than * a specific name. A callback function is used for printing. */ int pfm_print_event_info(char *name, int (*pf)(const char *fmt,...)) { unsigned long cmask[4]; long c; int i, code, ret; int code_is_used = 1, event_is_digit = 0; int idx; int number; if (PFMLIB_INITIALIZED() == 0) return PFMLIB_ERR_NOINIT; if (name == NULL || pf == NULL) return PFMLIB_ERR_INVAL; /* we can't quite use pfm_findevent() because we need to try * both ways systematically. */ if (isdigit(*name)) { ret = pfm_gen_event_code(name, &number); if (ret != PFMLIB_SUCCESS) return ret; if (number > INT_MAX) return PFMLIB_ERR_INVAL; ret = pfm_find_event_bycode(number, &idx); if (ret != PFMLIB_SUCCESS) { /* XXX: ugly upper 32 bits necessarily cleared */ ret = pfm_find_event_byvcode((unsigned long)number, &idx); code_is_used = 0; } event_is_digit = 1; } else { ret = pfm_find_event_byname(name, &idx); } if (ret != PFMLIB_SUCCESS) return PFMLIB_ERR_NOTFOUND; code = code_is_used ? pfm_current->get_event_code(idx) : pfm_current->get_event_vcode(idx); do { (*pf)( "Name : %s\n" "VCode : 0x%lx\n" "Code : 0x%lx\n", pfm_current->get_event_name(idx), pfm_current->get_event_vcode(idx), pfm_current->get_event_code(idx)); (*pf)( "PMD/PMC: [ "); pfm_current->get_event_counters(idx, cmask); c = cmask[0]; for (i=0; c; i++, c>>=1 ) { if (c & 0x1) (*pf)("%d ", i); } (*pf)( "]\n"); /* print PMU specific information */ if (pfm_config.current->print_info) { pfm_config.current->print_info(idx, pf); } ret = code_is_used ? pfm_find_event_bycode_next(code, idx, &idx) : pfm_find_event_byvcode_next((unsigned long)number, idx, &idx); } while (event_is_digit && ret == PFMLIB_SUCCESS); return PFMLIB_SUCCESS; }