14#include <linux/unistd.h>
43#define FOPEN_ERROR "fopen(%s) returned NULL"
46#define PERFCTR_CPU_NAME(pi) perfctr_info_cpu_name(pi)
47#define PERFCTR_CPU_NRCTRS(pi) perfctr_info_nrctrs(pi)
49#define PERFCTR_CPU_NAME perfctr_cpu_name
50#define PERFCTR_CPU_NRCTRS perfctr_cpu_nrctrs
57 switch ( perfctr_cpu_type ) {
58 case PERFCTR_X86_INTEL_P5:
59 case PERFCTR_X86_INTEL_P5MMX:
60 case PERFCTR_X86_INTEL_P6:
61 case PERFCTR_X86_INTEL_PII:
62 case PERFCTR_X86_INTEL_PIII:
63 case PERFCTR_X86_INTEL_P4:
64 case PERFCTR_X86_INTEL_P4M2:
65#ifdef PERFCTR_X86_INTEL_P4M3
66 case PERFCTR_X86_INTEL_P4M3:
68#ifdef PERFCTR_X86_INTEL_PENTM
69 case PERFCTR_X86_INTEL_PENTM:
71#ifdef PERFCTR_X86_INTEL_CORE
72 case PERFCTR_X86_INTEL_CORE:
74#ifdef PERFCTR_X86_INTEL_CORE2
75 case PERFCTR_X86_INTEL_CORE2:
77#ifdef PERFCTR_X86_INTEL_ATOM
78 case PERFCTR_X86_INTEL_ATOM:
80#ifdef PERFCTR_X86_INTEL_NHLM
81 case PERFCTR_X86_INTEL_NHLM:
83#ifdef PERFCTR_X86_INTEL_WSTMR
84 case PERFCTR_X86_INTEL_WSTMR:
87#ifdef PERFCTR_X86_AMD_K8
88 case PERFCTR_X86_AMD_K8:
90#ifdef PERFCTR_X86_AMD_K8C
91 case PERFCTR_X86_AMD_K8C:
93#ifdef PERFCTR_X86_AMD_FAM10
94 case PERFCTR_X86_AMD_FAM10:
96 case PERFCTR_X86_AMD_K7:
110 struct perfctr_info info;
113#if defined(PERFCTR26)
116 struct vperfctr *dev;
119#if defined(PERFCTR26)
127 fd = _vperfctr_open( 0 );
134 retval = perfctr_info( fd, &info );
148 if ( ( dev = vperfctr_open( ) ) == NULL ) {
154 SUBDBG(
"_perfctr_init_component vperfctr_open = %p\n", dev );
157 retval = vperfctr_info( dev, &info );
164 vperfctr_close( dev );
174 (
int ) info.cpu_type );
180 sprintf( abiv,
"0x%08X", info.abi_version );
186 if ( info.cpu_features & PERFCTR_FEATURE_RDPMC )
207 if ( info.cpu_features & PERFCTR_FEATURE_PCINT )
211 SUBDBG(
"Hardware/OS %s support counter generated interrupts\n",
250 struct vperfctr_control
tmp;
252#ifdef VPERFCTR_CONTROL_CLOEXEC
253 tmp.flags = VPERFCTR_CONTROL_CLOEXEC;
256 ctl->rvperfctr = rvperfctr_open( (
int ) tid );
257 if ( ctl->rvperfctr == NULL ) {
261 SUBDBG(
"_papi_hwd_ctl rvperfctr_open() = %p\n", ctl->rvperfctr );
264 memset( &
tmp, 0x0,
sizeof (
tmp ) );
265 tmp.cpu_control.tsc_on = 1;
268 if ( rvperfctr_control( ctl->rvperfctr, &
tmp ) < 0 ) {
279 rvperfctr_close( ctl->rvperfctr );
290 return ns + leftover_ns;
366#define OVERFLOW_MASK si->si_pmc_ovf_mask
367#define GEN_OVERFLOW 0
377 errno = vperfctr_iresume( our_context->perfctr );
388 struct vperfctr_control
tmp;
392 if ( ( ctx->perfctr = vperfctr_open( ) ) == NULL ) {
393#ifdef VPERFCTR_OPEN_CREAT_EXCL
398 if ( ( ctx->perfctr = vperfctr_open_mode( 0 ) ) == NULL ) {
408 SUBDBG(
"_papi_hwd_init vperfctr_open() = %p\n", ctx->perfctr );
411 memset( &
tmp, 0x0,
sizeof (
tmp ) );
412 tmp.cpu_control.tsc_on = 1;
414#ifdef VPERFCTR_CONTROL_CLOEXEC
415 tmp.flags = VPERFCTR_CONTROL_CLOEXEC;
416 SUBDBG(
"close on exec\t\t\t%u\n",
tmp.flags );
420 error = vperfctr_control( ctx->perfctr, &
tmp );
422 SUBDBG(
"starting virtualized TSC; vperfctr_control returns %d\n",
437 int retval = vperfctr_unlink( ctx->perfctr );
438 SUBDBG(
"_papi_hwd_shutdown vperfctr_unlink(%p) = %d\n", ctx->perfctr,
441 vperfctr_unlink( ctx->perfctr );
443 vperfctr_close( ctx->perfctr );
444 SUBDBG(
"_perfctr_shutdown vperfctr_close(%p)\n", ctx->perfctr );
#define GET_OVERFLOW_ADDRESS(ctx)
PAPI_os_info_t _papi_os_info
papi_os_vector_t _papi_os_vector
struct papi_vectors * _papi_hwd[]
#define PAPI_VENDOR_UNKNOWN
#define PAPI_DOM_SUPERVISOR
#define PAPI_VENDOR_INTEL
#define PAPI_DEF_ITIMER_NS
Return codes and api definitions.
#define SUBDBG(format, args...)
__sighandler_t signal(int __sig, __sighandler_t __handler) __attribute__((__nothrow__
void PAPIERROR(char *format,...)
int _papi_libpfm_init(papi_vector_t *my_vector, int cidx)
int setup_ppc64_presets(int cputype)
static int set_domain(hwd_control_state_t *cntrl, unsigned int domain)
papi_mdi_t _papi_hwi_system_info
papi_vector_t _perfctr_vector
static int xlate_cpu_type_to_vendor(unsigned perfctr_cpu_type)
static int attach(hwd_control_state_t *ctl, unsigned long tid)
int _perfctr_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
int _perfctr_init_thread(hwd_context_t *ctx)
static int detach(hwd_control_state_t *ctl)
#define PERFCTR_CPU_NRCTRS
void _perfctr_dispatch_timer(int signal, siginfo_t *si, void *context)
static int round_requested_ns(int ns)
int _perfctr_init_component(int cidx)
long long tb_scale_factor
int _perfctr_shutdown_thread(hwd_context_t *ctx)
int perfctr_ppc64_setup_native_table()
hwd_control_state_t * ctl_state
unsigned int fast_virtual_timer
unsigned int fast_counter_read
int available_granularities
char support_version[PAPI_MIN_STR_LEN]
char kernel_version[PAPI_MIN_STR_LEN]
char name[PAPI_MAX_STR_LEN]
unsigned int attach_must_ptrace
char disabled_reason[PAPI_HUGE_STR_LEN]
char version[PAPI_MIN_STR_LEN]
unsigned int fast_real_timer
unsigned int hardware_intr
char vendor_string[PAPI_MAX_STR_LEN]
char model_string[PAPI_MAX_STR_LEN]
hwd_ucontext_t * ucontext
int(* get_system_info)(papi_mdi_t *mdi)
int(* get_memory_info)(PAPI_hw_info_t *, int)
PAPI_component_info_t cmp_info
_papi_int_domain_t domain
_papi_int_multiplex_t multiplex
_papi_int_attach_t attach
_papi_int_itimer_t itimer