static int check_native_events(char *target, hwi_presets_t* results) { INTDBG("ENTER: target: %p (%s), results: %p\n", target, target, results); int ret; // find this native events code if ( ( ret = _papi_hwi_native_name_to_code( target, (int *)(&results->code[results->count])) ) != PAPI_OK ) { INTDBG("EXIT: returned: 0, call to convert name to event code failed with ret: %d\n", ret); return 0; } // if the code returned was 0, return to show it is not a valid native event if ( results->code[results->count] == 0 ) { INTDBG( "EXIT: returned: 0, event code not found\n"); return 0; } // if this native event is not for component 0, return to show it can not be used in derived events // it should be possible to create derived events for other components as long as all events in the derived event are associated with the same component if ( _papi_hwi_component_index(results->code[results->count]) != 0 ) { INTDBG( "EXIT: returned: 0, new event not associated with component 0 (current limitation with derived events)\n"); return 0; } // found = 1; INTDBG("\tFound a native event %s\n", target); results->name[results->count++] = papi_strdup(target); INTDBG( "EXIT: returned: 1\n"); return 1; }
/* The function below, _xml_start(), is a hook into expat's XML * parser. _xml_start() defines how the parser handles the * opening tags in PAPI's XML file. This function can be understood * more easily if you follow along with its logic while looking at * papi_events.xml. The location variable is a global telling us * where we are in the XML file. Have we found our architecture's * events yet? Are we looking at an event definition?...etc. */ static void _xml_start( void *data, const char *el, const char **attr ) { int native_encoding; if ( location == SPARSE_BEGIN && !strcmp( "papistdevents", el ) ) { location = SPARSE_EVENT_SEARCH; } else if ( location == SPARSE_EVENT_SEARCH && !strcmp( "papievent", el ) ) { _papi_hwi_presets[sparse_index].info.symbol = papi_strdup( attr[1] ); // strcpy(_papi_hwi_presets.info[sparse_index].symbol, attr[1]); location = SPARSE_EVENT; } else if ( location == SPARSE_EVENT && !strcmp( "desc", el ) ) { location = SPARSE_DESC; } else if ( location == ARCH_SEARCH && !strcmp( "availevents", el ) && !strcmp( xml_arch, attr[1] ) ) { location = DENSE_EVENT_SEARCH; } else if ( location == DENSE_EVENT_SEARCH && !strcmp( "papievent", el ) ) { if ( !strcmp( "PAPI_NULL", attr[1] ) ) { location = FINISHED; return; } else if ( PAPI_event_name_to_code( ( char * ) attr[1], &sparse_index ) != PAPI_OK ) { PAPIERROR( "Improper Preset name given in XML file for %s.", attr[1] ); error = 1; } sparse_index &= PAPI_PRESET_AND_MASK; /* allocate and initialize data space for this event */ papi_valid_free( _papi_hwi_presets[sparse_index].data ); _papi_hwi_presets[sparse_index].data = papi_malloc( sizeof ( hwi_preset_data_t ) ); native_index = 0; _papi_hwi_presets[sparse_index].data->native[native_index] = PAPI_NULL; _papi_hwi_presets[sparse_index].data->operation[0] = '\0'; if ( attr[2] ) { /* derived event */ _papi_hwi_presets[sparse_index].data->derived = _papi_hwi_derived_type( ( char * ) attr[3] ); /* where does DERIVED POSTSCRIPT get encoded?? */ if ( _papi_hwi_presets[sparse_index].data->derived == -1 ) { PAPIERROR( "No derived type match for %s in Preset XML file.", attr[3] ); error = 1; } if ( attr[5] ) { _papi_hwi_presets[sparse_index].count = atoi( attr[5] ); } else { PAPIERROR( "No count given for %s in Preset XML file.", attr[1] ); error = 1; } } else { _papi_hwi_presets[sparse_index].data->derived = NOT_DERIVED; _papi_hwi_presets[sparse_index].count = 1; } location = DENSE_NATIVE_SEARCH; } else if ( location == DENSE_NATIVE_SEARCH && !strcmp( "native", el ) ) { location = DENSE_NATIVE_DESC; } else if ( location == DENSE_NATIVE_DESC && !strcmp( "event", el ) ) { if ( _papi_hwi_native_name_to_code( attr[1], &native_encoding ) != PAPI_OK ) { printf( "Improper Native name given in XML file for %s\n", attr[1] ); PAPIERROR( "Improper Native name given in XML file for %s\n", attr[1] ); error = 1; } _papi_hwi_presets[sparse_index].data->native[native_index] = native_encoding; native_index++; _papi_hwi_presets[sparse_index].data->native[native_index] = PAPI_NULL; } else if ( location && location != ARCH_SEARCH && location != FINISHED ) { PAPIERROR( "Poorly-formed Preset XML document." ); error = 1; } }
static int generate_preset_search_map( hwi_search_t ** maploc, hwi_dev_notes_t ** noteloc, pfm_preset_search_entry_t * strmap ) { int k = 0, term; unsigned int i = 0, j = 0; hwi_search_t *psmap; hwi_dev_notes_t *notemap; int event_idx; /* Count up the proposed presets */ while ( strmap[i].preset ) { i++; } SUBDBG( "generate_preset_search_map(%p,%p,%p) %d proposed presets\n", maploc, noteloc, strmap, i ); i++; /* Add null entry */ psmap = ( hwi_search_t * ) malloc( i * sizeof ( hwi_search_t ) ); if ( psmap == NULL ) { return PAPI_ENOMEM; } notemap = ( hwi_dev_notes_t * ) malloc( i * sizeof ( hwi_dev_notes_t ) ); if ( notemap == NULL ) { free(psmap); return PAPI_ENOMEM; } memset( psmap, 0x0, i * sizeof ( hwi_search_t ) ); memset( notemap, 0x0, i * sizeof ( hwi_dev_notes_t ) ); i = 0; while ( strmap[i].preset ) { /* Handle derived events */ term = 0; do { int ret; SUBDBG("Looking up: %s\n",strmap[i].findme[term]); ret=_papi_hwi_native_name_to_code(strmap[i].findme[term], &event_idx); if (ret==PAPI_OK) { SUBDBG("Found %x\n",event_idx); psmap[j].data.native[term]=event_idx; term++; } else { SUBDBG("Error finding event %x\n",event_idx); break; } } while ( strmap[i].findme[term] != NULL && term < PAPI_MAX_COUNTER_TERMS ); /* terminate the native term array with PAPI_NULL */ if ( term < PAPI_MAX_COUNTER_TERMS ) { psmap[j].data.native[term] = PAPI_NULL; } //if ( ret == PAPI_OK ) { psmap[j].event_code = ( unsigned int ) strmap[i].preset; psmap[j].data.derived = strmap[i].derived; if ( strmap[i].derived == DERIVED_POSTFIX ) { strncpy( psmap[j].data.operation, strmap[i].operation, PAPI_MIN_STR_LEN ); } if ( strmap[i].note ) { notemap[k].event_code = ( unsigned int ) strmap[i].preset; notemap[k].dev_note = strdup( strmap[i].note ); k++; } j++; //} i++; } if ( i != j ) { PAPIERROR( "%d of %d events in %s were not valid", i - j, i, PAPI_EVENT_FILE ); } SUBDBG( "generate_preset_search_map(%p,%p,%p) %d actual presets\n", maploc, noteloc, strmap, j ); *maploc = psmap; *noteloc = notemap; return PAPI_OK; }