int _linux_get_system_info( papi_mdi_t *mdi ) { int retval; char maxargs[PAPI_HUGE_STR_LEN]; pid_t pid; /* Software info */ /* Path and args */ pid = getpid( ); if ( pid < 0 ) { PAPIERROR( "getpid() returned < 0" ); return PAPI_ESYS; } mdi->pid = pid; sprintf( maxargs, "/proc/%d/exe", ( int ) pid ); if ( readlink( maxargs, mdi->exe_info.fullname, PAPI_HUGE_STR_LEN ) < 0 ) { PAPIERROR( "readlink(%s) returned < 0", maxargs ); return PAPI_ESYS; } /* Careful, basename can modify it's argument */ strcpy( maxargs, mdi->exe_info.fullname ); strcpy( mdi->exe_info.address_info.name, basename( maxargs ) ); SUBDBG( "Executable is %s\n", mdi->exe_info.address_info.name ); SUBDBG( "Full Executable is %s\n", mdi->exe_info.fullname ); /* Executable regions, may require reading /proc/pid/maps file */ retval = _linux_update_shlib_info( mdi ); SUBDBG( "Text: Start %p, End %p, length %d\n", mdi->exe_info.address_info.text_start, mdi->exe_info.address_info.text_end, ( int ) ( mdi->exe_info.address_info.text_end - mdi->exe_info.address_info.text_start ) ); SUBDBG( "Data: Start %p, End %p, length %d\n", mdi->exe_info.address_info.data_start, mdi->exe_info.address_info.data_end, ( int ) ( mdi->exe_info.address_info.data_end - mdi->exe_info.address_info.data_start ) ); SUBDBG( "Bss: Start %p, End %p, length %d\n", mdi->exe_info.address_info.bss_start, mdi->exe_info.address_info.bss_end, ( int ) ( mdi->exe_info.address_info.bss_end - mdi->exe_info.address_info.bss_start ) ); /* PAPI_preload_option information */ strcpy( mdi->preload_info.lib_preload_env, "LD_PRELOAD" ); mdi->preload_info.lib_preload_sep = ' '; strcpy( mdi->preload_info.lib_dir_env, "LD_LIBRARY_PATH" ); mdi->preload_info.lib_dir_sep = ':'; /* Hardware info */ retval = _linux_get_cpu_info( &mdi->hw_info ); if ( retval ) return retval; retval = _linux_get_memory_info( &mdi->hw_info, mdi->hw_info.model ); if ( retval ) return retval; SUBDBG( "Found %d %s(%d) %s(%d) CPU's at %f Mhz, clock %d Mhz.\n", mdi->hw_info.totalcpus, mdi->hw_info.vendor_string, mdi->hw_info.vendor, mdi->hw_info.model_string, mdi->hw_info.model, mdi->hw_info.mhz, mdi->hw_info.clock_mhz ); return PAPI_OK; }
int _linux_get_system_info( papi_mdi_t *mdi ) { int retval; char maxargs[PAPI_HUGE_STR_LEN]; pid_t pid; int cpuinfo_mhz,sys_min_khz,sys_max_khz; /* Software info */ /* Path and args */ pid = getpid( ); if ( pid < 0 ) { PAPIERROR( "getpid() returned < 0" ); return PAPI_ESYS; } mdi->pid = pid; sprintf( maxargs, "/proc/%d/exe", ( int ) pid ); if ( (retval = readlink( maxargs, mdi->exe_info.fullname, PAPI_HUGE_STR_LEN-1 )) < 0 ) { PAPIERROR( "readlink(%s) returned < 0", maxargs ); return PAPI_ESYS; } if (retval > PAPI_HUGE_STR_LEN-1) retval=PAPI_HUGE_STR_LEN-1; mdi->exe_info.fullname[retval] = '\0'; /* Careful, basename can modify it's argument */ strcpy( maxargs, mdi->exe_info.fullname ); strncpy( mdi->exe_info.address_info.name, basename( maxargs ), PAPI_HUGE_STR_LEN-1); mdi->exe_info.address_info.name[PAPI_HUGE_STR_LEN-1] = '\0'; SUBDBG( "Executable is %s\n", mdi->exe_info.address_info.name ); SUBDBG( "Full Executable is %s\n", mdi->exe_info.fullname ); /* Executable regions, may require reading /proc/pid/maps file */ retval = _linux_update_shlib_info( mdi ); SUBDBG( "Text: Start %p, End %p, length %d\n", mdi->exe_info.address_info.text_start, mdi->exe_info.address_info.text_end, ( int ) ( mdi->exe_info.address_info.text_end - mdi->exe_info.address_info.text_start ) ); SUBDBG( "Data: Start %p, End %p, length %d\n", mdi->exe_info.address_info.data_start, mdi->exe_info.address_info.data_end, ( int ) ( mdi->exe_info.address_info.data_end - mdi->exe_info.address_info.data_start ) ); SUBDBG( "Bss: Start %p, End %p, length %d\n", mdi->exe_info.address_info.bss_start, mdi->exe_info.address_info.bss_end, ( int ) ( mdi->exe_info.address_info.bss_end - mdi->exe_info.address_info.bss_start ) ); /* PAPI_preload_option information */ strcpy( mdi->preload_info.lib_preload_env, "LD_PRELOAD" ); mdi->preload_info.lib_preload_sep = ' '; strcpy( mdi->preload_info.lib_dir_env, "LD_LIBRARY_PATH" ); mdi->preload_info.lib_dir_sep = ':'; /* Hardware info */ retval = _linux_get_cpu_info( &mdi->hw_info, &cpuinfo_mhz ); if ( retval ) return retval; /* Handle MHz */ retval = _linux_get_mhz( &sys_min_khz, &sys_max_khz ); if ( retval ) { mdi->hw_info.cpu_max_mhz=cpuinfo_mhz; mdi->hw_info.cpu_min_mhz=cpuinfo_mhz; /* mdi->hw_info.mhz=cpuinfo_mhz; mdi->hw_info.clock_mhz=cpuinfo_mhz; */ } else { mdi->hw_info.cpu_max_mhz=sys_max_khz/1000; mdi->hw_info.cpu_min_mhz=sys_min_khz/1000; /* mdi->hw_info.mhz=sys_max_khz/1000; mdi->hw_info.clock_mhz=sys_max_khz/1000; */ } /* Set Up Memory */ retval = _linux_get_memory_info( &mdi->hw_info, mdi->hw_info.model ); if ( retval ) return retval; SUBDBG( "Found %d %s(%d) %s(%d) CPUs at %d Mhz.\n", mdi->hw_info.totalcpus, mdi->hw_info.vendor_string, mdi->hw_info.vendor, mdi->hw_info.model_string, mdi->hw_info.model, mdi->hw_info.cpu_max_mhz); /* Get virtualization info */ mdi->hw_info.virtualized=_linux_detect_hypervisor(mdi->hw_info.virtual_vendor_string); return PAPI_OK; }