8#include <sys/utsname.h>
25 sprintf( fname,
"/proc/%d/map", getpid( ) );
26 map_f = fopen( fname,
"r" );
28 PAPIERROR(
"fopen(%s) returned < 0", fname );
35 while (
fread( &newp,
sizeof ( prmap_t ), 1, map_f ) > 0 ) {
36 vaddr = (
void * ) ( 1 + ( newp.pr_vaddr ) );
37 if ( dladdr( vaddr, &dlip ) > 0 ) {
39 if ( ( newp.pr_mflags & MA_EXEC ) && ( newp.pr_mflags & MA_READ ) ) {
40 if ( !( newp.pr_mflags & MA_WRITE ) )
43 strcpy(
name, dlip.dli_fname );
45 basename(
name ) ) == 0 ) {
46 if ( ( newp.pr_mflags & MA_EXEC ) &&
47 ( newp.pr_mflags & MA_READ ) ) {
48 if ( !( newp.pr_mflags & MA_WRITE ) ) {
52 (
vptr_t ) ( newp.pr_vaddr + newp.pr_size );
57 (
vptr_t ) ( newp.pr_vaddr + newp.pr_size );
70 PAPIERROR(
"Error allocating shared library address map" );
74 while (
fread( &newp,
sizeof ( prmap_t ), 1, map_f ) > 0 ) {
75 vaddr = (
void * ) ( 1 + ( newp.pr_vaddr ) );
76 if ( dladdr( vaddr, &dlip ) > 0 ) {
77 strcpy(
name, dlip.dli_fname );
79 basename(
name ) ) == 0 )
81 if ( ( newp.pr_mflags & MA_EXEC ) && ( newp.pr_mflags & MA_READ ) ) {
82 if ( !( newp.pr_mflags & MA_WRITE ) ) {
84 tmp[t_index].text_start = (
vptr_t ) newp.pr_vaddr;
85 tmp[t_index].text_end =
86 (
vptr_t ) ( newp.pr_vaddr + newp.pr_size );
87 strncpy(
tmp[t_index].
name, dlip.dli_fname,
93 tmp[t_index].data_start = (
vptr_t ) newp.pr_vaddr;
94 tmp[t_index].data_end =
95 (
vptr_t ) ( newp.pr_vaddr + newp.pr_size );
116 struct utsname uname_buffer;
118 uname(&uname_buffer);
134_ultra_hwd_update_shlib_info(
papi_mdi_t *mdi )
140 char address[16], size[10], flags[64], objname[256];
151 struct map_record *next;
152 } *tmpr, *head, *curr;
155 SUBDBG(
"Temporary name %s\n", fname );
157 sprintf( cmd_line,
"/bin/pmap %d > %s", (
int ) getpid( ), fname );
158 if ( system( cmd_line ) != 0 ) {
159 PAPIERROR(
"Could not run %s to get shared library address map",
164 f = fopen( fname,
"r" );
166 PAPIERROR(
"fopen(%s) returned < 0", fname );
172 fgets( line, 256,
f );
174 while ( fgets( line, 256,
f ) != NULL ) {
176 if ( strncmp( line,
" total", 6 ) != 0 ) {
177 sscanf( line,
"%s %s %s %s", address, size, flags, objname );
178 if ( objname[0] ==
'/' ) {
180 (
struct map_record * )
189 if ( head == NULL ) {
193 SUBDBG(
"%s\n", objname );
195 if ( ( strstr( flags,
"read" ) && strstr( flags,
"exec" ) ) ||
196 ( strstr( flags,
"r" ) && strstr( flags,
"x" ) ) ) {
197 if ( !( strstr( flags,
"write" ) || strstr( flags,
"w" ) ) ) {
203 sscanf( address,
"%lx", &tmpr->address );
204 sscanf( size,
"%d", &tmpr->size );
206 strcpy( tmpr->objname, objname );
218 PAPIERROR(
"Error allocating shared library address map" );
225 while ( curr != NULL ) {
227 basename( curr->objname ) ) == 0 ) {
232 (
vptr_t ) ( curr->address + curr->size );
237 (
vptr_t ) ( curr->address + curr->size );
242 tmp[t_index].text_start = (
vptr_t ) curr->address;
243 tmp[t_index].text_end =
244 (
vptr_t ) ( curr->address + curr->size );
245 strncpy(
tmp[t_index].
name, curr->objname,
251 tmp[t_index].data_start = (
vptr_t ) curr->address;
252 tmp[t_index].data_end =
253 (
vptr_t ) ( curr->address + curr->size );
279 char *
file =
"/proc/self/map";
280 char *resolve_pattern =
"/proc/self/path/%s";
282 char lastobject[PRMAPSZ];
288 int fd,
count = 0,
total = 0, position = -1, first = 1;
289 vptr_t t_min, t_max, d_min, d_max;
294 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
304 memset( lastobject, 0, PRMAPSZ );
307 SUBDBG(
" -> %s: Preprocessing memory maps from procfs\n", __func__ );
312 while (
read( fd, &mapping,
sizeof ( prmap_t ) ) > 0 ) {
314 SUBDBG(
" -> %s: Found a new memory map entry\n", __func__ );
320 if ( mapping.pr_mflags & ( MA_READ | MA_WRITE | MA_EXEC ) &&
321 !( mapping.pr_mflags & MA_ANON ) ) {
324 if ( strcmp( lastobject, mapping.pr_mapname ) != 0 ) {
325 strncpy( lastobject, mapping.pr_mapname, PRMAPSZ );
329 SUBDBG(
" -> %s: Memory mapping entry valid for %s\n", __func__,
330 mapping.pr_mapname );
336 SUBDBG(
" -> %s: Preprocessing done, starting to analyze\n", __func__ );
341 if (
lseek( fd, 0, SEEK_SET ) == -1 ) {
345 memset( lastobject, 0, PRMAPSZ );
352 while (
read( fd, &mapping,
sizeof ( prmap_t ) ) > 0 ) {
354 if ( mapping.pr_mflags & MA_ANON ) {
357 (
" -> %s: Anonymous mapping (MA_ANON) found for %s, skipping\n",
358 __func__, mapping.pr_mapname );
364 if ( strcmp( mapping.pr_mapname, lastobject ) != 0 ) {
366 SUBDBG(
" -> %s: Analyzing mapping for %s\n", __func__,
367 mapping.pr_mapname );
369 cur = &( pam[++position] );
370 strncpy( lastobject, mapping.pr_mapname, PRMAPSZ );
376 SUBDBG(
" -> %s: Resolved name for %s: %s\n", __func__,
377 mapping.pr_mapname, cur->
name );
381 if ( mapping.pr_mflags & MA_READ ) {
383 if ( mapping.pr_mflags & MA_WRITE ) {
386 (
vptr_t ) ( mapping.pr_vaddr + mapping.pr_size );
409 }
else if ( mapping.pr_mflags & MA_EXEC ) {
412 (
vptr_t ) ( mapping.pr_vaddr + mapping.pr_size );
456 SUBDBG(
" -> %s: Analysis of memory maps done, results:\n", __func__ );
457 SUBDBG(
" -> %s: text_start=%#x, text_end=%#x, text_size=%lld\n", __func__,
462 SUBDBG(
" -> %s: data_start=%#x, data_end=%#x, data_size=%lld\n", __func__,
474 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
488 pstatus_t *proc_status;
498 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
508 if ( proc_status->pr_flags & PR_MSACCT == 0 ||
509 proc_status->pr_flags & PR_MSFORK == 0 ) {
518 if ( proc_info->pr_argc > 1 ) {
519 c_ptr = strchr( proc_info->pr_psargs,
' ' );
526 if ( realpath( proc_info->pr_psargs, exec_name ) != NULL ) {
574 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
596 if ( cpc_version( CPC_VER_CURRENT ) != CPC_VER_CURRENT )
598 SUBDBG(
"CPC version %d successfully opened\n", CPC_VER_CURRENT );
600 if ( cpc_access( ) == -1 )
605 cpuver = cpc_getcpuver( );
621 SUBDBG(
"Could not get a CPC CPU reference\n" );
624 for (
i = 0;
i < cpc_getnpic(
cpuver );
i++ ) {
625 SUBDBG(
"\n%6s %-40s %8s\n",
"Reg",
"Symbolic name",
"Code" );
626 cpc_walk_names(
cpuver,
i,
"%6d %-40s %02x\n",
641 if (
cpuver <= CPC_ULTRA2 ) {
642 SUBDBG(
"cpuver (==%d) <= CPC_ULTRA2 (==%d)\n",
cpuver, CPC_ULTRA2 );
662 sprintf( maxargs,
"/proc/%d/ctl", (
int )
pid );
663 if ( ( fd =
open( maxargs, O_WRONLY ) ) == -1 )
673 cmd.flags = PR_MSACCT | PR_MSFORK;
677 if (
retval !=
sizeof ( cmd ) )
683 sprintf( maxargs,
"/proc/%d/psinfo", (
int )
pid );
684 if ( ( fd =
open( maxargs, O_RDONLY ) ) == -1 )
686 read( fd, &psi,
sizeof ( psi ) );
692 tmp = strchr( psi.pr_psargs,
' ' );
697 if ( realpath( psi.pr_psargs, pname ) )
709 SUBDBG(
"Full Executable is %s\n",
726 cpc_getcciname(
cpuver ) );
765 return ( (
long long ) gethrtime( ) / (
long long ) 1000 );
771 return ( _ultra_hwd_get_real_usec( ) *
778 return ( (
long long ) gethrvtime( ) / (
long long ) 1000 );
PAPI_os_info_t _papi_os_info
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
int open(const char *pathname, int flags, mode_t mode)
off_t lseek(int fd, off_t offset, int whence)
ssize_t write(int fd, const void *buf, size_t count)
ssize_t read(int fd, void *buf, size_t count)
#define PAPI_HUGE_STR_LEN
Return codes and api definitions.
#define SUBDBG(format, args...)
int remove(const char *__filename) __attribute__((__nothrow__
int fclose(FILE *__stream)
void PAPIERROR(char *format,...)
#define PAPI_INT_MPX_SIGNAL
#define PAPI_INT_MPX_DEF_US
#define papi_calloc(a, b)
int _papi_hwi_setup_all_presets(hwi_search_t *findem, int cidx)
hwi_search_t * preset_search_map
papi_mdi_t _papi_hwi_system_info
int _solaris_update_shlib_info(papi_mdi_t *mdi)
long long _solaris_get_real_usec(void)
int _papi_hwi_init_os(void)
int _solaris_get_system_info(papi_mdi_t *mdi)
long long _solaris_get_virt_usec(void)
long long _solaris_get_real_cycles(void)
int _niagara2_get_memory_info(PAPI_hw_info_t *hw, int id)
static pstatus_t * __sol_get_proc_status(const pid_t pid)
static psinfo_t * __sol_get_proc_info(const pid_t pid)
#define __CHECK_ERR_PAPI(retval)
static int __sol_get_processor_clock(void)
int _niagara2_update_shlib_info(papi_mdi_t *mdi)
papi_vector_t _niagara2_vector
hwi_search_t * preset_table
papi_vector_t _solaris_vector
static int build_tables(void)
void print_walk_names(void *arg, int regno, const char *name, uint8_t bits)
static int scan_prtconf(char *cpuname, int len_cpuname, int *hz, int *ver)
get the executable's address space info
char name[PAPI_HUGE_STR_LEN]
unsigned int fast_virtual_timer
char support_version[PAPI_MIN_STR_LEN]
char kernel_version[PAPI_MIN_STR_LEN]
char name[PAPI_MAX_STR_LEN]
char version[PAPI_MIN_STR_LEN]
unsigned int fast_real_timer
unsigned int hardware_intr
char fullname[PAPI_HUGE_STR_LEN]
PAPI_address_map_t address_info
char vendor_string[PAPI_MAX_STR_LEN]
char model_string[PAPI_MAX_STR_LEN]
char version[PAPI_MAX_STR_LEN]
char name[PAPI_MAX_STR_LEN]
PAPI_shlib_info_t shlib_info
PAPI_component_info_t cmp_info