|
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 |
|