--- papi-2.3.4.3/src/linux-perfctr.c.~1~ 2003-03-21 11:41:03.000000000 +0100 +++ papi-2.3.4.3/src/linux-perfctr.c 2003-06-19 01:03:22.000000000 +0200 @@ -26,6 +26,48 @@ #include "ia32_presets.h" +/* + * Simulate relevant parts the current perfctr API on older + * perfctr versions. + */ +#ifdef PERFCTR_ABI_VERSION /* perfctr-2.5 or higher */ +#define PERFCTR25 +#endif + +#if defined(PERFCTR25) /* perfctr-2.5 */ + +#define cpu_control_p4_escr(cpu_control) (cpu_control).p4.escr + +#elif defined(PERFCTR20) /* perfctr-2.3 or perfctr-2.4 */ + +#define cpu_control_p4_escr(cpu_control) (cpu_control).evntsel_aux + +static unsigned int perfctr_info_nrctrs(const struct perfctr_info *info) +{ + return perfctr_cpu_nrctrs(info); +} + +static const char *perfctr_info_cpu_name(const struct perfctr_info *info) +{ + return perfctr_cpu_name(info); +} + +#elif defined(PERFCTR16) /* perfctr-1.6, obsolete, may not work */ + +static unsigned int perfctr_info_nrctrs(const struct perfctr_info *info) +{ + return perfctr_cpu_nrctrs(info) - 1; /* exclude TSC */ +} + +static const char *perfctr_info_cpu_name(const struct perfctr_info *info) +{ + return perfctr_cpu_name(info); +} + +#define PERFCTR_FEATURE_PCINT 0 + +#endif /* PERFCTR16 */ + /* First entry is mask, counter code 1, counter code 2, and TSC. A high bit in the mask entry means it is an OR mask, not an and mask. This means that the same even is available on either @@ -351,13 +393,20 @@ #if defined(PERFCTR18) || defined(PERFCTR20) if (vperfctr_info(dev, &info) < 0) return(PAPI_ESYS); +#if 0 /* this is broken */ if (strstr(info.version,"2.4") != info.version) { fprintf(stderr,"Version mismatch of perfctr: compiled 2.4 or higher vs. installed %s\n",info.version); return(PAPI_ESBSTR); } +#endif +#elif defined(PERFCTR16) + if (perfctr_info(dev, &info) < 0) + return(PAPI_ESYS); +#endif + + strcpy(_papi_system_info.hw_info.model_string,perfctr_info_cpu_name(&info)); - strcpy(_papi_system_info.hw_info.model_string,perfctr_cpu_name(&info)); _papi_system_info.supports_hw_overflow = (info.cpu_features & PERFCTR_FEATURE_PCINT) ? 1 : 0; DBG((stderr,"Hardware/OS %s support counter generated interrupts\n", @@ -368,20 +417,9 @@ _papi_system_info.supports_hw_overflow = 0; #endif _papi_system_info.supports_hw_profile = 0; /* != _papi_system_info.supports_hw_overflow? */ -#ifdef PERFCTR20 - _papi_system_info.num_cntrs = perfctr_cpu_nrctrs(&info); - _papi_system_info.num_gp_cntrs = perfctr_cpu_nrctrs(&info); -#else /* PERFCTR20 */ - _papi_system_info.num_cntrs = perfctr_cpu_nrctrs(&info) - 1; - _papi_system_info.num_gp_cntrs = perfctr_cpu_nrctrs(&info) - 1; -#endif /* PERFCTR20 */ -#elif defined(PERFCTR16) /* Neither PERFCTR18 nor PERFCTR20 */ - if (perfctr_info(dev, &info) < 0) - return(PAPI_ESYS); - strcpy(_papi_system_info.hw_info.model_string,perfctr_cpu_name(&info)); - _papi_system_info.num_cntrs = perfctr_cpu_nrctrs(&info) - 1; - _papi_system_info.num_gp_cntrs = perfctr_cpu_nrctrs(&info) - 1; -#endif /* PERFCTR18 */ + + _papi_system_info.num_cntrs = perfctr_info_nrctrs(&info); + _papi_system_info.num_gp_cntrs = _papi_system_info.num_cntrs; _papi_system_info.hw_info.model = (int)info.cpu_type; _papi_system_info.hw_info.mhz = (float) info.cpu_khz / 1000.0; @@ -1357,9 +1395,9 @@ contr->cpu_control.evntsel[cntr1]=contr->cpu_control.evntsel[cntr2]; contr->cpu_control.evntsel[cntr2] = ui; - ui=contr->cpu_control.evntsel_aux[cntr1]; - contr->cpu_control.evntsel_aux[cntr1]=contr->cpu_control.evntsel_aux[cntr2]; - contr->cpu_control.evntsel_aux[cntr2] = ui; + ui = cpu_control_p4_escr(contr->cpu_control)[cntr1]; + cpu_control_p4_escr(contr->cpu_control)[cntr1] = cpu_control_p4_escr(contr->cpu_control)[cntr2]; + cpu_control_p4_escr(contr->cpu_control)[cntr2] = ui; si=contr->cpu_control.ireset[cntr1]; contr->cpu_control.ireset[cntr1]=contr->cpu_control.ireset[cntr2]; --- papi-2.3.4.3/src/perfctr-p4.c.~1~ 2003-03-31 22:22:33.000000000 +0200 +++ papi-2.3.4.3/src/perfctr-p4.c 2003-06-19 00:43:52.000000000 +0200 @@ -123,6 +123,30 @@ /* END LOCAL DECLARATIONS */ /**************************/ +#ifdef PERFCTR_ABI_VERSION /* perfctr-2.5 or higher */ +#define PERFCTR25 +#endif + +#ifdef PERFCTR25 + +#define cpu_control_p4_escr(cpu_control) (cpu_control).p4.escr + +#else + +#define cpu_control_p4_escr(cpu_control) (cpu_control).evntsel_aux + +static unsigned int perfctr_info_nrctrs(const struct perfctr_info *info) +{ + return perfctr_cpu_nrctrs(info); +} + +static const char *perfctr_info_cpu_name(const struct perfctr_info *info) +{ + return perfctr_cpu_name(info); +} + +#endif + #ifndef PAPI3 int _papi_hwd_query(int preset_index, int *flags, char **note) { @@ -173,7 +197,7 @@ sprintf(tmpnote,"%s0x%08x/0x%08x@0x%08x", (unum >= 1) ? " " : "", - tmp2->evntsel,tmp2->evntsel_aux,(ffs(tmp2->pmc_map)-1)|FAST_RDPMC); + tmp2->evntsel,tmp2->p4_escr,(ffs(tmp2->pmc_map)-1)|FAST_RDPMC); if ((strlen(note) + strlen(tmpnote)) < (PAPI_MAX_STR_LEN-1)) strcat(note,tmpnote); } @@ -292,14 +316,14 @@ if (vperfctr_info(dev, &info) < 0) error_return(PAPI_ESYS,VINFO_ERROR); - strcpy(_papi_hwi_system_info.hw_info.model_string,perfctr_cpu_name(&info)); + strcpy(_papi_hwi_system_info.hw_info.model_string,perfctr_info_cpu_name(&info)); _papi_hwi_system_info.supports_hw_overflow = (info.cpu_features & PERFCTR_FEATURE_PCINT) ? 1 : 0; SUBDBG("Hardware/OS %s support counter generated interrupts\n", _papi_hwi_system_info.supports_hw_overflow ? "does" : "does not"); - _papi_hwi_system_info.num_cntrs = perfctr_cpu_nrctrs(&info); - _papi_hwi_system_info.num_gp_cntrs = perfctr_cpu_nrctrs(&info); + _papi_hwi_system_info.num_cntrs = perfctr_info_nrctrs(&info); + _papi_hwi_system_info.num_gp_cntrs = _papi_hwi_system_info.num_cntrs; _papi_hwi_system_info.hw_info.model = info.cpu_type; _papi_hwi_system_info.hw_info.vendor = xlate_cpu_type_to_vendor(info.cpu_type); @@ -445,8 +469,8 @@ SUBDBG("pmc_map[%u]\t\t%u\n", i, control->pmc_map[i]); } SUBDBG("evntsel[%u]\t\t0x%08X\n", i, control->evntsel[i]); - if( control->evntsel_aux[i] ) - SUBDBG("evntsel_aux[%u]\t0x%08X\n", i, control->evntsel_aux[i]); + if( cpu_control_p4_escr(*control)[i] ) + SUBDBG("p4_escr[%u]\t0x%08X\n", i, cpu_control_p4_escr(*control)[i]); if (control->ireset[i]) SUBDBG("ireset[%u]\t%d\n",i,control->ireset[i]); } @@ -700,7 +724,7 @@ evset_info->allocated_registers.selector |= 1 << allocated[i]; evset_info->control.cpu_control.pmc_map[index] = allocated[i] | FAST_RDPMC; evset_info->control.cpu_control.evntsel[index] = preset->info->data[i].evntsel; - evset_info->control.cpu_control.evntsel_aux[index] = preset->info->data[i].evntsel_aux; + cpu_control_p4_escr(evset_info->control.cpu_control)[index] = preset->info->data[i].p4_escr; evset_info->control.cpu_control.ireset[index] = 0; if (preset->info->data[i].pebs_enable) evset_info->control.cpu_control.p4.pebs_enable = preset->info->data[i].pebs_enable; @@ -802,7 +826,7 @@ SUBDBG("Clearing pmc event entry %d\n",j); evset_info->control.cpu_control.pmc_map[j] = 0; evset_info->control.cpu_control.evntsel[j] = 0; - evset_info->control.cpu_control.evntsel_aux[j] = 0; + cpu_control_p4_escr(evset_info->control.cpu_control)[j] = 0; evset_info->control.cpu_control.ireset[j] = 0; } @@ -826,8 +850,8 @@ evset_info->control.cpu_control.pmc_map[j+ev_info->num_hardware_events]; evset_info->control.cpu_control.evntsel[j] = evset_info->control.cpu_control.evntsel[j+ev_info->num_hardware_events]; - evset_info->control.cpu_control.evntsel_aux[j] = - evset_info->control.cpu_control.evntsel_aux[j+ev_info->num_hardware_events]; + cpu_control_p4_escr(evset_info->control.cpu_control)[j] = + cpu_control_p4_escr(evset_info->control.cpu_control)[j+ev_info->num_hardware_events]; evset_info->control.cpu_control.ireset[j] = evset_info->control.cpu_control.ireset[j+ev_info->num_hardware_events]; } @@ -867,7 +891,7 @@ SUBDBG("Clearing pmc event entry %d\n",j); this_state->control.control.cpu_control.pmc_map[j] = 0; this_state->control.control.cpu_control.evntsel[j] = 0; - this_state->control.control.cpu_control.evntsel_aux[j] = 0; + cpu_control_p4_escr(this_state->control.control.cpu_control)[j] = 0; this_state->control.control.cpu_control.ireset[j] = 0; } #endif @@ -896,7 +920,7 @@ state->control.cpu_control.pmc_map[num] = add->pmc_map; state->control.cpu_control.evntsel[num] = add->evntsel; - state->control.cpu_control.evntsel_aux[num] = add->evntsel_aux; + cpu_control_p4_escr(state->control.cpu_control)[num] = add->p4_escr; if (add->ireset) { state->control.cpu_control.ireset[num] = add->ireset; @@ -957,9 +981,9 @@ contr->cpu_control.evntsel[cntr1]=contr->cpu_control.evntsel[cntr2]; contr->cpu_control.evntsel[cntr2] = ui; - ui=contr->cpu_control.evntsel_aux[cntr1]; - contr->cpu_control.evntsel_aux[cntr1]=contr->cpu_control.evntsel_aux[cntr2]; - contr->cpu_control.evntsel_aux[cntr2] = ui; + ui = cpu_control_p4_escr(contr->cpu_control)[cntr1]; + cpu_control_p4_escr(contr->cpu_control)[cntr1] = cpu_control_p4_escr(contr->cpu_control)[cntr2]; + cpu_control_p4_escr(contr->cpu_control)[cntr2] = ui; si=contr->cpu_control.ireset[cntr1]; contr->cpu_control.ireset[cntr1]=contr->cpu_control.ireset[cntr2]; --- papi-2.3.4.3/src/perfctr-p4.h.~1~ 2003-05-27 18:32:32.000000000 +0200 +++ papi-2.3.4.3/src/perfctr-p4.h 2003-06-19 00:27:00.000000000 +0200 @@ -43,7 +43,7 @@ typedef struct P4_perfctr_event { unsigned pmc_map; unsigned evntsel; - unsigned evntsel_aux; + unsigned p4_escr; unsigned pebs_enable; unsigned pebs_matrix_vert; unsigned ireset;