35#define PMU_GEN_IA64_MAX_COUNTERS 4
39#define PME_GEN_COUNT 2
49#define PFMLIB_GEN_IA64_PMC_BASE 0
70typedef struct pme_entry {
77#define pmc_plm pmc_gen_count_reg.pmc_plm
78#define pmc_ev pmc_gen_count_reg.pmc_ev
79#define pmc_oi pmc_gen_count_reg.pmc_oi
80#define pmc_pm pmc_gen_count_reg.pmc_pm
81#define pmc_es pmc_gen_count_reg.pmc_es
87#define PME_IA64_GEN_CPU_CYCLES 0
89#define PME_IA64_GEN_INST_RETIRED 1
90 {
"IA64_INST_RETIRED", },
107#define PFMLIB_GEN_IA64_PMC_BASE 0
120 if (range[strlen(range)-1] ==
'\n')
121 range[strlen(range)-1] =
'\0';
125 while (*p && *p !=
' ' && *p !=
'-') p++;
127 if (*p ==
'\0')
break;
136 while (*p && *p !=
' ' && *p !=
'-') p++;
151 fprintf(
stderr,
"%s.%s : bitmask too small need %d bits\n", __FILE__, __FUNCTION__,
start);
163 fp = fopen(
"/proc/pal/cpu0/perfmon_info",
"r");
167 p = fgets(buffer,
sizeof(buffer)-1,
fp);
169 if (p == NULL)
break;
171 if ((p = strchr(buffer,
':')) == NULL)
break;
175 if (!strncmp(
"Counter width", buffer, 13)) {
180 if (!strncmp(
"PMC/PMD pairs", buffer, 13)) {
185 if (!strncmp(
"Cycle event number", buffer, 18)) {
190 if (!strncmp(
"Retired event number", buffer, 20)) {
195 if (!strncmp(
"Cycles count capable", buffer, 20)) {
200 if (!strncmp(
"Retired bundles count capable", buffer, 29)) {
205 if (!strncmp(
"Implemented PMC", buffer, 15)) {
210 if (!strncmp(
"Implemented PMD", buffer, 15)) {
245 for(
i=4;
i < 8;
i++) {
276 for(
i=0;
i < cnt;
i++) {
277 if (as[
i]==0)
return 0;
294#define has_counter(e,b) (pfm_regmask_isset(&generic_pe[e].pme_counters, b) ? b : 0)
295 unsigned int max_l0, max_l1, max_l2, max_l3;
301 unsigned int i,j,k,l;
318 DPRINT(
"max_l0=%u max_l1=%u max_l2=%u max_l3=%u\n", max_l0, max_l1, max_l2, max_l3);
334 if (j ==
i)
continue;
342 if(k ==
i || k == j)
continue;
350 if(l ==
i || l == j || l == k)
continue;
364 for (j=0; j < cnt ; j++ ) {
379 __pfm_vbprintf(
"[PMC%u(pmc%u)=0x%lx,es=0x%02x,plm=%d pm=%d] %s\n",
424 memset(counters, 0,
sizeof(*counters));
465 *str = strdup(
"CPU cycles");
468 *str = strdup(
"IA-64 instructions retired");
static struct timeval start
static double b[MATRIX_SIZE][MATRIX_SIZE]
static double c[MATRIX_SIZE][MATRIX_SIZE]
int fclose(FILE *__stream)
#define PFMLIB_GEN_IA64_PMU
static int pfm_regmask_set(pfmlib_regmask_t *h, unsigned int b)
static int pfm_regmask_weight(pfmlib_regmask_t *h, unsigned int *w)
#define PFMLIB_ERR_TOOMANY
static int pfm_regmask_isset(pfmlib_regmask_t *h, unsigned int b)
#define PFMLIB_ERR_NOASSIGN
#define PFMLIB_PFP_SYSTEMWIDE
#define PFMLIB_ERR_NOTSUPP
static pfmlib_regmask_t pfm_gen_ia64_impl_pmds
static pme_gen_ia64_entry_t generic_pe[PME_GEN_COUNT]
static void pfm_gen_ia64_get_hw_counter_width(unsigned int *width)
static int pfm_gen_ia64_init(void)
static void pfm_gen_ia64_get_impl_pmcs(pfmlib_regmask_t *impl_pmcs)
static void pfm_gen_ia64_get_impl_pmds(pfmlib_regmask_t *impl_pmds)
static int pfm_gen_ia64_dispatch_counters(pfmlib_input_param_t *inp, pfmlib_output_param_t *outp)
#define PME_IA64_GEN_CPU_CYCLES
static void pfm_gen_ia64_get_impl_counters(pfmlib_regmask_t *impl_counters)
static int pfm_gen_ia64_get_event_desc(unsigned int ev, char **str)
static void pfm_gen_ia64_get_event_counters(unsigned int j, pfmlib_regmask_t *counters)
#define PME_IA64_GEN_INST_RETIRED
#define has_counter(e, b)
static pfmlib_regmask_t pfm_gen_ia64_impl_pmcs
pfm_pmu_support_t generic_ia64_support
static int pfm_gen_ia64_dispatch_events(pfmlib_input_param_t *inp, void *dummy1, pfmlib_output_param_t *outp, void *dummy2)
static int pfm_gen_ia64_counters
static int valid_assign(unsigned int *as, pfmlib_regmask_t *r_pmcs, unsigned int cnt)
static int pfm_gen_ia64_initialize(void)
static int pfm_gen_ia64_get_cycle_event(pfmlib_event_t *e)
static int pfm_gen_ia64_detect(void)
#define PMU_GEN_IA64_MAX_COUNTERS
static int pfm_gen_ia64_get_event_code(unsigned int i, unsigned int cnt, int *code)
static int pfm_gen_ia64_get_inst_retired(pfmlib_event_t *e)
#define PFMLIB_GEN_IA64_PMC_BASE
static int pfm_gen_ia64_counter_width
static int parse_counter_range(char *range, pfmlib_regmask_t *b)
static void pfm_gen_ia64_forced_initialize(void)
static char * pfm_gen_ia64_get_event_name(unsigned int i)
#define PMU_GEN_IA64_FIRST_COUNTER
void __pfm_vbprintf(const char *fmt,...)
#define DPRINT(fmt, a...)
pfmlib_reg_t pfp_pmds[PFMLIB_MAX_PMDS]
pfmlib_reg_t pfp_pmcs[PFMLIB_MAX_PMCS]
unsigned int pfp_pmc_count
unsigned int pfp_pmd_count
unsigned long long reg_value
unsigned long long reg_addr
pme_gen_ia64_entry_code_t pme_entry_code
pfmlib_regmask_t pme_counters
pme_gen_ia64_code_t pme_gen_code