/* * This file contains the user level interface description for * the perfmon-2.x interface on Linux. * * Copyright (c) 2001-2006 Hewlett-Packard Development Company, L.P. * Contributed by Stephane Eranian */ #ifndef __PERFMON_V2_H__ #define __PERFMON_V2_H__ #ifndef __PERFMON_H__ #error "this file should never be included directly, use perfmon.h instead" #endif /* * argument to v2.3 and onward pfm_create_context() */ typedef struct { uint32_t ctx_flags; /* noblock/block/syswide */ uint32_t ctx_reserved1; /* for future use */ uint64_t ctx_reserved3[7]; /* for future use */ } pfarg_ctx_t; /* * argument for pfm_write_pmcs() */ typedef struct { uint16_t reg_num; /* which register */ uint16_t reg_set; /* event set for this register */ uint32_t reg_flags; /* REGFL flags */ uint64_t reg_value; /* pmc value */ uint64_t reg_reserved2[4]; /* for future use */ } pfarg_pmc_t; /* * argument pfm_write_pmds() and pfm_read_pmds() */ typedef struct { uint16_t reg_num; /* which register */ uint16_t reg_set; /* event set for this register */ uint32_t reg_flags; /* REGFL flags */ uint64_t reg_value; /* initial pmc/pmd value */ uint64_t reg_long_reset; /* reset after buffer overflow notification */ uint64_t reg_short_reset; /* reset after counter overflow */ uint64_t reg_last_reset_val; /* return: PMD last reset value */ uint64_t reg_ovfl_switch_cnt; /* how many overflow before switch for next set */ uint64_t reg_reset_pmds[PFM_PMD_BV]; /* which other PMDS to reset on overflow */ uint64_t reg_smpl_pmds[PFM_PMD_BV]; /* which other PMDS to record when the associated PMD overflows */ uint64_t reg_smpl_eventid; /* opaque sampling event identifier */ uint64_t reg_random_mask; /* bitmask used to limit random value */ uint32_t reg_random_seed; /* seed for randomization (DEPRECATED) */ uint32_t reg_reserved2[7]; /* for future use */ } pfarg_pmd_t; /* * optional argument to pfm_start(), pass NULL if no arg needed */ typedef struct { uint16_t start_set; /* event set to start with */ uint16_t start_reserved1; /* for future use */ uint32_t start_reserved2; /* for future use */ uint64_t reserved3[3]; /* for future use */ } pfarg_start_t; /* * argument to pfm_load_context() */ typedef struct { uint32_t load_pid; /* thread or CPU to attach to */ uint16_t load_set; /* set to load first */ uint16_t load_reserved1; /* for future use */ uint64_t load_reserved2[3]; /* for future use */ } pfarg_load_t; #ifndef PFMLIB_OLD_PFMV2 typedef struct { uint16_t set_id; /* which set */ uint16_t set_reserved1; /* for future use */ uint32_t set_flags; /* SETFL flags */ uint64_t set_timeout; /* requested/effective switch timeout in nsecs */ uint64_t reserved[6]; /* for future use */ } pfarg_setdesc_t; typedef struct { uint16_t set_id; /* which set */ uint16_t set_reserved1; /* for future use */ uint32_t set_flags; /* for future use */ uint64_t set_ovfl_pmds[PFM_PMD_BV]; /* out: last ovfl PMDs */ uint64_t set_runs; /* out: #times set was active */ uint64_t set_timeout; /* out: leftover switch timeout (nsecs) */ uint64_t set_act_duration; /* out: time set was active (nsecs) */ uint64_t set_avail_pmcs[PFM_PMC_BV]; /* out: available PMCs */ uint64_t set_avail_pmds[PFM_PMD_BV]; /* out: available PMDs */ uint64_t set_reserved3[6]; /* for future use */ } pfarg_setinfo_t; #endif #ifdef PFMLIB_OLD_PFMV2 /* * argument to pfm_create_evtsets()/pfm_delete_evtsets() */ typedef struct { uint16_t set_id; /* which set */ uint16_t set_id_next; /* next set to go to (must use PFM_SETFL_EXPL_NEXT) */ uint32_t set_flags; /* SETFL flags */ uint64_t set_timeout; /* requested switch timeout in nsecs */ uint64_t set_mmap_offset; /* cookie to pass as mmap offset to access 64-bit virtual PMD */ uint64_t reserved[5]; /* for future use */ } pfarg_setdesc_t; /* * argument to pfm_getinfo_evtsets() */ typedef struct { uint16_t set_id; /* which set */ uint16_t set_id_next; /* output: next set to go to (must use PFM_SETFL_EXPL_NEXT) */ uint32_t set_flags; /* output: SETFL flags */ uint64_t set_ovfl_pmds[PFM_PMD_BV]; /* output: last ovfl PMDs which triggered a switch from set */ uint64_t set_runs; /* output: number of times the set was active */ uint64_t set_timeout; /* output:effective/leftover switch timeout in nsecs */ uint64_t set_act_duration; /* number of cycles set was active (syswide only) */ uint64_t set_mmap_offset; /* cookie to pass as mmap offset to access 64-bit virtual PMD */ uint64_t set_avail_pmcs[PFM_PMC_BV]; uint64_t set_avail_pmds[PFM_PMD_BV]; uint64_t reserved[4]; /* for future use */ } pfarg_setinfo_t; #ifdef __crayx2 #define PFM_MAX_HW_PMDS 512 #else #define PFM_MAX_HW_PMDS 256 #endif #define PFM_HW_PMD_BV PFM_BVSIZE(PFM_MAX_HW_PMDS) typedef struct { uint32_t msg_type; /* PFM_MSG_OVFL */ uint32_t msg_ovfl_pid; /* process id */ uint64_t msg_ovfl_pmds[PFM_HW_PMD_BV];/* which PMDs overflowed */ uint16_t msg_active_set; /* active set at the time of overflow */ uint16_t msg_ovfl_cpu; /* cpu on which the overflow occurred */ uint32_t msg_ovfl_tid; /* thread id */ uint64_t msg_ovfl_ip; /* instruction pointer where overflow interrupt happened */ } pfarg_ovfl_msg_t; #endif /* PFMLIB_OLD_PFMV2 */ extern os_err_t pfm_create_context(pfarg_ctx_t *ctx, char *smpl_name, void *smpl_arg, size_t smpl_size); extern os_err_t pfm_write_pmcs(int fd, pfarg_pmc_t *pmcs, int count); extern os_err_t pfm_write_pmds(int fd, pfarg_pmd_t *pmds, int count); extern os_err_t pfm_read_pmds(int fd, pfarg_pmd_t *pmds, int count); extern os_err_t pfm_load_context(int fd, pfarg_load_t *load); extern os_err_t pfm_start(int fd, pfarg_start_t *start); extern os_err_t pfm_stop(int fd); extern os_err_t pfm_restart(int fd); extern os_err_t pfm_create_evtsets(int fd, pfarg_setdesc_t *setd, int count); extern os_err_t pfm_getinfo_evtsets(int fd, pfarg_setinfo_t *info, int count); extern os_err_t pfm_delete_evtsets(int fd, pfarg_setdesc_t *setd, int count); extern os_err_t pfm_unload_context(int fd); #endif /* _PERFMON_V2_H */