Blame src/solaris-common.c

Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_internal.h"
Packit Service a1973e
#include "papi_vector.h"
Packit Service a1973e
#include "papi_memory.h"
Packit Service a1973e
Packit Service a1973e
#include "solaris-common.h"
Packit Service a1973e
Packit Service a1973e
#include <sys/utsname.h>
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
#if 0
Packit Service a1973e
/* once the bug in dladdr is fixed by SUN, (now dladdr caused deadlock when
Packit Service a1973e
   used with pthreads) this function can be used again */
Packit Service a1973e
int
Packit Service a1973e
_solaris_update_shlib_info( papi_mdi_t *mdi )
Packit Service a1973e
{
Packit Service a1973e
	char fname[80], name[PAPI_HUGE_STR_LEN];
Packit Service a1973e
	prmap_t newp;
Packit Service a1973e
	int count, t_index;
Packit Service a1973e
	FILE *map_f;
Packit Service a1973e
	void *vaddr;
Packit Service a1973e
	Dl_info dlip;
Packit Service a1973e
	PAPI_address_map_t *tmp = NULL;
Packit Service a1973e
Packit Service a1973e
	sprintf( fname, "/proc/%d/map", getpid(  ) );
Packit Service a1973e
	map_f = fopen( fname, "r" );
Packit Service a1973e
	if ( !map_f ) {
Packit Service a1973e
		PAPIERROR( "fopen(%s) returned < 0", fname );
Packit Service a1973e
		return ( PAPI_OK );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* count the entries we need */
Packit Service a1973e
	count = 0;
Packit Service a1973e
	t_index = 0;
Packit Service a1973e
	while ( fread( &newp, sizeof ( prmap_t ), 1, map_f ) > 0 ) {
Packit Service a1973e
		vaddr = ( void * ) ( 1 + ( newp.pr_vaddr ) );	// map base address 
Packit Service a1973e
		if ( dladdr( vaddr, &dlip ) > 0 ) {
Packit Service a1973e
			count++;
Packit Service a1973e
			if ( ( newp.pr_mflags & MA_EXEC ) && ( newp.pr_mflags & MA_READ ) ) {
Packit Service a1973e
				if ( !( newp.pr_mflags & MA_WRITE ) )
Packit Service a1973e
					t_index++;
Packit Service a1973e
			}
Packit Service a1973e
			strcpy( name, dlip.dli_fname );
Packit Service a1973e
			if ( strcmp( _papi_hwi_system_info.exe_info.address_info.name,
Packit Service a1973e
						 basename( name ) ) == 0 ) {
Packit Service a1973e
				if ( ( newp.pr_mflags & MA_EXEC ) &&
Packit Service a1973e
					 ( newp.pr_mflags & MA_READ ) ) {
Packit Service a1973e
					if ( !( newp.pr_mflags & MA_WRITE ) ) {
Packit Service a1973e
						_papi_hwi_system_info.exe_info.address_info.text_start =
Packit Service a1973e
							( caddr_t ) newp.pr_vaddr;
Packit Service a1973e
						_papi_hwi_system_info.exe_info.address_info.text_end =
Packit Service a1973e
							( caddr_t ) ( newp.pr_vaddr + newp.pr_size );
Packit Service a1973e
					} else {
Packit Service a1973e
						_papi_hwi_system_info.exe_info.address_info.data_start =
Packit Service a1973e
							( caddr_t ) newp.pr_vaddr;
Packit Service a1973e
						_papi_hwi_system_info.exe_info.address_info.data_end =
Packit Service a1973e
							( caddr_t ) ( newp.pr_vaddr + newp.pr_size );
Packit Service a1973e
					}
Packit Service a1973e
				}
Packit Service a1973e
			}
Packit Service a1973e
		}
Packit Service a1973e
Packit Service a1973e
	}
Packit Service a1973e
	rewind( map_f );
Packit Service a1973e
	tmp =
Packit Service a1973e
		( PAPI_address_map_t * ) papi_calloc( t_index - 1,
Packit Service a1973e
											  sizeof ( PAPI_address_map_t ) );
Packit Service a1973e
Packit Service a1973e
	if ( tmp == NULL ) {
Packit Service a1973e
		PAPIERROR( "Error allocating shared library address map" );
Packit Service a1973e
		return ( PAPI_ENOMEM );
Packit Service a1973e
	}
Packit Service a1973e
	t_index = -1;
Packit Service a1973e
	while ( fread( &newp, sizeof ( prmap_t ), 1, map_f ) > 0 ) {
Packit Service a1973e
		vaddr = ( void * ) ( 1 + ( newp.pr_vaddr ) );	// map base address
Packit Service a1973e
		if ( dladdr( vaddr, &dlip ) > 0 ) {	// valid name
Packit Service a1973e
			strcpy( name, dlip.dli_fname );
Packit Service a1973e
			if ( strcmp( _papi_hwi_system_info.exe_info.address_info.name,
Packit Service a1973e
						 basename( name ) ) == 0 )
Packit Service a1973e
				continue;
Packit Service a1973e
			if ( ( newp.pr_mflags & MA_EXEC ) && ( newp.pr_mflags & MA_READ ) ) {
Packit Service a1973e
				if ( !( newp.pr_mflags & MA_WRITE ) ) {
Packit Service a1973e
					t_index++;
Packit Service a1973e
					tmp[t_index].text_start = ( caddr_t ) newp.pr_vaddr;
Packit Service a1973e
					tmp[t_index].text_end =
Packit Service a1973e
						( caddr_t ) ( newp.pr_vaddr + newp.pr_size );
Packit Service a1973e
					strncpy( tmp[t_index].name, dlip.dli_fname,
Packit Service a1973e
							 PAPI_HUGE_STR_LEN - 1 );
Packit Service a1973e
					tmp[t_index].name[PAPI_HUGE_STR_LEN - 1] = '\0';
Packit Service a1973e
				} else {
Packit Service a1973e
					if ( t_index < 0 )
Packit Service a1973e
						continue;
Packit Service a1973e
					tmp[t_index].data_start = ( caddr_t ) newp.pr_vaddr;
Packit Service a1973e
					tmp[t_index].data_end =
Packit Service a1973e
						( caddr_t ) ( newp.pr_vaddr + newp.pr_size );
Packit Service a1973e
				}
Packit Service a1973e
			}
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	fclose( map_f );
Packit Service a1973e
Packit Service a1973e
	if ( _papi_hwi_system_info.shlib_info.map )
Packit Service a1973e
		papi_free( _papi_hwi_system_info.shlib_info.map );
Packit Service a1973e
	_papi_hwi_system_info.shlib_info.map = tmp;
Packit Service a1973e
	_papi_hwi_system_info.shlib_info.count = t_index + 1;
Packit Service a1973e
Packit Service a1973e
	return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
#endif
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
  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_ns = PAPI_INT_MPX_DEF_US * 1000;
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
#if 0
Packit Service a1973e
int
Packit Service a1973e
_ultra_hwd_update_shlib_info( papi_mdi_t *mdi )
Packit Service a1973e
{
Packit Service a1973e
	/*??? system call takes very long */
Packit Service a1973e
Packit Service a1973e
	char cmd_line[PAPI_HUGE_STR_LEN + PAPI_HUGE_STR_LEN], fname[L_tmpnam];
Packit Service a1973e
	char line[256];
Packit Service a1973e
	char address[16], size[10], flags[64], objname[256];
Packit Service a1973e
	PAPI_address_map_t *tmp = NULL;
Packit Service a1973e
Packit Service a1973e
	FILE *f = NULL;
Packit Service a1973e
	int t_index = 0, i;
Packit Service a1973e
	struct map_record
Packit Service a1973e
	{
Packit Service a1973e
		long address;
Packit Service a1973e
		int size;
Packit Service a1973e
		int flags;
Packit Service a1973e
		char objname[256];
Packit Service a1973e
		struct map_record *next;
Packit Service a1973e
	} *tmpr, *head, *curr;
Packit Service a1973e
Packit Service a1973e
	tmpnam( fname );
Packit Service a1973e
	SUBDBG( "Temporary name %s\n", fname );
Packit Service a1973e
Packit Service a1973e
	sprintf( cmd_line, "/bin/pmap %d > %s", ( int ) getpid(  ), fname );
Packit Service a1973e
	if ( system( cmd_line ) != 0 ) {
Packit Service a1973e
		PAPIERROR( "Could not run %s to get shared library address map",
Packit Service a1973e
				   cmd_line );
Packit Service a1973e
		return ( PAPI_OK );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	f = fopen( fname, "r" );
Packit Service a1973e
	if ( f == NULL ) {
Packit Service a1973e
		PAPIERROR( "fopen(%s) returned < 0", fname );
Packit Service a1973e
		remove( fname );
Packit Service a1973e
		return ( PAPI_OK );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* ignore the first line */
Packit Service a1973e
	fgets( line, 256, f );
Packit Service a1973e
	head = curr = NULL;
Packit Service a1973e
	while ( fgets( line, 256, f ) != NULL ) {
Packit Service a1973e
		/* discard the last line */
Packit Service a1973e
		if ( strncmp( line, " total", 6 ) != 0 ) {
Packit Service a1973e
			sscanf( line, "%s %s %s %s", address, size, flags, objname );
Packit Service a1973e
			if ( objname[0] == '/' ) {
Packit Service a1973e
				tmpr =
Packit Service a1973e
					( struct map_record * )
Packit Service a1973e
					papi_malloc( sizeof ( struct map_record ) );
Packit Service a1973e
				if ( tmpr == NULL )
Packit Service a1973e
					return ( -1 );
Packit Service a1973e
				tmpr->next = NULL;
Packit Service a1973e
				if ( curr ) {
Packit Service a1973e
					curr->next = tmpr;
Packit Service a1973e
					curr = tmpr;
Packit Service a1973e
				}
Packit Service a1973e
				if ( head == NULL ) {
Packit Service a1973e
					curr = head = tmpr;
Packit Service a1973e
				}
Packit Service a1973e
Packit Service a1973e
				SUBDBG( "%s\n", objname );
Packit Service a1973e
Packit Service a1973e
				if ( ( strstr( flags, "read" ) && strstr( flags, "exec" ) ) ||
Packit Service a1973e
					 ( strstr( flags, "r" ) && strstr( flags, "x" ) ) ) {
Packit Service a1973e
					if ( !( strstr( flags, "write" ) || strstr( flags, "w" ) ) ) {	/* text segment */
Packit Service a1973e
						t_index++;
Packit Service a1973e
						tmpr->flags = 1;
Packit Service a1973e
					} else {
Packit Service a1973e
						tmpr->flags = 0;
Packit Service a1973e
					}
Packit Service a1973e
					sscanf( address, "%lx", &tmpr->address );
Packit Service a1973e
					sscanf( size, "%d", &tmpr->size );
Packit Service a1973e
					tmpr->size *= 1024;
Packit Service a1973e
					strcpy( tmpr->objname, objname );
Packit Service a1973e
				}
Packit Service a1973e
Packit Service a1973e
			}
Packit Service a1973e
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
	tmp =
Packit Service a1973e
		( PAPI_address_map_t * ) papi_calloc( t_index - 1,
Packit Service a1973e
											  sizeof ( PAPI_address_map_t ) );
Packit Service a1973e
Packit Service a1973e
	if ( tmp == NULL ) {
Packit Service a1973e
		PAPIERROR( "Error allocating shared library address map" );
Packit Service a1973e
		return ( PAPI_ENOMEM );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	t_index = -1;
Packit Service a1973e
	tmpr = curr = head;
Packit Service a1973e
	i = 0;
Packit Service a1973e
	while ( curr != NULL ) {
Packit Service a1973e
		if ( strcmp( _papi_hwi_system_info.exe_info.address_info.name,
Packit Service a1973e
					 basename( curr->objname ) ) == 0 ) {
Packit Service a1973e
			if ( curr->flags ) {
Packit Service a1973e
				_papi_hwi_system_info.exe_info.address_info.text_start =
Packit Service a1973e
					( caddr_t ) curr->address;
Packit Service a1973e
				_papi_hwi_system_info.exe_info.address_info.text_end =
Packit Service a1973e
					( caddr_t ) ( curr->address + curr->size );
Packit Service a1973e
			} else {
Packit Service a1973e
				_papi_hwi_system_info.exe_info.address_info.data_start =
Packit Service a1973e
					( caddr_t ) curr->address;
Packit Service a1973e
				_papi_hwi_system_info.exe_info.address_info.data_end =
Packit Service a1973e
					( caddr_t ) ( curr->address + curr->size );
Packit Service a1973e
			}
Packit Service a1973e
		} else {
Packit Service a1973e
			if ( curr->flags ) {
Packit Service a1973e
				t_index++;
Packit Service a1973e
				tmp[t_index].text_start = ( caddr_t ) curr->address;
Packit Service a1973e
				tmp[t_index].text_end =
Packit Service a1973e
					( caddr_t ) ( curr->address + curr->size );
Packit Service a1973e
				strncpy( tmp[t_index].name, curr->objname,
Packit Service a1973e
						 PAPI_HUGE_STR_LEN - 1 );
Packit Service a1973e
				tmp[t_index].name[PAPI_HUGE_STR_LEN - 1] = '\0';
Packit Service a1973e
			} else {
Packit Service a1973e
				if ( t_index < 0 )
Packit Service a1973e
					continue;
Packit Service a1973e
				tmp[t_index].data_start = ( caddr_t ) curr->address;
Packit Service a1973e
				tmp[t_index].data_end =
Packit Service a1973e
					( caddr_t ) ( curr->address + curr->size );
Packit Service a1973e
			}
Packit Service a1973e
		}
Packit Service a1973e
		tmpr = curr->next;
Packit Service a1973e
		/* free the temporary allocated memory */
Packit Service a1973e
		papi_free( curr );
Packit Service a1973e
		curr = tmpr;
Packit Service a1973e
	}						 /* end of while */
Packit Service a1973e
Packit Service a1973e
	remove( fname );
Packit Service a1973e
	fclose( f );
Packit Service a1973e
	if ( _papi_hwi_system_info.shlib_info.map )
Packit Service a1973e
		papi_free( _papi_hwi_system_info.shlib_info.map );
Packit Service a1973e
	_papi_hwi_system_info.shlib_info.map = tmp;
Packit Service a1973e
	_papi_hwi_system_info.shlib_info.count = t_index + 1;
Packit Service a1973e
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
/* From niagara2 code */
Packit Service a1973e
int
Packit Service a1973e
_solaris_update_shlib_info( papi_mdi_t *mdi )
Packit Service a1973e
{
Packit Service a1973e
	char *file = "/proc/self/map";
Packit Service a1973e
	char *resolve_pattern = "/proc/self/path/%s";
Packit Service a1973e
Packit Service a1973e
	char lastobject[PRMAPSZ];
Packit Service a1973e
	char link[PAPI_HUGE_STR_LEN];
Packit Service a1973e
	char path[PAPI_HUGE_STR_LEN];
Packit Service a1973e
Packit Service a1973e
	prmap_t mapping;
Packit Service a1973e
Packit Service a1973e
	int fd, count = 0, total = 0, position = -1, first = 1;
Packit Service a1973e
	caddr_t t_min, t_max, d_min, d_max;
Packit Service a1973e
Packit Service a1973e
	PAPI_address_map_t *pam, *cur;
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
	SUBDBG( "ENTERING FUNCTION  >>%s<< at %s:%d\n", __func__, __FILE__,
Packit Service a1973e
			__LINE__ );
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	fd = open( file, O_RDONLY );
Packit Service a1973e
Packit Service a1973e
	if ( fd == -1 ) {
Packit Service a1973e
		return PAPI_ESYS;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	memset( lastobject, 0, PRMAPSZ );
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
	SUBDBG( " -> %s: Preprocessing memory maps from procfs\n", __func__ );
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	/* Search through the list of mappings in order to identify a) how many
Packit Service a1973e
	   mappings are available and b) how many unique mappings are available. */
Packit Service a1973e
	while ( read( fd, &mapping, sizeof ( prmap_t ) ) > 0 ) {
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
		SUBDBG( " -> %s: Found a new memory map entry\n", __func__ );
Packit Service a1973e
#endif
Packit Service a1973e
		/* Another entry found, just the total count of entries. */
Packit Service a1973e
		total++;
Packit Service a1973e
Packit Service a1973e
		/* Is the mapping accessible and not anonymous? */
Packit Service a1973e
		if ( mapping.pr_mflags & ( MA_READ | MA_WRITE | MA_EXEC ) &&
Packit Service a1973e
			 !( mapping.pr_mflags & MA_ANON ) ) {
Packit Service a1973e
			/* Test if a new library has been found. If a new library has been
Packit Service a1973e
			   found a new entry needs to be counted. */
Packit Service a1973e
			if ( strcmp( lastobject, mapping.pr_mapname ) != 0 ) {
Packit Service a1973e
				strncpy( lastobject, mapping.pr_mapname, PRMAPSZ );
Packit Service a1973e
				count++;
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
				SUBDBG( " -> %s: Memory mapping entry valid for %s\n", __func__,
Packit Service a1973e
						mapping.pr_mapname );
Packit Service a1973e
#endif
Packit Service a1973e
			}
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
	SUBDBG( " -> %s: Preprocessing done, starting to analyze\n", __func__ );
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
	/* Start from the beginning, now fill in the found mappings */
Packit Service a1973e
	if ( lseek( fd, 0, SEEK_SET ) == -1 ) {
Packit Service a1973e
		return PAPI_ESYS;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	memset( lastobject, 0, PRMAPSZ );
Packit Service a1973e
Packit Service a1973e
	/* Allocate memory */
Packit Service a1973e
	pam =
Packit Service a1973e
		( PAPI_address_map_t * ) papi_calloc( count,
Packit Service a1973e
											  sizeof ( PAPI_address_map_t ) );
Packit Service a1973e
Packit Service a1973e
	while ( read( fd, &mapping, sizeof ( prmap_t ) ) > 0 ) {
Packit Service a1973e
Packit Service a1973e
		if ( mapping.pr_mflags & MA_ANON ) {
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
			SUBDBG
Packit Service a1973e
				( " -> %s: Anonymous mapping (MA_ANON) found for %s, skipping\n",
Packit Service a1973e
				  __func__, mapping.pr_mapname );
Packit Service a1973e
#endif
Packit Service a1973e
			continue;
Packit Service a1973e
		}
Packit Service a1973e
Packit Service a1973e
		/* Check for a new entry */
Packit Service a1973e
		if ( strcmp( mapping.pr_mapname, lastobject ) != 0 ) {
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
			SUBDBG( " -> %s: Analyzing mapping for %s\n", __func__,
Packit Service a1973e
					mapping.pr_mapname );
Packit Service a1973e
#endif
Packit Service a1973e
			cur = &( pam[++position] );
Packit Service a1973e
			strncpy( lastobject, mapping.pr_mapname, PRMAPSZ );
Packit Service a1973e
			snprintf( link, PAPI_HUGE_STR_LEN, resolve_pattern, lastobject );
Packit Service a1973e
			memset( path, 0, PAPI_HUGE_STR_LEN );
Packit Service a1973e
			readlink( link, path, PAPI_HUGE_STR_LEN );
Packit Service a1973e
			strncpy( cur->name, path, PAPI_HUGE_STR_LEN );
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
			SUBDBG( " -> %s: Resolved name for %s: %s\n", __func__,
Packit Service a1973e
					mapping.pr_mapname, cur->name );
Packit Service a1973e
#endif
Packit Service a1973e
		}
Packit Service a1973e
Packit Service a1973e
		if ( mapping.pr_mflags & MA_READ ) {
Packit Service a1973e
			/* Data (MA_WRITE) or text (MA_READ) segment? */
Packit Service a1973e
			if ( mapping.pr_mflags & MA_WRITE ) {
Packit Service a1973e
				cur->data_start = ( caddr_t ) mapping.pr_vaddr;
Packit Service a1973e
				cur->data_end =
Packit Service a1973e
					( caddr_t ) ( mapping.pr_vaddr + mapping.pr_size );
Packit Service a1973e
Packit Service a1973e
				if ( strcmp
Packit Service a1973e
					 ( cur->name,
Packit Service a1973e
					   _papi_hwi_system_info.exe_info.fullname ) == 0 ) {
Packit Service a1973e
					_papi_hwi_system_info.exe_info.address_info.data_start =
Packit Service a1973e
						cur->data_start;
Packit Service a1973e
					_papi_hwi_system_info.exe_info.address_info.data_end =
Packit Service a1973e
						cur->data_end;
Packit Service a1973e
				}
Packit Service a1973e
Packit Service a1973e
				if ( first )
Packit Service a1973e
					d_min = cur->data_start;
Packit Service a1973e
				if ( first )
Packit Service a1973e
					d_max = cur->data_end;
Packit Service a1973e
Packit Service a1973e
				if ( cur->data_start < d_min ) {
Packit Service a1973e
					d_min = cur->data_start;
Packit Service a1973e
				}
Packit Service a1973e
Packit Service a1973e
				if ( cur->data_end > d_max ) {
Packit Service a1973e
					d_max = cur->data_end;
Packit Service a1973e
				}
Packit Service a1973e
			} else if ( mapping.pr_mflags & MA_EXEC ) {
Packit Service a1973e
				cur->text_start = ( caddr_t ) mapping.pr_vaddr;
Packit Service a1973e
				cur->text_end =
Packit Service a1973e
					( caddr_t ) ( mapping.pr_vaddr + mapping.pr_size );
Packit Service a1973e
Packit Service a1973e
				if ( strcmp
Packit Service a1973e
					 ( cur->name,
Packit Service a1973e
					   _papi_hwi_system_info.exe_info.fullname ) == 0 ) {
Packit Service a1973e
					_papi_hwi_system_info.exe_info.address_info.text_start =
Packit Service a1973e
						cur->text_start;
Packit Service a1973e
					_papi_hwi_system_info.exe_info.address_info.text_end =
Packit Service a1973e
						cur->text_end;
Packit Service a1973e
				}
Packit Service a1973e
Packit Service a1973e
				if ( first )
Packit Service a1973e
					t_min = cur->text_start;
Packit Service a1973e
				if ( first )
Packit Service a1973e
					t_max = cur->text_end;
Packit Service a1973e
Packit Service a1973e
				if ( cur->text_start < t_min ) {
Packit Service a1973e
					t_min = cur->text_start;
Packit Service a1973e
				}
Packit Service a1973e
Packit Service a1973e
				if ( cur->text_end > t_max ) {
Packit Service a1973e
					t_max = cur->text_end;
Packit Service a1973e
				}
Packit Service a1973e
			}
Packit Service a1973e
		}
Packit Service a1973e
Packit Service a1973e
		first = 0;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	close( fd );
Packit Service a1973e
Packit Service a1973e
	/* During the walk of shared objects the upper and lower bound of the
Packit Service a1973e
	   segments could be discovered. The bounds are stored in the PAPI info
Packit Service a1973e
	   structure. The information is important for the profiling functions of
Packit Service a1973e
	   PAPI. */
Packit Service a1973e
Packit Service a1973e
/* This variant would pass the addresses of all text and data segments 
Packit Service a1973e
  _papi_hwi_system_info.exe_info.address_info.text_start = t_min;
Packit Service a1973e
  _papi_hwi_system_info.exe_info.address_info.text_end = t_max;
Packit Service a1973e
  _papi_hwi_system_info.exe_info.address_info.data_start = d_min;
Packit Service a1973e
  _papi_hwi_system_info.exe_info.address_info.data_end = d_max;
Packit Service a1973e
*/
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
	SUBDBG( " -> %s: Analysis of memory maps done, results:\n", __func__ );
Packit Service a1973e
	SUBDBG( " -> %s: text_start=%#x, text_end=%#x, text_size=%lld\n", __func__,
Packit Service a1973e
			_papi_hwi_system_info.exe_info.address_info.text_start,
Packit Service a1973e
			_papi_hwi_system_info.exe_info.address_info.text_end,
Packit Service a1973e
			_papi_hwi_system_info.exe_info.address_info.text_end
Packit Service a1973e
			- _papi_hwi_system_info.exe_info.address_info.text_start );
Packit Service a1973e
	SUBDBG( " -> %s: data_start=%#x, data_end=%#x, data_size=%lld\n", __func__,
Packit Service a1973e
			_papi_hwi_system_info.exe_info.address_info.data_start,
Packit Service a1973e
			_papi_hwi_system_info.exe_info.address_info.data_end,
Packit Service a1973e
			_papi_hwi_system_info.exe_info.address_info.data_end
Packit Service a1973e
			- _papi_hwi_system_info.exe_info.address_info.data_start );
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	/* Store the map read and the total count of shlibs found */
Packit Service a1973e
	_papi_hwi_system_info.shlib_info.map = pam;
Packit Service a1973e
	_papi_hwi_system_info.shlib_info.count = count;
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
	SUBDBG( "LEAVING FUNCTION  >>%s<< at %s:%d\n", __func__, __FILE__,
Packit Service a1973e
			__LINE__ );
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
#if 0
Packit Service a1973e
int
Packit Service a1973e
_niagara2_get_system_info( papi_mdi_t *mdi )
Packit Service a1973e
{
Packit Service a1973e
	// Used for evaluating return values
Packit Service a1973e
	int retval = 0;
Packit Service a1973e
	// Check for process settings
Packit Service a1973e
	pstatus_t *proc_status;
Packit Service a1973e
	psinfo_t *proc_info;
Packit Service a1973e
	// Used for string truncating
Packit Service a1973e
	char *c_ptr;
Packit Service a1973e
	// For retrieving the executable full name
Packit Service a1973e
	char exec_name[PAPI_HUGE_STR_LEN];
Packit Service a1973e
	// For retrieving processor information
Packit Service a1973e
	__sol_processor_information_t cpus;
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
	SUBDBG( "ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
Packit Service a1973e
			__LINE__ );
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	/* Get and set pid */
Packit Service a1973e
	pid = getpid(  );
Packit Service a1973e
Packit Service a1973e
	/* Check for microstate accounting */
Packit Service a1973e
	proc_status = __sol_get_proc_status( pid );
Packit Service a1973e
Packit Service a1973e
	if ( proc_status->pr_flags & PR_MSACCT == 0 ||
Packit Service a1973e
		 proc_status->pr_flags & PR_MSFORK == 0 ) {
Packit Service a1973e
		/* Solaris 10 should have microstate accounting always activated */
Packit Service a1973e
		return PAPI_ECMP;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Fill _papi_hwi_system_info.exe_info.fullname */
Packit Service a1973e
	proc_info = __sol_get_proc_info( pid );
Packit Service a1973e
Packit Service a1973e
	// If there are arguments, trim the string to the executable name.
Packit Service a1973e
	if ( proc_info->pr_argc > 1 ) {
Packit Service a1973e
		c_ptr = strchr( proc_info->pr_psargs, ' ' );
Packit Service a1973e
		if ( c_ptr != NULL )
Packit Service a1973e
			c_ptr = '\0';
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* If the path can be qualified, use the full path, otherwise the trimmed
Packit Service a1973e
	   name. */
Packit Service a1973e
	if ( realpath( proc_info->pr_psargs, exec_name ) != NULL ) {
Packit Service a1973e
		strncpy( _papi_hwi_system_info.exe_info.fullname, exec_name,
Packit Service a1973e
				 PAPI_HUGE_STR_LEN );
Packit Service a1973e
	} else {
Packit Service a1973e
		strncpy( _papi_hwi_system_info.exe_info.fullname, proc_info->pr_psargs,
Packit Service a1973e
				 PAPI_HUGE_STR_LEN );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Fill _papi_hwi_system_info.exe_info.address_info */
Packit Service a1973e
	// Taken from the old component
Packit Service a1973e
	strncpy( _papi_hwi_system_info.exe_info.address_info.name,
Packit Service a1973e
			 basename( _papi_hwi_system_info.exe_info.fullname ),
Packit Service a1973e
			 PAPI_HUGE_STR_LEN );
Packit Service a1973e
	__CHECK_ERR_PAPI( _niagara2_update_shlib_info( &_papi_hwi_system_info ) );
Packit Service a1973e
Packit Service a1973e
	/* Fill _papi_hwi_system_info.hw_info */
Packit Service a1973e
Packit Service a1973e
	// Taken from the old component
Packit Service a1973e
	_papi_hwi_system_info.hw_info.ncpu = sysconf( _SC_NPROCESSORS_ONLN );
Packit Service a1973e
	_papi_hwi_system_info.hw_info.nnodes = 1;
Packit Service a1973e
	_papi_hwi_system_info.hw_info.vendor = PAPI_VENDOR_SUN;
Packit Service a1973e
	strcpy( _papi_hwi_system_info.hw_info.vendor_string, "SUN" );
Packit Service a1973e
	_papi_hwi_system_info.hw_info.totalcpus = sysconf( _SC_NPROCESSORS_CONF );
Packit Service a1973e
	_papi_hwi_system_info.hw_info.model = 1;
Packit Service a1973e
	strcpy( _papi_hwi_system_info.hw_info.model_string, cpc_cciname( cpc ) );
Packit Service a1973e
Packit Service a1973e
	/* The field sparc-version is no longer in prtconf -pv */
Packit Service a1973e
	_papi_hwi_system_info.hw_info.revision = 1;
Packit Service a1973e
Packit Service a1973e
	/* Clock speed */
Packit Service a1973e
	_papi_hwi_system_info.hw_info.mhz = ( float ) __sol_get_processor_clock(  );
Packit Service a1973e
	_papi_hwi_system_info.hw_info.clock_mhz = __sol_get_processor_clock(  );
Packit Service a1973e
	_papi_hwi_system_info.hw_info.cpu_max_mhz = __sol_get_processor_clock(  );
Packit Service a1973e
	_papi_hwi_system_info.hw_info.cpu_min_mhz = __sol_get_processor_clock(  );
Packit Service a1973e
Packit Service a1973e
	/* Fill _niagara2_vector.cmp_info.mem_hierarchy */
Packit Service a1973e
Packit Service a1973e
	_niagara2_get_memory_info( &_papi_hwi_system_info.hw_info, 0 );
Packit Service a1973e
Packit Service a1973e
	/* Fill _papi_hwi_system_info.sub_info */
Packit Service a1973e
	strcpy( _niagara2_vector.cmp_info.name, "SunNiagara2" );
Packit Service a1973e
	strcpy( _niagara2_vector.cmp_info.version, "ALPHA" );
Packit Service a1973e
	strcpy( _niagara2_vector.cmp_info.support_version, "libcpc2" );
Packit Service a1973e
	strcpy( _niagara2_vector.cmp_info.kernel_version, "libcpc2" );
Packit Service a1973e
Packit Service a1973e
	/* libcpc2 uses SIGEMT using real hardware signals, no sw emu */
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
	SUBDBG( "LEAVING FUNCTION  >>%s<< at %s:%d\n", __func__, __FILE__,
Packit Service a1973e
			__LINE__ );
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
_solaris_get_system_info( papi_mdi_t *mdi )
Packit Service a1973e
{
Packit Service a1973e
	int retval;
Packit Service a1973e
	pid_t pid;
Packit Service a1973e
	char maxargs[PAPI_MAX_STR_LEN] = "<none>";
Packit Service a1973e
	psinfo_t psi;
Packit Service a1973e
	int fd;
Packit Service a1973e
	int hz, version;
Packit Service a1973e
	char cpuname[PAPI_MAX_STR_LEN], pname[PAPI_HUGE_STR_LEN];
Packit Service a1973e
Packit Service a1973e
	/* Check counter access */
Packit Service a1973e
Packit Service a1973e
	if ( cpc_version( CPC_VER_CURRENT ) != CPC_VER_CURRENT )
Packit Service a1973e
		return PAPI_ECMP;
Packit Service a1973e
	SUBDBG( "CPC version %d successfully opened\n", CPC_VER_CURRENT );
Packit Service a1973e
Packit Service a1973e
	if ( cpc_access(  ) == -1 )
Packit Service a1973e
		return PAPI_ECMP;
Packit Service a1973e
Packit Service a1973e
	/* Global variable cpuver */
Packit Service a1973e
Packit Service a1973e
	cpuver = cpc_getcpuver(  );
Packit Service a1973e
	SUBDBG( "Got %d from cpc_getcpuver()\n", cpuver );
Packit Service a1973e
	if ( cpuver == -1 )
Packit Service a1973e
		return PAPI_ECMP;
Packit Service a1973e
Packit Service a1973e
#ifdef DEBUG
Packit Service a1973e
	{
Packit Service a1973e
		if ( ISLEVEL( DEBUG_SUBSTRATE ) ) {
Packit Service a1973e
			const char *name;
Packit Service a1973e
			int i;
Packit Service a1973e
Packit Service a1973e
			name = cpc_getcpuref( cpuver );
Packit Service a1973e
			if ( name ) {
Packit Service a1973e
				SUBDBG( "CPC CPU reference: %s\n", name );
Packit Service a1973e
			}
Packit Service a1973e
			else {
Packit Service a1973e
				SUBDBG( "Could not get a CPC CPU reference\n" );
Packit Service a1973e
			}
Packit Service a1973e
Packit Service a1973e
			for ( i = 0; i < cpc_getnpic( cpuver ); i++ ) {
Packit Service a1973e
				SUBDBG( "\n%6s %-40s %8s\n", "Reg", "Symbolic name", "Code" );
Packit Service a1973e
				cpc_walk_names( cpuver, i, "%6d %-40s %02x\n",
Packit Service a1973e
								print_walk_names );
Packit Service a1973e
			}
Packit Service a1973e
			SUBDBG( "\n" );
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
	/* Initialize other globals */
Packit Service a1973e
Packit Service a1973e
	if ( ( retval = build_tables(  ) ) != PAPI_OK )
Packit Service a1973e
		return retval;
Packit Service a1973e
Packit Service a1973e
	preset_search_map = preset_table;
Packit Service a1973e
	if ( cpuver <= CPC_ULTRA2 ) {
Packit Service a1973e
		SUBDBG( "cpuver (==%d) <= CPC_ULTRA2 (==%d)\n", cpuver, CPC_ULTRA2 );
Packit Service a1973e
		pcr_shift[0] = CPC_ULTRA_PCR_PIC0_SHIFT;
Packit Service a1973e
		pcr_shift[1] = CPC_ULTRA_PCR_PIC1_SHIFT;
Packit Service a1973e
	} else if ( cpuver <= LASTULTRA3 ) {
Packit Service a1973e
		SUBDBG( "cpuver (==%d) <= CPC_ULTRA3x (==%d)\n", cpuver, LASTULTRA3 );
Packit Service a1973e
		pcr_shift[0] = CPC_ULTRA_PCR_PIC0_SHIFT;
Packit Service a1973e
		pcr_shift[1] = CPC_ULTRA_PCR_PIC1_SHIFT;
Packit Service a1973e
		_solaris_vector.cmp_info.hardware_intr = 1;
Packit Service a1973e
		_solaris_vector.cmp_info.hardware_intr_sig = SIGEMT;
Packit Service a1973e
	} else
Packit Service a1973e
		return PAPI_ECMP;
Packit Service a1973e
Packit Service a1973e
	/* Path and args */
Packit Service a1973e
Packit Service a1973e
	pid = getpid(  );
Packit Service a1973e
	if ( pid == -1 )
Packit Service a1973e
		return ( PAPI_ESYS );
Packit Service a1973e
Packit Service a1973e
	/* Turn on microstate accounting for this process and any LWPs. */
Packit Service a1973e
Packit Service a1973e
	sprintf( maxargs, "/proc/%d/ctl", ( int ) pid );
Packit Service a1973e
	if ( ( fd = open( maxargs, O_WRONLY ) ) == -1 )
Packit Service a1973e
		return ( PAPI_ESYS );
Packit Service a1973e
	{
Packit Service a1973e
		int retval;
Packit Service a1973e
		struct
Packit Service a1973e
		{
Packit Service a1973e
			long cmd;
Packit Service a1973e
			long flags;
Packit Service a1973e
		} cmd;
Packit Service a1973e
		cmd.cmd = PCSET;
Packit Service a1973e
		cmd.flags = PR_MSACCT | PR_MSFORK;
Packit Service a1973e
		retval = write( fd, &cmd, sizeof ( cmd ) );
Packit Service a1973e
		close( fd );
Packit Service a1973e
		SUBDBG( "Write PCSET returned %d\n", retval );
Packit Service a1973e
		if ( retval != sizeof ( cmd ) )
Packit Service a1973e
			return ( PAPI_ESYS );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Get executable info */
Packit Service a1973e
Packit Service a1973e
	sprintf( maxargs, "/proc/%d/psinfo", ( int ) pid );
Packit Service a1973e
	if ( ( fd = open( maxargs, O_RDONLY ) ) == -1 )
Packit Service a1973e
		return ( PAPI_ESYS );
Packit Service a1973e
	read( fd, &psi, sizeof ( psi ) );
Packit Service a1973e
	close( fd );
Packit Service a1973e
Packit Service a1973e
	/* Cut off any arguments to exe */
Packit Service a1973e
	{
Packit Service a1973e
		char *tmp;
Packit Service a1973e
		tmp = strchr( psi.pr_psargs, ' ' );
Packit Service a1973e
		if ( tmp != NULL )
Packit Service a1973e
			*tmp = '\0';
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( realpath( psi.pr_psargs, pname ) )
Packit Service a1973e
		strncpy( _papi_hwi_system_info.exe_info.fullname, pname,
Packit Service a1973e
				 PAPI_HUGE_STR_LEN );
Packit Service a1973e
	else
Packit Service a1973e
		strncpy( _papi_hwi_system_info.exe_info.fullname, psi.pr_psargs,
Packit Service a1973e
				 PAPI_HUGE_STR_LEN );
Packit Service a1973e
Packit Service a1973e
	/* please don't use pr_fname here, because it can only store less that 
Packit Service a1973e
	   16 characters */
Packit Service a1973e
	strcpy( _papi_hwi_system_info.exe_info.address_info.name,
Packit Service a1973e
			basename( _papi_hwi_system_info.exe_info.fullname ) );
Packit Service a1973e
Packit Service a1973e
	SUBDBG( "Full Executable is %s\n",
Packit Service a1973e
			_papi_hwi_system_info.exe_info.fullname );
Packit Service a1973e
Packit Service a1973e
	/* Executable regions, reading /proc/pid/maps file */
Packit Service a1973e
	retval = _ultra_hwd_update_shlib_info( &_papi_hwi_system_info );
Packit Service a1973e
Packit Service a1973e
	/* Hardware info */
Packit Service a1973e
Packit Service a1973e
	_papi_hwi_system_info.hw_info.ncpu = sysconf( _SC_NPROCESSORS_ONLN );
Packit Service a1973e
	_papi_hwi_system_info.hw_info.nnodes = 1;
Packit Service a1973e
	_papi_hwi_system_info.hw_info.totalcpus = sysconf( _SC_NPROCESSORS_CONF );
Packit Service a1973e
Packit Service a1973e
	retval = scan_prtconf( cpuname, PAPI_MAX_STR_LEN, &hz, &version );
Packit Service a1973e
	if ( retval == -1 )
Packit Service a1973e
		return PAPI_ECMP;
Packit Service a1973e
Packit Service a1973e
	strcpy( _papi_hwi_system_info.hw_info.model_string,
Packit Service a1973e
			cpc_getcciname( cpuver ) );
Packit Service a1973e
	_papi_hwi_system_info.hw_info.model = cpuver;
Packit Service a1973e
	strcpy( _papi_hwi_system_info.hw_info.vendor_string, "SUN" );
Packit Service a1973e
	_papi_hwi_system_info.hw_info.vendor = PAPI_VENDOR_SUN;
Packit Service a1973e
	_papi_hwi_system_info.hw_info.revision = version;
Packit Service a1973e
Packit Service a1973e
	_papi_hwi_system_info.hw_info.mhz = ( ( float ) hz / 1.0e6 );
Packit Service a1973e
	SUBDBG( "hw_info.mhz = %f\n", _papi_hwi_system_info.hw_info.mhz );
Packit Service a1973e
Packit Service a1973e
	_papi_hwi_system_info.hw_info.cpu_max_mhz = _papi_hwi_system_info.hw_info.mhz;
Packit Service a1973e
	_papi_hwi_system_info.hw_info.cpu_min_mhz = _papi_hwi_system_info.hw_info.mhz;
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
	/* Number of PMCs */
Packit Service a1973e
Packit Service a1973e
	retval = cpc_getnpic( cpuver );
Packit Service a1973e
	if ( retval < 0 )
Packit Service a1973e
		return PAPI_ECMP;
Packit Service a1973e
Packit Service a1973e
	_solaris_vector.cmp_info.num_cntrs = retval;
Packit Service a1973e
	_solaris_vector.cmp_info.fast_real_timer = 1;
Packit Service a1973e
	_solaris_vector.cmp_info.fast_virtual_timer = 1;
Packit Service a1973e
	_solaris_vector.cmp_info.default_domain = PAPI_DOM_USER;
Packit Service a1973e
	_solaris_vector.cmp_info.available_domains =
Packit Service a1973e
		PAPI_DOM_USER | PAPI_DOM_KERNEL;
Packit Service a1973e
Packit Service a1973e
	/* Setup presets */
Packit Service a1973e
Packit Service a1973e
	retval = _papi_hwi_setup_all_presets( preset_search_map, NULL );
Packit Service a1973e
	if ( retval )
Packit Service a1973e
		return ( retval );
Packit Service a1973e
Packit Service a1973e
	return ( PAPI_OK );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
long long
Packit Service a1973e
_solaris_get_real_usec( void )
Packit Service a1973e
{
Packit Service a1973e
	return ( ( long long ) gethrtime(  ) / ( long long ) 1000 );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
long long
Packit Service a1973e
_solaris_get_real_cycles( void )
Packit Service a1973e
{
Packit Service a1973e
	return ( _ultra_hwd_get_real_usec(  ) *
Packit Service a1973e
			 ( long long ) _papi_hwi_system_info.hw_info.cpu_max_mhz );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
long long
Packit Service a1973e
_solaris_get_virt_usec( void )
Packit Service a1973e
{
Packit Service a1973e
	return ( ( long long ) gethrvtime(  ) / ( long long ) 1000 );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e