Blame src/testlib/test_utils.c

Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
#include <unistd.h>
Packit Service a1973e
#include <string.h>
Packit Service a1973e
Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_test.h"
Packit Service a1973e
Packit Service a1973e
#define TOLERANCE       .2
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*  Variable to hold reporting status
Packit Service a1973e
	if TRUE, output is suppressed
Packit Service a1973e
	if FALSE output is sent to stdout
Packit Service a1973e
	initialized to FALSE
Packit Service a1973e
	declared here so it can be available globally
Packit Service a1973e
*/
Packit Service a1973e
int TESTS_QUIET = 0;
Packit Service a1973e
static int TESTS_COLOR = 1;
Packit Service a1973e
static int TEST_WARN = 0;
Packit Service a1973e
Packit Service a1973e
void
Packit Service a1973e
validate_string( const char *name, char *s )
Packit Service a1973e
{
Packit Service a1973e
	if ( ( s == NULL ) || ( strlen( s ) == 0 ) ) {
Packit Service a1973e
		char s2[1024] = "";
Packit Service a1973e
		sprintf( s2, "%s was NULL or length 0", name );
Packit Service a1973e
		test_fail( __FILE__, __LINE__, s2, 0 );
Packit Service a1973e
	}
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
approx_equals( double a, double b )
Packit Service a1973e
{
Packit Service a1973e
	if ( ( a >= b * ( 1.0 - TOLERANCE ) ) && ( a <= b * ( 1.0 + TOLERANCE ) ) )
Packit Service a1973e
		return 1;
Packit Service a1973e
	else {
Packit Service a1973e
		printf( "Out of tolerance range %2.2f: %.0f vs %.0f [%.0f,%.0f]\n",
Packit Service a1973e
				TOLERANCE, a, b, b * ( 1.0 - TOLERANCE ),
Packit Service a1973e
				b * ( 1.0 + TOLERANCE ) );
Packit Service a1973e
		return 0;
Packit Service a1973e
	}
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
long long **
Packit Service a1973e
allocate_test_space( int num_tests, int num_events )
Packit Service a1973e
{
Packit Service a1973e
	long long **values;
Packit Service a1973e
	int i;
Packit Service a1973e
Packit Service a1973e
	values =
Packit Service a1973e
		( long long ** ) malloc( ( size_t ) num_tests *
Packit Service a1973e
								 sizeof ( long long * ) );
Packit Service a1973e
	if ( values == NULL )
Packit Service a1973e
		exit( 1 );
Packit Service a1973e
	memset( values, 0x0, ( size_t ) num_tests * sizeof ( long long * ) );
Packit Service a1973e
Packit Service a1973e
	for ( i = 0; i < num_tests; i++ ) {
Packit Service a1973e
		values[i] =
Packit Service a1973e
			( long long * ) malloc( ( size_t ) num_events *
Packit Service a1973e
									sizeof ( long long ) );
Packit Service a1973e
		if ( values[i] == NULL )
Packit Service a1973e
			exit( 1 );
Packit Service a1973e
		memset( values[i], 0x00, ( size_t ) num_events * sizeof ( long long ) );
Packit Service a1973e
	}
Packit Service a1973e
	return ( values );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
void
Packit Service a1973e
free_test_space( long long **values, int num_tests )
Packit Service a1973e
{
Packit Service a1973e
	int i;
Packit Service a1973e
Packit Service a1973e
	for ( i = 0; i < num_tests; i++ )
Packit Service a1973e
		free( values[i] );
Packit Service a1973e
	free( values );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
int is_event_derived(unsigned int event) {
Packit Service a1973e
Packit Service a1973e
  PAPI_event_info_t info;
Packit Service a1973e
Packit Service a1973e
  if (event & PAPI_PRESET_MASK) {
Packit Service a1973e
Packit Service a1973e
     PAPI_get_event_info(event,&info;;
Packit Service a1973e
Packit Service a1973e
     if (strcmp(info.derived,"NOT_DERIVED")) {
Packit Service a1973e
       //       printf("%#x is derived\n",event);
Packit Service a1973e
        return 1;
Packit Service a1973e
     }
Packit Service a1973e
  }
Packit Service a1973e
  return 0;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
int find_nonderived_event( void )
Packit Service a1973e
{
Packit Service a1973e
	/* query and set up the right event to monitor */
Packit Service a1973e
	PAPI_event_info_t info;
Packit Service a1973e
	int potential_evt_to_add[3] = { PAPI_FP_OPS, PAPI_FP_INS, PAPI_TOT_INS };
Packit Service a1973e
	int i;
Packit Service a1973e
Packit Service a1973e
	for ( i = 0; i < 3; i++ ) {
Packit Service a1973e
		if ( PAPI_query_event( potential_evt_to_add[i] ) == PAPI_OK ) {
Packit Service a1973e
			if ( PAPI_get_event_info( potential_evt_to_add[i], &info ) ==
Packit Service a1973e
				 PAPI_OK ) {
Packit Service a1973e
				if ( ( info.count > 0 ) &&
Packit Service a1973e
					 !strcmp( info.derived, "NOT_DERIVED" ) )
Packit Service a1973e
					return ( potential_evt_to_add[i] );
Packit Service a1973e
			}
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
	return ( 0 );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/* Add events to an EventSet, as specified by a mask.
Packit Service a1973e
Packit Service a1973e
   Returns: number = number of events added
Packit Service a1973e
Packit Service a1973e
*/
Packit Service a1973e
Packit Service a1973e
//struct test_events_t {
Packit Service a1973e
//  unsigned int mask;
Packit Service a1973e
//  unsigned int event;
Packit Service a1973e
//};
Packit Service a1973e
Packit Service a1973e
struct test_events_t test_events[MAX_TEST_EVENTS] = {
Packit Service a1973e
  { MASK_TOT_CYC, PAPI_TOT_CYC },
Packit Service a1973e
  { MASK_TOT_INS, PAPI_TOT_INS },
Packit Service a1973e
  { MASK_FP_INS,  PAPI_FP_INS },
Packit Service a1973e
  { MASK_L1_TCM,  PAPI_L1_TCM },
Packit Service a1973e
  { MASK_L1_ICM,  PAPI_L1_ICM },
Packit Service a1973e
  { MASK_L1_DCM,  PAPI_L1_DCM },
Packit Service a1973e
  { MASK_L2_TCM,  PAPI_L2_TCM },
Packit Service a1973e
  { MASK_L2_TCA,  PAPI_L2_TCA },
Packit Service a1973e
  { MASK_L2_TCH,  PAPI_L2_TCH },
Packit Service a1973e
  { MASK_BR_CN,   PAPI_BR_CN  },
Packit Service a1973e
  { MASK_BR_MSP,  PAPI_BR_MSP },
Packit Service a1973e
  { MASK_BR_PRC,  PAPI_BR_PRC },
Packit Service a1973e
  { MASK_TOT_IIS, PAPI_TOT_IIS},
Packit Service a1973e
  { MASK_L1_DCR,  PAPI_L1_DCR},
Packit Service a1973e
  { MASK_L1_DCW,  PAPI_L1_DCW},
Packit Service a1973e
  { MASK_L1_DCA,  PAPI_L1_DCA},
Packit Service a1973e
  { MASK_FP_OPS,  PAPI_FP_OPS},
Packit Service a1973e
};
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
add_test_events( int *number, int *mask, int allow_derived )
Packit Service a1973e
{
Packit Service a1973e
	int retval,i;
Packit Service a1973e
	int EventSet = PAPI_NULL;
Packit Service a1973e
	char name_string[BUFSIZ];
Packit Service a1973e
Packit Service a1973e
	*number = 0;
Packit Service a1973e
Packit Service a1973e
	/* create the eventset */
Packit Service a1973e
	retval = PAPI_create_eventset( &EventSet );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail(__FILE__,__LINE__,"Trouble creating eventset",retval);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
	/* check all the masks */
Packit Service a1973e
	for(i=0;i
Packit Service a1973e
Packit Service a1973e
		if ( *mask & test_events[i].mask ) {
Packit Service a1973e
Packit Service a1973e
			/* remove any derived events if told to */
Packit Service a1973e
			if ((is_event_derived(test_events[i].event)) &&
Packit Service a1973e
				(!allow_derived)) {
Packit Service a1973e
				*mask = *mask ^ test_events[i].mask;
Packit Service a1973e
				continue;
Packit Service a1973e
			}
Packit Service a1973e
Packit Service a1973e
			retval = PAPI_add_event( EventSet,
Packit Service a1973e
				test_events[i].event );
Packit Service a1973e
Packit Service a1973e
			if ( retval == PAPI_OK ) {
Packit Service a1973e
				( *number )++;
Packit Service a1973e
			}
Packit Service a1973e
			else {
Packit Service a1973e
				if ( !TESTS_QUIET ) {
Packit Service a1973e
				PAPI_event_code_to_name(test_events[i].event,
Packit Service a1973e
							name_string);
Packit Service a1973e
				fprintf( stdout, "%#x %s is not available.\n",
Packit Service a1973e
					test_events[i].event,name_string);
Packit Service a1973e
				}
Packit Service a1973e
				*mask = *mask ^ test_events[i].mask;
Packit Service a1973e
			}
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	return EventSet;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
remove_test_events( int *EventSet, int mask )
Packit Service a1973e
{
Packit Service a1973e
	int retval = PAPI_OK;
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_L1_DCA ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_L1_DCA );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_L1_DCW ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_L1_DCW );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_L1_DCR ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_L1_DCR );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_L2_TCH ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_L2_TCH );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_L2_TCA ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_L2_TCA );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_L2_TCM ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_L2_TCM );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_L1_DCM ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_L1_DCM );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_L1_ICM ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_L1_ICM );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_L1_TCM ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_L1_TCM );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_FP_OPS ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_FP_OPS );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_FP_INS ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_FP_INS );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_TOT_INS ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_TOT_INS );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_TOT_IIS ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_TOT_IIS );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( mask & MASK_TOT_CYC ) {
Packit Service a1973e
		retval = PAPI_remove_event( *EventSet, PAPI_TOT_CYC );
Packit Service a1973e
		if ( retval < PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	return ( PAPI_destroy_eventset( EventSet ) );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
char *
Packit Service a1973e
stringify_all_domains( int domains )
Packit Service a1973e
{
Packit Service a1973e
	static char buf[PAPI_HUGE_STR_LEN];
Packit Service a1973e
	int i, did = 0;
Packit Service a1973e
	buf[0] = '\0';
Packit Service a1973e
Packit Service a1973e
	for ( i = PAPI_DOM_MIN; i <= PAPI_DOM_MAX; i = i << 1 )
Packit Service a1973e
		if ( domains & i ) {
Packit Service a1973e
			if ( did )
Packit Service a1973e
				strcpy( buf + strlen( buf ), "|" );
Packit Service a1973e
			strcpy( buf + strlen( buf ), stringify_domain( domains & i ) );
Packit Service a1973e
			did++;
Packit Service a1973e
		}
Packit Service a1973e
	if ( did == 0 )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "Unrecognized domains!", 0 );
Packit Service a1973e
	return ( buf );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
char *
Packit Service a1973e
stringify_domain( int domain )
Packit Service a1973e
{
Packit Service a1973e
	switch ( domain ) {
Packit Service a1973e
	case PAPI_DOM_SUPERVISOR:
Packit Service a1973e
		return ( "PAPI_DOM_SUPERVISOR" );
Packit Service a1973e
	case PAPI_DOM_USER:
Packit Service a1973e
		return ( "PAPI_DOM_USER" );
Packit Service a1973e
	case PAPI_DOM_KERNEL:
Packit Service a1973e
		return ( "PAPI_DOM_KERNEL" );
Packit Service a1973e
	case PAPI_DOM_OTHER:
Packit Service a1973e
		return ( "PAPI_DOM_OTHER" );
Packit Service a1973e
	case PAPI_DOM_ALL:
Packit Service a1973e
		return ( "PAPI_DOM_ALL" );
Packit Service a1973e
	default:
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "Unrecognized domains!", 0 );
Packit Service a1973e
	}
Packit Service a1973e
	return ( NULL );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
char *
Packit Service a1973e
stringify_all_granularities( int granularities )
Packit Service a1973e
{
Packit Service a1973e
	static char buf[PAPI_HUGE_STR_LEN];
Packit Service a1973e
	int i, did = 0;
Packit Service a1973e
Packit Service a1973e
	buf[0] = '\0';
Packit Service a1973e
	for ( i = PAPI_GRN_MIN; i <= PAPI_GRN_MAX; i = i << 1 )
Packit Service a1973e
		if ( granularities & i ) {
Packit Service a1973e
			if ( did )
Packit Service a1973e
				strcpy( buf + strlen( buf ), "|" );
Packit Service a1973e
			strcpy( buf + strlen( buf ),
Packit Service a1973e
					stringify_granularity( granularities & i ) );
Packit Service a1973e
			did++;
Packit Service a1973e
		}
Packit Service a1973e
	if ( did == 0 )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "Unrecognized granularity!", 0 );
Packit Service a1973e
Packit Service a1973e
	return ( buf );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
char *
Packit Service a1973e
stringify_granularity( int granularity )
Packit Service a1973e
{
Packit Service a1973e
	switch ( granularity ) {
Packit Service a1973e
	case PAPI_GRN_THR:
Packit Service a1973e
		return ( "PAPI_GRN_THR" );
Packit Service a1973e
	case PAPI_GRN_PROC:
Packit Service a1973e
		return ( "PAPI_GRN_PROC" );
Packit Service a1973e
	case PAPI_GRN_PROCG:
Packit Service a1973e
		return ( "PAPI_GRN_PROCG" );
Packit Service a1973e
	case PAPI_GRN_SYS_CPU:
Packit Service a1973e
		return ( "PAPI_GRN_SYS_CPU" );
Packit Service a1973e
	case PAPI_GRN_SYS:
Packit Service a1973e
		return ( "PAPI_GRN_SYS" );
Packit Service a1973e
	default:
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "Unrecognized granularity!", 0 );
Packit Service a1973e
	}
Packit Service a1973e
	return ( NULL );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/* Checks for TESTS_QUIET or -q command line variable	*/
Packit Service a1973e
/* Sets the TESTS_QUIET global variable			*/
Packit Service a1973e
/* Also returns the value.				*/
Packit Service a1973e
int
Packit Service a1973e
tests_quiet( int argc, char **argv )
Packit Service a1973e
{
Packit Service a1973e
	char *value;
Packit Service a1973e
	int retval;
Packit Service a1973e
Packit Service a1973e
	if ( ( argc > 1 )
Packit Service a1973e
		 && ( ( strcasecmp( argv[1], "TESTS_QUIET" ) == 0 )
Packit Service a1973e
			  || ( strcasecmp( argv[1], "-q" ) == 0 ) ) ) {
Packit Service a1973e
		TESTS_QUIET = 1;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Always report PAPI errors when testing */
Packit Service a1973e
	/* Even in quiet mode */
Packit Service a1973e
	retval = PAPI_set_debug( PAPI_VERB_ECONT );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_set_debug", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	value=getenv("TESTS_COLOR");
Packit Service a1973e
	if (value!=NULL) {
Packit Service a1973e
		if (value[0]=='y') {
Packit Service a1973e
			TESTS_COLOR=1;
Packit Service a1973e
		}
Packit Service a1973e
		else {
Packit Service a1973e
			TESTS_COLOR=0;
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Disable colors if sending to a file */
Packit Service a1973e
	if (!isatty(fileno(stdout))) {
Packit Service a1973e
		TESTS_COLOR=0;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	return TESTS_QUIET;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
#define RED    "\033[1;31m"
Packit Service a1973e
#define YELLOW "\033[1;33m"
Packit Service a1973e
#define GREEN  "\033[1;32m"
Packit Service a1973e
#define NORMAL "\033[0m"
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
static void print_spaces(int count) {
Packit Service a1973e
	int i;
Packit Service a1973e
Packit Service a1973e
	for(i=0;i
Packit Service a1973e
		fprintf(stdout, " ");
Packit Service a1973e
	}
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/* Ugh, all these "fprintf(stdout)" are due to the */
Packit Service a1973e
/* TESTS_QUIET #define printf hack		*/
Packit Service a1973e
/* FIXME! Revert to printf once we are done converting */
Packit Service a1973e
Packit Service a1973e
void
Packit Service a1973e
test_pass( const char *filename )
Packit Service a1973e
{
Packit Service a1973e
	(void)filename;
Packit Service a1973e
Packit Service a1973e
//	int line_pad;
Packit Service a1973e
Packit Service a1973e
//	line_pad=60-strlen(filename);
Packit Service a1973e
//	if (line_pad<0) line_pad=0;
Packit Service a1973e
Packit Service a1973e
//	fprintf(stdout,"%s",filename);
Packit Service a1973e
//	print_spaces(line_pad);
Packit Service a1973e
Packit Service a1973e
	if ( TEST_WARN ) {
Packit Service a1973e
		print_spaces(59);
Packit Service a1973e
		if (TESTS_COLOR) fprintf( stdout, "%s", YELLOW);
Packit Service a1973e
		fprintf( stdout, "PASSED with WARNING");
Packit Service a1973e
		if (TESTS_COLOR) fprintf( stdout, "%s", NORMAL);
Packit Service a1973e
		fprintf( stdout, "\n");
Packit Service a1973e
	}
Packit Service a1973e
	else {
Packit Service a1973e
		if (TESTS_COLOR) fprintf( stdout, "%s",GREEN);
Packit Service a1973e
		fprintf( stdout, "PASSED");
Packit Service a1973e
		if (TESTS_COLOR) fprintf( stdout, "%s",NORMAL);
Packit Service a1973e
		fprintf( stdout, "\n");
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( PAPI_is_initialized(  ) ) {
Packit Service a1973e
		PAPI_shutdown(  );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	exit( 0 );
Packit Service a1973e
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/* Use a positive value of retval to simply print an error message */
Packit Service a1973e
void
Packit Service a1973e
test_fail( const char *file, int line, const char *call, int retval )
Packit Service a1973e
{
Packit Service a1973e
//	int line_pad;
Packit Service a1973e
	char buf[128];
Packit Service a1973e
Packit Service a1973e
	(void)file;
Packit Service a1973e
Packit Service a1973e
//	line_pad=(60-strlen(file));
Packit Service a1973e
//	if (line_pad<0) line_pad=0;
Packit Service a1973e
Packit Service a1973e
//	fprintf(stdout,"%s",file);
Packit Service a1973e
//	print_spaces(line_pad);
Packit Service a1973e
Packit Service a1973e
	memset( buf, '\0', sizeof ( buf ) );
Packit Service a1973e
Packit Service a1973e
	if (TESTS_COLOR) fprintf(stdout,"%s",RED);
Packit Service a1973e
	fprintf( stdout, "FAILED!!!");
Packit Service a1973e
	if (TESTS_COLOR) fprintf(stdout,"%s",NORMAL);
Packit Service a1973e
	fprintf( stdout, "\nLine # %d ", line );
Packit Service a1973e
Packit Service a1973e
	if ( retval == PAPI_ESYS ) {
Packit Service a1973e
		sprintf( buf, "System error in %s", call );
Packit Service a1973e
		perror( buf );
Packit Service a1973e
	} else if ( retval > 0 ) {
Packit Service a1973e
		fprintf( stdout, "Error: %s\n", call );
Packit Service a1973e
	} else if ( retval == 0 ) {
Packit Service a1973e
#if defined(sgi)
Packit Service a1973e
		fprintf( stdout, "SGI requires root permissions for this test\n" );
Packit Service a1973e
#else
Packit Service a1973e
		fprintf( stdout, "Error: %s\n", call );
Packit Service a1973e
#endif
Packit Service a1973e
	} else {
Packit Service a1973e
		fprintf( stdout, "Error in %s: %s\n", call, PAPI_strerror( retval ) );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
//	fprintf( stdout, "\n" );
Packit Service a1973e
Packit Service a1973e
	/* NOTE: Because test_fail is called from thread functions,
Packit Service a1973e
	   calling PAPI_shutdown here could prevent some threads
Packit Service a1973e
	   from being able to free memory they have allocated.
Packit Service a1973e
	 */
Packit Service a1973e
	if ( PAPI_is_initialized(  ) ) {
Packit Service a1973e
		PAPI_shutdown(  );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* This is stupid.  Threads are the rare case */
Packit Service a1973e
	/* and in any case an exit() should clear everything out */
Packit Service a1973e
	/* adding back the exit() call */
Packit Service a1973e
Packit Service a1973e
	exit(1);
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/* Use a positive value of retval to simply print an error message */
Packit Service a1973e
void
Packit Service a1973e
test_warn( const char *file, int line, const char *call, int retval )
Packit Service a1973e
{
Packit Service a1973e
Packit Service a1973e
	(void)file;
Packit Service a1973e
Packit Service a1973e
//	int line_pad;
Packit Service a1973e
Packit Service a1973e
//	line_pad=60-strlen(file);
Packit Service a1973e
//	if (line_pad<0) line_pad=0;
Packit Service a1973e
Packit Service a1973e
	char buf[128];
Packit Service a1973e
	memset( buf, '\0', sizeof ( buf ) );
Packit Service a1973e
Packit Service a1973e
//	fprintf(stdout,"%s",file);
Packit Service a1973e
//	print_spaces(line_pad);
Packit Service a1973e
Packit Service a1973e
	if (TEST_WARN==0) fprintf(stdout,"\n");
Packit Service a1973e
	if (TESTS_COLOR) fprintf( stdout, "%s", YELLOW);
Packit Service a1973e
	fprintf( stdout, "WARNING ");
Packit Service a1973e
	if (TESTS_COLOR) fprintf( stdout, "%s", NORMAL);
Packit Service a1973e
	fprintf( stdout, "Line # %d ", line );
Packit Service a1973e
Packit Service a1973e
	if ( retval == PAPI_ESYS ) {
Packit Service a1973e
		sprintf( buf, "System warning in %s", call );
Packit Service a1973e
		perror( buf );
Packit Service a1973e
	} else if ( retval > 0 ) {
Packit Service a1973e
		fprintf( stdout, "Warning: %s\n", call );
Packit Service a1973e
	} else if ( retval == 0 ) {
Packit Service a1973e
		fprintf( stdout, "Warning: %s\n", call );
Packit Service a1973e
	} else {
Packit Service a1973e
		fprintf( stdout, "Warning in %s: %s\n", call, PAPI_strerror( retval ));
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	TEST_WARN++;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
void
Packit Service a1973e
test_skip( const char *file, int line, const char *call, int retval )
Packit Service a1973e
{
Packit Service a1973e
//	int line_pad;
Packit Service a1973e
Packit Service a1973e
	(void)file;
Packit Service a1973e
	(void)line;
Packit Service a1973e
	(void)call;
Packit Service a1973e
	(void)retval;
Packit Service a1973e
Packit Service a1973e
//	line_pad=(60-strlen(file));
Packit Service a1973e
Packit Service a1973e
//	fprintf(stdout,"%s",file);
Packit Service a1973e
//	print_spaces(line_pad);
Packit Service a1973e
Packit Service a1973e
	fprintf( stdout, "SKIPPED\n");
Packit Service a1973e
Packit Service a1973e
	exit( 0 );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
void
Packit Service a1973e
test_print_event_header( const char *call, int evset )
Packit Service a1973e
{
Packit Service a1973e
        int *ev_ids;
Packit Service a1973e
	int i, nev;
Packit Service a1973e
	int retval;
Packit Service a1973e
	char evname[PAPI_MAX_STR_LEN];
Packit Service a1973e
Packit Service a1973e
	if ( *call )
Packit Service a1973e
		fprintf( stdout, "%s", call );
Packit Service a1973e
Packit Service a1973e
	if ((nev = PAPI_get_cmp_opt(PAPI_MAX_MPX_CTRS,NULL,0)) <= 0) {
Packit Service a1973e
		fprintf( stdout, "Can not list event names.\n" );
Packit Service a1973e
		return;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ((ev_ids = calloc(nev,sizeof(int))) == NULL) {
Packit Service a1973e
		fprintf( stdout, "Can not list event names.\n" );
Packit Service a1973e
		return;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_list_events( evset, ev_ids, &nev );
Packit Service a1973e
Packit Service a1973e
	if ( retval == PAPI_OK ) {
Packit Service a1973e
		for ( i = 0; i < nev; i++ ) {
Packit Service a1973e
			PAPI_event_code_to_name( ev_ids[i], evname );
Packit Service a1973e
			printf( ONEHDR, evname );
Packit Service a1973e
		}
Packit Service a1973e
	} else {
Packit Service a1973e
		fprintf( stdout, "Can not list event names." );
Packit Service a1973e
	}
Packit Service a1973e
	fprintf( stdout, "\n" );
Packit Service a1973e
	free(ev_ids);
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
add_two_events( int *num_events, int *papi_event, int *mask ) {
Packit Service a1973e
Packit Service a1973e
	int retval;
Packit Service a1973e
	int EventSet = PAPI_NULL;
Packit Service a1973e
Packit Service a1973e
	*num_events=2;
Packit Service a1973e
	*papi_event=PAPI_TOT_INS;
Packit Service a1973e
	(void)mask;
Packit Service a1973e
Packit Service a1973e
	/* create the eventset */
Packit Service a1973e
	retval = PAPI_create_eventset( &EventSet );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_add_named_event( EventSet, "PAPI_TOT_CYC");
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		if (!TESTS_QUIET) printf("Couldn't add PAPI_TOT_CYC\n");
Packit Service a1973e
		test_skip(__FILE__,__LINE__,"Couldn't add PAPI_TOT_CYC",0);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_add_named_event( EventSet, "PAPI_TOT_INS");
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		if (!TESTS_QUIET) printf("Couldn't add PAPI_TOT_CYC\n");
Packit Service a1973e
		test_skip(__FILE__,__LINE__,"Couldn't add PAPI_TOT_CYC",0);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	return EventSet;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
add_two_nonderived_events( int *num_events, int *papi_event, int *mask ) {
Packit Service a1973e
Packit Service a1973e
	/* query and set up the right event to monitor */
Packit Service a1973e
	int EventSet = PAPI_NULL;
Packit Service a1973e
	int retval;
Packit Service a1973e
Packit Service a1973e
	*num_events=0;
Packit Service a1973e
Packit Service a1973e
#define POTENTIAL_EVENTS 3
Packit Service a1973e
Packit Service a1973e
	unsigned int potential_evt_to_add[POTENTIAL_EVENTS][2] =
Packit Service a1973e
		{ {( unsigned int ) PAPI_FP_INS, MASK_FP_INS},
Packit Service a1973e
		  {( unsigned int ) PAPI_FP_OPS, MASK_FP_OPS},
Packit Service a1973e
		  {( unsigned int ) PAPI_TOT_INS, MASK_TOT_INS}
Packit Service a1973e
		};
Packit Service a1973e
Packit Service a1973e
	int i;
Packit Service a1973e
Packit Service a1973e
	*mask = 0;
Packit Service a1973e
Packit Service a1973e
	/* could leak up to two event sets. */
Packit Service a1973e
	for(i=0;i
Packit Service a1973e
		retval = PAPI_query_event( ( int ) potential_evt_to_add[i][0] );
Packit Service a1973e
		if (retval  == PAPI_OK ) {
Packit Service a1973e
			if ( !is_event_derived(potential_evt_to_add[i][0])) {
Packit Service a1973e
		 		*papi_event = ( int ) potential_evt_to_add[i][0];
Packit Service a1973e
		 		*mask = ( int ) potential_evt_to_add[i][1] | MASK_TOT_CYC;
Packit Service a1973e
		 		EventSet = add_test_events( num_events, mask, 0 );
Packit Service a1973e
		 		if ( *num_events == 2 ) break;
Packit Service a1973e
			}
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	return EventSet;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/* add native events to use all counters */
Packit Service a1973e
int
Packit Service a1973e
enum_add_native_events( int *num_events, int **evtcodes,
Packit Service a1973e
			int need_interrupt, int no_software_events,
Packit Service a1973e
			int cidx)
Packit Service a1973e
{
Packit Service a1973e
	/* query and set up the right event to monitor */
Packit Service a1973e
Packit Service a1973e
	int EventSet = PAPI_NULL;
Packit Service a1973e
	int i = 0, k, event_code, retval;
Packit Service a1973e
	int counters, event_found = 0;
Packit Service a1973e
	PAPI_event_info_t info;
Packit Service a1973e
	const PAPI_component_info_t *s = NULL;
Packit Service a1973e
	const PAPI_hw_info_t *hw_info = NULL;
Packit Service a1973e
Packit Service a1973e
	*num_events=0;
Packit Service a1973e
Packit Service a1973e
	s = PAPI_get_component_info( cidx );
Packit Service a1973e
	if ( s == NULL ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__,
Packit Service a1973e
				"PAPI_get_component_info", PAPI_ECMP );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	hw_info = PAPI_get_hardware_info(  );
Packit Service a1973e
	if ( hw_info == NULL ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_get_hardware_info", 2 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	counters = PAPI_num_hwctrs(  );
Packit Service a1973e
	if (counters<1) {
Packit Service a1973e
		if (!TESTS_QUIET) printf("No counters available\n");
Packit Service a1973e
		return EventSet;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (!TESTS_QUIET) {
Packit Service a1973e
		printf("Trying to fill %d hardware counters...\n", counters);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (need_interrupt) {
Packit Service a1973e
		if ( (!strcmp(hw_info->model_string,"POWER6")) ||
Packit Service a1973e
			(!strcmp(hw_info->model_string,"POWER5")) ) {
Packit Service a1973e
Packit Service a1973e
			test_warn(__FILE__, __LINE__,
Packit Service a1973e
					"Limiting num_counters because of "
Packit Service a1973e
					"LIMITED_PMC on Power5 and Power6",1);
Packit Service a1973e
			counters=4;
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	( *evtcodes ) = ( int * ) calloc( counters, sizeof ( int ) );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_create_eventset( &EventSet );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* For platform independence, always ASK FOR the first event */
Packit Service a1973e
	/* Don't just assume it'll be the first numeric value */
Packit Service a1973e
	i = 0 | PAPI_NATIVE_MASK;
Packit Service a1973e
	retval = PAPI_enum_cmp_event( &i, PAPI_ENUM_FIRST, cidx );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_enum_cmp_event", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
     do {
Packit Service a1973e
        retval = PAPI_get_event_info( i, &info );
Packit Service a1973e
Packit Service a1973e
	/* HACK! FIXME */
Packit Service a1973e
        if (no_software_events && ( strstr(info.symbol,"PERF_COUNT_SW") || strstr(info.long_descr, "PERF_COUNT_SW") ) ) {
Packit Service a1973e
	   if (!TESTS_QUIET) {
Packit Service a1973e
	      printf("Blocking event %s as a SW event\n", info.symbol);
Packit Service a1973e
	   }
Packit Service a1973e
	   continue;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( s->cntr_umasks ) {
Packit Service a1973e
	   k = i;
Packit Service a1973e
Packit Service a1973e
	   if ( PAPI_enum_cmp_event( &k, PAPI_NTV_ENUM_UMASKS, cidx ) == PAPI_OK ) {
Packit Service a1973e
	      do {
Packit Service a1973e
	         retval = PAPI_get_event_info( k, &info );
Packit Service a1973e
		 event_code = ( int ) info.event_code;
Packit Service a1973e
Packit Service a1973e
		 retval = PAPI_add_event( EventSet, event_code );
Packit Service a1973e
		 if ( retval == PAPI_OK ) {
Packit Service a1973e
		    ( *evtcodes )[event_found] = event_code;
Packit Service a1973e
		    if ( !TESTS_QUIET ) {
Packit Service a1973e
		       printf( "event_code[%d] = %#x (%s)\n",
Packit Service a1973e
			       event_found, event_code, info.symbol );
Packit Service a1973e
		    }
Packit Service a1973e
		    event_found++;
Packit Service a1973e
		 } else {
Packit Service a1973e
		    if ( !TESTS_QUIET ) {
Packit Service a1973e
		       printf( "%#x (%s) can't be added to the EventSet.\n",
Packit Service a1973e
			       event_code, info.symbol );
Packit Service a1973e
		    }
Packit Service a1973e
		 }
Packit Service a1973e
	      } while ( PAPI_enum_cmp_event( &k, PAPI_NTV_ENUM_UMASKS, cidx ) == PAPI_OK
Packit Service a1973e
						&& event_found < counters );
Packit Service a1973e
	   } else {
Packit Service a1973e
	      event_code = ( int ) info.event_code;
Packit Service a1973e
	      retval = PAPI_add_event( EventSet, event_code );
Packit Service a1973e
	      if ( retval == PAPI_OK ) {
Packit Service a1973e
		  ( *evtcodes )[event_found] = event_code;
Packit Service a1973e
		  if ( !TESTS_QUIET ) {
Packit Service a1973e
		     printf( "event_code[%d] = %#x (%s)\n",
Packit Service a1973e
			       event_found, event_code, info.symbol );
Packit Service a1973e
		  }
Packit Service a1973e
		  event_found++;
Packit Service a1973e
	      }
Packit Service a1973e
	   }
Packit Service a1973e
	   if ( !TESTS_QUIET && retval == PAPI_OK ) {
Packit Service a1973e
	     /* */
Packit Service a1973e
	   }
Packit Service a1973e
	} else {
Packit Service a1973e
			event_code = ( int ) info.event_code;
Packit Service a1973e
			retval = PAPI_add_event( EventSet, event_code );
Packit Service a1973e
			if ( retval == PAPI_OK ) {
Packit Service a1973e
				( *evtcodes )[event_found] = event_code;
Packit Service a1973e
				event_found++;
Packit Service a1973e
			} else {
Packit Service a1973e
				if ( !TESTS_QUIET )
Packit Service a1973e
					fprintf( stdout, "%#x is not available.\n", event_code );
Packit Service a1973e
			}
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
     while ( PAPI_enum_cmp_event( &i, PAPI_ENUM_EVENTS, cidx ) == PAPI_OK &&
Packit Service a1973e
			event_found < counters );
Packit Service a1973e
Packit Service a1973e
	*num_events = ( int ) event_found;
Packit Service a1973e
Packit Service a1973e
	if (!TESTS_QUIET) printf("Tried to fill %d counters with events, "
Packit Service a1973e
				 "found %d\n",counters,event_found);
Packit Service a1973e
Packit Service a1973e
	return EventSet;
Packit Service a1973e
}