Blame src/linux-bgq.c

Packit Service a1973e
/****************************/
Packit Service a1973e
/* THIS IS OPEN SOURCE CODE */
Packit Service a1973e
/****************************/
Packit Service a1973e
Packit Service a1973e
/** 
Packit Service a1973e
 * @file    linux-bgq.c
Packit Service a1973e
 * @author  Heike Jagode
Packit Service a1973e
 *          jagode@eecs.utk.edu
Packit Service a1973e
 * Mods:	< your name here >
Packit Service a1973e
 *			< your email address >
Packit Service a1973e
 * Blue Gene/Q CPU component: BGPM / Punit
Packit Service a1973e
 * 
Packit Service a1973e
 * Tested version of bgpm (early access)
Packit Service a1973e
 *
Packit Service a1973e
 * @brief
Packit Service a1973e
 *  This file has the source code for a component that enables PAPI-C to 
Packit Service a1973e
 *  access hardware monitoring counters for BG/Q through the BGPM library.
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_internal.h"
Packit Service a1973e
#include "papi_lock.h"
Packit Service a1973e
#include "papi_memory.h"
Packit Service a1973e
#include "extras.h"
Packit Service a1973e
Packit Service a1973e
#include "linux-bgq.h"
Packit Service a1973e
Packit Service a1973e
#include "papi_vector.h"
Packit Service a1973e
#include "error.h"
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * BG/Q specific 'stuff'
Packit Service a1973e
 */
Packit Service a1973e
#include <ucontext.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
#include <signal.h>
Packit Service a1973e
#include <sys/time.h>
Packit Service a1973e
#include <errno.h>
Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
#include <string.h>
Packit Service a1973e
#include <sys/utsname.h>
Packit Service a1973e
#include "spi/include/upci/upci.h"
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
#include <inttypes.h>
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
// BG/Q macros
Packit Service a1973e
#define get_cycles GetTimeBase
Packit Service a1973e
Packit Service a1973e
// BG/Q external structures/functions/stuff
Packit Service a1973e
#if 1
Packit Service a1973e
UPC_Lock_t thdLocks[PAPI_MAX_LOCK];
Packit Service a1973e
#else
Packit Service a1973e
pthread_mutex_t thdLocks[PAPI_MAX_LOCK];
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
/* Defined in papi_data.c */
Packit Service a1973e
//extern papi_mdi_t _papi_hwi_system_info;
Packit Service a1973e
Packit Service a1973e
papi_vector_t _bgq_vectors;
Packit Service a1973e
PAPI_os_info_t _papi_os_info;
Packit Service a1973e
Packit Service a1973e
#define OPCODE_EVENT_CHUNK 8
Packit Service a1973e
static int allocated_opcode_events = 0;
Packit Service a1973e
static int num_opcode_events = 0;
Packit Service a1973e
Packit Service a1973e
struct bgq_generic_events_t {
Packit Service a1973e
	int idx;
Packit Service a1973e
	int eventId;
Packit Service a1973e
	char mask[PAPI_MIN_STR_LEN];
Packit Service a1973e
	char opcode[PAPI_MIN_STR_LEN];
Packit Service a1973e
	uint64_t opcode_mask;
Packit Service a1973e
};
Packit Service a1973e
Packit Service a1973e
static struct bgq_generic_events_t *GenericEvent;
Packit Service a1973e
Packit Service a1973e
/* Defined in linux-bgq-memory.c */
Packit Service a1973e
extern int _bgq_get_memory_info( PAPI_hw_info_t * pHwInfo, int pCPU_Type );
Packit Service a1973e
extern int _bgq_get_dmem_info( PAPI_dmem_info_t * pDmemInfo );
Packit Service a1973e
Packit Service a1973e
/* prototypes */
Packit Service a1973e
void user_signal_handler( int hEvtSet, uint64_t address, uint64_t ovfVector, const ucontext_t *pContext );
Packit Service a1973e
Packit Service a1973e
/*******************************************************************************
Packit Service a1973e
 ********  BEGIN FUNCTIONS USED INTERNALLY SPECIFIC TO THIS COMPONENT **********
Packit Service a1973e
 ******************************************************************************/
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Lock
Packit Service a1973e
 */
Packit Service a1973e
void
Packit Service a1973e
_papi_hwd_lock( int lock ) 
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( _AT_ " _papi_hwd_lock %d\n", lock);
Packit Service a1973e
#endif
Packit Service a1973e
	assert( lock < PAPI_MAX_LOCK );
Packit Service a1973e
#if 1
Packit Service a1973e
	UPC_Lock( &thdLocks[lock] );
Packit Service a1973e
#else
Packit Service a1973e
	pthread_mutex_lock( &thdLocks[lock] );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( _AT_ " _papi_hwd_lock got lock %d\n", lock );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	return;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Unlock
Packit Service a1973e
 */
Packit Service a1973e
void
Packit Service a1973e
_papi_hwd_unlock( int lock )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
    printf( _AT_ " _papi_hwd_unlock %d\n", lock );
Packit Service a1973e
#endif
Packit Service a1973e
    assert( lock < PAPI_MAX_LOCK );
Packit Service a1973e
#if 1
Packit Service a1973e
	UPC_Unlock( &thdLocks[lock] );
Packit Service a1973e
#else
Packit Service a1973e
	pthread_mutex_unlock( &thdLocks[lock] );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	return;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Get System Information
Packit Service a1973e
 *
Packit Service a1973e
 * Initialize system information structure
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_get_system_info( papi_mdi_t *mdi )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_get_system_info\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	( void ) mdi;
Packit Service a1973e
	Personality_t personality;
Packit Service a1973e
	int retval;
Packit Service a1973e
	
Packit Service a1973e
	/* Hardware info */
Packit Service a1973e
	retval = Kernel_GetPersonality( &personality, sizeof( Personality_t ) );
