14 #include <linux/unistd.h> 43 #define FOPEN_ERROR "fopen(%s) returned NULL" 45 #if defined(PERFCTR26) 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 );
146 if ( ( dev = vperfctr_open( ) ) == NULL ) {
151 SUBDBG(
"_perfctr_init_component vperfctr_open = %p\n", dev );
154 retval = vperfctr_info( dev, &info );
160 vperfctr_close( dev );
170 (
int ) info.cpu_type );
176 sprintf( abiv,
"0x%08X", info.abi_version );
182 if ( info.cpu_features & PERFCTR_FEATURE_RDPMC )
203 if ( info.cpu_features & PERFCTR_FEATURE_PCINT )
207 SUBDBG(
"Hardware/OS %s support counter generated interrupts\n",
244 struct vperfctr_control
tmp;
246 #ifdef VPERFCTR_CONTROL_CLOEXEC 247 tmp.flags = VPERFCTR_CONTROL_CLOEXEC;
250 ctl->rvperfctr = rvperfctr_open( (
int ) tid );
251 if ( ctl->rvperfctr == NULL ) {
255 SUBDBG(
"_papi_hwd_ctl rvperfctr_open() = %p\n", ctl->rvperfctr );
258 memset( &
tmp, 0x0,
sizeof (
tmp ) );
259 tmp.cpu_control.tsc_on = 1;
262 if ( rvperfctr_control( ctl->rvperfctr, &
tmp ) < 0 ) {
273 rvperfctr_close( ctl->rvperfctr );
284 return ns + leftover_ns;
360 #define OVERFLOW_MASK si->si_pmc_ovf_mask 361 #define GEN_OVERFLOW 0 371 errno = vperfctr_iresume( our_context->perfctr );
382 struct vperfctr_control
tmp;
386 if ( ( ctx->perfctr = vperfctr_open( ) ) == NULL ) {
387 #ifdef VPERFCTR_OPEN_CREAT_EXCL 392 if ( ( ctx->perfctr = vperfctr_open_mode( 0 ) ) == NULL ) {
402 SUBDBG(
"_papi_hwd_init vperfctr_open() = %p\n", ctx->perfctr );
405 memset( &
tmp, 0x0,
sizeof (
tmp ) );
406 tmp.cpu_control.tsc_on = 1;
408 #ifdef VPERFCTR_CONTROL_CLOEXEC 409 tmp.flags = VPERFCTR_CONTROL_CLOEXEC;
410 SUBDBG(
"close on exec\t\t\t%u\n",
tmp.flags );
414 error = vperfctr_control( ctx->perfctr, &
tmp );
416 SUBDBG(
"starting virtualized TSC; vperfctr_control returns %d\n",
431 int retval = vperfctr_unlink( ctx->perfctr );
432 SUBDBG(
"_papi_hwd_shutdown vperfctr_unlink(%p) = %d\n", ctx->perfctr,
435 vperfctr_unlink( ctx->perfctr );
437 vperfctr_close( ctx->perfctr );
438 SUBDBG(
"_perfctr_shutdown vperfctr_close(%p)\n", ctx->perfctr );
int _papi_libpfm_init(papi_vector_t *my_vector, int cidx)
int available_granularities
char disabled_reason[PAPI_MAX_STR_LEN]
static int round_requested_ns(int ns)
#define PERFCTR_CPU_NRCTRS
void _perfctr_dispatch_timer(int signal, siginfo_t *si, void *context)
int _perfctr_init_thread(hwd_context_t *ctx)
#define PAPI_DEF_ITIMER_NS
static int xlate_cpu_type_to_vendor(unsigned perfctr_cpu_type)
long long tb_scale_factor
int(* get_system_info)(papi_mdi_t *mdi)
int _perfctr_shutdown_thread(hwd_context_t *ctx)
PAPI_component_info_t cmp_info
Return codes and api definitions.
char support_version[PAPI_MIN_STR_LEN]
_papi_int_itimer_t itimer
_papi_int_attach_t attach
papi_os_vector_t _papi_os_vector
unsigned int fast_real_timer
unsigned int fast_virtual_timer
#define PAPI_DOM_SUPERVISOR
PAPI_os_info_t _papi_os_info
papi_vector_t _perfctr_vector
static int set_domain(hwd_control_state_t *cntrl, unsigned int domain)
char kernel_version[PAPI_MIN_STR_LEN]
unsigned int attach_must_ptrace
unsigned int fast_counter_read
hwd_ucontext_t * ucontext
char model_string[PAPI_MAX_STR_LEN]
#define SUBDBG(format, args...)
void PAPIERROR(char *format,...)
char name[PAPI_MAX_STR_LEN]
_papi_int_multiplex_t multiplex
unsigned int hardware_intr
papi_mdi_t _papi_hwi_system_info
char vendor_string[PAPI_MAX_STR_LEN]
#define PAPI_VENDOR_INTEL
int _perfctr_init_component(int cidx)
__sighandler_t signal(int __sig, __sighandler_t __handler) __attribute__((__nothrow__
int perfctr_ppc64_setup_native_table()
int(* get_memory_info)(PAPI_hw_info_t *, int)
_papi_int_domain_t domain
int setup_ppc64_presets(int cputype)
static int attach(hwd_control_state_t *ctl, unsigned long tid)
char version[PAPI_MIN_STR_LEN]
hwd_control_state_t * ctl_state
#define GET_OVERFLOW_ADDRESS(ctx)
static int detach(hwd_control_state_t *ctl)
int _perfctr_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
#define PAPI_VENDOR_UNKNOWN