|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* This file contains the user level interface description for
|
|
Packit |
577717 |
* the perfmon3.x interface on Linux.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* It also includes perfmon2.x interface definitions.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Copyright (c) 2001-2006 Hewlett-Packard Development Company, L.P.
|
|
Packit |
577717 |
* Contributed by Stephane Eranian <eranian@hpl.hp.com>
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#ifndef __PERFMON_H__
|
|
Packit |
577717 |
#define __PERFMON_H__
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <sys/types.h>
|
|
Packit |
577717 |
#include <stdint.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __cplusplus
|
|
Packit |
577717 |
extern "C" {
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __ia64__
|
|
Packit |
577717 |
#include <perfmon/perfmon_ia64.h>
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __x86_64__
|
|
Packit |
577717 |
#include <perfmon/perfmon_x86_64.h>
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __i386__
|
|
Packit |
577717 |
#include <perfmon/perfmon_i386.h>
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#if defined(__powerpc__) || defined(__cell__)
|
|
Packit |
577717 |
#include <perfmon/perfmon_powerpc.h>
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __sparc__
|
|
Packit |
577717 |
#include <perfmon/perfmon_sparc.h>
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __mips__
|
|
Packit |
577717 |
#include <perfmon/perfmon_mips64.h>
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __crayx2
|
|
Packit |
577717 |
#include <perfmon/perfmon_crayx2.h>
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PFM_MAX_PMCS PFM_ARCH_MAX_PMCS
|
|
Packit |
577717 |
#define PFM_MAX_PMDS PFM_ARCH_MAX_PMDS
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifndef SWIG
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* number of element for each type of bitvector
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PFM_BPL (sizeof(uint64_t)<<3)
|
|
Packit |
577717 |
#define PFM_BVSIZE(x) (((x)+PFM_BPL-1) / PFM_BPL)
|
|
Packit |
577717 |
#define PFM_PMD_BV PFM_BVSIZE(PFM_MAX_PMDS)
|
|
Packit |
577717 |
#define PFM_PMC_BV PFM_BVSIZE(PFM_MAX_PMCS)
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* special data type for syscall error value used to help
|
|
Packit |
577717 |
* with Python support and in particular for SWIG. By using
|
|
Packit |
577717 |
* a specific type we can detect syscalls and trap errors
|
|
Packit |
577717 |
* in one SWIG statement as opposed to having to keep track of
|
|
Packit |
577717 |
* each syscall individually. Programs can use 'int' safely for
|
|
Packit |
577717 |
* the return value.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
typedef int os_err_t; /* error if -1 */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* passed to pfm_create
|
|
Packit |
577717 |
* contains list of available register upon return
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
uint64_t sif_avail_pmcs[PFM_PMC_BV]; /* out: available PMCs */
|
|
Packit |
577717 |
uint64_t sif_avail_pmds[PFM_PMD_BV]; /* out: available PMDs */
|
|
Packit |
577717 |
uint64_t sif_reserved[4];
|
|
Packit |
577717 |
} pfarg_sinfo_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
//os_err_t pfm_create(int flags, pfarg_sinfo_t *sif,
|
|
Packit |
577717 |
// char *smpl_name, void *smpl_arg, size_t arg_size);
|
|
Packit |
577717 |
extern os_err_t pfm_create(int flags, pfarg_sinfo_t *sif, ...);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* pfm_create flags:
|
|
Packit |
577717 |
* bits[00-15]: generic flags
|
|
Packit |
577717 |
* bits[16-31]: arch-specific flags (see perfmon_const.h)
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PFM_FL_NOTIFY_BLOCK 0x01 /* block task on user notifications */
|
|
Packit |
577717 |
#define PFM_FL_SYSTEM_WIDE 0x02 /* create a system wide context */
|
|
Packit |
577717 |
#define PFM_FL_SMPL_FMT 0x04 /* session uses sampling format */
|
|
Packit |
577717 |
#define PFM_FL_OVFL_NO_MSG 0x80 /* no overflow msgs */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* PMC and PMD generic (simplified) register description
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
uint16_t reg_num; /* which register */
|
|
Packit |
577717 |
uint16_t reg_set; /* which event set */
|
|
Packit |
577717 |
uint32_t reg_flags; /* REGFL flags */
|
|
Packit |
577717 |
uint64_t reg_value; /* 64-bit value */
|
|
Packit |
577717 |
} pfarg_pmr_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* pfarg_pmr_t flags:
|
|
Packit |
577717 |
* bit[00-15] : generic flags
|
|
Packit |
577717 |
* bit[16-31] : arch-specific flags
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* PFM_REGFL_NO_EMUL64: must be set on the PMC controlling the PMD
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PFM_REGFL_OVFL_NOTIFY 0x1 /* PMD: send notification on event */
|
|
Packit |
577717 |
#define PFM_REGFL_RANDOM 0x2 /* PMD: randomize value after event */
|
|
Packit |
577717 |
#define PFM_REGFL_NO_EMUL64 0x4 /* PMC: no 64-bit emulation */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* PMD extended description
|
|
Packit |
577717 |
* to be used with pfm_writeand pfm_read
|
|
Packit |
577717 |
* must be used with type = PFM_RW_PMD_ATTR
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
uint16_t reg_num; /* which register */
|
|
Packit |
577717 |
uint16_t reg_set; /* which event set */
|
|
Packit |
577717 |
uint32_t reg_flags; /* REGFL flags */
|
|
Packit |
577717 |
uint64_t reg_value; /* 64-bit value */
|
|
Packit |
577717 |
uint64_t reg_long_reset; /* write: value to reload after notification */
|
|
Packit |
577717 |
uint64_t reg_short_reset; /* write: reset after counter overflow */
|
|
Packit |
577717 |
uint64_t reg_random_mask; /* write: bitmask used to limit random value */
|
|
Packit |
577717 |
uint64_t reg_smpl_pmds[PFM_PMD_BV]; /* write: record in sample */
|
|
Packit |
577717 |
uint64_t reg_reset_pmds[PFM_PMD_BV]; /* write: reset on overflow */
|
|
Packit |
577717 |
uint64_t reg_ovfl_swcnt; /* write: # overflows before switch */
|
|
Packit |
577717 |
uint64_t reg_smpl_eventid; /* write: opaque event identifier */
|
|
Packit |
577717 |
uint64_t reg_last_value; /* read: PMD last reset value */
|
|
Packit |
577717 |
uint64_t reg_reserved[8]; /* for future use */
|
|
Packit |
577717 |
} pfarg_pmd_attr_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* pfm_write, pfm_read type:
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PFM_RW_PMD 1 /* simplified PMD (pfarg_pmr_t) */
|
|
Packit |
577717 |
#define PFM_RW_PMC 2 /* PMC registers (pfarg_pmr_t) */
|
|
Packit |
577717 |
#define PFM_RW_PMD_ATTR 3 /* extended PMD (pfarg_pmd_attr) */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* pfm_attach special target for detach
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PFM_NO_TARGET -1 /* no target, detach */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* pfm_set_state state:
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PFM_ST_START 0x1 /* start monitoring */
|
|
Packit |
577717 |
#define PFM_ST_STOP 0x2 /* stop monitoring */
|
|
Packit |
577717 |
#define PFM_ST_RESTART 0x3 /* resume after notify */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifndef PFMLIB_OLD_PFMV2
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
uint16_t set_id; /* which set */
|
|
Packit |
577717 |
uint16_t set_reserved1; /* for future use */
|
|
Packit |
577717 |
uint32_t set_flags; /* SETFL flags */
|
|
Packit |
577717 |
uint64_t set_timeout; /* requested/effective switch timeout in nsecs */
|
|
Packit |
577717 |
uint64_t reserved[6]; /* for future use */
|
|
Packit |
577717 |
} pfarg_set_desc_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
uint16_t set_id; /* which set */
|
|
Packit |
577717 |
uint16_t set_reserved1; /* for future use */
|
|
Packit |
577717 |
uint32_t set_reserved2; /* for future use */
|
|
Packit |
577717 |
uint64_t set_ovfl_pmds[PFM_PMD_BV]; /* out: last ovfl PMDs */
|
|
Packit |
577717 |
uint64_t set_runs; /* out: #times set was active */
|
|
Packit |
577717 |
uint64_t set_timeout; /* out: leftover switch timeout (nsecs) */
|
|
Packit |
577717 |
uint64_t set_duration; /* out: time set was active (nsecs) */
|
|
Packit |
577717 |
uint64_t set_reserved3[4]; /* for future use */
|
|
Packit |
577717 |
} pfarg_set_info_t;
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* pfm_set_desc_t flags:
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PFM_SETFL_OVFL_SWITCH 0x01 /* enable switch on overflow (subject to individual switch_cnt */
|
|
Packit |
577717 |
#define PFM_SETFL_TIME_SWITCH 0x02 /* switch set on timeout */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifndef PFMLIB_OLD_PFMV2
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
uint32_t msg_type; /* PFM_MSG_OVFL */
|
|
Packit |
577717 |
uint32_t msg_ovfl_pid; /* process id */
|
|
Packit |
577717 |
uint16_t msg_active_set; /* active set at the time of overflow */
|
|
Packit |
577717 |
uint16_t msg_ovfl_cpu; /* cpu on which the overflow occurred */
|
|
Packit |
577717 |
uint32_t msg_ovfl_tid; /* thread id */
|
|
Packit |
577717 |
uint64_t msg_ovfl_ip; /* instruction pointer where overflow interrupt happened */
|
|
Packit |
577717 |
uint64_t msg_ovfl_pmds[PFM_PMD_BV];/* which PMDs overflowed */
|
|
Packit |
577717 |
} pfarg_ovfl_msg_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
extern os_err_t pfm_write(int fd, int flags, int type, void *reg, size_t n);
|
|
Packit |
577717 |
extern os_err_t pfm_read(int fd, int flags, int type, void *reg, size_t n);
|
|
Packit |
577717 |
extern os_err_t pfm_set_state(int fd, int flags, int state);
|
|
Packit |
577717 |
extern os_err_t pfm_create_sets(int fd, int flags, pfarg_set_desc_t *s, size_t sz);
|
|
Packit |
577717 |
extern os_err_t pfm_getinfo_sets(int fd, int flags, pfarg_set_info_t *s, size_t sz);
|
|
Packit |
577717 |
extern os_err_t pfm_attach(int fd, int flags, int target);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "perfmon_v2.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef union {
|
|
Packit |
577717 |
uint32_t type;
|
|
Packit |
577717 |
pfarg_ovfl_msg_t pfm_ovfl_msg;
|
|
Packit |
577717 |
} pfarg_msg_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PFM_MSG_OVFL 1 /* an overflow happened */
|
|
Packit |
577717 |
#define PFM_MSG_END 2 /* thread to which context was attached ended */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PFM_VERSION_MAJOR(x) (((x)>>16) & 0xffff)
|
|
Packit |
577717 |
#define PFM_VERSION_MINOR(x) ((x) & 0xffff)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __cplusplus
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif /* _PERFMON_H */
|