| /* | 
 |  * Copyright (c) 2002-2006 Hewlett-Packard Development Company, L.P. | 
 |  * Contributed by Stephane Eranian <eranian@hpl.hp.com> | 
 |  * | 
 |  * Permission is hereby granted, free of charge, to any person obtaining a copy | 
 |  * of this software and associated documentation files (the "Software"), to deal | 
 |  * in the Software without restriction, including without limitation the rights | 
 |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | 
 |  * of the Software, and to permit persons to whom the Software is furnished to do so, | 
 |  * subject to the following conditions: | 
 |  * | 
 |  * The above copyright notice and this permission notice shall be included in all | 
 |  * copies or substantial portions of the Software. | 
 |  * | 
 |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, | 
 |  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | 
 |  * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | 
 |  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | 
 |  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE | 
 |  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | 
 |  * | 
 |  * This file is part of libpfm, a performance monitoring support library for | 
 |  * applications on Linux. | 
 |  */ | 
 | #ifndef __PFMLIB_PRIV_H__ | 
 | #define __PFMLIB_PRIV_H__ | 
 | #include <perfmon/pfmlib.h> | 
 | #include <string.h> | 
 |  | 
 | #define PFM_PLM_ALL (PFM_PLM0|PFM_PLM1|PFM_PLM2|PFM_PLM3|PFM_PLMH) | 
 |  | 
 | #define PFMLIB_ATTR_DELIM	':'	/* event attribute delimiter */ | 
 | #define PFMLIB_PMU_DELIM	"::"	/* pmu to event delimiter */ | 
 | #define PFMLIB_EVENT_DELIM	','	/* event to event delimiter */ | 
 |  | 
 | #define PFM_ATTR_I(y, d) { .name = (y), .type = PFM_ATTR_MOD_INTEGER, .desc = (d) } | 
 | #define PFM_ATTR_B(y, d) { .name = (y), .type = PFM_ATTR_MOD_BOOL, .desc = (d) } | 
 | #define PFM_ATTR_SKIP	 { .name = "" } /* entry not populated (skipped) */ | 
 | #define PFM_ATTR_NULL	{ .name = NULL } | 
 |  | 
 | #define PFMLIB_EVT_MAX_NAME_LEN	256 | 
 |  | 
 | /* | 
 |  * event identifier encoding: | 
 |  * bit 00-20 : event table specific index (2097152 possibilities) | 
 |  * bit 21-30 : PMU identifier (1024 possibilities) | 
 |  * bit 31    : reserved (to distinguish from a negative error code) | 
 |  */ | 
 | #define PFMLIB_PMU_SHIFT	21 | 
 | #define PFMLIB_PMU_MASK		0x3ff /* must fit PFM_PMU_MAX */ | 
 | #define PFMLIB_PMU_PIDX_MASK	((1<< PFMLIB_PMU_SHIFT)-1) | 
 |  | 
 | typedef struct { | 
 | 	const char	*name;	/* name */ | 
 | 	const char	*desc;	/* description */ | 
 | 	pfm_attr_t	type;	/* used to validate value (if any) */ | 
 | } pfmlib_attr_desc_t; | 
 |  | 
 | /* | 
 |  * attribute description passed to model-specific layer | 
 |  */ | 
 | typedef struct { | 
 | 	int	id;			/* attribute index */ | 
 | 	union { | 
 | 		uint64_t	ival;	/* integer value (incl. bool) */ | 
 | 		char		*sval;	/* string */ | 
 | 	}; | 
 | } pfmlib_attr_t; | 
 |  | 
 | /* | 
 |  * must be big enough to hold all possible priv level attributes | 
 |  */ | 
 | #define PFMLIB_MAX_ATTRS	64 /* max attributes per event desc */ | 
 | #define PFMLIB_MAX_ENCODING	4  /* max encoding length */ | 
 |  | 
 | /* | 
 |  * we add one entry to hold any raw umask users may specify | 
 |  * the last entry in pattrs[] hold that raw umask info | 
 |  */ | 
 | #define PFMLIB_MAX_PATTRS	(PFMLIB_MAX_ATTRS+1) | 
 |  | 
 | struct pfmlib_pmu; | 
 | typedef struct { | 
 | 	struct pfmlib_pmu	*pmu;				/* pmu */ | 
 | 	int			dfl_plm;			/* default priv level mask */ | 
 | 	int			event;				/* pidx */ | 
 | 	int			npattrs;			/* number of attrs in pattrs[] */ | 
 | 	int			nattrs;				/* number of attrs in attrs[] */ | 
 | 	pfm_os_t		osid;				/* OS API requested */ | 
 | 	int			count;				/* number of entries in codes[] */ | 
 | 	pfmlib_attr_t		attrs[PFMLIB_MAX_ATTRS];	/* list of requested attributes */ | 
 |  | 
 | 	pfm_event_attr_info_t	*pattrs;			/* list of possible attributes */ | 
 | 	char			fstr[PFMLIB_EVT_MAX_NAME_LEN];	/* fully qualified event string */ | 
 | 	uint64_t		codes[PFMLIB_MAX_ENCODING];	/* event encoding */ | 
 | 	void			*os_data; | 
 | } pfmlib_event_desc_t; | 
 | #define modx(atdesc, a, z)	(atdesc[(a)].z) | 
 | #define attr(e, k)		((e)->pattrs + (e)->attrs[k].id) | 
 |  | 
 | typedef struct pfmlib_pmu { | 
 | 	const char 	*desc;			/* PMU description */ | 
 | 	const char 	*name;			/* pmu short name */ | 
 | 	const char	*perf_name;		/* perf_event pmu name (optional) */ | 
 | 	pfm_pmu_t	pmu;			/* PMU model */ | 
 | 	int		pme_count;		/* number of events */ | 
 | 	int		max_encoding;		/* max number of uint64_t to encode an event */ | 
 | 	int		flags;			/* 16 LSB: common, 16 MSB: arch spec*/ | 
 | 	int		pmu_rev;		/* PMU model specific revision */ | 
 | 	int		num_cntrs;		/* number of generic counters */ | 
 | 	int		num_fixed_cntrs;	/* number of fixed counters */ | 
 | 	int		supported_plm;		/* supported priv levels */ | 
 |  | 
 | 	pfm_pmu_type_t	type;			/* PMU type */ | 
 | 	const void	*pe;			/* pointer to event table */ | 
 |  | 
 | 	const pfmlib_attr_desc_t *atdesc;	/* pointer to attrs table */ | 
 |  | 
 | 	const int	cpu_family;		/* cpu family number for detection */ | 
 | 	const int	*cpu_models;		/* cpu model numbers for detection (zero terminated) */ | 
 |  | 
 | 	int 		 (*pmu_detect)(void *this); | 
 | 	int 		 (*pmu_init)(void *this);	/* optional */ | 
 | 	void		 (*pmu_terminate)(void *this); /* optional */ | 
 | 	int		 (*get_event_first)(void *this); | 
 | 	int		 (*get_event_next)(void *this, int pidx); | 
 | 	int		 (*get_event_info)(void *this, int pidx, pfm_event_info_t *info); | 
 | 	unsigned int	 (*get_event_nattrs)(void *this, int pidx); | 
 | 	int		 (*event_is_valid)(void *this, int pidx); | 
 | 	int		 (*can_auto_encode)(void *this, int pidx, int uidx); | 
 |  | 
 | 	int		 (*get_event_attr_info)(void *this, int pidx, int umask_idx, pfm_event_attr_info_t *info); | 
 | 	int		 (*get_event_encoding[PFM_OS_MAX])(void *this, pfmlib_event_desc_t *e); | 
 |  | 
 | 	void		 (*validate_pattrs[PFM_OS_MAX])(void *this, pfmlib_event_desc_t *e); | 
 | 	int		 (*os_detect[PFM_OS_MAX])(void *this); | 
 | 	int		 (*validate_table)(void *this, FILE *fp); | 
 | 	/* | 
 | 	 * optional callbacks | 
 | 	 */ | 
 | 	int 		 (*get_num_events)(void *this); | 
 | 	void		 (*display_reg)(void *this, pfmlib_event_desc_t *e, void *val); | 
 | 	int 		 (*match_event)(void *this, pfmlib_event_desc_t *d, const char *e, const char *s); | 
 | } pfmlib_pmu_t; | 
 |  | 
 | typedef struct { | 
 | 	const char			*name; | 
 | 	const pfmlib_attr_desc_t	*atdesc; | 
 | 	pfm_os_t			id; | 
 | 	int				flags; | 
 | 	int				(*detect)(void *this); | 
 | 	int				(*get_os_attr_info)(void *this, pfmlib_event_desc_t *e); | 
 | 	int				(*get_os_nattrs)(void *this, pfmlib_event_desc_t *e); | 
 | 	int				(*encode)(void *this, const char *str, int dfl_plm, void *args); | 
 | } pfmlib_os_t; | 
 |  | 
 | #define PFMLIB_OS_FL_ACTIVATED	0x1	/* OS layer detected */ | 
 |  | 
 | /* | 
 |  * pfmlib_pmu_t common flags (LSB 16 bits) | 
 |  */ | 
 | #define PFMLIB_PMU_FL_INIT	0x1	/* PMU initialized correctly */ | 
 | #define PFMLIB_PMU_FL_ACTIVE	0x2	/* PMU is initialized + detected on host */ | 
 | #define PFMLIB_PMU_FL_RAW_UMASK	0x4	/* PMU supports PFM_ATTR_RAW_UMASKS */ | 
 | #define PFMLIB_PMU_FL_ARCH_DFL	0x8	/* PMU is arch default */ | 
 | #define PFMLIB_PMU_FL_NO_SMPL	0x10	/* PMU does not support sampling */ | 
 |  | 
 | typedef struct { | 
 | 	int	initdone; | 
 | 	int	verbose; | 
 | 	int	debug; | 
 | 	int	inactive; | 
 | 	char	*forced_pmu; | 
 | 	char	*blacklist_pmus; | 
 | 	FILE 	*fp;	/* verbose and debug file descriptor, default stderr or PFMLIB_DEBUG_STDOUT */ | 
 | } pfmlib_config_t;	 | 
 |  | 
 | #define PFMLIB_INITIALIZED()	(pfm_cfg.initdone) | 
 |  | 
 | extern pfmlib_config_t pfm_cfg; | 
 |  | 
 | extern void __pfm_vbprintf(const char *fmt,...); | 
 | extern void __pfm_dbprintf(const char *fmt,...); | 
 | extern void pfmlib_strconcat(char *str, size_t max, const char *fmt, ...); | 
 | extern int pfmlib_getl(char **buffer, size_t *len, FILE *fp); | 
 | extern void pfmlib_compact_pattrs(pfmlib_event_desc_t *e, int i); | 
 | #define evt_strcat(str, fmt, a...) pfmlib_strconcat(str, PFMLIB_EVT_MAX_NAME_LEN, fmt, a) | 
 |  | 
 | extern int pfmlib_parse_event(const char *event, pfmlib_event_desc_t *d); | 
 | extern int pfmlib_build_fstr(pfmlib_event_desc_t *e, char **fstr); | 
 | extern void pfmlib_sort_attr(pfmlib_event_desc_t *e); | 
 | extern pfmlib_pmu_t * pfmlib_get_pmu_by_type(pfm_pmu_type_t t); | 
 | extern void pfmlib_release_event(pfmlib_event_desc_t *e); | 
 |  | 
 | extern size_t pfmlib_check_struct(void *st, size_t usz, size_t refsz, size_t sz); | 
 |  | 
 | #ifdef CONFIG_PFMLIB_DEBUG | 
 | #define DPRINT(fmt, a...) \ | 
 | 	do { \ | 
 | 		__pfm_dbprintf("%s (%s.%d): " fmt, __FILE__, __func__, __LINE__, ## a); \ | 
 | 	} while (0) | 
 | #else | 
 | #define DPRINT(fmt, a...) do { } while (0) | 
 | #endif | 
 |  | 
 | extern pfmlib_pmu_t montecito_support; | 
 | extern pfmlib_pmu_t itanium2_support; | 
 | extern pfmlib_pmu_t itanium_support; | 
 | extern pfmlib_pmu_t generic_ia64_support; | 
 | extern pfmlib_pmu_t amd64_k7_support; | 
 | extern pfmlib_pmu_t amd64_k8_revb_support; | 
 | extern pfmlib_pmu_t amd64_k8_revc_support; | 
 | extern pfmlib_pmu_t amd64_k8_revd_support; | 
 | extern pfmlib_pmu_t amd64_k8_reve_support; | 
 | extern pfmlib_pmu_t amd64_k8_revf_support; | 
 | extern pfmlib_pmu_t amd64_k8_revg_support; | 
 | extern pfmlib_pmu_t amd64_fam10h_barcelona_support; | 
 | extern pfmlib_pmu_t amd64_fam10h_shanghai_support; | 
 | extern pfmlib_pmu_t amd64_fam10h_istanbul_support; | 
 | extern pfmlib_pmu_t amd64_fam11h_turion_support; | 
 | extern pfmlib_pmu_t amd64_fam12h_llano_support; | 
 | extern pfmlib_pmu_t amd64_fam14h_bobcat_support; | 
 | extern pfmlib_pmu_t amd64_fam15h_interlagos_support; | 
 | extern pfmlib_pmu_t amd64_fam15h_nb_support; | 
 | extern pfmlib_pmu_t intel_p6_support; | 
 | extern pfmlib_pmu_t intel_ppro_support; | 
 | extern pfmlib_pmu_t intel_pii_support; | 
 | extern pfmlib_pmu_t intel_pm_support; | 
 | extern pfmlib_pmu_t sicortex_support; | 
 | extern pfmlib_pmu_t netburst_support; | 
 | extern pfmlib_pmu_t netburst_p_support; | 
 | extern pfmlib_pmu_t intel_coreduo_support; | 
 | extern pfmlib_pmu_t intel_core_support; | 
 | extern pfmlib_pmu_t intel_x86_arch_support; | 
 | extern pfmlib_pmu_t intel_atom_support; | 
 | extern pfmlib_pmu_t intel_nhm_support; | 
 | extern pfmlib_pmu_t intel_nhm_ex_support; | 
 | extern pfmlib_pmu_t intel_nhm_unc_support; | 
 | extern pfmlib_pmu_t intel_snb_support; | 
 | extern pfmlib_pmu_t intel_snb_unc_cbo0_support; | 
 | extern pfmlib_pmu_t intel_snb_unc_cbo1_support; | 
 | extern pfmlib_pmu_t intel_snb_unc_cbo2_support; | 
 | extern pfmlib_pmu_t intel_snb_unc_cbo3_support; | 
 | extern pfmlib_pmu_t intel_snb_ep_support; | 
 | extern pfmlib_pmu_t intel_ivb_support; | 
 | extern pfmlib_pmu_t intel_ivb_unc_cbo0_support; | 
 | extern pfmlib_pmu_t intel_ivb_unc_cbo1_support; | 
 | extern pfmlib_pmu_t intel_ivb_unc_cbo2_support; | 
 | extern pfmlib_pmu_t intel_ivb_unc_cbo3_support; | 
 | extern pfmlib_pmu_t intel_ivb_ep_support; | 
 | extern pfmlib_pmu_t intel_hsw_support; | 
 | extern pfmlib_pmu_t intel_hsw_ep_support; | 
 | extern pfmlib_pmu_t intel_bdw_support; | 
 | extern pfmlib_pmu_t intel_rapl_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_cb0_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_cb1_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_cb2_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_cb3_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_cb4_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_cb5_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_cb6_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_cb7_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_ha_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_imc0_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_imc1_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_imc2_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_imc3_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_pcu_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_qpi0_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_qpi1_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_ubo_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_r2pcie_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_r3qpi0_support; | 
 | extern pfmlib_pmu_t intel_snbep_unc_r3qpi1_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb0_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb1_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb2_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb3_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb4_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb5_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb6_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb7_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb8_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb9_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb10_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb11_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb12_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb13_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_cb14_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_ha0_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_ha1_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_imc0_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_imc1_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_imc2_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_imc3_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_imc4_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_imc5_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_imc6_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_imc7_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_pcu_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_qpi0_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_qpi1_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_qpi2_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_ubo_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_r2pcie_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_r3qpi0_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_r3qpi1_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_r3qpi2_support; | 
 | extern pfmlib_pmu_t intel_ivbep_unc_irp_support; | 
 | extern pfmlib_pmu_t intel_knc_support; | 
 | extern pfmlib_pmu_t intel_slm_support; | 
 | extern pfmlib_pmu_t power4_support; | 
 | extern pfmlib_pmu_t ppc970_support; | 
 | extern pfmlib_pmu_t ppc970mp_support; | 
 | extern pfmlib_pmu_t power5_support; | 
 | extern pfmlib_pmu_t power5p_support; | 
 | extern pfmlib_pmu_t power6_support; | 
 | extern pfmlib_pmu_t power7_support; | 
 | extern pfmlib_pmu_t power8_support; | 
 | extern pfmlib_pmu_t torrent_support; | 
 | extern pfmlib_pmu_t sparc_support; | 
 | extern pfmlib_pmu_t sparc_ultra12_support; | 
 | extern pfmlib_pmu_t sparc_ultra3_support; | 
 | extern pfmlib_pmu_t sparc_ultra3i_support; | 
 | extern pfmlib_pmu_t sparc_ultra3plus_support; | 
 | extern pfmlib_pmu_t sparc_ultra4plus_support; | 
 | extern pfmlib_pmu_t sparc_niagara1_support; | 
 | extern pfmlib_pmu_t sparc_niagara2_support; | 
 | extern pfmlib_pmu_t cell_support; | 
 | extern pfmlib_pmu_t perf_event_support; | 
 | extern pfmlib_pmu_t perf_event_raw_support; | 
 | extern pfmlib_pmu_t intel_wsm_sp_support; | 
 | extern pfmlib_pmu_t intel_wsm_dp_support; | 
 | extern pfmlib_pmu_t intel_wsm_unc_support; | 
 | extern pfmlib_pmu_t arm_cortex_a7_support; | 
 | extern pfmlib_pmu_t arm_cortex_a8_support; | 
 | extern pfmlib_pmu_t arm_cortex_a9_support; | 
 | extern pfmlib_pmu_t arm_cortex_a15_support; | 
 | extern pfmlib_pmu_t arm_1176_support; | 
 | extern pfmlib_pmu_t arm_qcom_krait_support; | 
 | extern pfmlib_pmu_t arm_cortex_a57_support; | 
 | extern pfmlib_pmu_t arm_cortex_a53_support; | 
 | extern pfmlib_pmu_t arm_xgene_support; | 
 | extern pfmlib_pmu_t mips_74k_support; | 
 | extern pfmlib_pmu_t s390x_cpum_cf_support; | 
 | extern pfmlib_pmu_t s390x_cpum_sf_support; | 
 |  | 
 | extern pfmlib_os_t *pfmlib_os; | 
 | extern pfmlib_os_t pfmlib_os_perf; | 
 | extern pfmlib_os_t pfmlib_os_perf_ext; | 
 |  | 
 | extern char *pfmlib_forced_pmu; | 
 |  | 
 | #define this_pe(t)		(((pfmlib_pmu_t *)t)->pe) | 
 | #define this_atdesc(t)		(((pfmlib_pmu_t *)t)->atdesc) | 
 |  | 
 | #define LIBPFM_ARRAY_SIZE(a) (sizeof(a) / sizeof(typeof(*(a)))) | 
 | /* | 
 |  * population count (number of bits set) | 
 |  */ | 
 | static inline int | 
 | pfmlib_popcnt(unsigned long v) | 
 | { | 
 | 	int sum = 0; | 
 |  | 
 | 	for(; v ; v >>=1) { | 
 | 		if (v & 0x1) sum++; | 
 | 	} | 
 | 	return sum; | 
 | } | 
 |  | 
 | /* | 
 |  * find next bit set | 
 |  */ | 
 | static inline size_t | 
 | pfmlib_fnb(unsigned long value, size_t nbits, int p) | 
 | { | 
 | 	unsigned long m; | 
 | 	size_t i; | 
 |  | 
 | 	for(i=p; i < nbits; i++) { | 
 | 		m = 1 << i; | 
 | 		if (value & m) | 
 | 			return i; | 
 | 	} | 
 | 	return i; | 
 | } | 
 |  | 
 | /* | 
 |  * PMU + internal idx -> external opaque idx | 
 |  */ | 
 | static inline int | 
 | pfmlib_pidx2idx(pfmlib_pmu_t *pmu, int pidx) | 
 | { | 
 | 	int idx; | 
 |  | 
 | 	idx = pmu->pmu << PFMLIB_PMU_SHIFT; | 
 | 	idx |= pidx; | 
 |  | 
 | 	return  idx; | 
 | } | 
 |  | 
 | #define pfmlib_for_each_bit(x, m) \ | 
 | 	for((x) = pfmlib_fnb((m), (sizeof(m)<<3), 0); (x) < (sizeof(m)<<3); (x) = pfmlib_fnb((m), (sizeof(m)<<3), (x)+1)) | 
 |  | 
 | #ifdef __linux__ | 
 |  | 
 | #define PFMLIB_VALID_PERF_PATTRS(f)  \ | 
 | 	.validate_pattrs[PFM_OS_PERF_EVENT] = f, \ | 
 | 	.validate_pattrs[PFM_OS_PERF_EVENT_EXT]	= f | 
 |  | 
 | #define PFMLIB_ENCODE_PERF(f)  \ | 
 | 	.get_event_encoding[PFM_OS_PERF_EVENT] = f, \ | 
 | 	.get_event_encoding[PFM_OS_PERF_EVENT_EXT] = f | 
 |  | 
 | #define PFMLIB_OS_DETECT(f)  \ | 
 | 	.os_detect[PFM_OS_PERF_EVENT] = f, \ | 
 | 	.os_detect[PFM_OS_PERF_EVENT_EXT] = f | 
 | #else | 
 | #define PFMLIB_VALID_PERF_PATTRS(f) \ | 
 | 	.validate_pattrs[PFM_OS_PERF_EVENT] = NULL, \ | 
 | 	.validate_pattrs[PFM_OS_PERF_EVENT_EXT]	= NULL | 
 |  | 
 | #define PFMLIB_ENCODE_PERF(f)  \ | 
 | 	.get_event_encoding[PFM_OS_PERF_EVENT] = NULL, \ | 
 | 	.get_event_encoding[PFM_OS_PERF_EVENT_EXT] = NULL | 
 |  | 
 | #define PFMLIB_OS_DETECT(f)  \ | 
 | 	.os_detect[PFM_OS_PERF_EVENT] = NULL, \ | 
 | 	.os_detect[PFM_OS_PERF_EVENT_EXT] = NULL | 
 | #endif | 
 |  | 
 | static inline int | 
 | is_empty_attr(const pfmlib_attr_desc_t *a) | 
 | { | 
 | 	return !a || !a->name || strlen(a->name) == 0 ? 1 : 0; | 
 | } | 
 |  | 
 | #endif /* __PFMLIB_PRIV_H__ */ |