31 #include <sys/utsname.h> 33 #include <sys/ioctl.h> 45 #include "perfmon/pfmlib.h" 61 #define OBSOLETE_WORKAROUNDS 0 64 #define PERF_EVENTS_OPENED 0x01 65 #define PERF_EVENTS_RUNNING 0x02 80 #if defined(__powerpc__) 81 #define PAPI_REFRESH_VALUE 0 83 #define PAPI_REFRESH_VALUE 1 88 #if (OBSOLETE_WORKAROUNDS==1) 96 processor_supported(
int vendor,
int family) {
101 PAPIERROR(
"Pentium 4 not supported on kernels before 2.6.35");
178 #if (OBSOLETE_WORKAROUNDS==1) 185 #if defined(__mips__) 193 #if (OBSOLETE_WORKAROUNDS==1) 201 bug_sync_read(
void) {
230 PAPIERROR(
"cannot fcntl(F_SETOWN_EX) on %d: %s",
245 unsigned int format = 0;
249 format |= PERF_FORMAT_TOTAL_TIME_ENABLED;
250 format |= PERF_FORMAT_TOTAL_TIME_RUNNING;
257 format |= PERF_FORMAT_GROUP;
261 SUBDBG(
"multiplex: %d, inherit: %d, group_leader: %d, format: %#x\n",
280 memset(&attr, 0 ,
sizeof(attr));
281 attr.
config = PERF_COUNT_HW_INSTRUCTIONS;
285 PAPIERROR(
"Couldn't open hw_instructions in exclude_guest=0 test");
291 memset(&attr, 0 ,
sizeof(attr));
292 attr.
config = PERF_COUNT_HW_INSTRUCTIONS;
293 attr.exclude_guest=1;
301 PAPIERROR(
"Couldn't open hw_instructions in exclude_guest=1 test");
320 pid_t
pid,
int cpu,
int group_fd,
unsigned long int flags) {
332 SUBDBG(
"sys_perf_event_open(hw_event: %p, pid: %d, cpu: %d, " 333 "group_fd: %d, flags: %lx\n",
334 hw_event,
pid, cpu, group_fd, flags);
336 SUBDBG(
" size: %d\n",hw_event->size);
337 SUBDBG(
" config: %"PRIx64
" (%"PRIu64
")\n",
339 SUBDBG(
" sample_period: %"PRIu64
"\n",hw_event->sample_period);
340 SUBDBG(
" sample_type: %"PRIu64
"\n",hw_event->sample_type);
341 SUBDBG(
" read_format: %"PRIu64
"\n",hw_event->read_format);
342 SUBDBG(
" disabled: %d\n",hw_event->disabled);
343 SUBDBG(
" inherit: %d\n",hw_event->inherit);
344 SUBDBG(
" pinned: %d\n",hw_event->pinned);
345 SUBDBG(
" exclusive: %d\n",hw_event->exclusive);
346 SUBDBG(
" exclude_user: %d\n",hw_event->exclude_user);
347 SUBDBG(
" exclude_kernel: %d\n",hw_event->exclude_kernel);
348 SUBDBG(
" exclude_hv: %d\n",hw_event->exclude_hv);
349 SUBDBG(
" exclude_idle: %d\n",hw_event->exclude_idle);
350 SUBDBG(
" mmap: %d\n",hw_event->mmap);
351 SUBDBG(
" comm: %d\n",hw_event->comm);
352 SUBDBG(
" freq: %d\n",hw_event->freq);
353 SUBDBG(
" inherit_stat: %d\n",hw_event->inherit_stat);
354 SUBDBG(
" enable_on_exec: %d\n",hw_event->enable_on_exec);
355 SUBDBG(
" task: %d\n",hw_event->task);
356 SUBDBG(
" watermark: %d\n",hw_event->watermark);
357 SUBDBG(
" precise_ip: %d\n",hw_event->precise_ip);
358 SUBDBG(
" mmap_data: %d\n",hw_event->mmap_data);
359 SUBDBG(
" sample_id_all: %d\n",hw_event->sample_id_all);
360 SUBDBG(
" exclude_host: %d\n",hw_event->exclude_host);
361 SUBDBG(
" exclude_guest: %d\n",hw_event->exclude_guest);
362 SUBDBG(
" exclude_callchain_kernel: %d\n",
363 hw_event->exclude_callchain_kernel);
364 SUBDBG(
" exclude_callchain_user: %d\n",
365 hw_event->exclude_callchain_user);
366 SUBDBG(
" wakeup_events: %"PRIx32
" (%"PRIu32
")\n",
367 hw_event->wakeup_events, hw_event->wakeup_events);
368 SUBDBG(
" bp_type: %"PRIx32
" (%"PRIu32
")\n",
369 hw_event->bp_type, hw_event->bp_type);
370 SUBDBG(
" config1: %"PRIx64
" (%"PRIu64
")\n",
371 hw_event->config1, hw_event->config1);
372 SUBDBG(
" config2: %"PRIx64
" (%"PRIu64
")\n",
373 hw_event->config2, hw_event->config2);
374 SUBDBG(
" branch_sample_type: %"PRIx64
" (%"PRIu64
")\n",
375 hw_event->branch_sample_type, hw_event->branch_sample_type);
376 SUBDBG(
" sample_regs_user: %"PRIx64
" (%"PRIu64
")\n",
377 hw_event->sample_regs_user, hw_event->sample_regs_user);
378 SUBDBG(
" sample_stack_user: %"PRIx32
" (%"PRIu32
")\n",
379 hw_event->sample_stack_user, hw_event->sample_stack_user);
389 switch(perf_event_error) {
434 unsigned int cpu_num,
436 unsigned int granularity,
446 memset(&attr,
'\0',
sizeof(attr));
452 attr.
config = PERF_COUNT_HW_INSTRUCTIONS;
459 attr.exclude_user = 1;
462 attr.exclude_kernel = 1;
471 SUBDBG(
"Calling sys_perf_event_open() from check_permissions\n");
477 SUBDBG(
"sys_perf_event_open returned error. Linux says, %s",
494 #define READ_BUFFER_SIZE (3 + (2 * PERF_EVENT_MAX_MPX_COUNTERS)) 509 int i,group_leader_fd;
517 if (group_leader_fd==-1) group_leader_fd=ctl->
events[idx].
event_fd;
520 retval = ioctl( group_leader_fd, PERF_EVENT_IOC_ENABLE, NULL );
522 PAPIERROR(
"ioctl(PERF_EVENT_IOC_ENABLE) failed");
527 retval = ioctl(group_leader_fd, PERF_EVENT_IOC_DISABLE, NULL );
529 PAPIERROR(
"ioctl(PERF_EVENT_IOC_DISABLE) failed" );
534 cnt =
read( group_leader_fd, papi_pe_buffer,
sizeof(papi_pe_buffer));
536 SUBDBG(
"read returned an error! Should never happen.\n" );
562 for(
i = 0;
i < idx;
i++) {
565 PAPIERROR(
"ioctl(PERF_EVENT_IOC_RESET) #%d/%d %d " 586 ret = fcntl(
fd, F_SETFL, O_ASYNC | O_NONBLOCK );
588 PAPIERROR (
"fcntl(%d, F_SETFL, O_ASYNC | O_NONBLOCK) " 589 "returned error: %s",
fd, strerror(
errno ) );
601 ret=fcntl(
fd, F_SETFD, FD_CLOEXEC);
615 PAPIERROR(
"cannot fcntl(F_SETSIG,%d) on %d: %s",
632 buf_addr = mmap( NULL,
634 PROT_READ | PROT_WRITE,
649 SUBDBG(
"mmap(NULL,%d,%d,%d,%d,0): %s",
651 PROT_READ | PROT_WRITE,
660 PAPIERROR(
"Can't mmap, disabling fast_counter_read\n");
666 SUBDBG(
"Sample buffer for fd %d is located at %p\n",
fd, buf_addr );
669 ctl->
events[evt_idx].
mmap_buf = (
struct perf_counter_mmap_page *) buf_addr;
723 SUBDBG(
"Disabling exclude_guest in event %d\n",
i);
764 SUBDBG(
"sys_perf_event_open returned error " 765 "on event #%d. Error: %s\n",
769 goto open_pe_cleanup;
772 SUBDBG (
"sys_perf_event_open: tid: %ld, cpu_num: %d," 773 " group_leader/fd: %d, event_fd: %d," 774 " read_format: %"PRIu64
"\n",
795 goto open_pe_cleanup;
855 goto open_pe_cleanup;
884 int munmap_error=0,close_error=0;
888 PAPIERROR(
"munmap and num pages is zero");
892 PAPIERROR(
"munmap of fd = %d returned error: %s",
895 event->mmap_buf=NULL;
900 PAPIERROR(
"close of fd = %d returned error: %s",
905 event->event_opened=0;
907 if ((close_error || munmap_error)) {
920 int events_not_opened=0;
924 SUBDBG(
"Closing without stopping first\n");
933 if (result!=0)
return result;
947 if (result!=0)
return result;
954 if (ctl->
num_events!=(num_closed+events_not_opened)) {
956 "Closed %d Not Opened: %d Expected %d",
957 num_closed,events_not_opened,ctl->
num_events);
990 SUBDBG(
"old control domain %d, new domain %d\n", pe_ctl->
domain,domain);
1045 PERF_EVENT_IOC_RESET, NULL );
1047 PAPIERROR(
"ioctl(%d, PERF_EVENT_IOC_RESET, NULL) " 1048 "returned error, Linux says: %s",
1050 strerror(
errno ) );
1097 long long **
events,
int flags )
1101 SUBDBG(
"ENTER: ctx: %p, ctl: %p, events: %p, flags: %#x\n",
1102 ctx, ctl,
events, flags);
1106 ( void ) papi_pe_buffer;
1109 unsigned long long count, enabled = 0, running = 0, adjusted;
1118 if (
count==0xffffffffffffffffULL) {
1123 if (enabled == running) {
1126 else if (enabled && running) {
1127 adjusted = (enabled * 128LL) / running;
1128 adjusted = adjusted *
count;
1129 adjusted = adjusted / 128LL;
1133 SUBDBG(
"perf_event kernel bug(?) count, enabled, " 1134 "running: %lld, %lld, %lld\n",
1135 papi_pe_buffer[0],enabled,running);
1157 long long tot_time_running, tot_time_enabled, scale;
1166 sizeof ( papi_pe_buffer ) );
1174 if (
ret<(
signed)(3*
sizeof(
long long))) {
1179 SUBDBG(
"read: fd: %2d, tid: %ld, cpu: %d, ret: %d\n",
1182 SUBDBG(
"read: %lld %lld %lld\n",
1187 tot_time_enabled = papi_pe_buffer[1];
1188 tot_time_running = papi_pe_buffer[2];
1190 SUBDBG(
"count[%d] = (papi_pe_buffer[%d] %lld * " 1191 "tot_time_enabled %lld) / " 1192 "tot_time_running %lld\n",
1193 i, 0,papi_pe_buffer[0],
1194 tot_time_enabled,tot_time_running);
1196 if (tot_time_running == tot_time_enabled) {
1198 pe_ctl->
counts[
i] = papi_pe_buffer[0];
1199 }
else if (tot_time_running && tot_time_enabled) {
1203 scale = (tot_time_enabled * 100LL) / tot_time_running;
1204 scale = scale * papi_pe_buffer[0];
1205 scale = scale / 100LL;
1209 SUBDBG(
"perf_event kernel bug(?) count, enabled, " 1210 "running: %lld, %lld, %lld\n",
1211 papi_pe_buffer[0],tot_time_enabled,
1214 pe_ctl->
counts[
i] = papi_pe_buffer[0];
1234 sizeof ( papi_pe_buffer ) );
1242 if (
ret!=
sizeof(
long long)) {
1244 PAPIERROR(
"read: fd: %2d, tid: %ld, cpu: %d, ret: %d",
1250 SUBDBG(
"read: fd: %2d, tid: %ld, cpu: %d, ret: %d\n",
1253 SUBDBG(
"read: %lld\n",papi_pe_buffer[0]);
1255 pe_ctl->
counts[
i] = papi_pe_buffer[0];
1264 long long **
events,
int flags )
1266 SUBDBG(
"ENTER: ctx: %p, ctl: %p, events: %p, flags: %#x\n",
1267 ctx, ctl,
events, flags);
1305 PAPIERROR(
"Was expecting group leader");
1310 sizeof ( papi_pe_buffer ) );
1320 if (
ret<(
signed)((1+pe_ctl->
num_events)*
sizeof(
long long))) {
1325 SUBDBG(
"read: fd: %2d, tid: %ld, cpu: %d, ret: %d\n",
1329 for(j=0;j<
ret/8;j++) {
1330 SUBDBG(
"read %d: %lld\n",j,papi_pe_buffer[j]);
1335 PAPIERROR(
"Error! Wrong number of events");
1341 pe_ctl->
counts[
i] = papi_pe_buffer[1+
i];
1353 #if (OBSOLETE_WORKAROUNDS==1) 1361 long long **
events,
int flags )
1375 PERF_EVENT_IOC_DISABLE, NULL );
1377 PAPIERROR(
"ioctl(PERF_EVENT_IOC_DISABLE) " 1378 "returned an error: ", strerror(
errno ));
1395 PERF_EVENT_IOC_ENABLE, NULL );
1398 PAPIERROR(
"ioctl(PERF_EVENT_IOC_ENABLE) returned an error: ",
1417 int did_something = 0;
1431 SUBDBG(
"ioctl(enable): fd: %d\n",
1434 PERF_EVENT_IOC_ENABLE, NULL) ;
1438 PAPIERROR(
"ioctl(PERF_EVENT_IOC_ENABLE) failed");
1446 if (!did_something) {
1447 PAPIERROR(
"Did not enable any counters");
1461 SUBDBG(
"ENTER: ctx: %p, ctl: %p\n", ctx, ctl);
1472 PERF_EVENT_IOC_DISABLE, NULL);
1474 PAPIERROR(
"ioctl(%d, PERF_EVENT_IOC_DISABLE, NULL) " 1475 "returned error, Linux says: %s",
1505 SUBDBG(
"ENTER: ctl: %p, native: %p, count: %d, ctx: %p\n",
1510 int skipped_events=0;
1523 SUBDBG(
"EXIT: Called with count == 0\n" );
1533 SUBDBG(
"papi_event_code: %#x known by papi but not by the component\n",
native[
i].ni_papi_code);
1537 if (ntv_idx == -1) {
1548 SUBDBG(
"papi_event_code: %#x not found in native event tables\n",
native[
i].ni_papi_code);
1554 SUBDBG(
"ntv_evt: %p\n", ntv_evt);
1559 memcpy (&pe_ctl->
events[
i].
attr, &ntv_evt->
attr,
sizeof(perf_event_attr_t));
1566 if ((aName == NULL) || (strstr(aName,
":u=") == NULL)) {
1570 if ((aName == NULL) || (strstr(aName,
":k=") == NULL)) {
1605 SUBDBG(
"&native[%d]: %p, ni_papi_code: %#x, ni_event: %#x, ni_position: %d, ni_owners: %d\n",
1610 if (
count <= skipped_events) {
1611 SUBDBG(
"EXIT: No events to count, they all contained invalid umasks\n");
1620 SUBDBG(
"EXIT: open_pe_events returned: %d\n",
ret);
1625 SUBDBG(
"EXIT: PAPI_OK\n" );
1848 char *ntv_name,
int len)
1857 char *ntv_descr,
int len)
1879 unsigned int *native_index,
int *profile_index )
1881 int pos, esi_index,
count;
1887 if ( pos == evt_idx ) {
1888 *profile_index =
count;
1892 SUBDBG(
"Native event %d is at profile index %d, flags %d\n",
1893 *native_index, *profile_index, *flags );
1897 PAPIERROR(
"wrong count: %d vs. ESI->profile.event_counter %d",
1907 int ret, flags, profile_index;
1908 unsigned native_index;
1912 &flags, &native_index, &profile_index );
1917 ctl= (*thr)->running_eventset[
cidx]->ctl_state;
1934 int found_evt_idx = -1,
fd = info->si_fd;
1942 PAPIERROR(
"thread == NULL in _papi_pe_dispatch_timer for fd %d!",
fd );
1946 if (
thread->running_eventset[
cidx] == NULL ) {
1947 PAPIERROR(
"thread->running_eventset == NULL in " 1948 "_papi_pe_dispatch_timer for fd %d!",
fd );
1952 if (
thread->running_eventset[
cidx]->overflow.flags == 0 ) {
1953 PAPIERROR(
"thread->running_eventset->overflow.flags == 0 in " 1954 "_papi_pe_dispatch_timer for fd %d!",
fd );
1958 hw_context.
si = info;
1961 if (
thread->running_eventset[
cidx]->overflow.flags &
1970 if (
thread->running_eventset[
cidx]->overflow.flags !=
1972 PAPIERROR(
"thread->running_eventset->overflow.flags " 1973 "is set to something other than " 1974 "PAPI_OVERFLOW_HARDWARE or " 1975 "PAPI_OVERFLOW_FORCE_SW for fd %d (%#x)",
1977 thread->running_eventset[
cidx]->overflow.flags);
1981 ctl=
thread->running_eventset[
cidx]->ctl_state;
1991 if ( found_evt_idx == -1 ) {
1992 PAPIERROR(
"Unable to find fd %d among the open event fds " 1993 "_papi_hwi_dispatch_timer!",
fd );
1997 if (ioctl(
fd, PERF_EVENT_IOC_DISABLE, NULL ) == -1 ) {
1998 PAPIERROR(
"ioctl(PERF_EVENT_IOC_DISABLE) failed");
2002 !(
thread->running_eventset[
cidx]->profile.flags &
2010 unsigned char *data = ((
unsigned char*)pe->
mmap_buf) + getpagesize( );
2027 PAPIERROR(
"Attempting to access memory " 2028 "which may be inaccessable" );
2031 ip = *( uint64_t * ) ( data + ( ( head - 8 ) & pe->
mask ) );
2064 (
caddr_t ) (
unsigned long ) ip,
2065 NULL, ( 1 << found_evt_idx ), 0,
2072 PAPIERROR(
"overflow refresh failed", 0 );
2100 PAPIERROR(
"process_smpl_buf returned error %d",
ret );
2115 SUBDBG(
"ENTER: ESI: %p, EventIndex: %d, threshold: %d\n",
2120 int i, evt_idx, found_non_zero_sample_period = 0,
retval =
PAPI_OK;
2130 SUBDBG(
"Attempting to set overflow for index %d (%d) of EventSet %d\n",
2134 SUBDBG(
"EXIT: evt_idx: %d\n", evt_idx);
2141 ( ctl->
events[evt_idx].
attr.sample_period == 0 ) ) {
2142 SUBDBG(
"EXIT: PAPI_EINVAL, Tried to clear " 2143 "sample threshold when it was not set\n");
2160 ctl->
events[evt_idx].
attr.sample_type = PERF_SAMPLE_IP;
2168 found_non_zero_sample_period = 1;
2173 if ( found_non_zero_sample_period ) {
2182 SUBDBG(
"Call to _papi_hwi_start_signal " 2183 "returned: %d\n",
retval);
2194 SUBDBG(
"Call to _papi_hwi_stop_signal " 2195 "returned: %d\n",
retval);
2240 ctl->
events[evt_idx].
attr.sample_type &= ~PERF_SAMPLE_IP;
2298 int fd,rdpmc_exists=1;
2300 struct perf_event_mmap_page *our_mmap;
2303 #if defined(__i386__) || defined (__x86_64__) 2318 pe.
type=PERF_TYPE_HARDWARE;
2320 pe.
config=PERF_COUNT_HW_INSTRUCTIONS;
2321 pe.exclude_kernel=1;
2331 SUBDBG(
"FAILED perf_event_open trying to detect rdpmc support");
2336 addr=mmap(NULL,
page_size, PROT_READ, MAP_SHARED,
fd,0);
2338 SUBDBG(
"FAILED mmap trying to detect rdpmc support");
2344 our_mmap=(
struct perf_event_mmap_page *)addr;
2347 if (our_mmap->cap_usr_rdpmc!=0) {
2350 else if ((!our_mmap->cap_bit0_is_deprecated) && (our_mmap->cap_bit0)) {
2364 return rdpmc_exists;
2380 fff=fopen(
"/proc/sys/kernel/perf_event_paranoid",
"r");
2392 retval=fscanf(
fff,
"%d",¶noid_level);
2393 if (
retval!=1) fprintf(stderr,
"Error reading paranoid level\n");
2396 if (paranoid_level==3) {
2402 if ((paranoid_level==2) && (getuid()!=0)) {
2403 SUBDBG(
"/proc/sys/kernel/perf_event_paranoid prohibits kernel counts");
2411 #if (OBSOLETE_WORKAROUNDS==1) 2436 fprintf(stderr,
"warning, your processor is unsupported\n");
2442 if (bug_sync_read()) {
2443 component->
read = _pe_read_bug_sync;
2468 #if (OBSOLETE_WORKAROUNDS==1) 2497 #if (USE_PERFEVENT_RDPMC==1) 2524 "Error libpfm4 memory allocation",
2529 "Error libpfm4 no PMUs found",
2534 "Error libpfm4 no default PMU found",
2539 "Error libpfm4 too many default PMUs found",
2544 "Error loading preset events",
2549 "Unknown libpfm4 related error",
2562 SUBDBG(
"The Linux nmi_watchdog is using one of the performance " 2563 "counters, reducing the total number available.\n");
2580 .
name =
"perf_event",
2581 .short_name =
"perf",
2583 .description =
"Linux perf_event CPU counters",
2591 .kernel_profile = 1,
2594 .fast_virtual_timer = 0,
2596 .attach_must_ptrace = 1,
2601 .kernel_multiplex = 1,
2611 .reg_value =
sizeof ( int ),
2612 .reg_alloc =
sizeof (
int ),
ssize_t read(int fd, void *buf, size_t count)
static int _pe_init_component(int cidx)
long long counts[PERF_EVENT_MAX_MPX_COUNTERS]
char disabled_reason[PAPI_MAX_STR_LEN]
int _papi_hwi_get_ntv_idx(unsigned int papi_evt_code)
_papi_int_inherit_t inherit
static int process_smpl_buf(int evt_idx, ThreadInfo_t **thr, int cidx)
#define PERF_EVENT_MAX_MPX_COUNTERS
static int close_pe_events(pe_context_t *ctx, pe_control_t *ctl)
struct native_event_t * native_events
#define PAPI_DEF_ITIMER_NS
int _papi_libpfm4_init(papi_vector_t *my_vector)
static int _pe_write(hwd_context_t *ctx, hwd_control_state_t *ctl, long long *from)
#define PAPI_INSTR_ADDRESS
#define PAPI_PROFIL_DATA_EAR
static int _pe_set_domain(hwd_control_state_t *ctl, int domain)
_papi_int_addr_range_t address_range
static int _pe_shutdown_thread(hwd_context_t *ctx)
static unsigned long long mmap_read_self(void *addr, unsigned long long *en, unsigned long long *ru)
static int _pe_stop(hwd_context_t *ctx, hwd_control_state_t *ctl)
#define PAPI_DATA_ADDRESS
int(* read)(hwd_context_t *, hwd_control_state_t *, long long **, int)
#define PAPI_REFRESH_VALUE
static int bug_format_group(void)
static int _pe_ntv_code_to_descr(unsigned int EventCode, char *ntv_descr, int len)
static int set_irange(hwd_context_t *ctx, hwd_control_state_t *current_state, _papi_int_option_t *option)
static int _pe_read_multiplexed(pe_control_t *pe_ctl)
pe_event_info_t events[PERF_EVENT_MAX_MPX_COUNTERS]
int _pe_libpfm4_ntv_enum_events(unsigned int *PapiEventCode, int modifier, int cidx, struct native_event_table_t *event_table)
int _pe_libpfm4_ntv_name_to_code(const char *name, unsigned int *event_code, int cidx, struct native_event_table_t *event_table)
#define PERF_EVENTS_RUNNING
static int _pe_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info)
static int find_profile_index(EventSetInfo_t *ESI, int evt_idx, int *flags, unsigned int *native_index, int *profile_index)
static pid_t mygettid(void)
PAPI_component_info_t cmp_info
#define PAPI_MAX_SW_MPX_EVENTS
static int check_permissions(unsigned long tid, unsigned int cpu_num, unsigned int domain, unsigned int granularity, unsigned int multiplex, unsigned int inherit)
static int set_default_domain(EventSetInfo_t *zero, int domain)
static int _pe_update_control_state(hwd_control_state_t *ctl, NativeInfo_t *native, int count, hwd_context_t *ctx)
Return codes and api definitions.
int _pe_libpfm4_init(papi_vector_t *component, int cidx, struct native_event_table_t *event_table, int pmu_type)
char events[MAX_EVENTS][BUFSIZ]
_papi_int_attach_t attach
int _pe_libpfm4_ntv_code_to_name(unsigned int EventCode, char *ntv_name, int len, struct native_event_table_t *event_table)
papi_vector_t _perf_event_vector
static int _pe_set_profile(EventSetInfo_t *ESI, int EventIndex, int threshold)
EventSetOverflowInfo_t overflow
#define PAPI_OVERFLOW_HARDWARE
unsigned int fast_real_timer
static int _pe_start(hwd_context_t *ctx, hwd_control_state_t *ctl)
#define PAPI_DOM_SUPERVISOR
PAPI_os_info_t _papi_os_info
struct _ThreadInfo * master
static int _pe_rdpmc_read(hwd_context_t *ctx, hwd_control_state_t *ctl, long long **events, int flags)
static int pe_vendor_fixups(papi_vector_t *vector)
static int set_up_mmap(pe_control_t *ctl, int evt_idx)
static int check_scheduability(pe_context_t *ctx, pe_control_t *ctl, int idx)
unsigned int fast_counter_read
static int exclude_guest_unsupported
static int _pe_detect_rdpmc(void)
hwd_ucontext_t * ucontext
char model_string[PAPI_MAX_STR_LEN]
#define PERF_EVENTS_OPENED
#define SUBDBG(format, args...)
#define PAPI_PROFIL_INST_EAR
_papi_int_granularity_t granularity
static int configure_fd_for_sampling(pe_control_t *ctl, int evt_idx)
void PAPIERROR(char *format,...)
static int check_exclude_guest(void)
unsigned int kernel_multiplex
struct native_event_table_t * event_table
static int _pe_reset(hwd_context_t *ctx, hwd_control_state_t *ctl)
char name[PAPI_MAX_STR_LEN]
static void perf_event_dump_attr(struct perf_event_attr *hw_event, pid_t pid, int cpu, int group_fd, unsigned long int flags)
int _papi_libpfm4_shutdown(papi_vector_t *my_vector)
int cnt[ctr_pcp_ntv_code_to_info+1]
_papi_int_multiplex_t multiplex
static long sys_perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu, int group_fd, unsigned long flags)
static int close_event(pe_event_info_t *event)
NativeInfo_t * NativeInfoArray
EventInfo_t * EventInfoArray
papi_mdi_t _papi_hwi_system_info
static int _pe_stop_profiling(ThreadInfo_t *thread, EventSetInfo_t *ESI)
unsigned int overflow_signal
int _pe_libpfm4_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info, struct native_event_table_t *event_table)
#define PAPI_VENDOR_INTEL
int pos[PAPI_EVENTS_IN_DERIVED_EVENT]
#define PAPI_PROFIL_RANDOM
static int _pe_read(hwd_context_t *ctx, hwd_control_state_t *ctl, long long **events, int flags)
static void _pe_dispatch_timer(int n, hwd_siginfo_t *info, void *uc)
int _pe_libpfm4_ntv_code_to_descr(unsigned int EventCode, char *ntv_descr, int len, struct native_event_table_t *event_table)
#define LINUX_VERSION(a, b, c)
static void mmap_read(int cidx, ThreadInfo_t **thr, pe_event_info_t *pe, int profile_index)
static int map_perf_event_errors_to_papi(int perf_event_error)
int _pe_libpfm4_shutdown(papi_vector_t *my_vector, struct native_event_table_t *event_table)
static int _pe_shutdown_component(void)
#define PAPI_OVERFLOW_FORCE_SW
static int fcntl_setown_fd(int fd)
static int set_drange(hwd_context_t *ctx, hwd_control_state_t *current_state, _papi_int_option_t *option)
struct perf_event_attr attr
struct native_event_table_t perf_native_event_table
inline_static ThreadInfo_t * _papi_hwi_lookup_thread(int custom_tid)
#define PAPI_NATIVE_AND_MASK
#define PAPI_PROFIL_FORCE_SW
static int _pe_ntv_name_to_code(const char *name, unsigned int *event_code)
struct papi_vectors * _papi_hwd[]
int _linux_detect_nmi_watchdog()
_papi_int_domain_t domain
static int _pe_read_nogroup(pe_control_t *pe_ctl)
static int _pe_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
static unsigned int get_read_format(unsigned int multiplex, unsigned int inherit, int format_group)
static void mmap_write_tail(pe_event_info_t *pe, uint64_t tail)
EventSetProfileInfo_t profile
hwd_control_state_t * ctl_state
static int _pe_handle_paranoid(papi_vector_t *component)
static int _pe_init_thread(hwd_context_t *hwd_ctx)
#define GET_OVERFLOW_ADDRESS(ctx)
static int _pe_init_control_state(hwd_control_state_t *ctl)
static int _pe_ntv_enum_events(unsigned int *PapiEventCode, int modifier)
static int open_pe_events(pe_context_t *ctx, pe_control_t *ctl)
static int _pe_ntv_code_to_name(unsigned int EventCode, char *ntv_name, int len)
static int _pe_set_overflow(EventSetInfo_t *ESI, int EventIndex, int threshold)
static uint64_t mmap_read_head(pe_event_info_t *pe)