52#include <sys/processor.h>
58#include <sys/regset.h>
59#include <sys/utsname.h>
64#define hwd_control_state_t _niagara2_control_state_t
65#define hwd_context_t _niagara2_context_t
66#define hwd_register_t _niagara2_register_t
78#define __CHECK_ERR_DFLT(retval) \
79 if(retval != 0){ SUBDBG("RETVAL: %d\n", retval); return PAPI_ECMP;}
81#define __CHECK_ERR_NULL(retval) \
82 if(retval == NULL){ SUBDBG("RETVAL: NULL\n"); return PAPI_ECMP;}
84#define __CHECK_ERR_PAPI(retval) \
85 if(retval != PAPI_OK){ SUBDBG("RETVAL: %d\n", retval); return PAPI_ECMP;}
87#define __CHECK_ERR_INVA(retval) \
88 if(retval != 0){ SUBDBG("RETVAL: %d\n", retval); return PAPI_EINVAL;}
90#define __CHECK_ERR_NEGV(retval) \
91 if(retval < 0){ SUBDBG("RETVAL: %d\n", retval); return PAPI_ECMP;}
97static cpc_t *
cpc = NULL;
115typedef struct __sol_processor_information
121typedef struct __t2_pst_table
129#define SYNTHETIC_EVENTS_SUPPORTED 1
182#ifdef SYNTHETIC_EVENTS_SUPPORTED
185 {
"_syn_cycles_elapsed",
"DC_miss"}, 1,
NOT_DERIVED},
193#ifdef SYNTHETIC_EVENTS_SUPPORTED
202#ifdef SYNTHETIC_EVENTS_SUPPORTED
203typedef struct __int_synthetic_table
210#ifdef SYNTHETIC_EVENTS_SUPPORTED
236 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
244 SUBDBG(
" -> %s: Setting flags for PIC#%d, old value: %p\n",
245 __func__,
i, ctrl->flags[
i] );
251 SUBDBG(
" -> %s: +++ cleaned value: %p\n",
252 __func__, ctrl->flags[
i] );
258 SUBDBG(
" -> %s: +++ new value: %p\n",
259 __func__, ctrl->flags[
i] );
267 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
278 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
280 SUBDBG(
" -> %s: Option #%d requested\n", __func__, code );
319 SUBDBG(
" -> %s: PAPI_DEF_MPX_NS, option->itimer.ns=%d\n",
334 SUBDBG(
" -> %s: PAPI_DEF_ITIMER, ITIMER_REAL needs SIGALRM\n",
345 SUBDBG(
" -> %s: PAPI_DEF_ITIMER, ITIMER_VIRTUAL needs SIGVTALRM\n",
356 SUBDBG(
" -> %s: PAPI_DEF_ITIMER, ITIMER_PROF needs SIGPROF\n",
373 SUBDBG(
" -> %s: PAPI_DEF_ITIMER, option->itimer.ns=%d\n",
387 SUBDBG(
" -> %s: PAPI_DEF_ITIMER_NS, option->itimer.ns=%d\n",
395 SUBDBG(
" -> %s: Option not found\n", __func__ );
396 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
409 int overflow_vector = 0;
418 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
420 SUBDBG(
" -> %s: Overflow handler called by signal #%d\n", __func__,
433 SUBDBG(
" -> %s: Problems with ESI, not necessarily serious\n",
437 SUBDBG(
" -> %s: +++ ESI is NULL\n", __func__ );
441 SUBDBG(
" -> %s: +++ Thread mismatch, ESI->master=%#x thread=%#x\n",
446 SUBDBG(
" -> %s: +++ Counter state invalid\n", __func__ );
451 (
" -> %s: +++ Overflow flag missing, ESI->overflow.flags=%#x\n",
459 printf(
" -> %s: Preconditions valid, trying to read counters\n",
471 printf(
"%s: Failed to read counters\n", __func__ );
479 SUBDBG(
" -> %s: Counters read\n", __func__ );
486 for (
i = 0;
i < ctrl->count;
i++ ) {
487 if ( results[
i] >= 0 ) {
489 SUBDBG(
" -> %s: Overflow detected at PIC #%d\n", __func__,
i );
493 overflow_vector = overflow_vector | ( 1 <<
i );
499 ctrl->preset[
i] = UINT64_MAX - ctrl->threshold[
i];
500 ctrl->hangover[
i] += ctrl->threshold[
i];
504 cpc_request_preset(
cpc, ctrl->idx[
i], ctrl->result[
i] );
508 SUBDBG(
" -> %s: No overflow detected at PIC #%d, value=%ld\n",
509 __func__,
i, results[
i] );
515 ctrl->preset[
i] += results[
i];
516 ctrl->hangover[
i] = results[
i];
522 SUBDBG(
" -> %s: Restarting set to push values back\n", __func__ );
526 cpc_set_restart(
cpc, ctrl->set );
530 SUBDBG(
" -> %s: Passing overflow to PAPI with overflow_vector=%p\n",
531 __func__, overflow_vector );
544 ( info ), &hw, overflow_vector,
551 ( info ), &hw, overflow_vector,
557 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
568 SUBDBG(
"ENTERING/LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
587 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
594 if ( ctrl->counter_buffer != NULL ) {
596 SUBDBG(
" -> %s: Cleaning buffer\n", __func__ );
599 cpc_buf_destroy(
cpc, ctrl->counter_buffer );
600 ctrl->counter_buffer = NULL;
604 if ( ctrl->set != NULL ) {
606 SUBDBG(
" -> %s: Cleaning set\n", __func__ );
609 cpc_set_destroy(
cpc, ctrl->set );
616 SUBDBG(
" -> %s: Cleaning counter state #%d\n", __func__,
i );
630 ctrl->threshold[
i] = 0;
631 ctrl->hangover[
i] = 0;
633#ifdef SYNTHETIC_EVENTS_SUPPORTED
634 ctrl->syn_hangover[
i] = 0;
641#ifdef SYNTHETIC_EVENTS_SUPPORTED
646 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
657 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
663 SUBDBG(
" -> %s: Trying to initalize libcpc\n", __func__ );
665 cpc = cpc_open( CPC_VER_CURRENT );
669 SUBDBG(
" -> %s: Registering libcpc error handler\n", __func__ );
674 SUBDBG(
" -> %s: Detecting supported PICs", __func__ );
679 SUBDBG(
" -> %s: Storing component index, cidx=%d\n", __func__,
cidx );
684 SUBDBG(
" -> %s: Gathering system information for PAPI\n", __func__ );
690 SUBDBG(
" -> %s: Initializing locks\n", __func__ );
696 SUBDBG(
"Found %d %s %s CPUs at %d Mhz.\n",
704 SUBDBG(
" -> %s: Building native event table\n", __func__ );
710 SUBDBG(
" -> %s: Building PAPI preset table\n", __func__ );
716 SUBDBG(
" -> %s: Registering presets in PAPI\n", __func__ );
721 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
733 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
741 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
752 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
756 if ( event_code >= 0 &&
761 bits->event_code = event_code;
764 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
775 SUBDBG(
"ENTERING/LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
789 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
793 if ( event_code >= 0 &&
799 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
807 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
814 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
829 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
837 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
847 if ( event_code >= 1 &&
849 *EventCode = *EventCode + 1;
852 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
859 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
874 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
876 SUBDBG(
" -> %s: called with flags=%p\n", __func__, flags );
883 for (
i = 0;
i < ctrl->count;
i++ ) {
886 &ctrl->result[
i] ) );
892 if ( ctrl->threshold[
i] > 0 ) {
894 SUBDBG(
" -> %s: Normalizing result on PIC#%d to %lld\n",
895 __func__,
i, ctrl->result[
i] );
899 ctrl->result[
i] = ctrl->result[
i] -
900 ( UINT64_MAX - ctrl->threshold[
i] ) - 1;
905 ctrl->result[
i] = ctrl->hangover[
i];
908 SUBDBG(
" -> %s: Overflow scaling on PIC#%d:\n", __func__,
i );
909 SUBDBG(
" -> %s: +++ ctrl->result[%d]=%llu\n",
910 __func__,
i, ctrl->result[
i] );
911 SUBDBG(
" -> %s: +++ ctrl->threshold[%d]=%lld\n",
912 __func__,
i, ctrl->threshold[
i] );
913 SUBDBG(
" -> %s: +++ ctrl->hangover[%d]=%lld\n",
914 __func__,
i, ctrl->hangover[
i] );
918 SUBDBG(
" -> %s: +++ ctrl->result[%d]=%llu\n",
919 __func__,
i, ctrl->result[
i] );
923#ifdef SYNTHETIC_EVENTS_SUPPORTED
929 for (
i = 0;
i < ctrl->count;
i++ ) {
930 if ( ctrl->code[
i].event_code >= syn_barrier ) {
933 - syn_barrier, ctrl, &
i );
943 SUBDBG(
"LEAVING: %s\n",
"_papi_read" );
953 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
960 cpc_set_restart(
cpc, ctrl->set );
962#ifdef SYNTHETIC_EVENTS_SUPPORTED
968 if ( ctrl->syn_count > 0 ) {
970 if ( ctrl->code[
i].event_code >= syn_barrier ) {
972 ctrl->syn_hangover[
i] +=
974 syn_barrier, ctrl, &
i );
982 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
995 SUBDBG(
"ENTERING/LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1009 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1011 SUBDBG(
" -> %s: Overflow handling for %#x on PIC#%d requested\n",
1012 __func__, ctrl, EventIndex );
1013 SUBDBG(
" -> %s: ESI->overflow.flags=%#x\n\n", __func__, ctrl,
1021 SUBDBG(
" -> %s: Activating overflow handling\n", __func__ );
1024 ctrl->preset[EventIndex] = UINT64_MAX -
threshold;
1025 ctrl->threshold[EventIndex] =
threshold;
1030 if ( !( ctrl->flags[EventIndex] & CPC_OVF_NOTIFY_EMT ) ) {
1032 SUBDBG(
" -> %s: Need to activate SIGEMT on PIC %d\n",
1033 __func__, EventIndex );
1039 SUBDBG(
" -> %s: Activating SIGEMT failed for PIC %d\n",
1040 __func__, EventIndex );
1047 SUBDBG(
" -> %s: SIGEMT activated, will install signal handler\n",
1056 SUBDBG(
" -> %s: Disabling overflow handling\n", __func__ );
1061 ctrl->flags[EventIndex] &= ~( CPC_OVF_NOTIFY_EMT );
1062 ctrl->threshold[EventIndex] = 0;
1063 ctrl->hangover[EventIndex] = 0;
1066 SUBDBG(
" -> %s:ctrl->preset[%d]=%d, ctrl->flags[%d]=%p\n",
1067 __func__, EventIndex, ctrl->preset[EventIndex],
1068 EventIndex, ctrl->flags[EventIndex] );
1079 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1090 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1094 cpc_buf_destroy(
cpc, ctx->counter_buffer );
1095 cpc_set_destroy(
cpc, ctx->set );
1098 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1109 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1128 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1141 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1143 SUBDBG(
" -> %s: Starting EventSet %p\n", __func__, ctrl );
1147#ifdef SYNTHETIC_EVENTS_SUPPORTED
1150 SUBDBG(
" -> %s: Event count: ctrl->count=%d, ctrl->syn_count=%d\n",
1151 __func__, ctrl->count, ctrl->syn_count );
1154 if ( ctrl->count > 0 && ctrl->count == ctrl->syn_count ) {
1155 ctrl->idx[0] = cpc_set_add_request(
cpc, ctrl->set,
"Instr_cnt",
1156 ctrl->preset[0], ctrl->flags[0],
1158 ctrl->counter_buffer = cpc_buf_create(
cpc, ctrl->set );
1168 SUBDBG(
" -> %s: Flags for PIC#%d: ctrl->flags[%d]=%d\n", __func__,
1169 i,
i, ctrl->flags[
i] );
1177 retval = cpc_set_sample(
cpc, ctrl->set, ctrl->counter_buffer );
1180 printf(
"%s: cpc_set_sample failed, return=%d, errno=%d\n",
1185 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1196 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1203 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1218 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1223 if ( ctrl->counter_buffer != NULL ) {
1227 if ( ctrl->set != NULL ) {
1237 ctrl->set = cpc_set_create(
cpc );
1240 ctrl->count =
count;
1241 ctrl->syn_count = 0;
1252 (
" -> %s: EventSet@%p/PIC#%d - ntv request >>%s<< (%d), flags=%#x\n",
1254 ctrl->code[
i].event_code, ctrl->flags[
i] );
1260#ifdef SYNTHETIC_EVENTS_SUPPORTED
1262 int syn_code = ctrl->code[
i].event_code -
1267 if ( syn_code >= 0 ) {
1270 (
" -> %s: Adding synthetic event %#x (%s) on position %d\n",
1279 ctrl->syn_hangover[
i] = 0;
1292 SUBDBG(
" -> %s: Adding native event %#x (%s) on position %d\n",
1298 ctrl->idx[
i] = cpc_set_add_request(
cpc, ctrl->set,
1301 ctrl->preset[
i], ctrl->flags[
i], 0,
1308 SUBDBG(
" -> %s: nothing added\n", __func__ );
1312 ctrl->counter_buffer = cpc_buf_create(
cpc, ctrl->set );
1321 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1331 char *
file =
"/proc/self/map";
1332 char *resolve_pattern =
"/proc/self/path/%s";
1334 char lastobject[PRMAPSZ];
1340 int fd,
count = 0,
total = 0, position = -1, first = 1;
1341 vptr_t t_min, t_max, d_min, d_max;
1346 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1356 memset( lastobject, 0, PRMAPSZ );
1359 SUBDBG(
" -> %s: Preprocessing memory maps from procfs\n", __func__ );
1364 while (
read( fd, &mapping,
sizeof ( prmap_t ) ) > 0 ) {
1366 SUBDBG(
" -> %s: Found a new memory map entry\n", __func__ );
1372 if ( mapping.pr_mflags & ( MA_READ | MA_WRITE | MA_EXEC ) &&
1373 !( mapping.pr_mflags & MA_ANON ) ) {
1376 if ( strcmp( lastobject, mapping.pr_mapname ) != 0 ) {
1377 strncpy( lastobject, mapping.pr_mapname, PRMAPSZ );
1381 SUBDBG(
" -> %s: Memory mapping entry valid for %s\n", __func__,
1382 mapping.pr_mapname );
1388 SUBDBG(
" -> %s: Preprocessing done, starting to analyze\n", __func__ );
1393 if (
lseek( fd, 0, SEEK_SET ) == -1 ) {
1397 memset( lastobject, 0, PRMAPSZ );
1404 while (
read( fd, &mapping,
sizeof ( prmap_t ) ) > 0 ) {
1406 if ( mapping.pr_mflags & MA_ANON ) {
1409 (
" -> %s: Anonymous mapping (MA_ANON) found for %s, skipping\n",
1410 __func__, mapping.pr_mapname );
1416 if ( strcmp( mapping.pr_mapname, lastobject ) != 0 ) {
1418 SUBDBG(
" -> %s: Analyzing mapping for %s\n", __func__,
1419 mapping.pr_mapname );
1421 cur = &( pam[++position] );
1422 strncpy( lastobject, mapping.pr_mapname, PRMAPSZ );
1428 SUBDBG(
" -> %s: Resolved name for %s: %s\n", __func__,
1429 mapping.pr_mapname, cur->
name );
1433 if ( mapping.pr_mflags & MA_READ ) {
1435 if ( mapping.pr_mflags & MA_WRITE ) {
1438 (
vptr_t ) ( mapping.pr_vaddr + mapping.pr_size );
1461 }
else if ( mapping.pr_mflags & MA_EXEC ) {
1464 (
vptr_t ) ( mapping.pr_vaddr + mapping.pr_size );
1508 SUBDBG(
" -> %s: Analysis of memory maps done, results:\n", __func__ );
1509 SUBDBG(
" -> %s: text_start=%#x, text_end=%#x, text_size=%lld\n", __func__,
1514 SUBDBG(
" -> %s: data_start=%#x, data_end=%#x, data_size=%lld\n", __func__,
1526 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1550 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1558 SUBDBG(
" -> %s: Checking PICs for functionality\n", __func__ );
1565 SUBDBG(
" -> %s: Found %d events on PIC#%d\n", __func__,
1575 SUBDBG(
" -> %s: PIC#0 has 0 events\n", __func__ );
1585 SUBDBG(
" -> %s: PIC#%d has %d events, should have %d\n",
1594#ifdef SYNTHETIC_EVENTS_SUPPORTED
1600#ifndef SYNTHETIC_EVENTS_SUPPORTED
1612 sizeof (
char * ) );
1617 cpc_walk_events_pic(
cpc, 0, (
void * ) &
tmp,
1620#ifdef SYNTHETIC_EVENTS_SUPPORTED
1631 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1658 int num_psts,
i, j, event_code, pst_events;
1662 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1668 while (
__t2_table[num_psts].papi_pst != 0 ) {
1673 SUBDBG(
" -> %s: Found %d presets\n", __func__, num_psts );
1681 for (
i = 0;
i < num_psts;
i++ ) {
1692 tmp.data.operation[0] =
'\0';
1696 tmp.data.operation[0] =
'+';
1699 tmp.data.operation[0] =
'-';
1707 tmp.data.native[j] = event_code;
1714 SUBDBG(
" -> %s: pst row %d - event_code=%d\n",
1715 __func__,
i,
tmp.event_code );
1716 SUBDBG(
" -> %s: pst row %d - data.derived=%d, data.operation=%c\n",
1717 __func__,
i,
tmp.data.derived,
tmp.data.operation[0] );
1718 SUBDBG(
" -> %s: pst row %d - native event codes:\n", __func__,
i );
1723 SUBDBG(
" -> %s: pst row %d - +++ data.native[%d]=%d\n",
1724 __func__,
i, d_i,
tmp.data.native[d_i] );
1740 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1750#ifdef SYNTHETIC_EVENTS_SUPPORTED
1758 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1764 if ( ctrl->counter_buffer != NULL ) {
1768 if ( ctrl->set != NULL ) {
1773 ctrl->set = cpc_set_create(
cpc );
1776 for (
i = 0;
i < ctrl->count;
i++ ) {
1778 SUBDBG(
" -> %s: Adding native event %#x (%s) on position %d\n",
1779 __func__, ctrl->code[
i].event_code,
1781 SUBDBG(
" -> %s: Event setup: ctrl->code[%d].event_code=%#x\n",
1782 __func__,
i, ctrl->code[
i].event_code );
1783 SUBDBG(
" -> %s: Event setup: ctrl->preset[%d]=%d\n",
1784 __func__,
i, ctrl->preset[
i] );
1785 SUBDBG(
" -> %s: Event setup: ctrl->flags[%d]=%#x\n",
1786 __func__,
i, ctrl->flags[
i] );
1789#ifdef SYNTHETIC_EVENTS_SUPPORTED
1791 if ( ctrl->code[
i].event_code >= syn_barrier ) {
1793 SUBDBG(
" -> %s: Skipping counter %d, synthetic event found\n",
1802 ctrl->idx[
i] = cpc_set_add_request(
cpc, ctrl->set,
1805 ctrl->preset[
i], ctrl->flags[
i], 0,
1810 ctrl->counter_buffer = cpc_buf_create(
cpc, ctrl->set );
1814 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1827 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1829 SUBDBG(
" -> %s: papi_domain=%d requested\n", __func__, papi_domain );
1834 SUBDBG(
" -> %s: Domain PAPI_DOM_USER/CPC_COUNT_USER selected\n",
1837 domain |= CPC_COUNT_USER;
1842 SUBDBG(
" -> %s: Domain PAPI_DOM_KERNEL/CPC_COUNT_SYSTEM selected\n",
1845 domain |= CPC_COUNT_SYSTEM;
1850 SUBDBG(
" -> %s: Domain PAPI_DOM_SUPERVISOR/CPC_COUNT_HV selected\n",
1853 domain |= CPC_COUNT_HV;
1856 SUBDBG(
" -> %s: domain=%d\n", __func__, domain );
1866 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1871 fprintf(
stderr,
"ERROR - libcpc error handler in %s() called!\n", fn );
1875 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1884 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1890 SUBDBG(
" -> %s: Position of the counter does not exist\n", __func__ );
1896 ctrl->flags[position] = ctrl->flags[position] | CPC_OVF_NOTIFY_EMT;
1899 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1910 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1918 (
" -> %s: Found one native event on PIC#%d (now totally %d events)\n",
1923 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1931 int *
tmp = (
int * ) arg;
1934 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1941 SUBDBG(
" -> %s: Native event >>%s<< registered\n",
1948 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1956 processor_info_t pinfo;
1959 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1964 if ( processor_info( getcpuid( ), &pinfo ) == 0 ) {
1967 SUBDBG(
" -> %s: Clock at %d MHz\n", __func__, pinfo.pi_clock );
1970 return pinfo.pi_clock;
1973 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
1992 return ns + leftover_ns;
1996static inline lwpstatus_t *
1999 char *pattern =
"/proc/%d/lwp/%d/lwpstatus";
2002 static lwpstatus_t lwp;
2005 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2009 memset( &lwp, 0,
sizeof ( lwp ) );
2012 fd =
open( filename, O_RDONLY );
2016 read( fd, (
void * ) &lwp,
sizeof ( lwp ) );
2021 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2028static inline psinfo_t *
2031 char *pattern =
"/proc/%d/psinfo";
2034 static psinfo_t proc;
2037 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2041 memset( &proc, 0,
sizeof ( proc ) );
2044 fd =
open( filename, O_RDONLY );
2048 read( fd, (
void * ) &proc,
sizeof ( proc ) );
2053 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2060static inline pstatus_t *
2063 char *pattern =
"/proc/%d/status";
2066 static pstatus_t proc;
2069 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2073 memset( &proc, 0,
sizeof ( proc ) );
2076 fd =
open( filename, O_RDONLY );
2080 read( fd, (
void * ) &proc,
sizeof ( proc ) );
2085 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2096#ifdef SYNTHETIC_EVENTS_SUPPORTED
2102 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2111 int *
i = (
int * ) arg;
2112 return cpc_buf_tick(
cpc,
2113 ctrl->counter_buffer ) - ctrl->syn_hangover[*
i];
2118 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2125 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2132 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2140#ifdef SYNTHETIC_EVENTS_SUPPORTED
2146 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2154 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2161 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2167 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2173#ifdef SYNTHETIC_EVENTS_SUPPORTED
2181 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2193 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2199#ifdef SYNTHETIC_EVENTS_SUPPORTED
2210 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2220 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
2230 .
name =
"solaris-niagara2",
2231 .description =
"Solaris Counters",
2239 .fast_real_timer = 1,
2240 .fast_virtual_timer = 1,
2242 .attach_must_ptrace = 1,
2244 .hardware_intr_sig = SIGEMT,
2270 .stop_profiling = NULL,
2272 .ntv_name_to_code = NULL,
PAPI_os_info_t _papi_os_info
int open(const char *pathname, int flags, mode_t mode)
off_t lseek(int fd, off_t offset, int whence)
ssize_t read(int fd, void *buf, size_t count)
char event_name[2][PAPI_MAX_STR_LEN]
#define PAPI_DOM_SUPERVISOR
#define PAPI_HUGE_STR_LEN
#define PAPI_DEF_ITIMER_NS
char events[MAX_EVENTS][BUFSIZ]
#define PAPI_NATIVE_AND_MASK
Return codes and api definitions.
#define SUBDBG(format, args...)
__sighandler_t signal(int __sig, __sighandler_t __handler) __attribute__((__nothrow__
int sigaction(int __sig, const struct sigaction *__restrict __act, struct sigaction *__restrict __oact) __attribute__((__nothrow__
#define PAPI_EVENTS_IN_DERIVED_EVENT
#define papi_calloc(a, b)
int _papi_hwi_setup_all_presets(hwi_search_t *findem, int cidx)
static int attach(hwd_control_state_t *ctl, unsigned long tid)
int _solaris_update_shlib_info(papi_mdi_t *mdi)
long long _solaris_get_real_usec(void)
int _solaris_get_system_info(papi_mdi_t *mdi)
long long _solaris_get_virt_usec(void)
long long _solaris_get_real_cycles(void)
int _solaris_get_dmem_info(PAPI_dmem_info_t *d)
int _niagara2_get_memory_info(PAPI_hw_info_t *hw, int id)
static pstatus_t * __sol_get_proc_status(const pid_t pid)
int _niagara2_init_component(int cidx)
int __int_setup_synthetic_event(int, hwd_control_state_t *, void *)
static void _niagara2_lock_init(void)
papi_mdi_t _papi_hwi_system_info
int _niagara2_set_overflow(EventSetInfo_t *ESI, int EventIndex, int threshold)
#define __CHECK_ERR_NEGV(retval)
static lwpstatus_t * __sol_get_lwp_status(const pid_t pid, const lwpid_t lwpid)
int _niagara2_init_control_state(hwd_control_state_t *ctrl)
static psinfo_t * __sol_get_proc_info(const pid_t pid)
#define __CHECK_ERR_PAPI(retval)
void _niagara2_dispatch_timer(int signal, siginfo_t *si, void *info)
void __cpc_error_handler(const char *fn, int subcode, const char *fmt, va_list ap)
int _niagara2_update_control_state(hwd_control_state_t *ctrl, NativeInfo_t *native, int count, hwd_context_t *ctx)
@ SYNTHETIC_CYCLES_ELAPSED
int _niagara2_ntv_enum_events(unsigned int *EventCode, int modifier)
static int __sol_get_itimer_ns(int ns)
int _niagara2_reset(hwd_context_t *ctx, hwd_control_state_t *ctrl)
int _niagara2_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
uint64_t __int_get_synthetic_event(int, hwd_control_state_t *, void *)
int _niagara2_start(hwd_context_t *ctx, hwd_control_state_t *ctrl)
static int __cpc_build_pst_table(void)
void __cpc_walk_events_pic_action_count(void *arg, uint_t picno, const char *event)
static int __cpc_build_ntv_table(void)
UTILITY FUNCTIONS FOR ACCESS TO LIBCPC AND SOLARIS /////////////////////////.
int _niagara2_shutdown(hwd_context_t *ctx)
static int __sol_get_processor_clock(void)
enum @188 __int_synthetic_enum
static char ** __t2_ntv_events
int _niagara2_ntv_code_to_name(unsigned int EventCode, char *ntv_name, int len)
void __int_walk_synthetic_events_action_count(void)
static int __cpc_recreate_set(hwd_control_state_t *ctrl)
int _niagara2_update_shlib_info(papi_mdi_t *mdi)
static void * _niagara2_get_overflow_address(void *context)
static int __cpc_enable_sigemt(hwd_control_state_t *ctrl, int position)
static __t2_pst_table_t __t2_table[]
int _niagara2_ntv_code_to_bits(unsigned int EventCode, hwd_register_t *bits)
void __cpc_walk_events_pic_action_store(void *arg, uint_t picno, const char *event)
papi_vector_t _niagara2_vector
int _niagara2_ntv_code_to_descr(unsigned int EventCode, char *ntv_descr, int len)
hwi_search_t * preset_table
int _niagara2_shutdown_global(void)
void __int_walk_synthetic_events_action_store(void)
int _niagara2_set_profile(EventSetInfo_t *ESI, int EventIndex, int threshold)
papi_os_vector_t _papi_os_vector
static int __cpc_domain_translator(const int papi_domain)
int _niagara2_read(hwd_context_t *ctx, hwd_control_state_t *ctrl, long_long **events, int flags)
int _niagara2_stop(hwd_context_t *ctx, hwd_control_state_t *ctrl)
static __t2_store_t __t2_store
static int __cpc_search_ntv_event(char *event_name, int *event_code)
static __int_syn_table_t __int_syn_table[]
int _niagara2_set_domain(hwd_control_state_t *ctrl, int domain)
PAPI HWD LAYER RELATED FUNCTIONS ///////////////////////////////////////////.
#define __CHECK_ERR_NULL(retval)
#define __CHECK_ERR_DFLT(retval)
#define NOT_A_PAPI_HWD_READ
#define DEFAULT_CNTR_PRESET
#define CPC_COUNTING_DOMAINS
struct _ThreadInfo * master
hwd_control_state_t * ctl_state
EventSetOverflowInfo_t overflow
get the executable's address space info
char name[PAPI_HUGE_STR_LEN]
char name[PAPI_MAX_STR_LEN]
char fullname[PAPI_HUGE_STR_LEN]
PAPI_address_map_t address_info
char vendor_string[PAPI_MAX_STR_LEN]
char model_string[PAPI_MAX_STR_LEN]
PAPI_shlib_info_t shlib_info
int(* get_memory_info)(PAPI_hw_info_t *, int)
PAPI_component_info_t cmp_info
inline_static ThreadInfo_t * _papi_hwi_lookup_thread(int custom_tid)
_papi_int_domain_t domain
_papi_int_granularity_t granularity
_papi_int_itimer_t itimer