11#include <sys/syscall.h>
27#include <sys/resource.h>
38#include <sys/platform/ppc.h>
41#if defined(HAVE_MMTIMER)
43#include <linux/mmtimer.h>
45#ifndef MMTIMER_FULLNAME
46#define MMTIMER_FULLNAME "/dev/mmtimer"
50static unsigned long mmdev_mask;
51static unsigned long mmdev_ratio;
52static volatile unsigned long *mmdev_timer_addr;
57 unsigned long femtosecs_per_tick = 0;
58 unsigned long freq = 0;
62 SUBDBG(
"MMTIMER Opening %s\n", MMTIMER_FULLNAME );
63 if ( ( mmdev_fd =
open( MMTIMER_FULLNAME, O_RDONLY ) ) == -1 ) {
64 PAPIERROR(
"Failed to open MM timer %s", MMTIMER_FULLNAME );
67 SUBDBG(
"MMTIMER checking if we can mmap" );
68 if ( ioctl( mmdev_fd, MMTIMER_MMAPAVAIL, 0 ) != 1 ) {
69 PAPIERROR(
"mmap of MM timer unavailable" );
72 SUBDBG(
"MMTIMER setting close on EXEC flag\n" );
73 if ( fcntl( mmdev_fd, F_SETFD, FD_CLOEXEC ) == -1 ) {
74 PAPIERROR(
"Failed to fcntl(FD_CLOEXEC) on MM timer FD %d: %s",
75 mmdev_fd, strerror(
errno ) );
78 SUBDBG(
"MMTIMER is on FD %d, getting offset\n", mmdev_fd );
79 if ( ( offset = ioctl( mmdev_fd, MMTIMER_GETOFFSET, 0 ) ) < 0 ) {
80 PAPIERROR(
"Failed to get offset of MM timer" );
83 SUBDBG(
"MMTIMER has offset of %d, getting frequency\n", offset );
84 if ( ioctl( mmdev_fd, MMTIMER_GETFREQ, &
freq ) == -1 ) {
85 PAPIERROR(
"Failed to get frequency of MM timer" );
88 SUBDBG(
"MMTIMER has frequency %lu Mhz\n",
freq / 1000000 );
94 SUBDBG(
"MMTIMER has a ratio of %ld to the CPU's clock, getting resolution\n",
96 if ( ioctl( mmdev_fd, MMTIMER_GETRES, &femtosecs_per_tick ) == -1 ) {
97 PAPIERROR(
"Failed to get femtoseconds per tick" );
100 SUBDBG(
"MMTIMER res is %lu femtosecs/tick (10^-15s) or %f Mhz, getting valid bits\n",
101 femtosecs_per_tick, 1.0e9 / (
double ) femtosecs_per_tick );
102 if ( (
result = ioctl( mmdev_fd, MMTIMER_GETBITS, 0 ) ) == -ENOSYS ) {
103 PAPIERROR(
"Failed to get number of bits in MMTIMER" );
106 mmdev_mask = ~( 0xffffffffffffffff <<
result );
107 SUBDBG(
"MMTIMER has %d valid bits, mask %#16lx, getting mmaped page\n",
109 if ( ( mmdev_timer_addr =
110 (
unsigned long * ) mmap( 0, getpagesize( ), PROT_READ,
111 MAP_PRIVATE, mmdev_fd,
116 SUBDBG(
"MMTIMER page is at %p, actual address is %p\n",
117 mmdev_timer_addr, mmdev_timer_addr + offset );
118 mmdev_timer_addr += offset;
126#if defined(__powerpc__)
127static uint64_t multiplier = 1;
132#if defined(__powerpc__)
157#if defined(HAVE_MMTIMER)
159static inline long long
164 tmp = *mmdev_timer_addr & mmdev_mask;
165 SUBDBG(
"MMTIMER is %llu, scaled %llu\n",
tmp,
tmp*mmdev_ratio);
175#elif defined(__ia64__)
178static inline long long
182#if defined(__INTEL_COMPILER)
183 tmp = __getReg( _IA64_REG_AR_ITC );
185 __asm__ __volatile__(
"mov %0=ar.itc":
"=r"(
tmp )::
"memory" );
199#elif (defined(__i386__)||defined(__x86_64__))
200static inline long long
207 asm volatile (
"rdtsc":
"=a" (
a ),
"=d"( d ) );
208 ( ret ) = ( (
long long )
a ) | ( ( (
long long ) d ) << 32 );
212 __asm__ __volatile__(
"rdtsc":
"=A"( ret ): );
222#elif defined(__sparc__)
223static inline long long
226 register unsigned long ret
asm(
"g1" );
228 __asm__ __volatile__(
".word 0x83410000"
237#elif defined(__aarch64__)
238static inline long long
241 register unsigned long ret;
243 __asm__ __volatile__ (
"isb; mrs %0, cntvct_el0" :
"=r" (ret));
252#elif defined(__powerpc__)
284#elif (defined(__arm__) || defined(__mips__) || defined(__hppa__))
285static inline long long
295#elif defined(__NEC__)
296static inline long long
305#elif !defined(HAVE_GETTIMEOFDAY) && !defined(HAVE_CLOCK_GETTIME)
306#error "No get_cycles support for this architecture. "
315#if defined(HAVE_GETTIMEOFDAY)||defined(__arm__)||defined(__mips__)
346#ifdef HAVE_CLOCK_GETTIME_REALTIME_HR
347 syscall( __NR_clock_gettime, CLOCK_REALTIME_HR, &foo );
349 syscall( __NR_clock_gettime, CLOCK_REALTIME, &foo );
368 gettimeofday( &buffer, NULL );
402 struct rusage buffer;
404 getrusage( RUSAGE_SELF, &buffer );
405 SUBDBG(
"user %d system %d\n", (
int ) buffer.ru_utime.tv_sec,
406 (
int ) buffer.ru_stime.tv_sec );
407 retval = (
long long ) ( buffer.ru_utime.tv_sec + buffer.ru_stime.tv_sec )
408 * (
long long ) 1000000;
409 retval += (
long long) ( buffer.ru_utime.tv_usec + buffer.ru_stime.tv_usec );
428 SUBDBG(
"user %d system %d\n", (
int ) buffer.tms_utime,
429 (
int ) buffer.tms_stime );
430 retval = (
long long ) ( ( buffer.tms_utime + buffer.tms_stime ) *
431 1000000 / sysconf( _SC_CLK_TCK ));
450 syscall( __NR_clock_gettime, CLOCK_THREAD_CPUTIME_ID, &foo );
467 long long utime, stime;
468 int rv, cnt = 0,
i = 0;
473 sprintf(
buf,
"/proc/%d/task/%d/stat", getpid( ),
mygettid( ) );
474 stat_fd =
open(
buf, O_RDONLY );
475 if ( stat_fd == -1 ) {
480 rv =
read( stat_fd,
buf, LINE_MAX *
sizeof (
char ) );
482 if (
errno == EBADF ) {
490 lseek( stat_fd, 0, SEEK_SET );
492 if (rv == LINE_MAX) rv--;
494 SUBDBG(
"Thread stat file is:%s\n",
buf );
495 while ( ( cnt != 13 ) && (
i < rv ) ) {
496 if (
buf[
i] ==
' ' ) {
503 PAPIERROR(
"utime and stime not in thread stat file?" );
508 if ( sscanf(
buf +
i,
"%llu %llu", &utime, &stime ) != 2 ) {
510 PAPIERROR(
"Unable to scan two items from thread stat file at 13th space?");
539#ifdef HAVE_CLOCK_GETTIME_REALTIME_HR
540 syscall( __NR_clock_gettime, CLOCK_REALTIME_HR, &foo );
542 syscall( __NR_clock_gettime, CLOCK_REALTIME, &foo );
563 syscall( __NR_clock_gettime, CLOCK_THREAD_CPUTIME_ID, &foo );
PAPI_os_info_t _papi_os_info
papi_os_vector_t _papi_os_vector
int open(const char *pathname, int flags, mode_t mode)
off_t lseek(int fd, off_t offset, int whence)
ssize_t read(int fd, void *buf, size_t count)
static pid_t mygettid(void)
volatile int buf[CACHE_FLUSH_BUFFER_SIZE_INTS]
static double a[MATRIX_SIZE][MATRIX_SIZE]
long long _linux_get_real_usec_gettime(void)
long long _linux_get_virt_usec_times(void)
long long _linux_get_real_usec_cycles(void)
long long _linux_get_real_cycles(void)
long long _linux_get_virt_usec_rusage(void)
long long _linux_get_virt_usec_gettime(void)
long long _linux_get_real_nsec_gettime(void)
long long _linux_get_real_usec_gettimeofday(void)
long long _linux_get_virt_nsec_gettime(void)
long long _linux_get_virt_usec_pttimer(void)
Return codes and api definitions.
#define SUBDBG(format, args...)
void PAPIERROR(char *format,...)
papi_mdi_t _papi_hwi_system_info
static int _perfmon2_pfm_pmu_type
#define PFMLIB_MONTECITO_PMU
long long(* get_real_usec)(void)
__syscall_slong_t tv_nsec