--- papi-2.3.3/src/linux-perfctr.c.~1~ 2003-02-06 20:44:02.000000000 +0100 +++ papi-2.3.3/src/linux-perfctr.c 2003-03-15 19:30:01.000000000 +0100 @@ -39,6 +39,39 @@ */ #include "ia32_presets.h" +/* + * Simulate the current perfctr API on older perfctr versions. + * Incomplete: linux-perfctr.c is too far gone in #ifdef hell + * due to perfctr-1.6 support remaining. + */ +#ifdef PERFCTR_ABI_VERSION /* perfctr-2.5 or higher */ +#define PERFCTR25 +#endif + +#if defined(PERFCTR25) /* perfctr-2.5 */ + +/* nothing; this is the current API */ + +#elif defined(PERFCTR20) /* perfctr-2.x, x <= 4 */ +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, totally obsolete */ +static unsigned int perfctr_info_nrctrs(const struct perfctr_info *info) +{ + return perfctr_cpu_nrctrs(info) - 1; +} +static const char *perfctr_info_cpu_name(const struct perfctr_info *info) +{ + return perfctr_cpu_name(info); +} +#define PERFCTR_FEATURE_PCINT 0 +#endif /* Low level functions, should not handle errors, just return codes. */ @@ -355,7 +388,13 @@ #ifdef PERFCTR18 /* And PERFCTR20 */ if (vperfctr_info(dev, &info) < 0) return(PAPI_ESYS); - strcpy(_papi_system_info.hw_info.model_string,perfctr_cpu_name(&info)); +#elif defined(PERFCTR16) /* Neither PERFCTR18 nor PERFCTR20 */ + if (perfctr_info(dev, &info) < 0) + return(PAPI_ESYS); +#endif + + strcpy(_papi_system_info.hw_info.model_string,perfctr_info_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", @@ -366,20 +405,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; @@ -1355,9 +1383,13 @@ contr->cpu_control.evntsel[cntr1]=contr->cpu_control.evntsel[cntr2]; contr->cpu_control.evntsel[cntr2] = ui; + /* this substrate doesn't support P4, so don't bother swapping + p4.escr[cntr1] and [cntr2] (formerly evntsel_aux[]) */ +#if 0 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; +#endif si=contr->cpu_control.ireset[cntr1]; contr->cpu_control.ireset[cntr1]=contr->cpu_control.ireset[cntr2]; --- papi-2.3.3/src/perfctr-p4.c.~1~ 2003-02-06 20:44:04.000000000 +0100 +++ papi-2.3.3/src/perfctr-p4.c 2003-03-15 19:22:25.000000000 +0100 @@ -123,6 +123,21 @@ /* END LOCAL DECLARATIONS */ /**************************/ +#ifdef PERFCTR_ABI_VERSION /* perfctr-2.5 or higher */ +#define PERFCTR25 +#endif + +#ifndef PERFCTR25 /* perfctr-2.x, x <= 4 */ +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) { @@ -181,7 +196,7 @@ sprintf(tmpnote,"%s0x%08x/0x%08x@0x%08x", (unum >= 1) ? " " : "", - tmp2->evntsel,tmp2->evntsel_aux,tmp2->pmc_map); + tmp2->evntsel,tmp2->p4_escr,tmp2->pmc_map); if ((strlen(note) + strlen(tmpnote)) < (PAPI_MAX_STR_LEN-1)) strcat(note,tmpnote); } @@ -300,14 +315,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); @@ -452,8 +467,13 @@ SUBDBG("pmc_map[%u]\t\t%u\n", i, control->pmc_map[i]); } SUBDBG("evntsel[%u]\t\t0x%08X\n", i, control->evntsel[i]); +#ifdef PERFCTR25 + if( control->p4.escr[i] ) + SUBDBG("p4.escr[%u]\t0x%08X\n", i, control->p4.escr[i]); +#else if( control->evntsel_aux[i] ) SUBDBG("evntsel_aux[%u]\t0x%08X\n", i, control->evntsel_aux[i]); +#endif } if( control->p4.pebs_enable ) SUBDBG("pebs_enable\t0x%08X\n", @@ -761,7 +781,11 @@ { evset_info->control.cpu_control.pmc_map[index] = preset->info->data[i].pmc_map; 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; +#ifdef PERFCTR25 + evset_info->control.cpu_control.p4.escr[index] = preset->info->data[i].p4_escr; +#else + evset_info->control.cpu_control.evntsel_aux[index] = preset->info->data[i].p4_escr; +#endif 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; @@ -881,7 +905,11 @@ 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; +#ifdef PERFCTR25 + evset_info->control.cpu_control.p4.escr[j] = 0; +#else evset_info->control.cpu_control.evntsel_aux[j] = 0; +#endif evset_info->control.cpu_control.ireset[j] = 0; } @@ -905,8 +933,13 @@ 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]; +#ifdef PERFCTR25 + evset_info->control.cpu_control.p4.escr[j] = + evset_info->control.cpu_control.p4.escr[j+ev_info->num_hardware_events]; +#else evset_info->control.cpu_control.evntsel_aux[j] = evset_info->control.cpu_control.evntsel_aux[j+ev_info->num_hardware_events]; +#endif evset_info->control.cpu_control.ireset[j] = evset_info->control.cpu_control.ireset[j+ev_info->num_hardware_events]; } @@ -946,7 +979,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; + this_state->control.control.cpu_control.p4.escr[j] = 0; this_state->control.control.cpu_control.ireset[j] = 0; } #endif @@ -975,7 +1008,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; + state->control.cpu_control.p4.escr[num] = add->p4_escr; if (add->ireset) { state->control.cpu_control.ireset[num] = add->ireset; --- papi-2.3.3/src/perfctr-p4.h.~1~ 2002-12-11 01:45:27.000000000 +0100 +++ papi-2.3.3/src/perfctr-p4.h 2003-03-15 19:22:25.000000000 +0100 @@ -42,7 +42,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;