|
Packit Service |
a1973e |
/****************************/
|
|
Packit Service |
a1973e |
/* THIS IS OPEN SOURCE CODE */
|
|
Packit Service |
a1973e |
/****************************/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* File: ppc64_events.c
|
|
Packit Service |
a1973e |
* Author: Maynard Johnson
|
|
Packit Service |
a1973e |
* maynardj@us.ibm.com
|
|
Packit Service |
a1973e |
* Mods: <your name here>
|
|
Packit Service |
a1973e |
* <your email address>
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include "papi_internal.h"
|
|
Packit Service |
a1973e |
#include <string.h>
|
|
Packit Service |
a1973e |
#include "libperfctr.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
hwd_groups_t group_map[MAX_GROUPS] = { {0}
|
|
Packit Service |
a1973e |
, {0}
|
|
Packit Service |
a1973e |
, {0}
|
|
Packit Service |
a1973e |
, {0}
|
|
Packit Service |
a1973e |
, {0}
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
native_event_entry_t native_table[PAPI_MAX_NATIVE_EVENTS];
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* to initialize the native_table */
|
|
Packit Service |
a1973e |
void
|
|
Packit Service |
a1973e |
perfctr_initialize_native_table( )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int i, j;
|
|
Packit Service |
a1973e |
memset( native_table, 0,
|
|
Packit Service |
a1973e |
PAPI_MAX_NATIVE_EVENTS * sizeof ( native_event_entry_t ) );
|
|
Packit Service |
a1973e |
for ( i = 0; i < PAPI_MAX_NATIVE_EVENTS; i++ ) {
|
|
Packit Service |
a1973e |
for ( j = 0; j < MAX_COUNTERS; j++ )
|
|
Packit Service |
a1973e |
native_table[i].resources.counter_cmd[j] = -1;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* to setup native_table group value */
|
|
Packit Service |
a1973e |
void
|
|
Packit Service |
a1973e |
perfctr_ppc64_setup_gps( int total, ntv_event_group_info_t * group_info )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int i, j, gnum;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( i = 0; i < total; i++ ) {
|
|
Packit Service |
a1973e |
for ( j = 0; j < MAX_COUNTERS; j++ ) {
|
|
Packit Service |
a1973e |
if ( native_table[i].resources.selector & ( 1 << j ) ) {
|
|
Packit Service |
a1973e |
for ( gnum = 0; gnum < group_info->maxgroups; gnum++ ) {
|
|
Packit Service |
a1973e |
if ( native_table[i].resources.counter_cmd[j] ==
|
|
Packit Service |
a1973e |
group_info->event_groups[gnum]->events[j] ) {
|
|
Packit Service |
a1973e |
native_table[i].resources.group[gnum / 32] |=
|
|
Packit Service |
a1973e |
1 << ( gnum % 32 );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( gnum = 0; gnum < group_info->maxgroups; gnum++ ) {
|
|
Packit Service |
a1973e |
group_map[gnum].mmcr0 = group_info->event_groups[gnum]->mmcr0;
|
|
Packit Service |
a1973e |
group_map[gnum].mmcr1L = group_info->event_groups[gnum]->mmcr1L;
|
|
Packit Service |
a1973e |
group_map[gnum].mmcr1U = group_info->event_groups[gnum]->mmcr1U;
|
|
Packit Service |
a1973e |
group_map[gnum].mmcra = group_info->event_groups[gnum]->mmcra;
|
|
Packit Service |
a1973e |
for ( i = 0; i < MAX_COUNTERS; i++ )
|
|
Packit Service |
a1973e |
group_map[gnum].counter_cmd[i] =
|
|
Packit Service |
a1973e |
group_info->event_groups[gnum]->events[i];
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* to setup native_table values, and return number of entries */
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
perfctr_ppc64_setup_native_table( )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int pmc, ev, i, j, index;
|
|
Packit Service |
a1973e |
/* This is for initialisation-testing of consistency between
|
|
Packit Service |
a1973e |
native_name_map and our events file */
|
|
Packit Service |
a1973e |
int itemCount = 0;
|
|
Packit Service |
a1973e |
index = 0;
|
|
Packit Service |
a1973e |
perfctr_initialize_native_table( );
|
|
Packit Service |
a1973e |
ntv_event_info_t *info = perfctr_get_native_evt_info( );
|
|
Packit Service |
a1973e |
if ( info == NULL ) {
|
|
Packit Service |
a1973e |
PAPIERROR( EVENT_INFO_FILE_ERROR );
|
|
Packit Service |
a1973e |
return PAPI_ECMP;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
ntv_event_t *wevp;
|
|
Packit Service |
a1973e |
for ( pmc = 0; pmc < info->maxpmcs; pmc++ ) {
|
|
Packit Service |
a1973e |
wevp = info->wev[pmc];
|
|
Packit Service |
a1973e |
for ( ev = 0; ev < info->maxevents[pmc]; ev++, wevp++ ) {
|
|
Packit Service |
a1973e |
for ( i = 0; i < index; i++ ) {
|
|
Packit Service |
a1973e |
if ( strcmp( wevp->symbol, native_table[i].name ) == 0 ) {
|
|
Packit Service |
a1973e |
native_table[i].resources.selector |= 1 << pmc;
|
|
Packit Service |
a1973e |
native_table[i].resources.counter_cmd[pmc] =
|
|
Packit Service |
a1973e |
wevp->event_num;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
if ( i == index ) {
|
|
Packit Service |
a1973e |
//native_table[i].index=i;
|
|
Packit Service |
a1973e |
native_table[i].resources.selector |= 1 << pmc;
|
|
Packit Service |
a1973e |
native_table[i].resources.counter_cmd[pmc] = wevp->event_num;
|
|
Packit Service |
a1973e |
native_table[i].name =
|
|
Packit Service |
a1973e |
( char * ) malloc( strlen( wevp->symbol ) + 1 );
|
|
Packit Service |
a1973e |
strcpy( native_table[i].name, wevp->symbol );
|
|
Packit Service |
a1973e |
native_table[i].description = wevp->description;
|
|
Packit Service |
a1973e |
index++;
|
|
Packit Service |
a1973e |
for ( j = 0; j < MAX_NATNAME_MAP_INDEX; j++ ) {
|
|
Packit Service |
a1973e |
/* It appears that here, if I'm right, that the events
|
|
Packit Service |
a1973e |
file entry matches the event from native_name_map, */
|
|
Packit Service |
a1973e |
/* This here check is to ensure that native_name_map in fact
|
|
Packit Service |
a1973e |
has MAX_NATNAME_MAP_INDEX elements, or rather that it never
|
|
Packit Service |
a1973e |
tries to access one that has not been initialised. */
|
|
Packit Service |
a1973e |
if ( native_name_map[j].name == NULL ) {
|
|
Packit Service |
a1973e |
SUBDBG( "native_name_map has a NULL at position %i\n",
|
|
Packit Service |
a1973e |
j );
|
|
Packit Service |
a1973e |
PAPIERROR
|
|
Packit Service |
a1973e |
( "Inconsistency between events_map file and events header." );
|
|
Packit Service |
a1973e |
return PAPI_EBUG;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
if ( strcmp( native_table[i].name, native_name_map[j].name )
|
|
Packit Service |
a1973e |
== 0 ) {
|
|
Packit Service |
a1973e |
native_name_map[j].index = i;
|
|
Packit Service |
a1973e |
itemCount++;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
/* If we never set native_name_map[j], then there is an
|
|
Packit Service |
a1973e |
inconsistency between native_name_map and native_table */
|
|
Packit Service |
a1973e |
if ( ( !( j < MAX_NATNAME_MAP_INDEX ) ) ||
|
|
Packit Service |
a1973e |
native_name_map[j].index != i ) {
|
|
Packit Service |
a1973e |
SUBDBG
|
|
Packit Service |
a1973e |
( "No match found between native_name_map and native_table. "
|
|
Packit Service |
a1973e |
"Values was %s at position %i in native_table.\n",
|
|
Packit Service |
a1973e |
native_table[i].name, i );
|
|
Packit Service |
a1973e |
PAPIERROR
|
|
Packit Service |
a1973e |
( "Inconsistency between native_name_map and events file." );
|
|
Packit Service |
a1973e |
return PAPI_EBUG;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
/* given the previous evidence that native_name_map is a superset of
|
|
Packit Service |
a1973e |
native_table, ensuring this match in their cardinality shows them to
|
|
Packit Service |
a1973e |
be equivalent. */
|
|
Packit Service |
a1973e |
if ( itemCount != MAX_NATNAME_MAP_INDEX ) {
|
|
Packit Service |
a1973e |
SUBDBG( "%i events found in native_table, but really should be %i\n",
|
|
Packit Service |
a1973e |
itemCount, MAX_NATNAME_MAP_INDEX );
|
|
Packit Service |
a1973e |
PAPIERROR
|
|
Packit Service |
a1973e |
( "Inconsistent cardinality between native_name_map and events file",
|
|
Packit Service |
a1973e |
itemCount, MAX_NATNAME_MAP_INDEX );
|
|
Packit Service |
a1973e |
return PAPI_EBUG;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
ntv_event_group_info_t *gp_info = perfctr_get_native_group_info( );
|
|
Packit Service |
a1973e |
if ( gp_info == NULL ) {
|
|
Packit Service |
a1973e |
perfctr_initialize_native_table( );
|
|
Packit Service |
a1973e |
PAPIERROR( EVENT_INFO_FILE_ERROR );
|
|
Packit Service |
a1973e |
return PAPI_ECMP;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
perfctr_ppc64_setup_gps( index, gp_info );
|
|
Packit Service |
a1973e |
_papi_hwi_system_info.sub_info.num_native_events = index;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return check_native_name( );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
check_native_name( )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
enum native_name foo;
|
|
Packit Service |
a1973e |
int itemCount = 0;
|
|
Packit Service |
a1973e |
int i;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* This should ensure that the cardinality of native_name is the same
|
|
Packit Service |
a1973e |
as that of native_name_map which may be true iff native_name
|
|
Packit Service |
a1973e |
expresses the same data as native_name_map and there is a 1:1
|
|
Packit Service |
a1973e |
mapping from one onto the other, though there is no guarantee of
|
|
Packit Service |
a1973e |
order. */
|
|
Packit Service |
a1973e |
if ( ( NATNAME_GUARD - PAPI_NATIVE_MASK ) != MAX_NATNAME_MAP_INDEX ) {
|
|
Packit Service |
a1973e |
SUBDBG( "%i is the number of elements apparently in native_name, "
|
|
Packit Service |
a1973e |
"but really should be %i, according to native_name_map.\n",
|
|
Packit Service |
a1973e |
( NATNAME_GUARD - PAPI_NATIVE_MASK ), MAX_NATNAME_MAP_INDEX );
|
|
Packit Service |
a1973e |
PAPIERROR
|
|
Packit Service |
a1973e |
( "Inconsistent cardinality between native_name and native_name_map "
|
|
Packit Service |
a1973e |
"detected in preliminary check\n" );
|
|
Packit Service |
a1973e |
return PAPI_EBUG;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* The following is sanity checking only. It attempts to verify some level
|
|
Packit Service |
a1973e |
of consistency between native_name and native_name_map and native_table.
|
|
Packit Service |
a1973e |
This should imply that native_name is a subset of native_name_map. */
|
|
Packit Service |
a1973e |
for ( foo = PAPI_NATIVE_MASK; foo < NATNAME_GUARD; foo++ ) {
|
|
Packit Service |
a1973e |
for ( i = 0; i < MAX_NATNAME_MAP_INDEX; i++ ) {
|
|
Packit Service |
a1973e |
/* Now, if the event we are on is the native event we seek... */
|
|
Packit Service |
a1973e |
if ( ( native_name_map[i].index | PAPI_NATIVE_MASK ) == foo ) {
|
|
Packit Service |
a1973e |
itemCount++;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
if ( itemCount != MAX_NATNAME_MAP_INDEX ) {
|
|
Packit Service |
a1973e |
SUBDBG( "Inconsistency between native_name_map and native_name. "
|
|
Packit Service |
a1973e |
"%i events matched, but really should be %i\n", itemCount,
|
|
Packit Service |
a1973e |
MAX_NATNAME_MAP_INDEX );
|
|
Packit Service |
a1973e |
PAPIERROR
|
|
Packit Service |
a1973e |
( "Inconsistent cardinality between native_name and native_name_map\n" );
|
|
Packit Service |
a1973e |
return PAPI_EBUG;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static FILE *
|
|
Packit Service |
a1973e |
open_file( const char *fname )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
char *cpu;
|
|
Packit Service |
a1973e |
char *dot = ".";
|
|
Packit Service |
a1973e |
char *dot_dot = "..";
|
|
Packit Service |
a1973e |
#ifdef _POWER5p
|
|
Packit Service |
a1973e |
cpu = "power5+";
|
|
Packit Service |
a1973e |
#elif defined(_POWER5)
|
|
Packit Service |
a1973e |
cpu = "power5";
|
|
Packit Service |
a1973e |
#elif defined(_PPC970)
|
|
Packit Service |
a1973e |
cpu = "ppc970";
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
cpu = "";
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
char *dir = ( char * ) getenv( "PAPI_EVENTFILE_PATH" );
|
|
Packit Service |
a1973e |
#ifdef PAPI_DATADIR
|
|
Packit Service |
a1973e |
if ( dir == NULL ) {
|
|
Packit Service |
a1973e |
dir = PAPI_DATADIR;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
/* If dir is still NULL, assume current dir holds event_data dir */
|
|
Packit Service |
a1973e |
if ( dir == NULL )
|
|
Packit Service |
a1973e |
dir = dot;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
char *relative_pathname = ( char * ) malloc( strlen( "/" ) +
|
|
Packit Service |
a1973e |
strlen( "event_data" ) +
|
|
Packit Service |
a1973e |
strlen( "/" ) + strlen( cpu ) +
|
|
Packit Service |
a1973e |
strlen( "/" ) +
|
|
Packit Service |
a1973e |
strlen( fname ) + 1 );
|
|
Packit Service |
a1973e |
strcpy( relative_pathname, "/" );
|
|
Packit Service |
a1973e |
strcat( relative_pathname, "event_data" );
|
|
Packit Service |
a1973e |
strcat( relative_pathname, "/" );
|
|
Packit Service |
a1973e |
strcat( relative_pathname, cpu );
|
|
Packit Service |
a1973e |
strcat( relative_pathname, "/" );
|
|
Packit Service |
a1973e |
strcat( relative_pathname, fname );
|
|
Packit Service |
a1973e |
/* Add a little extra space to the malloc for the case where dir = "." since
|
|
Packit Service |
a1973e |
* we may be trying dir = ".." later on. */
|
|
Packit Service |
a1973e |
char *pathname =
|
|
Packit Service |
a1973e |
( char * ) malloc( strlen( dir ) + strlen( relative_pathname ) + 4 );
|
|
Packit Service |
a1973e |
int keep_trying;
|
|
Packit Service |
a1973e |
if ( strcmp( dir, dot ) == 0 )
|
|
Packit Service |
a1973e |
keep_trying = 2;
|
|
Packit Service |
a1973e |
else
|
|
Packit Service |
a1973e |
keep_trying = 3;
|
|
Packit Service |
a1973e |
FILE *file = NULL;
|
|
Packit Service |
a1973e |
while ( file == NULL && keep_trying-- ) {
|
|
Packit Service |
a1973e |
strcpy( pathname, dir );
|
|
Packit Service |
a1973e |
strcat( pathname, relative_pathname );
|
|
Packit Service |
a1973e |
file = fopen( pathname, "r" );
|
|
Packit Service |
a1973e |
if ( strcmp( dir, dot ) == 0 ) {
|
|
Packit Service |
a1973e |
dir = dot_dot;
|
|
Packit Service |
a1973e |
} else {
|
|
Packit Service |
a1973e |
dir = dot;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
SUBDBG( "Attempt to open event data file %s %s successful.\n", pathname,
|
|
Packit Service |
a1973e |
( file == NULL ) ? "was not" : "was" );
|
|
Packit Service |
a1973e |
memset( pathname, '\0', sizeof ( pathname ) );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
free( pathname );
|
|
Packit Service |
a1973e |
free( relative_pathname );
|
|
Packit Service |
a1973e |
return ( file );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static ntv_event_t *
|
|
Packit Service |
a1973e |
copy_buffer( ntv_event_t events[], int maxevents )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
ntv_event_t *cur_wev, *start_wev;
|
|
Packit Service |
a1973e |
start_wev = ( ntv_event_t * ) malloc( sizeof ( ntv_event_t ) * maxevents );
|
|
Packit Service |
a1973e |
cur_wev = start_wev;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int cnt;
|
|
Packit Service |
a1973e |
for ( cnt = 0; cnt < maxevents; cnt++, cur_wev++ ) {
|
|
Packit Service |
a1973e |
cur_wev->event_num = events[cnt].event_num;
|
|
Packit Service |
a1973e |
strcpy( cur_wev->symbol, events[cnt].symbol );
|
|
Packit Service |
a1973e |
cur_wev->short_description =
|
|
Packit Service |
a1973e |
( char * ) malloc( strlen( events[cnt].short_description ) );
|
|
Packit Service |
a1973e |
strcpy( cur_wev->short_description, events[cnt].short_description );
|
|
Packit Service |
a1973e |
cur_wev->description =
|
|
Packit Service |
a1973e |
( char * ) malloc( strlen( events[cnt].description ) );
|
|
Packit Service |
a1973e |
strcpy( cur_wev->description, events[cnt].description );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
return start_wev;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static ntv_event_info_t *
|
|
Packit Service |
a1973e |
parse_eventfile( FILE * evfile )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int counter = 0, num_events = 0;
|
|
Packit Service |
a1973e |
int i, len, cc;
|
|
Packit Service |
a1973e |
int event;
|
|
Packit Service |
a1973e |
int line_counter_flag = 0;
|
|
Packit Service |
a1973e |
char line_data[1024];
|
|
Packit Service |
a1973e |
ntv_event_t events[PAPI_MAX_NATIVE_EVENTS];
|
|
Packit Service |
a1973e |
ntv_event_info_t *ntv_evt_info =
|
|
Packit Service |
a1973e |
( ntv_event_info_t * ) malloc( sizeof ( ntv_event_info_t ) );
|
|
Packit Service |
a1973e |
ntv_evt_info->maxpmcs = 0;
|
|
Packit Service |
a1973e |
char data[1024];
|
|
Packit Service |
a1973e |
while ( fgets( data, 1022, evfile ) ) {
|
|
Packit Service |
a1973e |
if ( feof( evfile ) )
|
|
Packit Service |
a1973e |
continue;
|
|
Packit Service |
a1973e |
if ( strlen( data ) < 2 )
|
|
Packit Service |
a1973e |
continue;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( strncmp( data, "$$$$", 4 ) == 0 ) {
|
|
Packit Service |
a1973e |
line_counter_flag = 0;
|
|
Packit Service |
a1973e |
ntv_evt_info->maxevents[counter - 1] = num_events;
|
|
Packit Service |
a1973e |
ntv_evt_info->wev[counter - 1] = copy_buffer( events, num_events );
|
|
Packit Service |
a1973e |
ntv_event_t *temp = ntv_evt_info->wev[counter - 1];
|
|
Packit Service |
a1973e |
temp++;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
switch ( line_counter_flag ) {
|
|
Packit Service |
a1973e |
case 0:
|
|
Packit Service |
a1973e |
if ( sscanf( data, "{ counter %u", &counter ) == 1 ) {
|
|
Packit Service |
a1973e |
line_counter_flag = 1;
|
|
Packit Service |
a1973e |
num_events = 0;
|
|
Packit Service |
a1973e |
ntv_evt_info->maxpmcs++;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case 1:
|
|
Packit Service |
a1973e |
if ( sscanf( data, "#%u", &event ) != 1 ) {
|
|
Packit Service |
a1973e |
fprintf( stderr, "EVS file format error 1 (%s)\n", data );
|
|
Packit Service |
a1973e |
return NULL;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
if ( event >= PAPI_MAX_NATIVE_EVENTS ) {
|
|
Packit Service |
a1973e |
fprintf( stderr, "EVS file format error 1 (%s)\n", data );
|
|
Packit Service |
a1973e |
return NULL;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
events[num_events].event_num = event;
|
|
Packit Service |
a1973e |
len = strlen( data );
|
|
Packit Service |
a1973e |
int symb_found = 0;
|
|
Packit Service |
a1973e |
for ( i = cc = 0; i < len; i++ ) {
|
|
Packit Service |
a1973e |
if ( data[i] == ',' )
|
|
Packit Service |
a1973e |
cc++;
|
|
Packit Service |
a1973e |
if ( cc == 5 && !symb_found ) {
|
|
Packit Service |
a1973e |
strcpy( line_data, &data[i + 1] );
|
|
Packit Service |
a1973e |
int j = 0;
|
|
Packit Service |
a1973e |
while ( line_data[j] != ',' )
|
|
Packit Service |
a1973e |
j++;
|
|
Packit Service |
a1973e |
strncpy( events[num_events].symbol, line_data, j );
|
|
Packit Service |
a1973e |
events[num_events].symbol[j] = 0;
|
|
Packit Service |
a1973e |
symb_found = 1;
|
|
Packit Service |
a1973e |
i += j;
|
|
Packit Service |
a1973e |
} else if ( cc == 6 ) {
|
|
Packit Service |
a1973e |
len = strlen( &data[i + 1] );
|
|
Packit Service |
a1973e |
events[num_events].short_description =
|
|
Packit Service |
a1973e |
( char * ) malloc( len );
|
|
Packit Service |
a1973e |
strcpy( events[num_events].short_description,
|
|
Packit Service |
a1973e |
&data[i + 1] );
|
|
Packit Service |
a1973e |
events[num_events].short_description[len - 1] = 0;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
line_counter_flag = 2;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case 2:
|
|
Packit Service |
a1973e |
line_counter_flag = 3;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case 3:
|
|
Packit Service |
a1973e |
len = strlen( data );
|
|
Packit Service |
a1973e |
events[num_events].description = ( char * ) malloc( len );
|
|
Packit Service |
a1973e |
strcpy( events[num_events].description, data );
|
|
Packit Service |
a1973e |
events[num_events].description[len - 1] = 0;
|
|
Packit Service |
a1973e |
line_counter_flag = 1;
|
|
Packit Service |
a1973e |
num_events++;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
if ( counter == 0 ) {
|
|
Packit Service |
a1973e |
free( ntv_evt_info );
|
|
Packit Service |
a1973e |
ntv_evt_info = NULL;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
if ( counter == MAX_COUNTERS ) {
|
|
Packit Service |
a1973e |
ntv_evt_info->maxevents[counter - 1] = num_events;
|
|
Packit Service |
a1973e |
ntv_evt_info->wev[counter - 1] = copy_buffer( events, num_events );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
fclose( evfile );
|
|
Packit Service |
a1973e |
return ntv_evt_info;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int
|
|
Packit Service |
a1973e |
any_counter_invalid( int event_id[], int size )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int j;
|
|
Packit Service |
a1973e |
for ( j = 0; j < size; j++ ) {
|
|
Packit Service |
a1973e |
if ( event_id[j] >= PAPI_MAX_NATIVE_EVENTS )
|
|
Packit Service |
a1973e |
return 1;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
return 0;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static ntv_event_group_info_t *
|
|
Packit Service |
a1973e |
parse_groupfile( FILE * grp_file )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
char data[1024];
|
|
Packit Service |
a1973e |
unsigned int mmcr0, mmcr1H, mmcr1L, mmcra;
|
|
Packit Service |
a1973e |
int g, state = 0;
|
|
Packit Service |
a1973e |
ntv_event_group_info_t *group_info =
|
|
Packit Service |
a1973e |
( ntv_event_group_info_t * )
|
|
Packit Service |
a1973e |
malloc( sizeof ( ntv_event_group_info_t ) );
|
|
Packit Service |
a1973e |
group_info->maxgroups = 0;
|
|
Packit Service |
a1973e |
int event_num[MAX_COUNTERS];
|
|
Packit Service |
a1973e |
while ( fgets( data, 1022, grp_file ) ) {
|
|
Packit Service |
a1973e |
if ( feof( grp_file ) || ( strlen( data ) < 2 ) )
|
|
Packit Service |
a1973e |
continue;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
switch ( state ) {
|
|
Packit Service |
a1973e |
case 0:
|
|
Packit Service |
a1973e |
#if defined(_POWER5) || defined(_POWER5p)
|
|
Packit Service |
a1973e |
if ( sscanf
|
|
Packit Service |
a1973e |
( data, "#%u,%u,%u,%u,%u,%u,%u", &g, &event_num[0],
|
|
Packit Service |
a1973e |
&event_num[1], &event_num[2], &event_num[3], &event_num[4],
|
|
Packit Service |
a1973e |
&event_num[5] ) == 7 ) {
|
|
Packit Service |
a1973e |
state = 1;
|
|
Packit Service |
a1973e |
if ( any_counter_invalid( event_num, 6 ) ) {
|
|
Packit Service |
a1973e |
fprintf( stderr, "ERROR: Maximum events exceeded\n" );
|
|
Packit Service |
a1973e |
return NULL;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
if ( sscanf
|
|
Packit Service |
a1973e |
( data, "#%u,%u,%u,%u,%u,%u,%u,%u,%u", &g, &event_num[0],
|
|
Packit Service |
a1973e |
&event_num[1], &event_num[2], &event_num[3], &event_num[4],
|
|
Packit Service |
a1973e |
&event_num[5], &event_num[6], &event_num[7] ) == 9 ) {
|
|
Packit Service |
a1973e |
state = 1;
|
|
Packit Service |
a1973e |
if ( any_counter_invalid( event_num, 8 ) ) {
|
|
Packit Service |
a1973e |
fprintf( stderr, "ERROR: Maximum events exceeded\n" );
|
|
Packit Service |
a1973e |
return NULL;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
if ( state == 1 ) {
|
|
Packit Service |
a1973e |
group_info->event_groups[group_info->maxgroups] =
|
|
Packit Service |
a1973e |
( event_group_t * ) malloc( sizeof ( event_group_t ) );
|
|
Packit Service |
a1973e |
group_info->event_groups[group_info->maxgroups]->group_id = g;
|
|
Packit Service |
a1973e |
int j = 0;
|
|
Packit Service |
a1973e |
for ( ; j < MAX_COUNTERS; j++ )
|
|
Packit Service |
a1973e |
group_info->event_groups[group_info->maxgroups]->events[j] =
|
|
Packit Service |
a1973e |
event_num[j];
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case 1:
|
|
Packit Service |
a1973e |
// unused hex event codes
|
|
Packit Service |
a1973e |
state = 2;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case 2:
|
|
Packit Service |
a1973e |
/* get mmcr values */
|
|
Packit Service |
a1973e |
if ( sscanf( data, "%#x,%#x,%#x,%#x", &mmcr0, &mmcr1H, &mmcr1L, &mmcra )
|
|
Packit Service |
a1973e |
!= 4 ) {
|
|
Packit Service |
a1973e |
fprintf( stderr, "GPS file format error 1 (%s)\n", data );
|
|
Packit Service |
a1973e |
return NULL;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
state = 3;
|
|
Packit Service |
a1973e |
group_info->event_groups[group_info->maxgroups]->mmcr0 = mmcr0;
|
|
Packit Service |
a1973e |
group_info->event_groups[group_info->maxgroups]->mmcr1L = mmcr1L;
|
|
Packit Service |
a1973e |
group_info->event_groups[group_info->maxgroups]->mmcr1U = mmcr1H;
|
|
Packit Service |
a1973e |
group_info->event_groups[group_info->maxgroups]->mmcra = mmcra;
|
|
Packit Service |
a1973e |
group_info->maxgroups++;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case 3:
|
|
Packit Service |
a1973e |
// unused group name
|
|
Packit Service |
a1973e |
state = 0;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
fclose( grp_file );
|
|
Packit Service |
a1973e |
return group_info;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
ntv_event_info_t *
|
|
Packit Service |
a1973e |
perfctr_get_native_evt_info( void )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
ntv_event_info_t *evt_info = NULL;
|
|
Packit Service |
a1973e |
FILE *evt_file = open_file( "events" );
|
|
Packit Service |
a1973e |
if ( evt_file != NULL ) {
|
|
Packit Service |
a1973e |
evt_info = parse_eventfile( evt_file );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
return evt_info;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
ntv_event_group_info_t *
|
|
Packit Service |
a1973e |
perfctr_get_native_group_info( void )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
ntv_event_group_info_t *groups = NULL;
|
|
Packit Service |
a1973e |
FILE *grp_file = NULL;
|
|
Packit Service |
a1973e |
if ( ( grp_file = open_file( "groups" ) ) != NULL ) {
|
|
Packit Service |
a1973e |
groups = parse_groupfile( grp_file );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
return groups;
|
|
Packit Service |
a1973e |
}
|