/*
 * 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);
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
/*
 * 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;
}
Esempio n. 17
0
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;
}
Esempio n. 20
0
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;
}