Packit Service a1973e
	if ( retval ) {
Packit Service a1973e
		fprintf( stdout, "Kernel_GetPersonality returned %d (sys error=%d).\n"
Packit Service a1973e
				"\t%s\n", retval, errno, strerror( errno ) );
Packit Service a1973e
		return PAPI_ESYS;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Returns the number of processors that are associated with the currently
Packit Service a1973e
	 * running process */
Packit Service a1973e
	_papi_hwi_system_info.hw_info.ncpu = Kernel_ProcessorCount( );
Packit Service a1973e
	// TODO: HJ Those values need to be fixed
Packit Service a1973e
	_papi_hwi_system_info.hw_info.nnodes = Kernel_ProcessCount( );
Packit Service a1973e
	_papi_hwi_system_info.hw_info.totalcpus = _papi_hwi_system_info.hw_info.ncpu;
Packit Service a1973e
	
Packit Service a1973e
	_papi_hwi_system_info.hw_info.cpu_max_mhz = personality.Kernel_Config.FreqMHz;
Packit Service a1973e
	_papi_hwi_system_info.hw_info.cpu_min_mhz = personality.Kernel_Config.FreqMHz;
Packit Service a1973e
Packit Service a1973e
	_papi_hwi_system_info.hw_info.mhz = ( float ) personality.Kernel_Config.FreqMHz;
Packit Service a1973e
	SUBDBG( "_bgq_get_system_info:  Detected MHZ is %f\n",
Packit Service a1973e
		   _papi_hwi_system_info.hw_info.mhz );
Packit Service a1973e
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Initialize Control State
Packit Service a1973e
 *
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_init_control_state( hwd_control_state_t * ptr )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_init_control_state\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	int retval;
Packit Service a1973e
	
Packit Service a1973e
	ptr->EventGroup = Bgpm_CreateEventSet();
Packit Service a1973e
	retval = _check_BGPM_error( ptr->EventGroup, "Bgpm_CreateEventSet" );
Packit Service a1973e
	if ( retval < 0 ) return retval;
Packit Service a1973e
Packit Service a1973e
	// initialize multiplexing flag to OFF (0)
Packit Service a1973e
	ptr->muxOn = 0;
Packit Service a1973e
	// initialize overflow flag to OFF (0)
Packit Service a1973e
	ptr->overflow = 0;
Packit Service a1973e
    ptr->overflow_count = 0;
Packit Service a1973e
	// initialized BGPM eventGroup flag to NOT applied yet (0)
Packit Service a1973e
	ptr->bgpm_eventset_applied = 0;
Packit Service a1973e
	
Packit Service a1973e
	return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Set Domain
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_set_domain( hwd_control_state_t * cntrl, int domain )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_set_domain\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	int found = 0;
Packit Service a1973e
	( void ) cntrl;
Packit Service a1973e
	
Packit Service a1973e
	if ( PAPI_DOM_USER & domain )
Packit Service a1973e
		found = 1;
Packit Service a1973e
	
Packit Service a1973e
	if ( PAPI_DOM_KERNEL & domain )
Packit Service a1973e
		found = 1;
Packit Service a1973e
	
Packit Service a1973e
	if ( PAPI_DOM_OTHER & domain )
Packit Service a1973e
		found = 1;
Packit Service a1973e
	
Packit Service a1973e
	if ( !found )
Packit Service a1973e
		return ( PAPI_EINVAL );
Packit Service a1973e
	
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * PAPI Initialization
Packit Service a1973e
 * This is called whenever a thread is initialized
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_init( hwd_context_t * ctx )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_init\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	( void ) ctx;
Packit Service a1973e
	int retval;
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG_BGPM
Packit Service a1973e
	Bgpm_PrintOnError(1);
Packit Service a1973e
	Bgpm_ExitOnError(0);
Packit Service a1973e
#else
Packit Service a1973e
	Bgpm_PrintOnError(0);
Packit Service a1973e
	// avoid bgpm default of exiting when error occurs - caller will check return code instead.
Packit Service a1973e
	Bgpm_ExitOnError(0);	
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	retval = Bgpm_Init( BGPM_MODE_SWDISTRIB );
Packit Service a1973e
	retval = _check_BGPM_error( retval, "Bgpm_Init" );
Packit Service a1973e
	if ( retval < 0 ) return retval;
Packit Service a1973e
Packit Service a1973e
	//_common_initBgpm();
Packit Service a1973e
	
Packit Service a1973e
	return PAPI_OK;	
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
_bgq_multiplex( hwd_control_state_t * bgq_state )
Packit Service a1973e
{
Packit Service a1973e
	int retval;
Packit Service a1973e
	uint64_t bgpm_period;
Packit Service a1973e
	double Sec, Hz;	
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf("_bgq_multiplex BEGIN: Num of Events = %d (vs %d)\n", Bgpm_NumEvents( bgq_state->EventGroup ), bgq_state->count );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	// convert Mhz to Hz ( = cycles / sec )
Packit Service a1973e
	Hz = (double) _papi_hwi_system_info.hw_info.cpu_max_mhz * 1000 * 1000;
Packit Service a1973e
	// convert PAPI multiplex period (in ns) to BGPM period (in cycles)
Packit Service a1973e
	Sec = (double) _papi_os_info.itimer_ns / ( 1000 * 1000 * 1000 );
Packit Service a1973e
	bgpm_period = Hz * Sec;
Packit Service a1973e
Packit Service a1973e
	// if EventGroup is not empty -- which is required by BGPM before 
Packit Service a1973e
	// we can call SetMultiplex() -- then drain the events from the 
Packit Service a1973e
	// BGPM EventGroup, turn on multiplex flag, and rebuild BGPM EventGroup.
Packit Service a1973e
	if ( 0 < bgq_state->count ) {
Packit Service a1973e
		// Delete and re-create BGPM eventset
Packit Service a1973e
		retval = _common_deleteRecreate( &bgq_state->EventGroup );
Packit Service a1973e
		if ( retval < 0 ) return retval;
Packit Service a1973e
Packit Service a1973e
		// turn on multiplex for BGPM
Packit Service a1973e
		retval = Bgpm_SetMultiplex( bgq_state->EventGroup, bgpm_period, BGPM_NORMAL ); 		
Packit Service a1973e
		retval = _check_BGPM_error( retval, "Bgpm_SetMultiplex" );
Packit Service a1973e
		if ( retval < 0 ) return retval;
Packit Service a1973e
Packit Service a1973e
		// rebuild BGPM EventGroup
Packit Service a1973e
		retval = _common_rebuildEventgroup( bgq_state->count, 
Packit Service a1973e
								   bgq_state->EventGroup_local, 
Packit Service a1973e
								   &bgq_state->EventGroup );	
Packit Service a1973e
		if ( retval < 0 ) return retval;
Packit Service a1973e
	}
Packit Service a1973e
	else {
Packit Service a1973e
		// need to pass either BGPM_NORMAL or BGPM_NOTNORMAL 
Packit Service a1973e
		// BGPM_NORMAL: numbers reported by Bgpm_ReadEvent() are normalized 
Packit Service a1973e
		// to the maximum time spent in a multiplexed group
Packit Service a1973e
		retval = Bgpm_SetMultiplex( bgq_state->EventGroup, bgpm_period, BGPM_NORMAL ); 		
Packit Service a1973e
		retval = _check_BGPM_error( retval, "Bgpm_SetMultiplex" );
Packit Service a1973e
		if ( retval < 0 ) return retval;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf("_bgq_multiplex END: Num of Events = %d (vs %d) --- retval = %d\n", 
Packit Service a1973e
		   Bgpm_NumEvents( bgq_state->EventGroup ), bgq_state->count, retval );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	return ( retval );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Register Allocation
Packit Service a1973e
 *
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_allocate_registers( EventSetInfo_t * ESI )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf("_bgq_allocate_registers\n");
Packit Service a1973e
#endif
Packit Service a1973e
	int i, natNum;
Packit Service a1973e
	int xEventId;
Packit Service a1973e
Packit Service a1973e
	/*
Packit Service a1973e
	 * Start monitoring the events...
Packit Service a1973e
	 */
Packit Service a1973e
	natNum = ESI->NativeCount;
Packit Service a1973e
Packit Service a1973e
	for ( i = 0; i < natNum; i++ ) {
Packit Service a1973e
		xEventId = ( ESI->NativeInfoArray[i].ni_event & PAPI_NATIVE_AND_MASK ) + 1;
Packit Service a1973e
		ESI->NativeInfoArray[i].ni_position = i;		
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * PAPI Cleanup Eventset
Packit Service a1973e
 *
Packit Service a1973e
 * Destroy and re-create the BGPM / Punit EventSet
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_cleanup_eventset( hwd_control_state_t * ctrl )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_cleanup_eventset\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	// set multiplexing flag to OFF (0)
Packit Service a1973e
	ctrl->muxOn = 0;
Packit Service a1973e
	// set overflow flag to OFF (0)
Packit Service a1973e
	ctrl->overflow = 0;
Packit Service a1973e
    ctrl->overflow_count = 0;
Packit Service a1973e
	// set BGPM eventGroup flag back to NOT applied yet (0)
Packit Service a1973e
	ctrl->bgpm_eventset_applied = 0;
Packit Service a1973e
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Update Control State
Packit Service a1973e
 *
Packit Service a1973e
 * This function clears the current contents of the control
Packit Service a1973e
 * structure and updates it with whatever resources are allocated
Packit Service a1973e
 * for all the native events in the native info structure array.
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_update_control_state( hwd_control_state_t * ptr,
Packit Service a1973e
						   NativeInfo_t * native, int count,
Packit Service a1973e
						   hwd_context_t * ctx )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( _AT_ " _bgq_update_control_state: count = %d, EventGroup=%d\n", count, ptr->EventGroup );
Packit Service a1973e
#endif
Packit Service a1973e
	( void ) ctx;
Packit Service a1973e
	int i, j, k, index, retval;
Packit Service a1973e
	unsigned evtIdx;
Packit Service a1973e
	
Packit Service a1973e
	// Delete and re-create BGPM eventset
Packit Service a1973e
	retval = _common_deleteRecreate( &ptr->EventGroup );
Packit Service a1973e
	if ( retval < 0 ) return retval;
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
    printf( _AT_ " _bgq_update_control_state: EventGroup=%d, muxOn = %d, overflow = %d\n",
Packit Service a1973e
		   ptr->EventGroup, ptr->muxOn, ptr->overflow );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	// add the events to the eventset
Packit Service a1973e
	for ( i = 0; i < count; i++ ) {
Packit Service a1973e
		index = ( native[i].ni_event & PAPI_NATIVE_AND_MASK ) + 1;
Packit Service a1973e
		
Packit Service a1973e
		ptr->EventGroup_local[i] = index;
Packit Service a1973e
Packit Service a1973e
		// we found an opcode event
Packit Service a1973e
		if ( index > BGQ_PUNIT_MAX_EVENTS ) {
Packit Service a1973e
			for( j = 0; j < num_opcode_events; j++ ) {
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
				printf(_AT_ " _bgq_update_control_state: %d out of %d OPCODES\n",
Packit Service a1973e
					   j, num_opcode_events );
Packit Service a1973e
#endif
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
				printf(_AT_ " _bgq_update_control_state: j's idx = %d, index = %d\n",
Packit Service a1973e
					   GenericEvent[j].idx, index );
Packit Service a1973e
#endif
Packit Service a1973e
				if ( GenericEvent[j].idx == ( index - 1) ) {
Packit Service a1973e
					/* Add events to the BGPM eventGroup */
Packit Service a1973e
					retval = Bgpm_AddEvent( ptr->EventGroup, GenericEvent[j].eventId );
Packit Service a1973e
					retval = _check_BGPM_error( retval, "Bgpm_AddEvent" );
Packit Service a1973e
					if ( retval < 0 ) return retval;
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
					printf(_AT_ " _bgq_update_control_state: ADD event: i = %d, eventId = %d\n", i, GenericEvent[j].eventId );
Packit Service a1973e
#endif
Packit Service a1973e
					
Packit Service a1973e
					evtIdx = Bgpm_GetEventIndex( ptr->EventGroup,
Packit Service a1973e
												 GenericEvent[j].eventId,
Packit Service a1973e
												 i );
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
					printf(_AT_ " _bgq_update_control_state: evtIdx in EventGroup = %d\n",
Packit Service a1973e
						   evtIdx );
Packit Service a1973e
#endif
Packit Service a1973e
					if ( 0 == strcmp( GenericEvent[j].mask, "PEVT_INST_XU_GRP_MASK" ) ) {
Packit Service a1973e
						retval = Bgpm_SetXuGrpMask( ptr->EventGroup,
Packit Service a1973e
												    evtIdx,
Packit Service a1973e
												    GenericEvent[j].opcode_mask );
Packit Service a1973e
						retval = _check_BGPM_error( retval, "Bgpm_SetXuGrpMask" );
Packit Service a1973e
						if ( retval < 0 ) return retval;
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
						printf(_AT_ " _bgq_update_control_state: it's PEVT_INST_XU_GRP_MASK\n" );
Packit Service a1973e
#endif
Packit Service a1973e
					} else if ( 0 == strcmp( GenericEvent[j].mask, "PEVT_INST_QFPU_GRP_MASK" ) ) {
Packit Service a1973e
						retval = Bgpm_SetQfpuGrpMask( ptr->EventGroup,
Packit Service a1973e
												      evtIdx,
Packit Service a1973e
													  GenericEvent[j].opcode_mask );
Packit Service a1973e
						retval = _check_BGPM_error( retval, "Bgpm_SetQfpuGrpMask" );
Packit Service a1973e
						if ( retval < 0 ) return retval;
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
						printf(_AT_ " _bgq_update_control_state: it's PEVT_INST_QFPU_GRP_MASK\n" );
Packit Service a1973e
#endif
Packit Service a1973e
					}
Packit Service a1973e
				}	
Packit Service a1973e
			}
Packit Service a1973e
		}
Packit Service a1973e
		else {
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
			printf(_AT_ " _bgq_update_control_state: no OPCODE\n" );
Packit Service a1973e
#endif
Packit Service a1973e
			
Packit Service a1973e
			/* Add events to the BGPM eventGroup */
Packit Service a1973e
			retval = Bgpm_AddEvent( ptr->EventGroup, index );
Packit Service a1973e
			retval = _check_BGPM_error( retval, "Bgpm_AddEvent" );
Packit Service a1973e
			if ( retval < 0 ) return retval;
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
			printf(_AT_ " _bgq_update_control_state: ADD event: i = %d, index = %d\n", i, index );
Packit Service a1973e
#endif
Packit Service a1973e
			
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
	
Packit Service a1973e
	// store how many events we added to an EventSet
Packit Service a1973e
	ptr->count = count;
Packit Service a1973e
Packit Service a1973e
	// if muxOn and EventGroup is not empty -- which is required by BGPM before 
Packit Service a1973e
	// we can call SetMultiplex() -- then drain the events from the 
Packit Service a1973e
	// BGPM EventGroup, turn on multiplex flag, and rebuild BGPM EventGroup.
Packit Service a1973e
	if ( 1 == ptr->muxOn ) {
Packit Service a1973e
		retval = _bgq_multiplex( ptr );
Packit Service a1973e
	}
Packit Service a1973e
		
Packit Service a1973e
    // since update_control_state trashes overflow settings, this puts things
Packit Service a1973e
    // back into balance for BGPM
Packit Service a1973e
    if ( 1 == ptr->overflow ) {
Packit Service a1973e
        for ( k = 0; k < ptr->overflow_count; k++ ) {
Packit Service a1973e
            retval = _common_set_overflow_BGPM( ptr->EventGroup,
Packit Service a1973e
                                       ptr->overflow_list[k].EventIndex,
Packit Service a1973e
                                       ptr->overflow_list[k].threshold,
Packit Service a1973e
                                       user_signal_handler );
Packit Service a1973e
			if ( retval < 0 ) return retval;
Packit Service a1973e
        }
Packit Service a1973e
    }
Packit Service a1973e
		
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * PAPI Start
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_start( hwd_context_t * ctx, hwd_control_state_t * ptr )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "BEGIN _bgq_start\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	( void ) ctx;
Packit Service a1973e
	int retval;
Packit Service a1973e
		
Packit Service a1973e
	retval = Bgpm_Apply( ptr->EventGroup ); 
Packit Service a1973e
	retval = _check_BGPM_error( retval, "Bgpm_Apply" );
Packit Service a1973e
	if ( retval < 0 ) return retval;
Packit Service a1973e
	
Packit Service a1973e
	// set flag to 1: BGPM eventGroup HAS BEEN applied
Packit Service a1973e
	ptr->bgpm_eventset_applied = 1;
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	int i;
Packit Service a1973e
	int numEvts = Bgpm_NumEvents( ptr->EventGroup );
Packit Service a1973e
	for ( i = 0; i < numEvts; i++ ) {
Packit Service a1973e
		printf("%d = %s\n", i, Bgpm_GetEventLabel( ptr->EventGroup, i) );
Packit Service a1973e
	}
Packit Service a1973e
#endif	
Packit Service a1973e
	
Packit Service a1973e
	/* Bgpm_Apply() does an implicit reset; 
Packit Service a1973e
	 hence no need to use Bgpm_ResetStart */
Packit Service a1973e
	retval = Bgpm_Start( ptr->EventGroup );
Packit Service a1973e
	retval = _check_BGPM_error( retval, "Bgpm_Start" );
Packit Service a1973e
	if ( retval < 0 ) return retval;
Packit Service a1973e
	
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * PAPI Stop
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_stop( hwd_context_t * ctx, hwd_control_state_t * ptr )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "BEGIN _bgq_stop\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	( void ) ctx;
Packit Service a1973e
	int retval;
Packit Service a1973e
	
Packit Service a1973e
	retval = Bgpm_Stop( ptr->EventGroup );
Packit Service a1973e
	retval = _check_BGPM_error( retval, "Bgpm_Stop" );
Packit Service a1973e
	if ( retval < 0 ) return retval;
Packit Service a1973e
	
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * PAPI Read Counters
Packit Service a1973e
 *
Packit Service a1973e
 * Read the counters into local storage
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_read( hwd_context_t * ctx, hwd_control_state_t * ptr,
Packit Service a1973e
		   long_long ** dp, int flags )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_read\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	( void ) ctx;
Packit Service a1973e
	( void ) flags;
Packit Service a1973e
	int i, numEvts;
Packit Service a1973e
	
Packit Service a1973e
	numEvts = Bgpm_NumEvents( ptr->EventGroup );
Packit Service a1973e
	if ( numEvts == 0 ) {
Packit Service a1973e
#ifdef DEBUG_BGPM
Packit Service a1973e
		printf ("Error: ret value is %d for BGPM API function Bgpm_NumEvents.\n", numEvts );
Packit Service a1973e
		//return ( EXIT_FAILURE );
Packit Service a1973e
#endif
Packit Service a1973e
	}
Packit Service a1973e
	
Packit Service a1973e
	for ( i = 0; i < numEvts; i++ ) 
Packit Service a1973e
		ptr->counters[i] = _common_getEventValue( i, ptr->EventGroup );
Packit Service a1973e
Packit Service a1973e
	*dp = ptr->counters;
Packit Service a1973e
		
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * PAPI Reset
Packit Service a1973e
 *
Packit Service a1973e
 * Zero the counter values
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_reset( hwd_context_t * ctx, hwd_control_state_t * ptr )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_reset\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	( void ) ctx;
Packit Service a1973e
	int retval;
Packit Service a1973e
	
Packit Service a1973e
	/* we can't simply call Bgpm_Reset() since PAPI doesn't have the 
Packit Service a1973e
	   restriction that an EventSet has to be stopped before resetting is
Packit Service a1973e
	   possible. However, BGPM does have this restriction. 
Packit Service a1973e
	   Hence we need to stop, reset and start */
Packit Service a1973e
	retval = Bgpm_Stop( ptr->EventGroup );
Packit Service a1973e
	retval = _check_BGPM_error( retval, "Bgpm_Stop" );
Packit Service a1973e
	if ( retval < 0 ) return retval;
Packit Service a1973e
	
Packit Service a1973e
	retval = Bgpm_ResetStart( ptr->EventGroup );
Packit Service a1973e
	retval = _check_BGPM_error( retval, "Bgpm_ResetStart" );
Packit Service a1973e
	if ( retval < 0 ) return retval;
Packit Service a1973e
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * PAPI Shutdown
Packit Service a1973e
 *
Packit Service a1973e
 * This routine is for shutting down threads,
Packit Service a1973e
 * including the master thread.
Packit Service a1973e
 * Effectively a no-op, same as BG/L/P...
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_shutdown( hwd_context_t * ctx )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_shutdown\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	( void ) ctx;
Packit Service a1973e
	int retval;
Packit Service a1973e
	
Packit Service a1973e
	/* Disable BGPM library */	
Packit Service a1973e
	retval = Bgpm_Disable();
Packit Service a1973e
	retval = _check_BGPM_error( retval, "Bgpm_Disable" );
Packit Service a1973e
	if ( retval < 0 ) return retval;
Packit Service a1973e
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * PAPI Write
Packit Service a1973e
 *
Packit Service a1973e
 * Write counter values
Packit Service a1973e
 * NOTE:  Could possible support, but signal error as BG/L/P does...
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_write( hwd_context_t * ctx, hwd_control_state_t * cntrl, long_long * from )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_write\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	( void ) ctx;
Packit Service a1973e
	( void ) cntrl;
Packit Service a1973e
	( void ) from;
Packit Service a1973e
	
Packit Service a1973e
	return PAPI_ECMP;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Dispatch Timer
Packit Service a1973e
 *
Packit Service a1973e
 * NOT the same as BG/L/P where we simply return
Packit Service a1973e
 * This function is used when hardware overflows are working or when
Packit Service a1973e
 * software overflows are forced
Packit Service a1973e
 */
Packit Service a1973e
void
Packit Service a1973e
_bgq_dispatch_timer( int signal, hwd_siginfo_t * info, void *uc )
Packit Service a1973e
{
Packit Service a1973e
	( void ) signal;
Packit Service a1973e
	( void ) info;
Packit Service a1973e
	( void ) uc;
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf("BEGIN _bgq_dispatch_timer\n");
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	return;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * user_signal_handler
Packit Service a1973e
 *
Packit Service a1973e
 * This function is used when hardware overflows are working or when
Packit Service a1973e
 * software overflows are forced
Packit Service a1973e
 */
Packit Service a1973e
void
Packit Service a1973e
user_signal_handler( int hEvtSet, uint64_t address, uint64_t ovfVector, const ucontext_t *pContext )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "user_signal_handler start\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	( void ) address;
Packit Service a1973e
	int retval; 
Packit Service a1973e
	unsigned i;
Packit Service a1973e
	int isHardware = 1;
Packit Service a1973e
	int cidx = _bgq_vectors.cmp_info.CmpIdx;
Packit Service a1973e
	long_long overflow_bit = 0;
Packit Service a1973e
	caddr_t address1;
Packit Service a1973e
	_papi_hwi_context_t ctx;
Packit Service a1973e
	ctx.ucontext = ( hwd_ucontext_t * ) pContext;
Packit Service a1973e
	ThreadInfo_t *thread = _papi_hwi_lookup_thread( 0 );
Packit Service a1973e
	
Packit Service a1973e
	//printf(_AT_ " thread = %p\n", thread);	// <<<<<<<<<<<<<<<<<<
Packit Service a1973e
	
Packit Service a1973e
	EventSetInfo_t *ESI;
Packit Service a1973e
	ESI = thread->running_eventset[cidx];
Packit Service a1973e
    // Get the indices of all events which have overflowed.
Packit Service a1973e
    unsigned ovfIdxs[BGPM_MAX_OVERFLOW_EVENTS];
Packit Service a1973e
    unsigned len = BGPM_MAX_OVERFLOW_EVENTS;
Packit Service a1973e
	
Packit Service a1973e
    retval = Bgpm_GetOverflowEventIndices( hEvtSet, ovfVector, ovfIdxs, &len );
Packit Service a1973e
Packit Service a1973e
	if ( retval < 0 ) {
Packit Service a1973e
#ifdef DEBUG_BGPM
Packit Service a1973e
		printf ( "Error: ret value is %d for BGPM API function Bgpm_GetOverflowEventIndices.\n", 
Packit Service a1973e
				 retval ); 
Packit Service a1973e
#endif
Packit Service a1973e
		return;
Packit Service a1973e
	}
Packit Service a1973e
		
Packit Service a1973e
	if ( thread == NULL ) {
Packit Service a1973e
		PAPIERROR( "thread == NULL in user_signal_handler!" );
Packit Service a1973e
		return;
Packit Service a1973e
	}
Packit Service a1973e
		
Packit Service a1973e
	if ( ESI == NULL ) {
Packit Service a1973e
		PAPIERROR( "ESI == NULL in user_signal_handler!");
Packit Service a1973e
		return;
Packit Service a1973e
	}
Packit Service a1973e
		
Packit Service a1973e
	if ( ESI->overflow.flags == 0 ) {
Packit Service a1973e
		PAPIERROR( "ESI->overflow.flags == 0 in user_signal_handler!");
Packit Service a1973e
		return;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	for ( i = 0; i < len; i++ ) {
Packit Service a1973e
		uint64_t hProf;
Packit Service a1973e
        Bgpm_GetEventUser1( hEvtSet, ovfIdxs[i], &hProf );
Packit Service a1973e
        if ( hProf ) {
Packit Service a1973e
			overflow_bit ^= 1 << ovfIdxs[i];
Packit Service a1973e
			break;
Packit Service a1973e
        }
Packit Service a1973e
		
Packit Service a1973e
	}
Packit Service a1973e
	
Packit Service a1973e
	if ( ESI->overflow.flags & PAPI_OVERFLOW_FORCE_SW ) {
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
		printf("OVERFLOW_SOFTWARE\n");
Packit Service a1973e
#endif
Packit Service a1973e
		address1 = GET_OVERFLOW_ADDRESS( ctx );
Packit Service a1973e
		_papi_hwi_dispatch_overflow_signal( ( void * ) &ctx, address1, NULL, 0, 0, &thread, cidx );
Packit Service a1973e
		return;
Packit Service a1973e
	}
Packit Service a1973e
	else if ( ESI->overflow.flags & PAPI_OVERFLOW_HARDWARE ) {
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
		printf("OVERFLOW_HARDWARE\n");
Packit Service a1973e
#endif
Packit Service a1973e
		address1 = GET_OVERFLOW_ADDRESS( ctx );
Packit Service a1973e
		_papi_hwi_dispatch_overflow_signal( ( void * ) &ctx, address1, &isHardware, overflow_bit, 0, &thread, cidx );
Packit Service a1973e
	}
Packit Service a1973e
	else {
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
		printf("OVERFLOW_NONE\n");
Packit Service a1973e
#endif
Packit Service a1973e
		PAPIERROR( "ESI->overflow.flags is set to something other than PAPI_OVERFLOW_HARDWARE or PAPI_OVERFLOW_FORCE_SW (%#x)", thread->running_eventset[cidx]->overflow.flags);
Packit Service a1973e
	}
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Set Overflow
Packit Service a1973e
 *
Packit Service a1973e
 * This is commented out in BG/L/P - need to explore and complete...
Packit Service a1973e
 * However, with true 64-bit counters in BG/Q and all counters for PAPI
Packit Service a1973e
 * always starting from a true zero (we don't allow write...), the possibility
Packit Service a1973e
 * for overflow is remote at best...
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_set_overflow( EventSetInfo_t * ESI, int EventIndex, int threshold )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf("BEGIN _bgq_set_overflow\n");
Packit Service a1973e
#endif
Packit Service a1973e
	hwd_control_state_t * this_state = ( hwd_control_state_t * ) ESI->ctl_state;
Packit Service a1973e
	int retval;
Packit Service a1973e
	int evt_idx;
Packit Service a1973e
	
Packit Service a1973e
	/*
Packit Service a1973e
	 * In case an BGPM eventGroup HAS BEEN applied or attached before
Packit Service a1973e
	 * overflow is set, delete the eventGroup and create an new empty one,
Packit Service a1973e
	 * and rebuild as it was prior to deletion
Packit Service a1973e
	 */
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_set_overflow: bgpm_eventset_applied = %d, threshold = %d\n",
Packit Service a1973e
		    this_state->bgpm_eventset_applied, threshold );
Packit Service a1973e
#endif	
Packit Service a1973e
	if ( 1 == this_state->bgpm_eventset_applied && 0 != threshold ) {
Packit Service a1973e
		retval = _common_deleteRecreate( &this_state->EventGroup );
Packit Service a1973e
		if ( retval < 0 ) return retval;
Packit Service a1973e
Packit Service a1973e
		retval = _common_rebuildEventgroup( this_state->count,
Packit Service a1973e
								   this_state->EventGroup_local,
Packit Service a1973e
								   &this_state->EventGroup );
Packit Service a1973e
		if ( retval < 0 ) return retval;
Packit Service a1973e
Packit Service a1973e
		/* set BGPM eventGroup flag back to NOT applied yet (0) 
Packit Service a1973e
		 * because the eventGroup has been recreated from scratch */
Packit Service a1973e
		this_state->bgpm_eventset_applied = 0;
Packit Service a1973e
	}
Packit Service a1973e
	
Packit Service a1973e
	
Packit Service a1973e
	evt_idx = ESI->EventInfoArray[EventIndex].pos[0];
Packit Service a1973e
	//evt_id = ( ESI->NativeInfoArray[EventIndex].ni_event & PAPI_NATIVE_AND_MASK ) + 1;
Packit Service a1973e
	SUBDBG( "Hardware counter %d (vs %d) used in overflow, threshold %d\n",
Packit Service a1973e
		    evt_idx, EventIndex, threshold );
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "Hardware counter %d (vs %d) used in overflow, threshold %d\n",
Packit Service a1973e
		    evt_idx, EventIndex, threshold );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	/* If this counter isn't set to overflow, it's an error */
Packit Service a1973e
	if ( threshold == 0 ) {
Packit Service a1973e
		/* Remove the signal handler */
Packit Service a1973e
		retval = _papi_hwi_stop_signal( _bgq_vectors.cmp_info.hardware_intr_sig );
Packit Service a1973e
		if ( retval != PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
	}
Packit Service a1973e
	else {
Packit Service a1973e
		this_state->overflow = 1;
Packit Service a1973e
        this_state->overflow_count++;
Packit Service a1973e
		this_state->overflow_list[this_state->overflow_count-1].threshold = threshold;
Packit Service a1973e
		this_state->overflow_list[this_state->overflow_count-1].EventIndex = evt_idx;
Packit Service a1973e
	
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
		printf( "_bgq_set_overflow: Enable the signal handler\n" );
Packit Service a1973e
#endif		
Packit Service a1973e
		/* Enable the signal handler */
Packit Service a1973e
		retval = _papi_hwi_start_signal( _bgq_vectors.cmp_info.hardware_intr_sig, 
Packit Service a1973e
										 NEED_CONTEXT, 
Packit Service a1973e
										 _bgq_vectors.cmp_info.CmpIdx );
Packit Service a1973e
		if ( retval != PAPI_OK )
Packit Service a1973e
			return ( retval );
Packit Service a1973e
		
Packit Service a1973e
		retval = _common_set_overflow_BGPM( this_state->EventGroup,
Packit Service a1973e
                                  this_state->overflow_list[this_state->overflow_count-1].EventIndex,
Packit Service a1973e
                                  this_state->overflow_list[this_state->overflow_count-1].threshold,
Packit Service a1973e
                                  user_signal_handler );
Packit Service a1973e
		if ( retval < 0 ) return retval;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Set Profile
Packit Service a1973e
 *
Packit Service a1973e
 * Same as for BG/L/P, routine not used and returns error
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_set_profile( EventSetInfo_t * ESI, int EventIndex, int threshold )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf("BEGIN _bgq_set_profile\n");
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	( void ) ESI;
Packit Service a1973e
	( void ) EventIndex;
Packit Service a1973e
	( void ) threshold;
Packit Service a1973e
	
Packit Service a1973e
	return PAPI_ECMP;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Stop Profiling
Packit Service a1973e
 *
Packit Service a1973e
 * Same as for BG/L/P...
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_stop_profiling( ThreadInfo_t * master, EventSetInfo_t * ESI )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf("BEGIN _bgq_stop_profiling\n");
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	( void ) master;
Packit Service a1973e
	( void ) ESI;
Packit Service a1973e
	
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * PAPI Control
Packit Service a1973e
 *
Packit Service a1973e
 * Same as for BG/L/P - initialize the domain
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_ctl( hwd_context_t * ctx, int code, _papi_int_option_t * option )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_ctl\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	( void ) ctx;
Packit Service a1973e
	int retval;
Packit Service a1973e
	
Packit Service a1973e
	switch ( code ) {
Packit Service a1973e
		case PAPI_MULTIPLEX:
Packit Service a1973e
		{
Packit Service a1973e
			hwd_control_state_t * bgq_state = ( ( hwd_control_state_t * ) option->multiplex.ESI->ctl_state );
Packit Service a1973e
			bgq_state->muxOn = 1;
Packit Service a1973e
			retval = _bgq_multiplex( bgq_state );
Packit Service a1973e
			return ( retval );
Packit Service a1973e
		}
Packit Service a1973e
		default:
Packit Service a1973e
			return ( PAPI_OK );
Packit Service a1973e
	}
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Get Real Micro-seconds
Packit Service a1973e
 */
Packit Service a1973e
long long
Packit Service a1973e
_bgq_get_real_usec( void )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_get_real_usec\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	/*
Packit Service a1973e
	 * NOTE:  _papi_hwi_system_info.hw_info.mhz is really a representation of unit of time per cycle.
Packit Service a1973e
	 *        On BG/P, it's value is 8.5e-4.  Therefore, to get cycles per sec, we have to multiply
Packit Service a1973e
	 *        by 1.0e12.  To then convert to usec, we have to divide by 1.0e-3.
Packit Service a1973e
	 */
Packit Service a1973e
	return ( ( long long ) ( ( ( float ) get_cycles(  ) ) /
Packit Service a1973e
							 ( ( _papi_hwi_system_info.hw_info.cpu_max_mhz ) ) ) );
Packit Service a1973e
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Get Real Cycles
Packit Service a1973e
 *
Packit Service a1973e
 * Same for BG/L/P, using native function...
Packit Service a1973e
 */
Packit Service a1973e
long long
Packit Service a1973e
_bgq_get_real_cycles( void )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_get_real_cycles\n" );
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	return ( ( long long ) get_cycles(  ) );
Packit Service a1973e
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Get Virtual Micro-seconds
Packit Service a1973e
 *
Packit Service a1973e
 * Same calc as for BG/L/P, returns real usec...
Packit Service a1973e
 */
Packit Service a1973e
long long
Packit Service a1973e
_bgq_get_virt_usec( void )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_get_virt_usec\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	return _bgq_get_real_usec(  );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Get Virtual Cycles
Packit Service a1973e
 *
Packit Service a1973e
 * Same calc as for BG/L/P, returns real cycles...
Packit Service a1973e
 */
Packit Service a1973e
long long
Packit Service a1973e
_bgq_get_virt_cycles( void )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_get_virt_cycles\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	return _bgq_get_real_cycles(  );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Component setup and shutdown
Packit Service a1973e
 *
Packit Service a1973e
 * Initialize hardware counters, setup the function vector table
Packit Service a1973e
 * and get hardware information, this routine is called when the
Packit Service a1973e
 * PAPI process is initialized (IE PAPI_library_init)
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_init_component( int cidx )
Packit Service a1973e
{	
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf("_bgq_init_substrate\n");
Packit Service a1973e
	//printf("_bgq_init_substrate: 1. BGPM_INITIALIZED = %d \n", BGPM_INITIALIZED);
Packit Service a1973e
#endif
Packit Service a1973e
	int retval;
Packit Service a1973e
	int i;
Packit Service a1973e
		
Packit Service a1973e
	/* allocate the opcode event structure */
Packit Service a1973e
	GenericEvent = calloc( OPCODE_EVENT_CHUNK, sizeof( struct bgq_generic_events_t ) );
Packit Service a1973e
	if ( NULL == GenericEvent ) {
Packit Service a1973e
		return PAPI_ENOMEM;
Packit Service a1973e
	}
Packit Service a1973e
	
Packit Service a1973e
	/* init opcode event stuff */
Packit Service a1973e
	allocated_opcode_events = OPCODE_EVENT_CHUNK;
Packit Service a1973e
	num_opcode_events = 0;
Packit Service a1973e
		
Packit Service a1973e
	_bgq_vectors.cmp_info.CmpIdx = cidx;
Packit Service a1973e
Packit Service a1973e
	/*
Packit Service a1973e
	 * Fill in what we can of the papi_system_info
Packit Service a1973e
	 */
Packit Service a1973e
	SUBDBG( "Before _bgq_get_system_info()...\n" );
Packit Service a1973e
	retval = _bgq_get_system_info( &_papi_hwi_system_info );
Packit Service a1973e
	SUBDBG( "After _bgq_get_system_info(), retval=%d...\n", retval );
Packit Service a1973e
	if ( retval != PAPI_OK )
Packit Service a1973e
		return ( retval );
Packit Service a1973e
Packit Service a1973e
	/*
Packit Service a1973e
	 * Setup memory info
Packit Service a1973e
	 */
Packit Service a1973e
Packit Service a1973e
	SUBDBG( "Before _bgq_get_memory_info...\n" );
Packit Service a1973e
	retval = _bgq_get_memory_info( &_papi_hwi_system_info.hw_info,
Packit Service a1973e
								  ( int ) _papi_hwi_system_info.hw_info.
Packit Service a1973e
								  model );
Packit Service a1973e
	SUBDBG( "After _bgq_get_memory_info, retval=%d...\n", retval );
Packit Service a1973e
	if ( retval )
Packit Service a1973e
		return ( retval );
Packit Service a1973e
#if 1
Packit Service a1973e
	/* Setup Locks */
Packit Service a1973e
	for ( i = 0; i < PAPI_MAX_LOCK; i++ )
Packit Service a1973e
		thdLocks[i] = 0;  // MUTEX_OPEN
Packit Service a1973e
#else
Packit Service a1973e
	for( i = 0; i < PAPI_MAX_LOCK; i++ ) {
Packit Service a1973e
		pthread_mutex_init( &thdLocks[i], NULL );
Packit Service a1973e
	}
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	/* Setup presets */
Packit Service a1973e
	retval = _papi_load_preset_table( "BGQ", 0, cidx );
Packit Service a1973e
	if ( retval ) {
Packit Service a1973e
		return retval;
Packit Service a1973e
	}	
Packit Service a1973e
	
Packit Service a1973e
	
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*************************************/
Packit Service a1973e
/* CODE TO SUPPORT OPAQUE NATIVE MAP */
Packit Service a1973e
/*************************************/
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Event Name to Native Code
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_ntv_name_to_code( const char *name, unsigned int *event_code )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_ntv_name_to_code\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	int ret;
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "name = ===%s===\n", name );
Packit Service a1973e
#endif	
Packit Service a1973e
Packit Service a1973e
	/* Treat events differently if BGPM Opcodes are used */
Packit Service a1973e
	/* Opcode group selection values are "OR"ed together to create a desired 
Packit Service a1973e
	 mask of instruction group events to accumulate in the same counter */	
Packit Service a1973e
	if ( 0 == strncmp( name, "PEVT_INST_XU_GRP_MASK", strlen( "PEVT_INST_XU_GRP_MASK" ) ) ||
Packit Service a1973e
		 0 == strncmp( name, "PEVT_INST_QFPU_GRP_MASK", strlen( "PEVT_INST_QFPU_GRP_MASK" ) ) ) {
Packit Service a1973e
Packit Service a1973e
		char *pcolon;
Packit Service a1973e
		pcolon = strchr( name, ':' );
Packit Service a1973e
		
Packit Service a1973e
		// Found colon separator
Packit Service a1973e
		if ( pcolon != NULL ) {
Packit Service a1973e
			int mask_len = pcolon - name;
Packit Service a1973e
			strncpy( GenericEvent[num_opcode_events].mask, name,  mask_len  );
Packit Service a1973e
			strncpy( GenericEvent[num_opcode_events].opcode, pcolon+1, strlen(name) - 1 - mask_len );
Packit Service a1973e
			/* opcode_mask needs to be 'uint64_t',
Packit Service a1973e
			   hence we use strtoull() which returns an 'unsigned long long int' */
Packit Service a1973e
			GenericEvent[num_opcode_events].opcode_mask = strtoull( GenericEvent[num_opcode_events].opcode, (char **)NULL, 16 );
Packit Service a1973e
			GenericEvent[num_opcode_events].idx = OPCODE_BUF + num_opcode_events;
Packit Service a1973e
			/* Return event id matching the generic XU/QFPU event string */
Packit Service a1973e
			GenericEvent[num_opcode_events].eventId = Bgpm_GetEventIdFromLabel( GenericEvent[num_opcode_events].mask );
Packit Service a1973e
			if ( GenericEvent[num_opcode_events].eventId <= 0 ) {
Packit Service a1973e
#ifdef DEBUG_BGPM
Packit Service a1973e
				printf ("Error: ret value is %d for BGPM API function '%s'.\n",
Packit Service a1973e
						ret, "Bgpm_GetEventIdFromLabel" );
Packit Service a1973e
#endif
Packit Service a1973e
				return PAPI_ENOEVNT;
Packit Service a1973e
			}
Packit Service a1973e
			
Packit Service a1973e
			*event_code = GenericEvent[num_opcode_events].idx;
Packit Service a1973e
			
Packit Service a1973e
			num_opcode_events++;
Packit Service a1973e
			
Packit Service a1973e
			/* If there are too many opcode events than allocated, then allocate more room */
Packit Service a1973e
			if( num_opcode_events >= allocated_opcode_events ) {
Packit Service a1973e
				
Packit Service a1973e
				SUBDBG("Allocating more room for BGPM opcode events (%d %ld)\n",
Packit Service a1973e
					   ( allocated_opcode_events + NATIVE_OPCODE_CHUNK ),
Packit Service a1973e
					   ( long )sizeof( struct bgq_generic_events_t ) *
Packit Service a1973e
					   ( allocated_opcode_events + NATIVE_OPCODE_CHUNK ) );
Packit Service a1973e
				
Packit Service a1973e
				GenericEvent = realloc( GenericEvent, sizeof( struct bgq_generic_events_t ) *
Packit Service a1973e
									   ( allocated_opcode_events + OPCODE_EVENT_CHUNK ) );
Packit Service a1973e
				if ( NULL == GenericEvent ) {
Packit Service a1973e
					return PAPI_ENOMEM;
Packit Service a1973e
				}
Packit Service a1973e
				allocated_opcode_events += OPCODE_EVENT_CHUNK;
Packit Service a1973e
			}
Packit Service a1973e
        }
Packit Service a1973e
		else {
Packit Service a1973e
			SUBDBG( "Error: Found a generic BGPM event mask without opcode string\n" );
Packit Service a1973e
			return PAPI_ENOEVNT;
Packit Service a1973e
		}
Packit Service a1973e
		
Packit Service a1973e
		
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
		printf(_AT_ " _bgq_ntv_name_to_code: GenericEvent no. %d: \n", num_opcode_events-1 );
Packit Service a1973e
		printf(	"idx         = %d\n", GenericEvent[num_opcode_events-1].idx);
Packit Service a1973e
		printf(	"eventId     = %d\n", GenericEvent[num_opcode_events-1].eventId);
Packit Service a1973e
		printf(	"mask        = %s\n", GenericEvent[num_opcode_events-1].mask);
Packit Service a1973e
		printf(	"opcode      = %s\n", GenericEvent[num_opcode_events-1].opcode);
Packit Service a1973e
		printf( "opcode_mask = %#lX (%lu)\n", GenericEvent[num_opcode_events-1].opcode_mask,
Packit Service a1973e
			   GenericEvent[num_opcode_events-1].opcode_mask );
Packit Service a1973e
#endif
Packit Service a1973e
	}
Packit Service a1973e
	else {
Packit Service a1973e
		/* Return event id matching a given event label string */
Packit Service a1973e
		ret = Bgpm_GetEventIdFromLabel ( name );
Packit Service a1973e
		
Packit Service a1973e
		if ( ret <= 0 ) {
Packit Service a1973e
#ifdef DEBUG_BGPM
Packit Service a1973e
			printf ("Error: ret value is %d for BGPM API function '%s'.\n",
Packit Service a1973e
					ret, "Bgpm_GetEventIdFromLabel" );
Packit Service a1973e
#endif
Packit Service a1973e
			return PAPI_ENOEVNT;
Packit Service a1973e
		}
Packit Service a1973e
		else if ( ret > BGQ_PUNIT_MAX_EVENTS ) // not a PUnit event
Packit Service a1973e
			return PAPI_ENOEVNT;
Packit Service a1973e
		else
Packit Service a1973e
			*event_code = ( ret - 1 );		
Packit Service a1973e
	}
Packit Service a1973e
	
Packit Service a1973e
	return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Native Code to Event Name
Packit Service a1973e
 *
Packit Service a1973e
 * Given a native event code, returns the short text label
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_ntv_code_to_name( unsigned int EventCode, char *name, int len )
Packit Service a1973e
{	
Packit Service a1973e
#ifdef DEBUG_BGQ	
Packit Service a1973e
	printf( "_bgq_ntv_code_to_name\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	int index = ( EventCode & PAPI_NATIVE_AND_MASK ) + 1;
Packit Service a1973e
	
Packit Service a1973e
	if ( index >= MAX_COUNTERS )
Packit Service a1973e
		return PAPI_ENOEVNT;
Packit Service a1973e
			
Packit Service a1973e
	strncpy( name, Bgpm_GetEventIdLabel( index ), len );
Packit Service a1973e
	
Packit Service a1973e
	if ( name == NULL ) {
Packit Service a1973e
#ifdef DEBUG_BGPM
Packit Service a1973e
		printf ("Error: ret value is NULL for BGPM API function Bgpm_GetEventIdLabel.\n" );
Packit Service a1973e
#endif
Packit Service a1973e
		return PAPI_ENOEVNT;
Packit Service a1973e
	}
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "name = ===%s===\n", name );
Packit Service a1973e
#endif	
Packit Service a1973e
	
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Native Code to Event Description
Packit Service a1973e
 *
Packit Service a1973e
 * Given a native event code, returns the longer native event description
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_ntv_code_to_descr( unsigned int EventCode, char *name, int len )
Packit Service a1973e
{	
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_ntv_code_to_descr\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	int retval;
Packit Service a1973e
	int index = ( EventCode & PAPI_NATIVE_AND_MASK ) + 1;
Packit Service a1973e
Packit Service a1973e
	retval = Bgpm_GetLongDesc( index, name, &len );
Packit Service a1973e
	retval = _check_BGPM_error( retval, "Bgpm_GetLongDesc" );						 
Packit Service a1973e
	if ( retval < 0 ) return retval;
Packit Service a1973e
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Native Code to Bit Configuration
Packit Service a1973e
 *
Packit Service a1973e
 * Given a native event code, assigns the native event's
Packit Service a1973e
 * information to a given pointer.
Packit Service a1973e
 * NOTE: The info must be COPIED to location addressed by
Packit Service a1973e
 *       the provided pointer, not just referenced!
Packit Service a1973e
 * NOTE: For BG/Q, the bit configuration is not needed,
Packit Service a1973e
 *       as the native SPI is used to configure events.
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_ntv_code_to_bits( unsigned int EventCode, hwd_register_t * bits )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_ntv_code_to_bits\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	( void ) EventCode;
Packit Service a1973e
	( void ) bits;
Packit Service a1973e
	
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Native ENUM Events
Packit Service a1973e
 *
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
_bgq_ntv_enum_events( unsigned int *EventCode, int modifier )
Packit Service a1973e
{
Packit Service a1973e
#ifdef DEBUG_BGQ
Packit Service a1973e
	printf( "_bgq_ntv_enum_events\n" );
Packit Service a1973e
#endif
Packit Service a1973e
	
Packit Service a1973e
	switch ( modifier ) {
Packit Service a1973e
		case PAPI_ENUM_FIRST:
Packit Service a1973e
			*EventCode = PAPI_NATIVE_MASK;
Packit Service a1973e
			
Packit Service a1973e
			return ( PAPI_OK );
Packit Service a1973e
			break;
Packit Service a1973e
			
Packit Service a1973e
		case PAPI_ENUM_EVENTS:
Packit Service a1973e
		{
Packit Service a1973e
			int index = ( *EventCode & PAPI_NATIVE_AND_MASK ) + 1;
Packit Service a1973e
			
Packit Service a1973e
			if ( index < BGQ_PUNIT_MAX_EVENTS ) {
Packit Service a1973e
				*EventCode = *EventCode + 1;
Packit Service a1973e
				return ( PAPI_OK );
Packit Service a1973e
			} else
Packit Service a1973e
				return ( PAPI_ENOEVNT );
Packit Service a1973e
			
Packit Service a1973e
			break;
Packit Service a1973e
		}
Packit Service a1973e
		default:
Packit Service a1973e
			return ( PAPI_EINVAL );
Packit Service a1973e
	}
Packit Service a1973e
	
Packit Service a1973e
	return ( PAPI_EINVAL );	
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
int 
Packit Service a1973e
_papi_hwi_init_os(void) {
Packit Service a1973e
	
Packit Service a1973e
	struct utsname uname_buffer;
Packit Service a1973e
	
Packit Service a1973e
	/* Get the kernel info */
Packit Service a1973e
    uname(&uname_buffer);
Packit Service a1973e
	
Packit Service a1973e
    strncpy(_papi_os_info.name,uname_buffer.sysname,PAPI_MAX_STR_LEN);
Packit Service a1973e
	
Packit Service a1973e
    strncpy(_papi_os_info.version,uname_buffer.release,PAPI_MAX_STR_LEN);
Packit Service a1973e
	
Packit Service a1973e
    _papi_os_info.itimer_sig = PAPI_INT_MPX_SIGNAL;
Packit Service a1973e
    _papi_os_info.itimer_num = PAPI_INT_ITIMER;
Packit Service a1973e
    _papi_os_info.itimer_res_ns = 1;
Packit Service a1973e
	
Packit Service a1973e
    return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * PAPI Vector Table for BG/Q
Packit Service a1973e
 */
Packit Service a1973e
papi_vector_t _bgq_vectors = {
Packit Service a1973e
	.cmp_info = {
Packit Service a1973e
				 /* Default component information (unspecified values are initialized to 0) */
Packit Service a1973e
				 .name = "linux-bgq",
Packit Service a1973e
				 .short_name = "bgq",
Packit Service a1973e
				 .description = "Blue Gene/Q component",
Packit Service a1973e
				 .num_cntrs = BGQ_PUNIT_MAX_COUNTERS,
Packit Service a1973e
				 .num_mpx_cntrs = BGQ_PUNIT_MAX_COUNTERS,
Packit Service a1973e
				 .num_native_events = BGQ_PUNIT_MAX_EVENTS,
Packit Service a1973e
				 .default_domain = PAPI_DOM_USER,
Packit Service a1973e
				 .available_domains = PAPI_DOM_USER | PAPI_DOM_KERNEL,
Packit Service a1973e
				 .default_granularity = PAPI_GRN_THR,
Packit Service a1973e
				 .available_granularities = PAPI_GRN_THR,
Packit Service a1973e
				 .hardware_intr_sig = PAPI_INT_SIGNAL,
Packit Service a1973e
				 .hardware_intr = 1,
Packit Service a1973e
				 .kernel_multiplex = 1,
Packit Service a1973e
		
Packit Service a1973e
				 /* component specific cmp_info initializations */
Packit Service a1973e
				 .fast_real_timer = 1,
Packit Service a1973e
				 .fast_virtual_timer = 0,
Packit Service a1973e
				 }
Packit Service a1973e
	,
Packit Service a1973e
Packit Service a1973e
	/* Sizes of framework-opaque component-private structures */
Packit Service a1973e
	.size = {
Packit Service a1973e
			 .context = sizeof ( hwd_context_t ),
Packit Service a1973e
			 .control_state = sizeof ( hwd_control_state_t ),
Packit Service a1973e
			 .reg_value = sizeof ( hwd_register_t ),
Packit Service a1973e
			 .reg_alloc = sizeof ( hwd_reg_alloc_t ),
Packit Service a1973e
			 }
Packit Service a1973e
	,
Packit Service a1973e
	/* Function pointers in this component */
Packit Service a1973e
//   .get_overflow_address =
Packit Service a1973e
	.start = _bgq_start,
Packit Service a1973e
	.stop = _bgq_stop,
Packit Service a1973e
	.read = _bgq_read,
Packit Service a1973e
	.reset = _bgq_reset,
Packit Service a1973e
	.write = _bgq_write,
Packit Service a1973e
	.stop_profiling = _bgq_stop_profiling,
Packit Service a1973e
	.init_component = _bgq_init_component,
Packit Service a1973e
	.init_thread = _bgq_init,
Packit Service a1973e
	.init_control_state = _bgq_init_control_state,
Packit Service a1973e
	.update_control_state = _bgq_update_control_state,
Packit Service a1973e
	.ctl = _bgq_ctl,
Packit Service a1973e
	.set_overflow = _bgq_set_overflow,
Packit Service a1973e
	//.dispatch_timer = _bgq_dispatch_timer,
Packit Service a1973e
	.set_profile = _bgq_set_profile,
Packit Service a1973e
	.set_domain = _bgq_set_domain,
Packit Service a1973e
	.ntv_enum_events = _bgq_ntv_enum_events,
Packit Service a1973e
	.ntv_name_to_code = _bgq_ntv_name_to_code,
Packit Service a1973e
	.ntv_code_to_name = _bgq_ntv_code_to_name,
Packit Service a1973e
	.ntv_code_to_descr = _bgq_ntv_code_to_descr,
Packit Service a1973e
	.ntv_code_to_bits = _bgq_ntv_code_to_bits,
Packit Service a1973e
	.allocate_registers = _bgq_allocate_registers,
Packit Service a1973e
	.cleanup_eventset = _bgq_cleanup_eventset,
Packit Service a1973e
	.shutdown_thread = _bgq_shutdown
Packit Service a1973e
//  .shutdown_global      =
Packit Service a1973e
//  .user                 =
Packit Service a1973e
};
Packit Service a1973e
Packit Service a1973e
papi_os_vector_t _papi_os_vector = {
Packit Service a1973e
	.get_memory_info = _bgq_get_memory_info,
Packit Service a1973e
	.get_dmem_info = _bgq_get_dmem_info,
Packit Service a1973e
	.get_real_cycles = _bgq_get_real_cycles,
Packit Service a1973e
	.get_real_usec = _bgq_get_real_usec,
Packit Service a1973e
	.get_virt_cycles = _bgq_get_virt_cycles,
Packit Service a1973e
	.get_virt_usec = _bgq_get_virt_usec,
Packit Service a1973e
	.get_system_info = _bgq_get_system_info
Packit Service a1973e
};