36 #include "perfmon/pfmlib_itanium2.h" 37 #include "perfmon/pfmlib_montecito.h" 60 SUBDBG(
"SMPL_ARG.buf_size = %llu\n",
61 (
unsigned long long ) arg->buf_size );
62 SUBDBG(
"SMPL_ARG.buf_flags = %d\n", arg->buf_flags );
70 for (
i = 0;
i < num_sets;
i++ ) {
72 SUBDBG(
"SET[%d].set_id = %d\n",
i, set[
i].set_id );
74 SUBDBG(
"SET[%d].set_flags = %d\n",
i, set[
i].set_flags );
75 SUBDBG(
"SET[%d].set_timeout = %llu\n",
i,
76 (
unsigned long long ) set[
i].set_timeout );
86 for (
i = 0;
i < num_sets;
i++ ) {
88 SUBDBG(
"SETINFO[%d].set_id = %d\n",
i, setinfo[
i].set_id );
90 SUBDBG(
"SETINFO[%d].set_flags = %d\n",
i, setinfo[
i].set_flags );
91 SUBDBG(
"SETINFO[%d].set_ovfl_pmds[0] = %#016llx\n",
i,
92 (
unsigned long long ) setinfo[
i].set_ovfl_pmds[0] );
93 SUBDBG(
"SETINFO[%d].set_runs = %llu\n",
i,
94 (
unsigned long long ) setinfo[
i].set_runs );
95 SUBDBG(
"SETINFO[%d].set_timeout = %llu\n",
i,
96 (
unsigned long long ) setinfo[
i].set_timeout );
97 SUBDBG(
"SETINFO[%d].set_act_duration = %llu\n",
i,
98 (
unsigned long long ) setinfo[
i].set_act_duration );
100 SUBDBG(
"SETINFO[%d].set_avail_pmcs[0] = %#016llx\n",
i,
101 (
unsigned long long ) setinfo[
i].set_avail_pmcs[0] );
102 SUBDBG(
"SETINFO[%d].set_avail_pmds[0] = %#016llx\n",
i,
103 (
unsigned long long ) setinfo[
i].set_avail_pmds[0] );
111 pfarg_pmc_t *pc = ctl->
pc;
113 for (
i = 0;
i < ctl->
out.pfp_pmc_count;
i++ ) {
115 SUBDBG(
"PC[%d].reg_num = %d\n",
i, pc[
i].reg_num );
116 SUBDBG(
"PC[%d].reg_set = %d\n",
i, pc[
i].reg_set );
117 SUBDBG(
"PC[%d].reg_flags = %#08x\n",
i, pc[
i].reg_flags );
118 SUBDBG(
"PC[%d].reg_value = %#016llx\n",
i,
119 (
unsigned long long ) pc[
i].reg_value );
127 pfarg_pmd_t *pd = ctl->
pd;
129 for (
i = 0;
i < ctl->
in.pfp_event_count;
i++ ) {
131 SUBDBG(
"PD[%d].reg_num = %d\n",
i, pd[
i].reg_num );
132 SUBDBG(
"PD[%d].reg_set = %d\n",
i, pd[
i].reg_set );
133 SUBDBG(
"PD[%d].reg_flags = %#08x\n",
i, pd[
i].reg_flags );
134 SUBDBG(
"PD[%d].reg_value = %#016llx\n",
i,
135 (
unsigned long long ) pd[
i].reg_value );
136 SUBDBG(
"PD[%d].reg_long_reset = %llu\n",
i,
137 (
unsigned long long ) pd[
i].reg_long_reset );
138 SUBDBG(
"PD[%d].reg_short_reset = %llu\n",
i,
139 (
unsigned long long ) pd[
i].reg_short_reset );
140 SUBDBG(
"PD[%d].reg_last_reset_val = %llu\n",
i,
141 (
unsigned long long ) pd[
i].reg_last_reset_val );
142 SUBDBG(
"PD[%d].reg_ovfl_switch_cnt = %llu\n",
i,
143 (
unsigned long long ) pd[
i].reg_ovfl_switch_cnt );
144 SUBDBG(
"PD[%d].reg_reset_pmds[0] = %#016llx\n",
i,
145 (
unsigned long long ) pd[
i].reg_reset_pmds[0] );
146 SUBDBG(
"PD[%d].reg_smpl_pmds[0] = %#016llx\n",
i,
147 (
unsigned long long ) pd[
i].reg_smpl_pmds[0] );
148 SUBDBG(
"PD[%d].reg_smpl_eventid = %llu\n",
i,
149 (
unsigned long long ) pd[
i].reg_smpl_eventid );
150 SUBDBG(
"PD[%d].reg_random_mask = %llu\n",
i,
151 (
unsigned long long ) pd[
i].reg_random_mask );
152 SUBDBG(
"PD[%d].reg_random_seed = %d\n",
i, pd[
i].reg_random_seed );
159 SUBDBG(
"SMPL_HDR.hdr_count = %llu\n",
160 (
unsigned long long ) hdr->hdr_count );
161 SUBDBG(
"SMPL_HDR.hdr_cur_offs = %llu\n",
162 (
unsigned long long ) hdr->hdr_cur_offs );
163 SUBDBG(
"SMPL_HDR.hdr_overflows = %llu\n",
164 (
unsigned long long ) hdr->hdr_overflows );
165 SUBDBG(
"SMPL_HDR.hdr_buf_size = %llu\n",
166 (
unsigned long long ) hdr->hdr_buf_size );
167 SUBDBG(
"SMPL_HDR.hdr_min_buf_space = %llu\n",
168 (
unsigned long long ) hdr->hdr_min_buf_space );
169 SUBDBG(
"SMPL_HDR.hdr_version = %d\n", hdr->hdr_version );
170 SUBDBG(
"SMPL_HDR.hdr_buf_flags = %d\n", hdr->hdr_buf_flags );
176 SUBDBG(
"SMPL.pid = %d\n", entry->pid );
177 SUBDBG(
"SMPL.ovfl_pmd = %d\n", entry->ovfl_pmd );
178 SUBDBG(
"SMPL.last_reset_val = %llu\n",
179 (
unsigned long long ) entry->last_reset_val );
180 SUBDBG(
"SMPL.ip = %#llx\n", (
unsigned long long ) entry->ip );
181 SUBDBG(
"SMPL.tstamp = %llu\n", (
unsigned long long ) entry->tstamp );
182 SUBDBG(
"SMPL.cpu = %d\n", entry->cpu );
183 SUBDBG(
"SMPL.set = %d\n", entry->set );
184 SUBDBG(
"SMPL.tgid = %d\n", entry->tgid );
188 #define PFM_MAX_PMCDS 20 198 ctl->
out.pfp_pmc_count );
203 pfm_write_pmcs( ctl->
ctx_fd, ctl->
pc +
i,
207 ctl->
out.pfp_pmc_count, strerror(
ret ) );
214 pfm_write_pmcs( ctl->
ctx_fd, ctl->
pc +
i,
215 ctl->
out.pfp_pmc_count -
i ) ) ) {
218 ctl->
out.pfp_pmc_count, strerror(
ret ) );
234 ctl->
in.pfp_event_count );
239 pfm_write_pmds( ctl->
ctx_fd, ctl->
pd +
i,
245 perror(
"pfm_write_pmds" );
252 pfm_write_pmds( ctl->
ctx_fd, ctl->
pd +
i,
253 ctl->
in.pfp_event_count -
i ) ) ) {
256 ctl->
pd, ctl->
in.pfp_event_count,
errno, strerror(
ret ) );
257 perror(
"pfm_write_pmds" );
273 ctl->
in.pfp_event_count );
282 ctl->
in.pfp_event_count, strerror(
ret ) );
290 ctl->
in.pfp_event_count -
i ) ) ) {
293 ctl->
in.pfp_event_count, strerror(
ret ) );
309 pfarg_setdesc_t set[2];
311 memset( set, 0,
sizeof ( pfarg_setdesc_t ) * 2 );
313 set[1].set_flags = PFM_SETFL_TIME_SWITCH;
314 set[1].set_timeout = *timeout_ns;
315 SUBDBG(
"Multiplexing interval requested is %llu ns.\n",
316 (
unsigned long long ) set[1].set_timeout );
320 SUBDBG(
"PFM_CREATE_EVTSETS(%d,%p,1)\n", ctx_fd, &set[1] );
321 if ( (
ret = pfm_create_evtsets( ctx_fd, &set[1], 1 ) ) != PFMLIB_SUCCESS ) {
323 PAPIERROR(
"pfm_create_evtsets(%d,%p,%d): %s", ctx_fd, &set[1], 1,
328 SUBDBG(
"Multiplexing interval returned is %llu ns.\n",
329 (
unsigned long long ) set[1].set_timeout );
330 *timeout_ns = set[1].set_timeout;
334 pfm_delete_evtsets( ctx_fd, &set[1], 1 );
342 pfmlib_regmask_t * r_pmds,
343 unsigned long *timeout_ns )
346 pfarg_setinfo_t setf;
350 memset( r_pmcs, 0,
sizeof ( *r_pmcs ) );
351 memset( r_pmds, 0,
sizeof ( *r_pmds ) );
353 memset( &ctx, 0,
sizeof ( ctx ) );
354 memset( &setf, 0,
sizeof ( setf ) );
359 SUBDBG(
"PFM_CREATE_CONTEXT(%p,%p,%p,%d)\n", &ctx, NULL, NULL, 0 );
360 myfd = pfm_create_context( &ctx, NULL, NULL, 0 );
362 PAPIERROR(
"detect_unavail_pmu_regs:pfm_create_context(): %s",
366 SUBDBG(
"PFM_CREATE_CONTEXT returned fd %d\n", myfd );
371 ret = pfm_getinfo_evtsets( myfd, &setf, 1 );
372 if (
ret != PFMLIB_SUCCESS ) {
373 PAPIERROR(
"pfm_getinfo_evtsets(): %s", strerror(
ret ) );
378 for (
i = 0;
i < PFM_PMC_BV;
i++ ) {
379 for ( j = 0; j < 64; j++ ) {
380 if ( ( setf.set_avail_pmcs[
i] & ( 1ULL << j ) ) == 0 )
381 pfm_regmask_set( r_pmcs, (
i << 6 ) + j );
385 for (
i = 0;
i < PFM_PMD_BV;
i++ ) {
386 for ( j = 0; j < 64; j++ ) {
387 if ( ( setf.set_avail_pmds[
i] & ( 1ULL << j ) ) == 0 )
388 pfm_regmask_set( r_pmds, (
i << 6 ) + j );
393 SUBDBG(
"CLOSE fd %d returned %d\n", myfd,
i );
403 pfmlib_input_param_t *inp = &ctl->
in;
404 pfmlib_output_param_t *outp = &ctl->
out;
405 pfmlib_input_param_t tmpin;
406 pfmlib_output_param_t tmpout;
411 pfarg_pmd_t *pd = ctl->
pd;
412 pfarg_pmc_t *pc = ctl->
pc;
413 pfarg_setdesc_t *sets = ctl->
set;
414 pfarg_setinfo_t *setinfos = ctl->
setinfo;
416 unsigned int set = 0;
417 int donepc = 0, donepd = 0,
ret, j;
418 unsigned int i, dispatch_count = inp->pfp_event_count;
419 int togo = inp->pfp_event_count, done = 0;
427 (
"entry multiplexed %d, pfp_event_count %d, num_cntrs %d, num_sets %d\n",
431 ( inp->pfp_event_count >
438 memset( &tmpin, 0x0,
sizeof ( tmpin ) );
439 memset( &tmpout, 0x0,
sizeof ( tmpout ) );
441 SUBDBG(
"togo %d, done %d, dispatch_count %d, num_cntrs %d\n", togo,
443 tmpin.pfp_event_count = dispatch_count;
444 tmpin.pfp_dfl_plm = inp->pfp_dfl_plm;
450 for (
i = 0, j = done;
i < dispatch_count;
i++, j++ ) {
451 memcpy( tmpin.pfp_events +
i, inp->pfp_events + j,
452 sizeof ( pfmlib_event_t ) );
456 pfm_dispatch_events( &tmpin, NULL, &tmpout,
457 NULL ) ) != PFMLIB_SUCCESS ) {
460 if ( dispatch_count == 0 ) {
462 pfm_strerror(
ret ) );
466 (
"Dispatch failed because of counter conflict, trying again with %d counters.\n",
470 PAPIERROR(
"pfm_dispatch_events(): %s", pfm_strerror(
ret ) );
484 for (
i = 0;
i < tmpout.pfp_pmc_count;
i++, donepc++ ) {
485 pc[donepc].reg_num = tmpout.pfp_pmcs[
i].reg_num;
486 pc[donepc].reg_value = tmpout.pfp_pmcs[
i].reg_value;
487 pc[donepc].reg_set = set;
488 SUBDBG(
"PC%d (i%d) is reg num %d, value %llx, set %d\n", donepc,
i,
490 (
unsigned long long ) pc[donepc].reg_value,
491 pc[donepc].reg_set );
496 #if defined(HAVE_PFM_REG_EVT_IDX) 497 for (
i = 0, j = 0;
i < tmpin.pfp_event_count;
i++, donepd++ ) {
498 pd[donepd].reg_num = tmpout.pfp_pmcs[j].reg_pmd_num;
499 pd[donepd].reg_set = set;
500 SUBDBG(
"PD%d (i%d,j%d) is reg num %d, set %d\n", donepd,
i, j,
501 pd[donepd].reg_num, pd[donepd].reg_set );
506 for ( ; j < tmpout.pfp_pmc_count; j++ )
507 if ( tmpout.pfp_pmcs[j].reg_evt_idx !=
i )
511 for (
i = 0;
i < tmpout.pfp_pmd_count;
i++, donepd++ ) {
512 pd[donepd].reg_num = tmpout.pfp_pmds[
i].reg_num;
513 pd[donepd].reg_set = set;
514 SUBDBG(
"PD%d (i%d) is reg num %d, set %d\n", donepd,
i,
515 pd[donepd].reg_num, pd[donepd].reg_set );
519 togo -= dispatch_count;
520 done += dispatch_count;
524 dispatch_count = togo;
526 setinfos[set].set_id = set;
527 sets[set].set_id = set;
532 outp->pfp_pmc_count = donepc;
535 for (
i = 0;
i < set;
i++ ) {
536 sets[
i].set_flags = PFM_SETFL_TIME_SWITCH;
541 (
"exit multiplexed %d (ns switch time), pfp_pmc_count %d, num_sets %d\n",
542 ctl->
multiplexed, outp->pfp_pmc_count, *num_sets );
553 ret = fcntl( ctx_fd, F_SETFD, FD_CLOEXEC );
555 PAPIERROR(
"cannot fcntl(FD_CLOEXEC) on %d: %s", ctx_fd,
560 ret = fcntl( ctx_fd, F_SETFL, fcntl( ctx_fd, F_GETFL, 0 ) | O_ASYNC );
562 PAPIERROR(
"cannot fcntl(O_ASYNC) on %d: %s", ctx_fd,
569 PAPIERROR(
"cannot fcntl(F_SETOWN) on %d: %s", ctx_fd,
584 PAPIERROR(
"cannot fcntl(F_SETSIG,%d) on %d: %s",
595 pfarg_ctx_t *newctx = ( pfarg_ctx_t * ) malloc(
sizeof ( pfarg_ctx_t ) );
596 pfarg_load_t *load_args =
597 ( pfarg_load_t * ) malloc(
sizeof ( pfarg_load_t ) );
600 if ( ( newctx == NULL ) || ( load_args == NULL ) )
602 memset( newctx, 0x0,
sizeof ( *newctx ) );
603 memset( load_args, 0,
sizeof ( *load_args ) );
607 ret = ptrace( PTRACE_ATTACH, tid, NULL, NULL );
609 ptrace( PTRACE_DETACH, tid, NULL, NULL );
610 PAPIERROR(
"Process/thread %d is not being ptraced", tid );
618 if ( (
ret == -1 ) && (
errno != EPERM ) ) {
619 PAPIERROR(
"Process/thread %d cannot be ptraced: %s", tid,
626 SUBDBG(
"PFM_CREATE_CONTEXT(%p,%p,%p,%d)\n", newctx, NULL, NULL, 0 );
627 if ( (
ret = pfm_create_context( newctx, NULL, NULL, 0 ) ) == -1 ) {
628 PAPIERROR(
"attach:pfm_create_context(): %s", strerror(
errno ) );
633 SUBDBG(
"PFM_CREATE_CONTEXT returned fd %d\n",
ret );
638 load_args->load_pid = tid;
650 SUBDBG(
"CLOSE fd %d returned %d\n",
670 int mode = 0, did = 0;
671 pfmlib_input_param_t *inp = &ctl->
in;
696 inp->pfp_dfl_plm = mode;
733 FILE *
f = fopen(
file,
"r" );
739 if ( fscanf(
f,
"%s\n",
buf ) != 1 ) {
740 PAPIERROR(
"fscanf(%s, %%s\\n): Unable to scan 1 token",
file );
770 sprintf(
buf,
"%d.%d", PFM_VERSION_MAJOR( PFM_VERSION ),
771 PFM_VERSION_MINOR( PFM_VERSION ) );
772 SUBDBG(
"Perfmon2 library versions...kernel: %s library: %s\n",
776 if ( !( ( PFM_VERSION_MINOR( PFM_VERSION ) == 81 ) &&
779 PAPIERROR(
"Version mismatch of libpfm: compiled %s " 780 "vs. installed %s\n",
799 unsigned long min_timeout_ns;
803 if ( syscall( __NR_clock_getres, CLOCK_REALTIME, &ts ) == -1 ) {
804 PAPIERROR(
"Could not detect proper HZ rate, multiplexing may fail\n" );
805 min_timeout_ns = 10000000;
833 #ifdef PFMLIB_SPARC_ULTRA12_PMU 834 case PFMLIB_SPARC_ULTRA12_PMU:
835 case PFMLIB_SPARC_ULTRA3_PMU:
836 case PFMLIB_SPARC_ULTRA3I_PMU:
837 case PFMLIB_SPARC_ULTRA3PLUS_PMU:
838 case PFMLIB_SPARC_ULTRA4PLUS_PMU:
871 pfarg_load_t load_args;
875 #if defined(USE_PROC_PTTIMER) 881 memset( &newctx, 0,
sizeof ( newctx ) );
882 memset( &load_args, 0,
sizeof ( load_args ) );
884 if ( (
ret = pfm_create_context( &newctx, NULL, NULL, 0 ) ) == -1 ) {
889 SUBDBG(
"PFM_CREATE_CONTEXT returned fd %d\n",
ret );
893 memcpy( &( (
pfm_context_t * ) thr_ctx )->ctx, &newctx,
sizeof ( newctx ) );
897 sizeof ( load_args ) );
913 reg_flags & PFM_REGFL_OVFL_NOTIFY )
941 reg_flags & PFM_REGFL_OVFL_NOTIFY )
961 long long **
events,
int flags )
966 long long tot_runs = 0LL;
976 for (
i = 0;
i < ctl->
in.pfp_event_count;
i++ ) {
977 if ( ctl->
pd[
i].reg_flags & PFM_REGFL_OVFL_NOTIFY )
978 ctl->
counts[
i] = ctl->
pd[
i].reg_value - ctl->
pd[
i].reg_long_reset;
981 SUBDBG(
"PMD[%d] = %lld (LLD),%llu (LLU)\n",
i,
982 (
unsigned long long ) ctl->
counts[
i],
983 (
unsigned long long ) ctl->
pd[
i].reg_value );
1009 for (
i = 0;
i < (
unsigned int ) ctl->
num_sets;
i++ )
1010 tot_runs += ctl->
setinfo[
i].set_runs;
1014 for (
i = 0;
i < ctl->
in.pfp_event_count;
i++ ) {
1016 (
"Counter %d is in set %d ran %llu of %llu times, old count %lld.\n",
1017 i, ctl->
pd[
i].reg_set,
1018 (
unsigned long long ) ctl->
setinfo[ctl->
pd[
i].reg_set].set_runs,
1019 (
unsigned long long ) tot_runs, ctl->
counts[
i] );
1020 if ( ctl->
setinfo[ctl->
pd[
i].reg_set].set_runs )
1022 ( ctl->
counts[
i] * tot_runs ) /
1026 SUBDBG(
"Set %lld didn't run!!!!\n",
1027 (
unsigned long long ) ctl->
pd[
i].reg_set );
1035 #if defined(__crayxt) 1036 int _papi_hwd_start_create_context = 0;
1047 #if defined(__crayxt) 1048 if ( _papi_hwd_start_create_context ) {
1051 memset( &
tmp, 0,
sizeof (
tmp ) );
1052 if ( (
ret = pfm_create_context( &
tmp, NULL, NULL, 0 ) ) == -1 ) {
1053 PAPIERROR(
"_papi_hwd_init:pfm_create_context(): %s",
1054 strerror(
errno ) );
1066 pfm_create_evtsets( ctl->
ctx_fd, ctl->
set,
1067 ctl->
num_sets ) ) != PFMLIB_SUCCESS ) {
1069 PAPIERROR(
"pfm_create_evtsets(%d,%p,%d): errno=%d %s",
1072 perror(
"pfm_create_evtsets" );
1093 for (
i = 0;
i < ctl->
in.pfp_event_count;
i++ )
1094 if ( !( ctl->
pd[
i].reg_flags & PFM_REGFL_OVFL_NOTIFY ) )
1095 ctl->
pd[
i].reg_value = 0ULL;
1107 ctl->
load->load_pid );
1108 if ( (
ret = pfm_load_context( ctl->
ctx_fd, ctl->
load ) ) ) {
1110 ctl->
load->load_pid, strerror(
ret ) );
1115 if ( (
ret = pfm_start( ctl->
ctx_fd, NULL ) ) ) {
1131 if ( (
ret = pfm_stop( ctl->
ctx_fd ) ) ) {
1135 if ( (
ret == PFMLIB_ERR_NOTSUPP ) &&
1136 ( ctl->
load->load_pid != (
unsigned int )
mygettid( ) ) )
1143 SUBDBG(
"PFM_UNLOAD_CONTEXT(%d) (tid %u)\n", ctl->
ctx_fd,
1144 ctl->
load->load_pid );
1145 if ( (
ret = pfm_unload_context( ctl->
ctx_fd ) ) ) {
1151 static pfarg_setdesc_t set = { 0, 0, 0, 0, {0, 0, 0, 0, 0, 0} };
1156 pfm_delete_evtsets( ctl->
ctx_fd, &ctl->
set[1],
1157 ctl->
num_sets - 1 ) ) != PFMLIB_SUCCESS ) {
1167 SUBDBG(
"PFM_CREATE_EVTSETS(%d,%p,%d)\n", ctl->
ctx_fd, &set, 1 );
1169 pfm_create_evtsets( ctl->
ctx_fd, &set,
1170 1 ) ) != PFMLIB_SUCCESS ) {
1235 ctl_state ), option );
1247 ctl_state ), option );
1292 #if defined(USE_PROC_PTTIMER) 1293 close( ctx->stat_fd );
1308 unsigned int *native_index,
int *profile_index )
1310 int pos, esi_index,
count;
1320 for (
i = 0;
i < ctl->
in.pfp_event_count;
i++ ) {
1321 if ( pd[
i].reg_num == pmd ) {
1322 SUBDBG(
"Physical PMD %d is Virtual PMD %d\n", pmd,
i );
1329 SUBDBG(
"(%p,%d,%p)\n", ESI, pmd, index );
1335 SUBDBG(
"Examining event at ESI index %d, PMD position %d\n", esi_index,
1339 *profile_index =
count;
1343 SUBDBG(
"Native event %d is at profile index %d, flags %d\n",
1344 *native_index, *profile_index, *flags );
1349 PAPIERROR(
"wrong count: %d vs. ESI->profile.event_counter %d",
count,
1354 #if defined(__ia64__) 1356 is_montecito_and_dear(
unsigned int native_index )
1359 if ( pfm_mont_is_dear( native_index ) )
1365 is_montecito_and_iear(
unsigned int native_index )
1368 if ( pfm_mont_is_iear( native_index ) )
1374 is_itanium2_and_dear(
unsigned int native_index )
1377 if ( pfm_ita2_is_dear( native_index ) )
1383 is_itanium2_and_iear(
unsigned int native_index )
1386 if ( pfm_ita2_is_iear( native_index ) )
1393 #define BPL (sizeof(uint64_t)<<3) 1398 bv[rnum >>
LBPL] |= 1UL << ( rnum & (
BPL - 1 ) );
1405 #if defined(__ia64__) 1407 if ( pfm_mont_is_dear( native_index ) ) {
1413 }
else if ( pfm_mont_is_iear( native_index ) ) {
1421 if ( pfm_mont_is_dear( native_index ) ) {
1427 }
else if ( pfm_mont_is_iear( native_index ) ) {
1436 ( void ) native_index;
1444 pfm_dfl_smpl_entry_t ** ent,
caddr_t * pc )
1447 ( void ) native_pfm_index;
1450 SUBDBG(
"process_smpl_entry(%d,%d,%p,%p)\n", native_pfm_index, flags, ent,
1455 if ( is_montecito_and_dear( native_pfm_index ) ) {
1456 pfm_mont_pmd_reg_t data_addr;
1457 pfm_mont_pmd_reg_t latency;
1458 pfm_mont_pmd_reg_t load_addr;
1459 unsigned long newent;
1470 data_addr = *( pfm_mont_pmd_reg_t * ) * ent;
1472 *( pfm_mont_pmd_reg_t * ) ( (
unsigned long ) *ent +
1473 sizeof ( data_addr ) );
1475 *( pfm_mont_pmd_reg_t * ) ( (
unsigned long ) *ent +
1476 sizeof ( data_addr ) +
1477 sizeof ( latency ) );
1479 SUBDBG(
"PMD[32]: %#016llx\n",
1480 (
unsigned long long ) data_addr.pmd_val );
1481 SUBDBG(
"PMD[33]: %#016llx\n",
1482 (
unsigned long long ) latency.pmd_val );
1483 SUBDBG(
"PMD[36]: %#016llx\n",
1484 (
unsigned long long ) load_addr.pmd_val );
1486 if ( ( !load_addr.pmd36_mont_reg.dear_vl ) ||
1487 ( !load_addr.pmd33_mont_reg.dear_stat ) ) {
1489 (
"Invalid DEAR sample found, dear_vl = %d, dear_stat = %#x\n",
1490 load_addr.pmd36_mont_reg.dear_vl,
1491 load_addr.pmd33_mont_reg.dear_stat );
1493 newent = (
unsigned long ) *ent;
1494 newent += 3 *
sizeof ( pfm_mont_pmd_reg_t );
1495 *ent = ( pfm_dfl_smpl_entry_t * ) newent;
1500 *pc = (
caddr_t ) data_addr.pmd_val;
1503 ( ( load_addr.pmd36_mont_reg.dear_iaddr +
1504 (
unsigned long ) load_addr.pmd36_mont_reg.
1505 dear_bn ) << 4 ) | (
unsigned long ) load_addr.
1506 pmd36_mont_reg.dear_slot;
1513 newent = (
unsigned long ) *ent;
1514 newent += 3 *
sizeof ( pfm_mont_pmd_reg_t );
1515 *ent = ( pfm_dfl_smpl_entry_t * ) newent;
1517 }
else if ( is_montecito_and_iear( native_pfm_index ) ) {
1518 pfm_mont_pmd_reg_t latency;
1519 pfm_mont_pmd_reg_t icache_line_addr;
1520 unsigned long newent;
1530 icache_line_addr = *( pfm_mont_pmd_reg_t * ) * ent;
1532 *( pfm_mont_pmd_reg_t * ) ( (
unsigned long ) *ent +
1533 sizeof ( icache_line_addr ) );
1535 SUBDBG(
"PMD[34]: %#016llx\n",
1536 (
unsigned long long ) icache_line_addr.pmd_val );
1537 SUBDBG(
"PMD[35]: %#016llx\n",
1538 (
unsigned long long ) latency.pmd_val );
1540 if ( ( icache_line_addr.pmd34_mont_reg.iear_stat & 0x1 ) == 0 ) {
1541 SUBDBG(
"Invalid IEAR sample found, iear_stat = %#x\n",
1542 icache_line_addr.pmd34_mont_reg.iear_stat );
1544 newent = (
unsigned long ) *ent;
1545 newent += 2 *
sizeof ( pfm_mont_pmd_reg_t );
1546 *ent = ( pfm_dfl_smpl_entry_t * ) newent;
1551 unsigned long tmp = icache_line_addr.pmd34_mont_reg.iear_iaddr << 5;
1558 newent = (
unsigned long ) *ent;
1559 newent += 2 *
sizeof ( pfm_mont_pmd_reg_t );
1560 *ent = ( pfm_dfl_smpl_entry_t * ) newent;
1562 }
else if ( is_itanium2_and_dear( native_pfm_index ) ) {
1563 pfm_ita2_pmd_reg_t data_addr;
1564 pfm_ita2_pmd_reg_t latency;
1565 pfm_ita2_pmd_reg_t load_addr;
1566 unsigned long newent;
1577 data_addr = *( pfm_ita2_pmd_reg_t * ) * ent;
1579 *( pfm_ita2_pmd_reg_t * ) ( (
unsigned long ) *ent +
1580 sizeof ( data_addr ) );
1582 *( pfm_ita2_pmd_reg_t * ) ( (
unsigned long ) *ent +
1583 sizeof ( data_addr ) +
1584 sizeof ( latency ) );
1586 SUBDBG(
"PMD[2]: %#016llx\n",
1587 (
unsigned long long ) data_addr.pmd_val );
1588 SUBDBG(
"PMD[3]: %#016llx\n", (
unsigned long long ) latency.pmd_val );
1589 SUBDBG(
"PMD[17]: %#016llx\n",
1590 (
unsigned long long ) load_addr.pmd_val );
1592 if ( ( !load_addr.pmd17_ita2_reg.dear_vl ) ||
1593 ( !load_addr.pmd3_ita2_reg.dear_stat ) ) {
1595 (
"Invalid DEAR sample found, dear_vl = %d, dear_stat = %#x\n",
1596 load_addr.pmd17_ita2_reg.dear_vl,
1597 load_addr.pmd3_ita2_reg.dear_stat );
1599 newent = (
unsigned long ) *ent;
1600 newent += 3 *
sizeof ( pfm_mont_pmd_reg_t );
1601 *ent = ( pfm_dfl_smpl_entry_t * ) newent;
1606 *pc = (
caddr_t ) data_addr.pmd_val;
1609 ( ( load_addr.pmd17_ita2_reg.dear_iaddr +
1610 (
unsigned long ) load_addr.pmd17_ita2_reg.
1611 dear_bn ) << 4 ) | (
unsigned long ) load_addr.
1612 pmd17_ita2_reg.dear_slot;
1619 newent = (
unsigned long ) *ent;
1620 newent += 3 *
sizeof ( pfm_ita2_pmd_reg_t );
1621 *ent = ( pfm_dfl_smpl_entry_t * ) newent;
1623 }
else if ( is_itanium2_and_iear( native_pfm_index ) ) {
1624 pfm_ita2_pmd_reg_t latency;
1625 pfm_ita2_pmd_reg_t icache_line_addr;
1626 unsigned long newent;
1636 icache_line_addr = *( pfm_ita2_pmd_reg_t * ) * ent;
1638 *( pfm_ita2_pmd_reg_t * ) ( (
unsigned long ) *ent +
1639 sizeof ( icache_line_addr ) );
1641 SUBDBG(
"PMD[0]: %#016llx\n",
1642 (
unsigned long long ) icache_line_addr.pmd_val );
1643 SUBDBG(
"PMD[1]: %#016llx\n", (
unsigned long long ) latency.pmd_val );
1645 if ( ( icache_line_addr.pmd0_ita2_reg.iear_stat & 0x1 ) == 0 ) {
1646 SUBDBG(
"Invalid IEAR sample found, iear_stat = %#x\n",
1647 icache_line_addr.pmd0_ita2_reg.iear_stat );
1649 newent = (
unsigned long ) *ent;
1650 newent += 2 *
sizeof ( pfm_mont_pmd_reg_t );
1651 *ent = ( pfm_dfl_smpl_entry_t * ) newent;
1656 unsigned long tmp = icache_line_addr.pmd0_ita2_reg.iear_iaddr << 5;
1663 newent = (
unsigned long ) *ent;
1664 newent += 2 *
sizeof ( pfm_ita2_pmd_reg_t );
1665 *ent = ( pfm_dfl_smpl_entry_t * ) newent;
1669 ( is_btb( native_pfm_index ) ) {
1678 *pc = (
caddr_t ) ( (
size_t ) ( ( *ent )->ip ) );
1687 ( void ) num_smpl_pmds;
1688 ( void ) entry_size;
1690 pfm_dfl_smpl_entry_t *ent;
1691 uint64_t entry,
count;
1692 pfm_dfl_smpl_hdr_t *hdr =
1694 int ret, profile_index, flags;
1695 unsigned int native_pfm_index;
1700 count = hdr->hdr_count;
1701 ent = ( pfm_dfl_smpl_entry_t * ) ( hdr + 1 );
1704 SUBDBG(
"This buffer has %llu samples in it.\n",
1705 (
unsigned long long )
count );
1707 SUBDBG(
"Processing sample entry %llu\n",
1708 (
unsigned long long ) entry );
1715 &flags, &native_pfm_index, &profile_index );
1722 weight, profile_index );
1737 #ifdef HAVE_PFM_MSG_TYPE 1742 int ret, wanted_fd,
fd = info->si_fd;
1748 PAPIERROR(
"thread == NULL in _papi_pfm_dispatch_timer!" );
1756 if (
thread->running_eventset[
cidx] == NULL ) {
1758 (
"thread->running_eventset == NULL in _papi_pfm_dispatch_timer!" );
1766 if (
thread->running_eventset[
cidx]->overflow.flags == 0 ) {
1768 (
"thread->running_eventset->overflow.flags == 0 in _papi_pfm_dispatch_timer!" );
1779 if (
thread->running_eventset[
cidx]->overflow.
1785 if (
thread->running_eventset[
cidx]->overflow.flags ==
1789 ctl_state ) )->ctx_fd;
1793 if ( wanted_fd !=
fd ) {
1794 SUBDBG(
"expected fd %d, got %d in _papi_hwi_dispatch_timer!",
1805 if (
errno == EINTR ) {
1806 SUBDBG(
"read(%d) interrupted, retrying\n",
fd );
1811 }
else if (
ret !=
sizeof ( msg ) ) {
1817 if ( msg.type != PFM_MSG_OVFL ) {
1818 PAPIERROR(
"unexpected msg type %d", msg.type );
1822 if ( msg.pfm_ovfl_msg.msg_ovfl_tid !=
mygettid( ) ) {
1823 PAPIERROR(
"unmatched thread id %lx vs. %lx",
1824 msg.pfm_ovfl_msg.msg_ovfl_tid,
mygettid( ) );
1839 unsigned long i, vector = msg.pfm_ovfl_msg.msg_ovfl_pmds[0];
1843 for (
i = 0;
i < ctl->
in.pfp_event_count;
i++ ) {
1847 if ( ctl->
pd[
i].reg_num ==
1848 ffsl( msg.pfm_ovfl_msg.msg_ovfl_pmds[0] ) - 1 ) {
1859 NULL, vector, 0, &
thread,
1864 if ( (
ret = pfm_restart(
fd ) ) ) {
1885 void *buf_addr = NULL;
1886 pfm_dfl_smpl_arg_t buf_arg;
1887 pfm_dfl_smpl_hdr_t *hdr;
1890 memset( &newctx, 0,
sizeof ( newctx ) );
1894 (
unsigned long long ) ctx->
smpl.buf_size );
1905 memset( &ctx->
smpl, 0, sizeof ( buf_arg ) );
1915 memset( &buf_arg, 0,
sizeof ( buf_arg ) );
1916 buf_arg.buf_size = 2 * getpagesize( );
1918 SUBDBG(
"PFM_CREATE_CONTEXT(%p,%s,%p,%d)\n", &newctx, PFM_DFL_SMPL_NAME,
1919 &buf_arg, (
int )
sizeof ( buf_arg ) );
1921 pfm_create_context( &newctx, PFM_DFL_SMPL_NAME, &buf_arg,
1922 sizeof ( buf_arg ) ) ) == -1 ) {
1924 PAPIERROR(
"_papi_hwd_set_profile:pfm_create_context(): %s",
1925 strerror(
errno ) );
1929 SUBDBG(
"PFM_CREATE_CONTEXT returned fd %d\n", ctx_fd );
1932 SUBDBG(
"MMAP(NULL,%lld,%d,%d,%d,0)\n",
1933 (
unsigned long long ) buf_arg.buf_size, PROT_READ, MAP_PRIVATE,
1936 mmap( NULL, (
size_t ) buf_arg.buf_size, PROT_READ, MAP_PRIVATE, ctx_fd,
1939 PAPIERROR(
"mmap(NULL,%d,%d,%d,%d,0): %s", buf_arg.buf_size, PROT_READ,
1940 MAP_PRIVATE, ctx_fd, strerror(
errno ) );
1944 SUBDBG(
"Sample buffer is located at %p\n", buf_addr );
1946 hdr = ( pfm_dfl_smpl_hdr_t * ) buf_addr;
1947 SUBDBG(
"hdr_cur_offs=%llu version=%u.%u\n",
1948 (
unsigned long long ) hdr->hdr_cur_offs,
1949 PFM_VERSION_MAJOR( hdr->hdr_version ),
1950 PFM_VERSION_MINOR( hdr->hdr_version ) );
1952 if ( PFM_VERSION_MAJOR( hdr->hdr_version ) < 1 ) {
1953 PAPIERROR(
"invalid buffer format version %d",
1954 PFM_VERSION_MAJOR( hdr->hdr_version ) );
1955 munmap( buf_addr, buf_arg.buf_size );
1962 munmap( buf_addr, buf_arg.buf_size );
1971 int pos, native_index;
1985 pd[pos].reg_random_seed = 5;
1986 pd[pos].reg_random_mask = 0xff;
1996 memcpy( &ctx->
smpl, &buf_arg, sizeof ( buf_arg ) );
2018 SUBDBG(
"Hardware counter %d used in overflow, threshold %d\n", j,
2024 if ( ( this_state->
pd[j].reg_flags & PFM_REGFL_OVFL_NOTIFY ) == 0 )
2035 this_state->
pd[j].reg_flags ^= PFM_REGFL_OVFL_NOTIFY;
2048 this_state->
pd[j].reg_value = 0;
2049 this_state->
pd[j].reg_long_reset = 0;
2050 this_state->
pd[j].reg_short_reset = 0;
2051 this_state->
pd[j].reg_random_seed = 0;
2052 this_state->
pd[j].reg_random_mask = 0;
2064 this_state->
pd[j].reg_flags |= PFM_REGFL_OVFL_NOTIFY;
2077 this_state->
pd[j].reg_value = -(
unsigned long long )
threshold + 1;
2078 this_state->
pd[j].reg_short_reset =
2080 this_state->
pd[j].reg_long_reset =
2090 pfmlib_input_param_t *inp = &ctl->
in;
2091 pfmlib_output_param_t *outp = &ctl->
out;
2092 pfarg_pmd_t *pd = ctl->
pd;
2093 pfarg_pmc_t *pc = ctl->
pc;
2094 pfarg_setdesc_t *set = ctl->
set;
2095 pfarg_setinfo_t *setinfo = ctl->
setinfo;
2097 memset( inp, 0,
sizeof ( *inp ) );
2098 memset( outp, 0,
sizeof ( *inp ) );
2099 memset( pc, 0,
sizeof ( ctl->
pc ) );
2100 memset( pd, 0,
sizeof ( ctl->
pd ) );
2101 memset( set, 0,
sizeof ( ctl->
set ) );
2102 memset( setinfo, 0,
sizeof ( ctl->
setinfo ) );
2123 for ( j = 0; j <
i; j++ )
2141 int last_reg_set = 0, reg_set_done = 0,
offset = 0;
2142 pfmlib_input_param_t tmpin, *inp = &ctl->
in;
2143 pfmlib_output_param_t tmpout, *outp = &ctl->
out;
2144 pfarg_pmd_t *pd = ctl->
pd;
2147 SUBDBG(
"Called with count == 0\n" );
2148 inp->pfp_event_count = 0;
2149 outp->pfp_pmc_count = 0;
2150 memset( inp->pfp_events, 0x0, sizeof ( inp->pfp_events ) );
2154 memcpy( &tmpin, inp,
sizeof ( tmpin ) );
2155 memcpy( &tmpout, outp,
sizeof ( tmpout ) );
2159 (
"Stuffing native event index %d (code %#x) into input structure.\n",
2161 memcpy( inp->pfp_events +
i,
native[
i].ni_bits,
2162 sizeof ( pfmlib_event_t ) );
2164 inp->pfp_event_count =
count;
2171 memcpy( inp, &tmpin,
sizeof ( tmpin ) );
2172 memcpy( outp, &tmpout,
sizeof ( tmpout ) );
2178 last_reg_set = pd[0].reg_set;
2180 if ( pd[
i].reg_set != last_reg_set ) {
2187 SUBDBG(
"native event index %d (code %#x) is at PMD offset %d\n",
i,
2196 if ( ctl->
ctx == NULL ) {
2210 .description =
"Linux perfmon2 CPU counters",
2219 .kernel_multiplex = 1,
2220 .kernel_profile = 1,
2221 .num_mpx_cntrs = PFMLIB_MAX_PMDS,
2224 .fast_real_timer = 1,
2225 .fast_virtual_timer = 0,
2227 .attach_must_ptrace = 1,
int _papi_libpfm_ntv_name_to_code(const char *name, unsigned int *event_code)
static int process_smpl_buf(int num_smpl_pmds, int entry_size, ThreadInfo_t **thr)
int _papi_libpfm_init(papi_vector_t *my_vector, int cidx)
ssize_t read(int fd, void *buf, size_t count)
static int get_string_from_file(char *file, char *str, int len)
char disabled_reason[PAPI_MAX_STR_LEN]
int _papi_pfm_read(hwd_context_t *ctx0, hwd_control_state_t *ctl0, long long **events, int flags)
int _papi_pfm_start(hwd_context_t *ctx0, hwd_control_state_t *ctl0)
pfarg_setinfo_t setinfo[PFMLIB_MAX_PMDS]
#define PAPI_DEF_ITIMER_NS
int _papi_pfm_shutdown_component()
static int _papi_pfm_init_thread(hwd_context_t *thr_ctx)
#define PAPI_INSTR_ADDRESS
static int attach(hwd_control_state_t *ctl, unsigned long tid)
static void _papi_pfm_dispatch_timer(int n, hwd_siginfo_t *info, void *uc)
#define PAPI_PROFIL_DATA_EAR
static int detect_timeout_and_unavail_pmu_regs(pfmlib_regmask_t *r_pmcs, pfmlib_regmask_t *r_pmds, unsigned long *timeout_ns)
_papi_int_addr_range_t address_range
static int detach(hwd_context_t *ctx, hwd_control_state_t *ctl)
#define PAPI_DATA_ADDRESS
pfarg_setdesc_t set[PFMLIB_MAX_PMDS]
int _papi_libpfm_ntv_enum_events(unsigned int *EventCode, int modifier)
pfarg_pmd_t pd[PFMLIB_MAX_PMDS]
static int _perfmon2_pfm_pmu_type
static int set_irange(hwd_context_t *ctx, hwd_control_state_t *current_state, _papi_int_option_t *option)
static int process_smpl_entry(unsigned int native_pfm_index, int flags, pfm_dfl_smpl_entry_t **ent, caddr_t *pc)
static int set_granularity(hwd_control_state_t *this_state, int domain)
static pid_t mygettid(void)
PAPI_component_info_t cmp_info
static void dump_pmc(pfm_control_state_t *ctl)
static int set_default_domain(EventSetInfo_t *zero, int domain)
Return codes and api definitions.
char support_version[PAPI_MIN_STR_LEN]
int init_proc_thread_timer(hwd_context_t *thr_ctx)
char events[MAX_EVENTS][BUFSIZ]
_papi_int_itimer_t itimer
_papi_int_attach_t attach
pfmlib_output_param_t out
__syscall_slong_t tv_nsec
int _papi_libpfm_ntv_code_to_name(unsigned int EventCode, char *ntv_name, int len)
static int _papi_pfm_update_control_state(hwd_control_state_t *ctl0, NativeInfo_t *native, int count, hwd_context_t *ctx0)
static int setup_ear_event(unsigned int native_index, pfarg_pmd_t *pd, int flags)
int _papi_pfm_init_component(int cidx)
EventSetOverflowInfo_t overflow
#define PAPI_OVERFLOW_HARDWARE
unsigned int fast_real_timer
#define PAPI_DOM_SUPERVISOR
PAPI_os_info_t _papi_os_info
struct _ThreadInfo * master
static int compute_kernel_args(hwd_control_state_t *ctl0)
static void dump_sets(pfarg_setdesc_t *set, int num_sets)
char kernel_version[PAPI_MIN_STR_LEN]
static void dump_setinfo(pfarg_setinfo_t *setinfo, int num_sets)
static pfmlib_regmask_t _perfmon2_pfm_unavailable_pmds
unsigned int fast_counter_read
static void dump_smpl_hdr(pfm_dfl_smpl_hdr_t *hdr)
papi_vector_t _perfmon2_vector
static int _papi_pfm_allocate_registers(EventSetInfo_t *ESI)
hwd_ucontext_t * ucontext
#define PAPI_HUGE_STR_LEN
int _papi_pfm_reset(hwd_context_t *ctx, hwd_control_state_t *ctl)
char model_string[PAPI_MAX_STR_LEN]
static int _papi_pfm_init_control_state(hwd_control_state_t *ctl0)
static int set_domain(hwd_control_state_t *ctl0, int domain)
#define SUBDBG(format, args...)
#define PAPI_PROFIL_INST_EAR
_papi_int_granularity_t granularity
void PAPIERROR(char *format,...)
char name[PAPI_MAX_STR_LEN]
static int find_profile_index(EventSetInfo_t *ESI, int pmd, int *flags, unsigned int *native_index, int *profile_index)
long long counts[PFMLIB_MAX_PMDS]
int _papi_pfm_stop(hwd_context_t *ctx0, hwd_control_state_t *ctl0)
_papi_int_multiplex_t multiplex
NativeInfo_t * NativeInfoArray
int _papi_libpfm_error(int pfm_error)
EventInfo_t * EventInfoArray
int _papi_pfm_shutdown(hwd_context_t *ctx0)
int _papi_libpfm_ntv_code_to_descr(unsigned int EventCode, char *ntv_descr, int len)
papi_mdi_t _papi_hwi_system_info
#define PAPI_VENDOR_INTEL
pfmlib_event_t pfm_register_t
int pos[PAPI_EVENTS_IN_DERIVED_EVENT]
#define PAPI_PROFIL_RANDOM
static int set_inherit(int arg)
static int _papi_pfm_stop_profiling(ThreadInfo_t *thread, EventSetInfo_t *ESI)
static int check_multiplex_timeout(int ctx_fd, unsigned long *timeout_ns)
#define PAPI_OVERFLOW_FORCE_SW
static int set_drange(hwd_context_t *ctx, hwd_control_state_t *current_state, _papi_int_option_t *option)
static int _papi_pfm_set_profile(EventSetInfo_t *ESI, int EventIndex, int threshold)
inline_static ThreadInfo_t * _papi_hwi_lookup_thread(int custom_tid)
int _papi_pfm_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
#define PAPI_NATIVE_AND_MASK
#define PAPI_PROFIL_FORCE_SW
static int round_requested_ns(int ns)
int _papi_libpfm_ntv_code_to_bits(unsigned int EventCode, hwd_register_t *bits)
_papi_int_domain_t domain
int _papi_pfm_write(hwd_context_t *ctx, hwd_control_state_t *ctl, long long *from)
EventSetProfileInfo_t profile
pfarg_pmc_t pc[PFMLIB_MAX_PMCS]
hwd_control_state_t * ctl_state
static void dump_pmd(pfm_control_state_t *ctl)
int _papi_pfm_write_pmds(pfm_context_t *ctx, pfm_control_state_t *ctl)
static int _papi_pfm_set_overflow(EventSetInfo_t *ESI, int EventIndex, int threshold)
int tune_up_fd(int ctx_fd)
static pfmlib_regmask_t _perfmon2_pfm_unavailable_pmcs
#define GET_OVERFLOW_ADDRESS(ctx)
volatile int buf[CACHE_FLUSH_BUFFER_SIZE_INTS]
int _papi_pfm_write_pmcs(pfm_context_t *ctx, pfm_control_state_t *ctl)
int _papi_pfm_read_pmds(pfm_context_t *ctx, pfm_control_state_t *ctl)
static void pfm_bv_set(uint64_t *bv, uint16_t rnum)
static void dump_smpl(pfm_dfl_smpl_entry_t *entry)
static void dump_smpl_arg(pfm_dfl_smpl_arg_t *arg)