|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* File: linux-common.c
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include <unistd.h>
|
|
Packit Service |
a1973e |
#include <string.h>
|
|
Packit Service |
a1973e |
#include <stdlib.h>
|
|
Packit Service |
a1973e |
#include <ctype.h>
|
|
Packit Service |
a1973e |
#include <err.h>
|
|
Packit Service |
a1973e |
#include <stdarg.h>
|
|
Packit Service |
a1973e |
#include <stdio.h>
|
|
Packit Service |
a1973e |
#include <errno.h>
|
|
Packit Service |
a1973e |
#include <syscall.h>
|
|
Packit Service |
a1973e |
#include <sys/utsname.h>
|
|
Packit Service |
a1973e |
#include <sys/time.h>
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include "papi.h"
|
|
Packit Service |
a1973e |
#include "papi_internal.h"
|
|
Packit Service |
a1973e |
#include "papi_vector.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include "linux-memory.h"
|
|
Packit Service |
a1973e |
#include "linux-common.h"
|
|
Packit Service |
a1973e |
#include "linux-timer.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include "x86_cpuid_info.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
PAPI_os_info_t _papi_os_info;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* The locks used by Linux */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#if defined(USE_PTHREAD_MUTEXES)
|
|
Packit Service |
a1973e |
pthread_mutex_t _papi_hwd_lock_data[PAPI_MAX_LOCK];
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
volatile unsigned int _papi_hwd_lock_data[PAPI_MAX_LOCK];
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int _linux_init_locks(void) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int i;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( i = 0; i < PAPI_MAX_LOCK; i++ ) {
|
|
Packit Service |
a1973e |
#if defined(USE_PTHREAD_MUTEXES)
|
|
Packit Service |
a1973e |
pthread_mutex_init(&_papi_hwd_lock_data[i],NULL);
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
_papi_hwd_lock_data[i] = MUTEX_OPEN;
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_linux_detect_hypervisor(char *virtual_vendor_name) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int retval=0;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#if defined(__i386__)||defined(__x86_64__)
|
|
Packit Service |
a1973e |
retval=_x86_detect_hypervisor(virtual_vendor_name);
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
(void) virtual_vendor_name;
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return retval;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#define _PATH_SYS_SYSTEM "/sys/devices/system"
|
|
Packit Service |
a1973e |
#define _PATH_SYS_CPU0 _PATH_SYS_SYSTEM "/cpu/cpu0"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static char pathbuf[PATH_MAX] = "/";
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static char *
|
|
Packit Service |
a1973e |
search_cpu_info( FILE * f, char *search_str)
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
static char line[PAPI_HUGE_STR_LEN] = "";
|
|
Packit Service |
a1973e |
char *s, *start = NULL;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
rewind(f);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
while (fgets(line,PAPI_HUGE_STR_LEN,f)!=NULL) {
|
|
Packit Service |
a1973e |
s=strstr(line,search_str);
|
|
Packit Service |
a1973e |
if (s!=NULL) {
|
|
Packit Service |
a1973e |
/* skip all characters in line up to the colon */
|
|
Packit Service |
a1973e |
/* and then spaces */
|
|
Packit Service |
a1973e |
s=strchr(s,':');
|
|
Packit Service |
a1973e |
if (s==NULL) break;
|
|
Packit Service |
a1973e |
s++;
|
|
Packit Service |
a1973e |
while (isspace(*s)) {
|
|
Packit Service |
a1973e |
s++;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
start = s;
|
|
Packit Service |
a1973e |
/* Find and clear newline */
|
|
Packit Service |
a1973e |
s=strrchr(start,'\n');
|
|
Packit Service |
a1973e |
if (s!=NULL) *s = 0;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
return start;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static void
|
|
Packit Service |
a1973e |
decode_vendor_string( char *s, int *vendor )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
if ( strcasecmp( s, "GenuineIntel" ) == 0 )
|
|
Packit Service |
a1973e |
*vendor = PAPI_VENDOR_INTEL;
|
|
Packit Service |
a1973e |
else if ( ( strcasecmp( s, "AMD" ) == 0 ) ||
|
|
Packit Service |
a1973e |
( strcasecmp( s, "AuthenticAMD" ) == 0 ) )
|
|
Packit Service |
a1973e |
*vendor = PAPI_VENDOR_AMD;
|
|
Packit Service |
a1973e |
else if ( strcasecmp( s, "IBM" ) == 0 )
|
|
Packit Service |
a1973e |
*vendor = PAPI_VENDOR_IBM;
|
|
Packit Service |
a1973e |
else if ( strcasecmp( s, "Cray" ) == 0 )
|
|
Packit Service |
a1973e |
*vendor = PAPI_VENDOR_CRAY;
|
|
Packit Service |
a1973e |
else if ( strcasecmp( s, "ARM" ) == 0 )
|
|
Packit Service |
a1973e |
*vendor = PAPI_VENDOR_ARM;
|
|
Packit Service |
a1973e |
else if ( strcasecmp( s, "MIPS" ) == 0 )
|
|
Packit Service |
a1973e |
*vendor = PAPI_VENDOR_MIPS;
|
|
Packit Service |
a1973e |
else if ( strcasecmp( s, "SiCortex" ) == 0 )
|
|
Packit Service |
a1973e |
*vendor = PAPI_VENDOR_MIPS;
|
|
Packit Service |
a1973e |
else
|
|
Packit Service |
a1973e |
*vendor = PAPI_VENDOR_UNKNOWN;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static FILE *
|
|
Packit Service |
a1973e |
xfopen( const char *path, const char *mode )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
FILE *fd = fopen( path, mode );
|
|
Packit Service |
a1973e |
if ( !fd )
|
|
Packit Service |
a1973e |
err( EXIT_FAILURE, "error: %s", path );
|
|
Packit Service |
a1973e |
return fd;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static FILE *
|
|
Packit Service |
a1973e |
path_vfopen( const char *mode, const char *path, va_list ap )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
vsnprintf( pathbuf, sizeof ( pathbuf ), path, ap );
|
|
Packit Service |
a1973e |
return xfopen( pathbuf, mode );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int
|
|
Packit Service |
a1973e |
path_sibling( const char *path, ... )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int c;
|
|
Packit Service |
a1973e |
long n;
|
|
Packit Service |
a1973e |
int result = 0;
|
|
Packit Service |
a1973e |
char s[2];
|
|
Packit Service |
a1973e |
FILE *fp;
|
|
Packit Service |
a1973e |
va_list ap;
|
|
Packit Service |
a1973e |
va_start( ap, path );
|
|
Packit Service |
a1973e |
fp = path_vfopen( "r", path, ap );
|
|
Packit Service |
a1973e |
va_end( ap );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
while ( ( c = fgetc( fp ) ) != EOF ) {
|
|
Packit Service |
a1973e |
if ( isxdigit( c ) ) {
|
|
Packit Service |
a1973e |
s[0] = ( char ) c;
|
|
Packit Service |
a1973e |
s[1] = '\0';
|
|
Packit Service |
a1973e |
for ( n = strtol( s, NULL, 16 ); n > 0; n /= 2 ) {
|
|
Packit Service |
a1973e |
if ( n % 2 )
|
|
Packit Service |
a1973e |
result++;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
fclose( fp );
|
|
Packit Service |
a1973e |
return result;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int
|
|
Packit Service |
a1973e |
path_exist( const char *path, ... )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
va_list ap;
|
|
Packit Service |
a1973e |
va_start( ap, path );
|
|
Packit Service |
a1973e |
vsnprintf( pathbuf, sizeof ( pathbuf ), path, ap );
|
|
Packit Service |
a1973e |
va_end( ap );
|
|
Packit Service |
a1973e |
return access( pathbuf, F_OK ) == 0;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int
|
|
Packit Service |
a1973e |
decode_cpuinfo_x86( FILE *f, PAPI_hw_info_t *hwinfo )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int tmp;
|
|
Packit Service |
a1973e |
unsigned int strSize;
|
|
Packit Service |
a1973e |
char *s;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Stepping */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "stepping");
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
if (sscanf( s, "%d", &tmp ) ==1 ) {
|
|
Packit Service |
a1973e |
hwinfo->revision = ( float ) tmp;
|
|
Packit Service |
a1973e |
hwinfo->cpuid_stepping = tmp;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Model Name */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "model name");
|
|
Packit Service |
a1973e |
strSize = sizeof(hwinfo->model_string);
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
strncpy( hwinfo->model_string, s, strSize);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Family */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "cpu family");
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
sscanf( s, "%d", &tmp );
|
|
Packit Service |
a1973e |
hwinfo->cpuid_family = tmp;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* CPU Model */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "model");
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
sscanf( s , "%d", &tmp );
|
|
Packit Service |
a1973e |
hwinfo->model = tmp;
|
|
Packit Service |
a1973e |
hwinfo->cpuid_model = tmp;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int
|
|
Packit Service |
a1973e |
decode_cpuinfo_power(FILE *f, PAPI_hw_info_t *hwinfo )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int tmp;
|
|
Packit Service |
a1973e |
unsigned int strSize;
|
|
Packit Service |
a1973e |
char *s;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Revision */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "revision");
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
sscanf( s, "%d", &tmp );
|
|
Packit Service |
a1973e |
hwinfo->revision = ( float ) tmp;
|
|
Packit Service |
a1973e |
hwinfo->cpuid_stepping = tmp;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Model Name */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "model");
|
|
Packit Service |
a1973e |
strSize = sizeof(hwinfo->model_string);
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
strncpy( hwinfo->model_string, s, strSize);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int
|
|
Packit Service |
a1973e |
decode_cpuinfo_arm(FILE *f, PAPI_hw_info_t *hwinfo )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int tmp;
|
|
Packit Service |
a1973e |
unsigned int strSize;
|
|
Packit Service |
a1973e |
char *s, *t;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* revision */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "CPU revision");
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
sscanf( s, "%d", &tmp );
|
|
Packit Service |
a1973e |
hwinfo->revision = ( float ) tmp;
|
|
Packit Service |
a1973e |
/* For compatability with old PAPI */
|
|
Packit Service |
a1973e |
hwinfo->model = tmp;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Model Name */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "model name");
|
|
Packit Service |
a1973e |
strSize = sizeof(hwinfo->model_string);
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
strncpy( hwinfo->model_string, s, strSize );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Architecture (ARMv6, ARMv7, ARMv8, etc.) */
|
|
Packit Service |
a1973e |
/* Note the Raspberry Pi lies in the CPU architecture line */
|
|
Packit Service |
a1973e |
/* (it's ARMv6 not ARMv7) */
|
|
Packit Service |
a1973e |
/* So we should actually get the value from the */
|
|
Packit Service |
a1973e |
/* Processor/ model name line */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "CPU architecture");
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (strstr(s,"AArch64")) {
|
|
Packit Service |
a1973e |
hwinfo->cpuid_family = 8;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "Processor" );
|
|
Packit Service |
a1973e |
if (s) {
|
|
Packit Service |
a1973e |
t=strchr(s,'(');
|
|
Packit Service |
a1973e |
tmp=*(t+2)-'0';
|
|
Packit Service |
a1973e |
hwinfo->cpuid_family = tmp;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "model name" );
|
|
Packit Service |
a1973e |
if (s) {
|
|
Packit Service |
a1973e |
t=strchr(s,'(');
|
|
Packit Service |
a1973e |
tmp=*(t+2)-'0';
|
|
Packit Service |
a1973e |
hwinfo->cpuid_family = tmp;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* CPU Model */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "CPU part" );
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
sscanf( s, "%x", &tmp );
|
|
Packit Service |
a1973e |
hwinfo->cpuid_model = tmp;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* CPU Variant */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "CPU variant" );
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
sscanf( s, "%x", &tmp );
|
|
Packit Service |
a1973e |
hwinfo->cpuid_stepping = tmp;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_linux_get_cpu_info( PAPI_hw_info_t *hwinfo, int *cpuinfo_mhz )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int retval = PAPI_OK;
|
|
Packit Service |
a1973e |
char *s;
|
|
Packit Service |
a1973e |
float mhz = 0.0;
|
|
Packit Service |
a1973e |
FILE *f;
|
|
Packit Service |
a1973e |
char cpuinfo_filename[]="/proc/cpuinfo";
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( ( f = fopen( cpuinfo_filename, "r" ) ) == NULL ) {
|
|
Packit Service |
a1973e |
PAPIERROR( "fopen(/proc/cpuinfo) errno %d", errno );
|
|
Packit Service |
a1973e |
return PAPI_ESYS;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* All of this information may be overwritten by the component */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/***********************/
|
|
Packit Service |
a1973e |
/* Attempt to find MHz */
|
|
Packit Service |
a1973e |
/***********************/
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "cpu MHz" );
|
|
Packit Service |
a1973e |
if ( !s ) {
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "clock" );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
sscanf( s, "%f", &mhz );
|
|
Packit Service |
a1973e |
*cpuinfo_mhz = mhz;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
// PAPIWARN("Failed to find a clock speed in /proc/cpuinfo");
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*******************************/
|
|
Packit Service |
a1973e |
/* Vendor Name and Vendor Code */
|
|
Packit Service |
a1973e |
/*******************************/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* First try to read "vendor_id" field */
|
|
Packit Service |
a1973e |
/* Which is the most common field */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "vendor_id");
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
strcpy( hwinfo->vendor_string, s );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
/* If not found, try "vendor" which seems to be Itanium specific */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "vendor" );
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
strcpy( hwinfo->vendor_string, s );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
/* "system type" seems to be MIPS and Alpha */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "system type");
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
strcpy( hwinfo->vendor_string, s );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
/* "platform" indicates Power */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "platform");
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
if ( ( strcasecmp( s, "pSeries" ) == 0 ) ||
|
|
Packit Service |
a1973e |
( strcasecmp( s, "PowerNV" ) == 0 ) ||
|
|
Packit Service |
a1973e |
( strcasecmp( s, "PowerMac" ) == 0 ) ) {
|
|
Packit Service |
a1973e |
strcpy( hwinfo->vendor_string, "IBM" );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
/* "CPU implementer" indicates ARM */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "CPU implementer");
|
|
Packit Service |
a1973e |
if ( s ) {
|
|
Packit Service |
a1973e |
strcpy( hwinfo->vendor_string, "ARM" );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Decode the string to a PAPI specific implementer value */
|
|
Packit Service |
a1973e |
if ( strlen( hwinfo->vendor_string ) ) {
|
|
Packit Service |
a1973e |
decode_vendor_string( hwinfo->vendor_string, &hwinfo->vendor );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/**********************************************/
|
|
Packit Service |
a1973e |
/* Provide more stepping/model/family numbers */
|
|
Packit Service |
a1973e |
/**********************************************/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ((hwinfo->vendor==PAPI_VENDOR_INTEL) ||
|
|
Packit Service |
a1973e |
(hwinfo->vendor==PAPI_VENDOR_AMD)) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
decode_cpuinfo_x86(f,hwinfo);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (hwinfo->vendor==PAPI_VENDOR_IBM) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
decode_cpuinfo_power(f,hwinfo);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (hwinfo->vendor==PAPI_VENDOR_ARM) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
decode_cpuinfo_arm(f,hwinfo);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* The following members are set using the same methodology */
|
|
Packit Service |
a1973e |
/* used in lscpu. */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Total number of CPUs */
|
|
Packit Service |
a1973e |
/* The following line assumes totalcpus was initialized to zero! */
|
|
Packit Service |
a1973e |
while ( path_exist( _PATH_SYS_SYSTEM "/cpu/cpu%d", hwinfo->totalcpus ) )
|
|
Packit Service |
a1973e |
hwinfo->totalcpus++;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Number of threads per core */
|
|
Packit Service |
a1973e |
if ( path_exist( _PATH_SYS_CPU0 "/topology/thread_siblings" ) )
|
|
Packit Service |
a1973e |
hwinfo->threads =
|
|
Packit Service |
a1973e |
path_sibling( _PATH_SYS_CPU0 "/topology/thread_siblings" );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Number of cores per socket */
|
|
Packit Service |
a1973e |
if ( path_exist( _PATH_SYS_CPU0 "/topology/core_siblings" ) &&
|
|
Packit Service |
a1973e |
hwinfo->threads > 0 )
|
|
Packit Service |
a1973e |
hwinfo->cores =
|
|
Packit Service |
a1973e |
path_sibling( _PATH_SYS_CPU0 "/topology/core_siblings" ) /
|
|
Packit Service |
a1973e |
hwinfo->threads;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Number of NUMA nodes */
|
|
Packit Service |
a1973e |
/* The following line assumes nnodes was initialized to zero! */
|
|
Packit Service |
a1973e |
while ( path_exist( _PATH_SYS_SYSTEM "/node/node%d", hwinfo->nnodes ) ) {
|
|
Packit Service |
a1973e |
hwinfo->nnodes++;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Number of CPUs per node */
|
|
Packit Service |
a1973e |
hwinfo->ncpu = hwinfo->nnodes > 1 ?
|
|
Packit Service |
a1973e |
hwinfo->totalcpus / hwinfo->nnodes : hwinfo->totalcpus;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Number of sockets */
|
|
Packit Service |
a1973e |
if ( hwinfo->threads > 0 && hwinfo->cores > 0 ) {
|
|
Packit Service |
a1973e |
hwinfo->sockets = hwinfo->totalcpus / hwinfo->cores / hwinfo->threads;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#if 0
|
|
Packit Service |
a1973e |
int *nodecpu;
|
|
Packit Service |
a1973e |
/* cpumap data is not currently part of the _papi_hw_info struct */
|
|
Packit Service |
a1973e |
nodecpu = malloc( (unsigned int) hwinfo->nnodes * sizeof(int) );
|
|
Packit Service |
a1973e |
if ( nodecpu ) {
|
|
Packit Service |
a1973e |
int i;
|
|
Packit Service |
a1973e |
for ( i = 0; i < hwinfo->nnodes; ++i ) {
|
|
Packit Service |
a1973e |
nodecpu[i] = path_sibling(
|
|
Packit Service |
a1973e |
_PATH_SYS_SYSTEM "/node/node%d/cpumap", i );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
} else {
|
|
Packit Service |
a1973e |
PAPIERROR( "malloc failed for variable not currently used" );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Fixup missing Megahertz Value */
|
|
Packit Service |
a1973e |
/* This is missing from cpuinfo on ARM and MIPS */
|
|
Packit Service |
a1973e |
if (*cpuinfo_mhz < 1.0) {
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "BogoMIPS" );
|
|
Packit Service |
a1973e |
if ((!s) || (sscanf( s, "%f", &mhz ) != 1)) {
|
|
Packit Service |
a1973e |
INTDBG("MHz detection failed. "
|
|
Packit Service |
a1973e |
"Please edit file %s at line %d.\n",
|
|
Packit Service |
a1973e |
__FILE__,__LINE__);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (hwinfo->vendor == PAPI_VENDOR_MIPS) {
|
|
Packit Service |
a1973e |
/* MIPS has 2x clock multiplier */
|
|
Packit Service |
a1973e |
*cpuinfo_mhz = 2*(((int)mhz)+1);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Also update version info on MIPS */
|
|
Packit Service |
a1973e |
s = search_cpu_info( f, "cpu model");
|
|
Packit Service |
a1973e |
s = strstr(s," V")+2;
|
|
Packit Service |
a1973e |
strtok(s," ");
|
|
Packit Service |
a1973e |
sscanf(s, "%f ", &hwinfo->revision );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
/* In general bogomips is proportional to number of CPUs */
|
|
Packit Service |
a1973e |
if (hwinfo->totalcpus) {
|
|
Packit Service |
a1973e |
if (mhz!=0) *cpuinfo_mhz = mhz / hwinfo->totalcpus;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
fclose( f );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return retval;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_linux_get_mhz( int *sys_min_mhz, int *sys_max_mhz ) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
FILE *fff;
|
|
Packit Service |
a1973e |
int result;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Try checking for min MHz */
|
|
Packit Service |
a1973e |
/* Assume cpu0 exists */
|
|
Packit Service |
a1973e |
fff=fopen("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq","r");
|
|
Packit Service |
a1973e |
if (fff==NULL) return PAPI_EINVAL;
|
|
Packit Service |
a1973e |
result=fscanf(fff,"%d",sys_min_mhz);
|
|
Packit Service |
a1973e |
fclose(fff);
|
|
Packit Service |
a1973e |
if (result!=1) return PAPI_EINVAL;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
fff=fopen("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq","r");
|
|
Packit Service |
a1973e |
if (fff==NULL) return PAPI_EINVAL;
|
|
Packit Service |
a1973e |
result=fscanf(fff,"%d",sys_max_mhz);
|
|
Packit Service |
a1973e |
fclose(fff);
|
|
Packit Service |
a1973e |
if (result!=1) return PAPI_EINVAL;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_linux_get_system_info( papi_mdi_t *mdi ) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
char maxargs[PAPI_HUGE_STR_LEN];
|
|
Packit Service |
a1973e |
pid_t pid;
|
|
Packit Service |
a1973e |
int cpuinfo_mhz,sys_min_khz,sys_max_khz;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Software info */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Path and args */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
pid = getpid( );
|
|
Packit Service |
a1973e |
if ( pid < 0 ) {
|
|
Packit Service |
a1973e |
PAPIERROR( "getpid() returned < 0" );
|
|
Packit Service |
a1973e |
return PAPI_ESYS;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
mdi->pid = pid;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
sprintf( maxargs, "/proc/%d/exe", ( int ) pid );
|
|
Packit Service |
a1973e |
retval = readlink( maxargs, mdi->exe_info.fullname,
|
|
Packit Service |
a1973e |
PAPI_HUGE_STR_LEN-1 );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) {
|
|
Packit Service |
a1973e |
PAPIERROR( "readlink(%s) returned < 0", maxargs );
|
|
Packit Service |
a1973e |
return PAPI_ESYS;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (retval > PAPI_HUGE_STR_LEN-1) {
|
|
Packit Service |
a1973e |
retval=PAPI_HUGE_STR_LEN-1;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
mdi->exe_info.fullname[retval] = '\0';
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Careful, basename can modify its argument */
|
|
Packit Service |
a1973e |
strcpy( maxargs, mdi->exe_info.fullname );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
strncpy( mdi->exe_info.address_info.name, basename( maxargs ),
|
|
Packit Service |
a1973e |
PAPI_HUGE_STR_LEN-1);
|
|
Packit Service |
a1973e |
mdi->exe_info.address_info.name[PAPI_HUGE_STR_LEN-1] = '\0';
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
SUBDBG( "Executable is %s\n", mdi->exe_info.address_info.name );
|
|
Packit Service |
a1973e |
SUBDBG( "Full Executable is %s\n", mdi->exe_info.fullname );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Executable regions, may require reading /proc/pid/maps file */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = _linux_update_shlib_info( mdi );
|
|
Packit Service |
a1973e |
SUBDBG( "Text: Start %p, End %p, length %d\n",
|
|
Packit Service |
a1973e |
mdi->exe_info.address_info.text_start,
|
|
Packit Service |
a1973e |
mdi->exe_info.address_info.text_end,
|
|
Packit Service |
a1973e |
( int ) ( mdi->exe_info.address_info.text_end -
|
|
Packit Service |
a1973e |
mdi->exe_info.address_info.text_start ) );
|
|
Packit Service |
a1973e |
SUBDBG( "Data: Start %p, End %p, length %d\n",
|
|
Packit Service |
a1973e |
mdi->exe_info.address_info.data_start,
|
|
Packit Service |
a1973e |
mdi->exe_info.address_info.data_end,
|
|
Packit Service |
a1973e |
( int ) ( mdi->exe_info.address_info.data_end -
|
|
Packit Service |
a1973e |
mdi->exe_info.address_info.data_start ) );
|
|
Packit Service |
a1973e |
SUBDBG( "Bss: Start %p, End %p, length %d\n",
|
|
Packit Service |
a1973e |
mdi->exe_info.address_info.bss_start,
|
|
Packit Service |
a1973e |
mdi->exe_info.address_info.bss_end,
|
|
Packit Service |
a1973e |
( int ) ( mdi->exe_info.address_info.bss_end -
|
|
Packit Service |
a1973e |
mdi->exe_info.address_info.bss_start ) );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* PAPI_preload_option information */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
strcpy( mdi->preload_info.lib_preload_env, "LD_PRELOAD" );
|
|
Packit Service |
a1973e |
mdi->preload_info.lib_preload_sep = ' ';
|
|
Packit Service |
a1973e |
strcpy( mdi->preload_info.lib_dir_env, "LD_LIBRARY_PATH" );
|
|
Packit Service |
a1973e |
mdi->preload_info.lib_dir_sep = ':';
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Hardware info */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = _linux_get_cpu_info( &mdi->hw_info, &cpuinfo_mhz );
|
|
Packit Service |
a1973e |
if ( retval )
|
|
Packit Service |
a1973e |
return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Handle MHz */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = _linux_get_mhz( &sys_min_khz, &sys_max_khz );
|
|
Packit Service |
a1973e |
if ( retval ) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
mdi->hw_info.cpu_max_mhz=cpuinfo_mhz;
|
|
Packit Service |
a1973e |
mdi->hw_info.cpu_min_mhz=cpuinfo_mhz;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
mdi->hw_info.mhz=cpuinfo_mhz;
|
|
Packit Service |
a1973e |
mdi->hw_info.clock_mhz=cpuinfo_mhz;
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
mdi->hw_info.cpu_max_mhz=sys_max_khz/1000;
|
|
Packit Service |
a1973e |
mdi->hw_info.cpu_min_mhz=sys_min_khz/1000;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
mdi->hw_info.mhz=sys_max_khz/1000;
|
|
Packit Service |
a1973e |
mdi->hw_info.clock_mhz=sys_max_khz/1000;
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Set Up Memory */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = _linux_get_memory_info( &mdi->hw_info, mdi->hw_info.model );
|
|
Packit Service |
a1973e |
if ( retval )
|
|
Packit Service |
a1973e |
return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
SUBDBG( "Found %d %s(%d) %s(%d) CPUs at %d Mhz.\n",
|
|
Packit Service |
a1973e |
mdi->hw_info.totalcpus,
|
|
Packit Service |
a1973e |
mdi->hw_info.vendor_string,
|
|
Packit Service |
a1973e |
mdi->hw_info.vendor,
|
|
Packit Service |
a1973e |
mdi->hw_info.model_string,
|
|
Packit Service |
a1973e |
mdi->hw_info.model,
|
|
Packit Service |
a1973e |
mdi->hw_info.cpu_max_mhz);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Get virtualization info */
|
|
Packit Service |
a1973e |
mdi->hw_info.virtualized=_linux_detect_hypervisor(mdi->hw_info.virtual_vendor_string);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_papi_hwi_init_os(void) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int major=0,minor=0,sub=0;
|
|
Packit Service |
a1973e |
char *ptr;
|
|
Packit Service |
a1973e |
struct utsname uname_buffer;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Initialize the locks */
|
|
Packit Service |
a1973e |
_linux_init_locks();
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Get the kernel info */
|
|
Packit Service |
a1973e |
uname(&uname_buffer);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
SUBDBG("Native kernel version %s\n",uname_buffer.release);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
strncpy(_papi_os_info.name,uname_buffer.sysname,PAPI_MAX_STR_LEN);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#ifdef ASSUME_KERNEL
|
|
Packit Service |
a1973e |
strncpy(_papi_os_info.version,ASSUME_KERNEL,PAPI_MAX_STR_LEN);
|
|
Packit Service |
a1973e |
SUBDBG("Assuming kernel version %s\n",_papi_os_info.name);
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
strncpy(_papi_os_info.version,uname_buffer.release,PAPI_MAX_STR_LEN);
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
ptr=strtok(_papi_os_info.version,".");
|
|
Packit Service |
a1973e |
if (ptr!=NULL) major=atoi(ptr);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
ptr=strtok(NULL,".");
|
|
Packit Service |
a1973e |
if (ptr!=NULL) minor=atoi(ptr);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
ptr=strtok(NULL,".");
|
|
Packit Service |
a1973e |
if (ptr!=NULL) sub=atoi(ptr);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
_papi_os_info.os_version=LINUX_VERSION(major,minor,sub);
|
|
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 |
_papi_os_info.clock_ticks = sysconf( _SC_CLK_TCK );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Get Linux-specific system info */
|
|
Packit Service |
a1973e |
_linux_get_system_info( &_papi_hwi_system_info );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int _linux_detect_nmi_watchdog() {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int watchdog_detected=0,watchdog_value=0;
|
|
Packit Service |
a1973e |
FILE *fff;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
fff=fopen("/proc/sys/kernel/nmi_watchdog","r");
|
|
Packit Service |
a1973e |
if (fff!=NULL) {
|
|
Packit Service |
a1973e |
if (fscanf(fff,"%d",&watchdog_value)==1) {
|
|
Packit Service |
a1973e |
if (watchdog_value>0) watchdog_detected=1;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
fclose(fff);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return watchdog_detected;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
papi_os_vector_t _papi_os_vector = {
|
|
Packit Service |
a1973e |
.get_memory_info = _linux_get_memory_info,
|
|
Packit Service |
a1973e |
.get_dmem_info = _linux_get_dmem_info,
|
|
Packit Service |
a1973e |
.get_real_cycles = _linux_get_real_cycles,
|
|
Packit Service |
a1973e |
.update_shlib_info = _linux_update_shlib_info,
|
|
Packit Service |
a1973e |
.get_system_info = _linux_get_system_info,
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#if defined(HAVE_CLOCK_GETTIME)
|
|
Packit Service |
a1973e |
.get_real_usec = _linux_get_real_usec_gettime,
|
|
Packit Service |
a1973e |
#elif defined(HAVE_GETTIMEOFDAY)
|
|
Packit Service |
a1973e |
.get_real_usec = _linux_get_real_usec_gettimeofday,
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
.get_real_usec = _linux_get_real_usec_cycles,
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#if defined(USE_PROC_PTTIMER)
|
|
Packit Service |
a1973e |
.get_virt_usec = _linux_get_virt_usec_pttimer,
|
|
Packit Service |
a1973e |
#elif defined(HAVE_CLOCK_GETTIME_THREAD)
|
|
Packit Service |
a1973e |
.get_virt_usec = _linux_get_virt_usec_gettime,
|
|
Packit Service |
a1973e |
#elif defined(HAVE_PER_THREAD_TIMES)
|
|
Packit Service |
a1973e |
.get_virt_usec = _linux_get_virt_usec_times,
|
|
Packit Service |
a1973e |
#elif defined(HAVE_PER_THREAD_GETRUSAGE)
|
|
Packit Service |
a1973e |
.get_virt_usec = _linux_get_virt_usec_rusage,
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#if defined(HAVE_CLOCK_GETTIME)
|
|
Packit Service |
a1973e |
.get_real_nsec = _linux_get_real_nsec_gettime,
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#if defined(HAVE_CLOCK_GETTIME_THREAD)
|
|
Packit Service |
a1973e |
.get_virt_nsec = _linux_get_virt_nsec_gettime,
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
};
|