25 #if defined(__INTEL_COMPILER) 27 #define hweight64(x) _m64_popcnt(x) 29 #elif defined(__GNUC__) 32 hweight64(
unsigned long x )
35 __asm__(
"popcnt %0=%1":
"=r"( result ):
"r"(
x ) );
36 return (
int ) result;
40 #error "you need to provide inline assembly from your compiler" 46 #define OVFL_SIGNAL SIGPROF 47 #define PFMW_PEVT_EVTCOUNT(evt) (evt->inp.pfp_event_count) 48 #define PFMW_PEVT_EVENT(evt,idx) (evt->inp.pfp_events[idx].event) 49 #define PFMW_PEVT_PLM(evt,idx) (evt->inp.pfp_events[idx].plm) 50 #define PFMW_PEVT_DFLPLM(evt) (evt->inp.pfp_dfl_plm) 51 #define PFMW_PEVT_PFPPC(evt) (evt->pc) 52 #define PFMW_PEVT_PFPPD(evt) (evt->pd) 53 #define PFMW_PEVT_PFPPC_COUNT(evt) (evt->outp.pfp_pmc_count) 54 #define PFMW_PEVT_PFPPC_REG_NUM(evt,idx) (evt->outp.pfp_pmcs[idx].reg_num) 55 #define PFMW_PEVT_PFPPC_REG_VAL(evt,idx) (evt->pc[idx].reg_value) 56 #define PFMW_PEVT_PFPPC_REG_FLG(evt,idx) (evt->pc[idx].reg_flags) 57 #define PFMW_ARCH_REG_PMCVAL(reg) (reg.pmc_val) 58 #define PFMW_ARCH_REG_PMDVAL(reg) (reg.pmd_val) 60 #define PFMON_MONT_MAX_IBRS 8 61 #define PFMON_MONT_MAX_DBRS 8 63 #define PFMON_ITA2_MAX_IBRS 8 64 #define PFMON_ITA2_MAX_DBRS 8 102 return ( perfmonctl(
fd, cmd, arg, narg ) );
124 #ifdef PFMLIB_MONTECITO_PMU 127 pfm_dispatch_events( &evt->
inp,
128 ( pfmlib_mont_input_param_t * ) evt->
mod_inp,
130 ( pfmlib_mont_output_param_t * ) evt->
135 pfm_dispatch_events( &evt->
inp,
136 ( pfmlib_ita2_input_param_t * ) evt->
mod_inp,
138 ( pfmlib_ita2_output_param_t * ) evt->
143 for (
i = 0;
i < evt->
outp.pfp_pmc_count;
i++ ) {
144 evt->
pc[
i].reg_num = evt->
outp.pfp_pmcs[
i].reg_num;
145 evt->
pc[
i].reg_value = evt->
outp.pfp_pmcs[
i].reg_value;
147 #if defined(HAVE_PFMLIB_OUTPUT_PFP_PMD_COUNT) 148 for (
i = 0;
i < evt->
outp.pfp_pmd_count;
i++ ) {
149 evt->
pd[
i].reg_num = evt->
outp.pfp_pmds[
i].reg_num;
153 for (
i = 0;
i < evt->
inp.pfp_event_count;
i++ ) {
154 evt->
pd[
i].reg_num = evt->
pc[
i].reg_num;
164 pfarg_load_t load_args;
167 memset( &load_args, 0,
sizeof ( load_args ) );
174 SUBDBG(
"PFM_LOAD_CONTEXT FD %d, PID %d\n",
191 PAPIERROR(
"fcntl(%d,F_SETFL,O_ASYNC) errno %d",
204 PAPIERROR(
"fcntl(%d,F_SETOWN) errno %d",
213 PAPIERROR(
"fcntl(%d,F_SETSIG) errno %d",
223 PAPIERROR(
"fcntl(%d,FD_CLOEXEC) errno %d",
236 memset( &ctx, 0,
sizeof ( ctx ) );
238 SUBDBG(
"PFM_CREATE_CONTEXT on 0\n" );
239 if ( perfmonctl( 0, PFM_CREATE_CONTEXT, &ctx, 1 ) == -1 ) {
245 SUBDBG(
"PFM_CREATE_CONTEXT returns FD %d, TID %d\n",
267 this_state->
evt.
pc[
i].reg_smpl_pmds[0] = value;
278 unsigned int *umask );
282 void **smpl_vaddr,
int EventIndex )
284 pfm_default_smpl_ctx_arg_t ctx;
285 pfm_uuid_t buf_fmt_id = PFM_DEFAULT_SMPL_UUID;
287 unsigned int native_index, EventCode;
290 #ifdef PFMLIB_MONTECITO_PMU 296 #ifdef PFMLIB_MONTECITO_PMU 307 memset( &ctx, 0,
sizeof ( ctx ) );
313 memcpy( ctx.ctx_arg.ctx_smpl_buf_id, buf_fmt_id, sizeof ( pfm_uuid_t ) );
319 ctx.buf_arg.buf_size = 4096;
323 SUBDBG(
"PFM_CREATE_CONTEXT on 0\n" );
324 if ( perfmonctl( 0, PFM_CREATE_CONTEXT, &ctx, 1 ) == -1 ) {
325 if (
errno == ENOSYS )
327 (
"Your kernel does not have performance monitoring support" );
336 ctx_fd = ctx.ctx_arg.ctx_fd;
340 SUBDBG(
"PFM_CREATE_CONTEXT returns FD %d, TID %d\n",
346 case PFMLIB_ITANIUM_PMU:
347 if ( pfm_ita_is_dear( native_index ) )
349 else if ( pfm_ita_is_btb( native_index )
353 case PFMLIB_ITANIUM2_PMU:
354 if ( pfm_ita2_is_dear( native_index ) )
356 else if ( pfm_ita2_is_btb( native_index )
360 case PFMLIB_MONTECITO_PMU:
361 if ( pfm_mont_is_dear( native_index ) )
363 else if ( pfm_mont_is_etb( native_index ) ||
368 PAPIERROR(
"PMU type %d is not supported by this component",
373 *smpl_vaddr = ctx.ctx_arg.ctx_smpl_vaddr;
383 pfm_get_num_events( &
total );
397 if ( pfm_get_event_description( idx, &descr ) == PFMLIB_SUCCESS ) {
398 strncpy( dest, descr, len );
408 case PFMLIB_ITANIUM_PMU:
409 return ( pfm_ita_is_dear(
i ) );
411 case PFMLIB_ITANIUM2_PMU:
412 return ( pfm_ita2_is_dear(
i ) );
414 case PFMLIB_MONTECITO_PMU:
415 return ( pfm_mont_is_dear(
i ) );
418 PAPIERROR(
"PMU type %d is not supported by this component",
428 case PFMLIB_ITANIUM_PMU:
429 return ( pfm_ita_is_iear(
i ) );
431 case PFMLIB_ITANIUM2_PMU:
432 return ( pfm_ita2_is_iear(
i ) );
434 case PFMLIB_MONTECITO_PMU:
435 return ( pfm_mont_is_iear(
i ) );
438 PAPIERROR(
"PMU type %d is not supported by this component",
448 case PFMLIB_ITANIUM_PMU:
449 return ( pfm_ita_support_darr(
i ) );
451 case PFMLIB_ITANIUM2_PMU:
452 return ( pfm_ita2_support_darr(
i ) );
454 case PFMLIB_MONTECITO_PMU:
455 return ( pfm_mont_support_darr(
i ) );
458 PAPIERROR(
"PMU type %d is not supported by this component",
468 case PFMLIB_ITANIUM_PMU:
469 return ( pfm_ita_support_iarr(
i ) );
471 case PFMLIB_ITANIUM2_PMU:
472 return ( pfm_ita2_support_iarr(
i ) );
474 case PFMLIB_MONTECITO_PMU:
475 return ( pfm_mont_support_iarr(
i ) );
478 PAPIERROR(
"PMU type %d is not supported by this component",
488 case PFMLIB_ITANIUM_PMU:
489 return ( pfm_ita_support_opcm(
i ) );
491 case PFMLIB_ITANIUM2_PMU:
492 return ( pfm_ita2_support_opcm(
i ) );
494 case PFMLIB_MONTECITO_PMU:
495 return ( pfm_mont_support_opcm(
i ) );
498 PAPIERROR(
"PMU type %d is not supported by this component",
509 unsigned long umasks_retired[4];
511 unsigned int j,
i, seen_retired, ibrp, idx;
513 int retired_code,
incr;
514 pfmlib_ita2_output_param_t *ita2_output_param;
515 pfmlib_mont_output_param_t *mont_output_param;
517 #if defined(PFMLIB_ITANIUM2_PMU) || defined(PFMLIB_MONTECITO_PMU) 518 char *retired_events[] = {
519 "IA64_TAGGED_INST_RETIRED_IBRP0_PMC8",
520 "IA64_TAGGED_INST_RETIRED_IBRP1_PMC9",
521 "IA64_TAGGED_INST_RETIRED_IBRP2_PMC8",
522 "IA64_TAGGED_INST_RETIRED_IBRP3_PMC9",
528 case PFMLIB_ITANIUM2_PMU:
537 incr = pfm_ita2_irange_is_fine( &evt->
outp, ita2_output_param ) ? 4 : 2;
539 for (
i = 0; retired_events[
i];
i++ ) {
540 pfm_find_event( retired_events[
i], &idx );
541 pfm_ita2_get_event_umask( idx, umasks_retired +
i );
544 pfm_get_event_code( idx, &retired_code );
551 for (
i = 0;
i < ita2_output_param->pfp_ita2_irange.rr_nbr_used;
554 ibrp = ita2_output_param->pfp_ita2_irange.rr_br[
i].reg_num >> 1;
557 for ( j = 0; j < evt->
inp.pfp_event_count; j++ ) {
558 pfm_get_event_code( evt->
inp.pfp_events[j].event, &code );
559 if ( code != retired_code )
562 pfm_ita2_get_event_umask( evt->
inp.pfp_events[j].event,
564 if ( umask == umasks_retired[ibrp] )
567 if ( seen_retired && j == evt->
inp.pfp_event_count )
569 (
"warning: code range uses IBR pair %d which is not monitored using %s\n",
570 ibrp, retired_events[ibrp] );
574 case PFMLIB_MONTECITO_PMU:
583 incr = pfm_mont_irange_is_fine( &evt->
outp, mont_output_param ) ? 4 : 2;
585 for (
i = 0; retired_events[
i];
i++ ) {
586 pfm_find_event( retired_events[
i], &idx );
587 pfm_mont_get_event_umask( idx, umasks_retired +
i );
590 pfm_get_event_code( idx, &retired_code );
597 for (
i = 0;
i < mont_output_param->pfp_mont_irange.rr_nbr_used;
600 ibrp = mont_output_param->pfp_mont_irange.rr_br[
i].reg_num >> 1;
603 for ( j = 0; j < evt->
inp.pfp_event_count; j++ ) {
604 pfm_get_event_code( evt->
inp.pfp_events[j].event, &code );
605 if ( code != retired_code )
608 pfm_mont_get_event_umask( evt->
inp.pfp_events[j].event,
610 if ( umask == umasks_retired[ibrp] )
613 if ( seen_retired && j == evt->
inp.pfp_event_count )
615 (
"warning: code range uses IBR pair %d which is not monitored using %s\n",
616 ibrp, retired_events[ibrp] );
620 PAPIERROR(
"PMU type %d is not supported by this component",
629 unsigned int i, used_dbr;
633 pfmlib_ita2_output_param_t *ita2_output_param;
635 pfmlib_mont_output_param_t *mont_output_param;
638 memset( mont_dbreg, 0,
sizeof ( mont_dbreg ) );
639 memset( ita2_dbreg, 0,
sizeof ( ita2_dbreg ) );
643 case PFMLIB_ITANIUM2_PMU:
646 used_dbr = ita2_output_param->pfp_ita2_irange.rr_nbr_used;
648 for (
i = 0;
i < used_dbr;
i++ ) {
649 ita2_dbreg[
i].dbreg_num =
650 ita2_output_param->pfp_ita2_irange.rr_br[
i].reg_num;
651 ita2_dbreg[
i].dbreg_value =
652 ita2_output_param->pfp_ita2_irange.rr_br[
i].reg_value;
655 r = perfmonctl(
pid, PFM_WRITE_IBRS, ita2_dbreg,
656 ita2_output_param->pfp_ita2_irange.rr_nbr_used );
658 SUBDBG(
"cannot install code range restriction: %s\n",
664 case PFMLIB_MONTECITO_PMU:
668 used_dbr = mont_output_param->pfp_mont_irange.rr_nbr_used;
670 for (
i = 0;
i < used_dbr;
i++ ) {
671 mont_dbreg[
i].dbreg_num =
672 mont_output_param->pfp_mont_irange.rr_br[
i].reg_num;
673 mont_dbreg[
i].dbreg_value =
674 mont_output_param->pfp_mont_irange.rr_br[
i].reg_value;
677 r = perfmonctl(
pid, PFM_WRITE_IBRS, mont_dbreg,
678 mont_output_param->pfp_mont_irange.rr_nbr_used );
680 SUBDBG(
"cannot install code range restriction: %s\n",
687 PAPIERROR(
"PMU type %d is not supported by this component",
697 unsigned int i, used_dbr;
701 pfmlib_ita2_output_param_t *ita2_output_param;
703 pfmlib_mont_output_param_t *mont_output_param;
706 memset( mont_dbreg, 0,
sizeof ( mont_dbreg ) );
707 memset( ita2_dbreg, 0,
sizeof ( ita2_dbreg ) );
710 case PFMLIB_ITANIUM2_PMU:
713 used_dbr = ita2_output_param->pfp_ita2_drange.rr_nbr_used;
715 for (
i = 0;
i < used_dbr;
i++ ) {
716 ita2_dbreg[
i].dbreg_num =
717 ita2_output_param->pfp_ita2_drange.rr_br[
i].reg_num;
718 ita2_dbreg[
i].dbreg_value =
719 ita2_output_param->pfp_ita2_drange.rr_br[
i].reg_value;
722 r = perfmonctl(
pid, PFM_WRITE_DBRS, ita2_dbreg,
723 ita2_output_param->pfp_ita2_drange.rr_nbr_used );
725 SUBDBG(
"cannot install data range restriction: %s\n",
731 case PFMLIB_MONTECITO_PMU:
734 used_dbr = mont_output_param->pfp_mont_drange.rr_nbr_used;
736 for (
i = 0;
i < used_dbr;
i++ ) {
737 mont_dbreg[
i].dbreg_num =
738 mont_output_param->pfp_mont_drange.rr_br[
i].reg_num;
739 mont_dbreg[
i].dbreg_value =
740 mont_output_param->pfp_mont_drange.rr_br[
i].reg_value;
743 r = perfmonctl(
pid, PFM_WRITE_DBRS, mont_dbreg,
744 mont_output_param->pfp_mont_drange.rr_nbr_used );
746 SUBDBG(
"cannot install data range restriction: %s\n",
753 PAPIERROR(
"PMU type %d is not supported by this component",
773 pfmlib_input_param_t *inp = &evt->
inp;
774 pfmlib_ita2_input_param_t *ita2_inp =
776 pfmlib_ita2_output_param_t *ita2_outp =
778 pfmlib_mont_input_param_t *mont_inp =
780 pfmlib_mont_output_param_t *mont_outp =
784 case PFMLIB_ITANIUM2_PMU:
795 memset( &ita2_inp->pfp_ita2_drange, 0,
796 sizeof ( pfmlib_ita2_input_rr_t ) );
797 memset( ita2_outp, 0,
sizeof ( pfmlib_ita2_output_param_t ) );
798 inp->pfp_dfl_plm = PFM_PLM3;
799 ita2_inp->pfp_ita2_drange.rr_used = 1;
800 ita2_inp->pfp_ita2_drange.rr_limits[0].rr_start =
802 ita2_inp->pfp_ita2_drange.rr_limits[0].rr_end =
805 (
"++++ before data range : [%#016lx-%#016lx=%ld]: %d pair of debug registers used\n" 806 " start_offset:-%#lx end_offset:+%#lx\n",
807 ita2_inp->pfp_ita2_drange.rr_limits[0].rr_start,
808 ita2_inp->pfp_ita2_drange.rr_limits[0].rr_end,
809 ita2_inp->pfp_ita2_drange.rr_limits[0].rr_end -
810 ita2_inp->pfp_ita2_drange.rr_limits[0].rr_start,
811 ita2_outp->pfp_ita2_drange.rr_nbr_used >> 1,
812 ita2_outp->pfp_ita2_drange.rr_infos[0].rr_soff,
813 ita2_outp->pfp_ita2_drange.rr_infos[0].rr_eoff );
819 SUBDBG(
"cannot configure events: %s\n", pfm_strerror(
ret ) );
823 (
"++++ data range : [%#016lx-%#016lx=%ld]: %d pair of debug registers used\n" 824 " start_offset:-%#lx end_offset:+%#lx\n",
825 ita2_inp->pfp_ita2_drange.rr_limits[0].rr_start,
826 ita2_inp->pfp_ita2_drange.rr_limits[0].rr_end,
827 ita2_inp->pfp_ita2_drange.rr_limits[0].rr_end -
828 ita2_inp->pfp_ita2_drange.rr_limits[0].rr_start,
829 ita2_outp->pfp_ita2_drange.rr_nbr_used >> 1,
830 ita2_outp->pfp_ita2_drange.rr_infos[0].rr_soff,
831 ita2_outp->pfp_ita2_drange.rr_infos[0].rr_eoff );
841 ita2_outp->pfp_ita2_drange.rr_infos[0].rr_soff;
843 ita2_outp->pfp_ita2_drange.rr_infos[0].rr_eoff;
848 case PFMLIB_MONTECITO_PMU:
859 memset( &mont_inp->pfp_mont_drange, 0,
860 sizeof ( pfmlib_mont_input_rr_t ) );
861 memset( mont_outp, 0,
sizeof ( pfmlib_mont_output_param_t ) );
862 inp->pfp_dfl_plm = PFM_PLM3;
863 mont_inp->pfp_mont_drange.rr_used = 1;
864 mont_inp->pfp_mont_drange.rr_limits[0].rr_start =
866 mont_inp->pfp_mont_drange.rr_limits[0].rr_end =
869 (
"++++ before data range : [%#016lx-%#016lx=%ld]: %d pair of debug registers used\n" 870 " start_offset:-%#lx end_offset:+%#lx\n",
871 mont_inp->pfp_mont_drange.rr_limits[0].rr_start,
872 mont_inp->pfp_mont_drange.rr_limits[0].rr_end,
873 mont_inp->pfp_mont_drange.rr_limits[0].rr_end -
874 mont_inp->pfp_mont_drange.rr_limits[0].rr_start,
875 mont_outp->pfp_mont_drange.rr_nbr_used >> 1,
876 mont_outp->pfp_mont_drange.rr_infos[0].rr_soff,
877 mont_outp->pfp_mont_drange.rr_infos[0].rr_eoff );
882 SUBDBG(
"cannot configure events: %s\n", pfm_strerror(
ret ) );
886 (
"++++ data range : [%#016lx-%#016lx=%ld]: %d pair of debug registers used\n" 887 " start_offset:-%#lx end_offset:+%#lx\n",
888 mont_inp->pfp_mont_drange.rr_limits[0].rr_start,
889 mont_inp->pfp_mont_drange.rr_limits[0].rr_end,
890 mont_inp->pfp_mont_drange.rr_limits[0].rr_end -
891 mont_inp->pfp_mont_drange.rr_limits[0].rr_start,
892 mont_outp->pfp_mont_drange.rr_nbr_used >> 1,
893 mont_outp->pfp_mont_drange.rr_infos[0].rr_soff,
894 mont_outp->pfp_mont_drange.rr_infos[0].rr_eoff );
904 mont_outp->pfp_mont_drange.rr_infos[0].rr_soff;
906 mont_outp->pfp_mont_drange.rr_infos[0].rr_eoff;
912 PAPIERROR(
"PMU type %d is not supported by this component",
925 pfmlib_input_param_t *inp = &evt->
inp;
926 pfmlib_ita2_input_param_t *ita2_inp =
928 pfmlib_ita2_output_param_t *ita2_outp =
930 pfmlib_mont_input_param_t *mont_inp =
932 pfmlib_mont_output_param_t *mont_outp =
936 case PFMLIB_ITANIUM2_PMU:
947 memset( &ita2_inp->pfp_ita2_irange, 0,
948 sizeof ( pfmlib_ita2_input_rr_t ) );
949 memset( ita2_outp, 0,
sizeof ( pfmlib_ita2_output_param_t ) );
950 inp->pfp_dfl_plm = PFM_PLM3;
951 ita2_inp->pfp_ita2_irange.rr_used = 1;
952 ita2_inp->pfp_ita2_irange.rr_limits[0].rr_start =
954 ita2_inp->pfp_ita2_irange.rr_limits[0].rr_end =
957 (
"++++ before code range : [%#016lx-%#016lx=%ld]: %d pair of debug registers used\n" 958 " start_offset:-%#lx end_offset:+%#lx\n",
959 ita2_inp->pfp_ita2_irange.rr_limits[0].rr_start,
960 ita2_inp->pfp_ita2_irange.rr_limits[0].rr_end,
961 ita2_inp->pfp_ita2_irange.rr_limits[0].rr_end -
962 ita2_inp->pfp_ita2_irange.rr_limits[0].rr_start,
963 ita2_outp->pfp_ita2_irange.rr_nbr_used >> 1,
964 ita2_outp->pfp_ita2_irange.rr_infos[0].rr_soff,
965 ita2_outp->pfp_ita2_irange.rr_infos[0].rr_eoff );
971 SUBDBG(
"cannot configure events: %s\n", pfm_strerror(
ret ) );
975 (
"++++ code range : [%#016lx-%#016lx=%ld]: %d pair of debug registers used\n" 976 " start_offset:-%#lx end_offset:+%#lx\n",
977 ita2_inp->pfp_ita2_irange.rr_limits[0].rr_start,
978 ita2_inp->pfp_ita2_irange.rr_limits[0].rr_end,
979 ita2_inp->pfp_ita2_irange.rr_limits[0].rr_end -
980 ita2_inp->pfp_ita2_irange.rr_limits[0].rr_start,
981 ita2_outp->pfp_ita2_irange.rr_nbr_used >> 1,
982 ita2_outp->pfp_ita2_irange.rr_infos[0].rr_soff,
983 ita2_outp->pfp_ita2_irange.rr_infos[0].rr_eoff );
986 ita2_outp->pfp_ita2_irange.rr_infos[0].rr_soff;
988 ita2_outp->pfp_ita2_irange.rr_infos[0].rr_eoff;
992 case PFMLIB_MONTECITO_PMU:
1003 memset( &mont_inp->pfp_mont_irange, 0,
1004 sizeof ( pfmlib_mont_input_rr_t ) );
1005 memset( mont_outp, 0,
sizeof ( pfmlib_mont_output_param_t ) );
1006 inp->pfp_dfl_plm = PFM_PLM3;
1007 mont_inp->pfp_mont_irange.rr_used = 1;
1008 mont_inp->pfp_mont_irange.rr_limits[0].rr_start =
1010 mont_inp->pfp_mont_irange.rr_limits[0].rr_end =
1013 (
"++++ before code range : [%#016lx-%#016lx=%ld]: %d pair of debug registers used\n" 1014 " start_offset:-%#lx end_offset:+%#lx\n",
1015 mont_inp->pfp_mont_irange.rr_limits[0].rr_start,
1016 mont_inp->pfp_mont_irange.rr_limits[0].rr_end,
1017 mont_inp->pfp_mont_irange.rr_limits[0].rr_end -
1018 mont_inp->pfp_mont_irange.rr_limits[0].rr_start,
1019 mont_outp->pfp_mont_irange.rr_nbr_used >> 1,
1020 mont_outp->pfp_mont_irange.rr_infos[0].rr_soff,
1021 mont_outp->pfp_mont_irange.rr_infos[0].rr_eoff );
1027 SUBDBG(
"cannot configure events: %s\n", pfm_strerror(
ret ) );
1031 (
"++++ code range : [%#016lx-%#016lx=%ld]: %d pair of debug registers used\n" 1032 " start_offset:-%#lx end_offset:+%#lx\n",
1033 mont_inp->pfp_mont_irange.rr_limits[0].rr_start,
1034 mont_inp->pfp_mont_irange.rr_limits[0].rr_end,
1035 mont_inp->pfp_mont_irange.rr_limits[0].rr_end -
1036 mont_inp->pfp_mont_irange.rr_limits[0].rr_start,
1037 mont_outp->pfp_mont_irange.rr_nbr_used >> 1,
1038 mont_outp->pfp_mont_irange.rr_infos[0].rr_soff,
1039 mont_outp->pfp_mont_irange.rr_infos[0].rr_eoff );
1042 mont_outp->pfp_mont_irange.rr_infos[0].rr_soff;
1044 mont_outp->pfp_mont_irange.rr_infos[0].rr_eoff;
1049 PAPIERROR(
"PMU type %d is not supported by this component",
1061 if ( pfm_get_num_counters( &
tmp ) != PFMLIB_SUCCESS )
1071 if ( pfm_get_num_events( &
tmp ) != PFMLIB_SUCCESS )
1123 {
"L1D_READ_MISSES_RETIRED",
"L2_INST_DEMAND_READS"}, {0}},
1125 {
PAPI_L1_DCM, 0, {
"L1D_READ_MISSES_RETIRED"}, {0}},
1128 {
PAPI_L2_ICM, 0, {
"L3_READS_INST_READS_ALL"}, {0}},
1130 {
PAPI_L3_ICM, 0, {
"L3_READS_INST_READS_MISS"}, {0}},
1132 {
"L3_READS_DATA_READS_MISS",
"L3_WRITES_DATA_WRITES_MISS"}, {0}},
1133 {
PAPI_L3_LDM, 0, {
"L3_READS_DATA_READS_MISS"}, {0}},
1134 {
PAPI_L3_STM, 0, {
"L3_WRITES_DATA_WRITES_MISS"}, {0}},
1135 {
PAPI_L1_LDM, 0, {
"L1D_READ_MISSES_RETIRED"}, {0}},
1136 {
PAPI_L2_LDM, 0, {
"L3_READS_DATA_READS_ALL"}, {0}},
1137 {
PAPI_L2_STM, 0, {
"L3_WRITES_ALL_WRITES_ALL"}, {0}},
1139 {
"L3_READS_DATA_READS_HIT",
"L3_WRITES_DATA_WRITES_HIT"}, {0}},
1143 {
PAPI_L2_DCA, 0, {
"L2_DATA_REFERENCES_ALL"}, {0}},
1145 {
"L3_READS_DATA_READS_ALL",
"L3_WRITES_DATA_WRITES_ALL"}, {0}},
1146 {
PAPI_L2_DCR, 0, {
"L2_DATA_REFERENCES_READS"}, {0}},
1147 {
PAPI_L3_DCR, 0, {
"L3_READS_DATA_READS_ALL"}, {0}},
1148 {
PAPI_L2_DCW, 0, {
"L2_DATA_REFERENCES_WRITES"}, {0}},
1149 {
PAPI_L3_DCW, 0, {
"L3_WRITES_DATA_WRITES_ALL"}, {0}},
1150 {
PAPI_L3_ICH, 0, {
"L3_READS_INST_READS_HIT"}, {0}},
1153 {
"L2_INST_DEMAND_READS",
"L2_INST_PREFETCH_READS"}, {0}},
1154 {
PAPI_L3_ICR, 0, {
"L3_READS_INST_READS_ALL"}, {0}},
1160 {
PAPI_BR_PRC, 0, {
"BRANCH_PREDICTOR_ALL_CORRECT_PREDICTIONS"}, {0}},
1162 {
"BRANCH_PREDICTOR_ALL_WRONG_PATH",
"BRANCH_PREDICTOR_ALL_WRONG_TARGET"},
1176 {
"BUS_MEM_READ_BRIL_SELF",
"BUS_MEM_READ_BIL_SELF"}, {0}},
1185 {
"L2_DATA_REFERENCES_L2_DATA_READS",
"L2_INST_DEMAND_READS",
1186 "L2_INST_PREFETCHES"}, {0}},
1193 {
PAPI_L2_ICM, 0, {
"L3_READS_INST_FETCH_ALL"}, {0}},
1195 {
PAPI_L3_ICM, 0, {
"L3_READS_INST_FETCH_MISS"}, {0}},
1197 {
"L3_READS_DATA_READ_MISS",
"L3_WRITES_DATA_WRITE_MISS"}, {0}},
1199 {
PAPI_L3_STM, 0, {
"L3_WRITES_DATA_WRITE_MISS"}, {0}},
1207 {
"L3_READS_DATA_READ_HIT",
"L3_WRITES_DATA_WRITE_HIT"}, {0}},
1209 {
PAPI_L2_DCA, 0, {
"L2_DATA_REFERENCES_L2_ALL"}, {0}},
1211 {
"L3_READS_DATA_READ_ALL",
"L3_WRITES_DATA_WRITE_ALL"}, {0}},
1213 {
PAPI_L2_DCR, 0, {
"L2_DATA_REFERENCES_L2_DATA_READS"}, {0}},
1214 {
PAPI_L3_DCR, 0, {
"L3_READS_DATA_READ_ALL"}, {0}},
1215 {
PAPI_L2_DCW, 0, {
"L2_DATA_REFERENCES_L2_DATA_WRITES"}, {0}},
1216 {
PAPI_L3_DCW, 0, {
"L3_WRITES_DATA_WRITE_ALL"}, {0}},
1217 {
PAPI_L3_ICH, 0, {
"L3_READS_DINST_FETCH_HIT"}, {0}},
1221 {
PAPI_L3_ICR, 0, {
"L3_READS_INST_FETCH_ALL"}, {0}},
1230 {
PAPI_TLB_IM, 0, {
"ITLB_MISSES_FETCH_L2ITLB"}, {0}},
1232 {
PAPI_BR_PRC, 0, {
"BR_MISPRED_DETAIL_ALL_CORRECT_PRED"}, {0}},
1234 {
"BR_MISPRED_DETAIL_ALL_WRONG_PATH",
"BR_MISPRED_DETAIL_ALL_WRONG_TARGET"},
1243 {
PAPI_L3_ICA, 0, {
"L3_READS_INST_FETCH_ALL"}, {0}},
1246 {
PAPI_L2_TCW, 0, {
"L2_DATA_REFERENCES_L2_DATA_WRITES"}, {0}},
1252 {
PAPI_CA_SNP, 0, {
"BUS_SNOOP_STALL_CYCLES_ANY"}, {0}},
1254 {
"BUS_MEM_READ_BRIL_SELF",
"BUS_MEM_READ_BIL_SELF"}, {0}},
1265 {
"L2D_REFERENCES_READS",
"L2I_READS_ALL_DMND",
"L2I_READS_ALL_PFTCH"},
1275 {
PAPI_L2_TCM, 0, {
"L2I_READS_MISS_ALL",
"L2D_MISSES"}, {0}},
1279 {
PAPI_L3_ICM, 0, {
"L3_READS_INST_FETCH_MISS:M:E:S:I"}, {0}},
1281 {
"L3_READS_DATA_READ_MISS:M:E:S:I",
"L3_WRITES_DATA_WRITE_MISS:M:E:S:I"},
1283 {
PAPI_L3_LDM, 0, {
"L3_READS_ALL_MISS:M:E:S:I"}, {0}},
1284 {
PAPI_L3_STM, 0, {
"L3_WRITES_DATA_WRITE_MISS:M:E:S:I"}, {0}},
1289 {
PAPI_L2_LDM, 0, {
"L3_READS_ALL_ALL:M:E:S:I"}, {0}},
1290 {
PAPI_L2_STM, 0, {
"L3_WRITES_ALL_ALL:M:E:S:I"}, {0}},
1294 {
"L3_READS_DATA_READ_HIT:M:E:S:I",
"L3_WRITES_DATA_WRITE_HIT:M:E:S:I"},
1301 {
PAPI_L3_DCR, 0, {
"L3_READS_DATA_READ_ALL:M:E:S:I"}, {0}},
1303 {
PAPI_L3_DCW, 0, {
"L3_WRITES_DATA_WRITE_ALL:M:E:S:I"}, {0}},
1304 {
PAPI_L3_ICH, 0, {
"L3_READS_DINST_FETCH_HIT:M:E:S:I"}, {0}},
1307 {
PAPI_L3_ICR, 0, {
"L3_READS_INST_FETCH_ALL:M:E:S:I"}, {0}},
1314 {
PAPI_L3_TCR, 0, {
"L3_READS_ALL_ALL:M:E:S:I"}, {0}},
1315 {
PAPI_L3_TCW, 0, {
"L3_WRITES_ALL_ALL:M:E:S:I"}, {0}},
1317 {
PAPI_TLB_IM, 0, {
"ITLB_MISSES_FETCH_L2ITLB"}, {0}},
1319 {
PAPI_BR_PRC, 0, {
"BR_MISPRED_DETAIL_ALL_CORRECT_PRED"}, {0}},
1321 {
"BR_MISPRED_DETAIL_ALL_WRONG_PATH",
"BR_MISPRED_DETAIL_ALL_WRONG_TARGET"},
1330 {
PAPI_L3_ICA, 0, {
"L3_READS_INST_FETCH_ALL:M:E:S:I"}, {0}},
1336 {
"L1I_PREFETCHES",
"L1I_READS",
"L1D_READS_SET0"}, {0}},
1353 unsigned int *umask )
1355 unsigned int tevent, major, minor;
1365 SUBDBG(
"EventCode %#08x is event %d, umask %#x\n", EventCode, major,
1377 SUBDBG(
"Old native index was %#08x with %#08x mask\n",
tmp, mask );
1387 unsigned int tmp = foo,
i, j = 0;
1392 while ( (
i = ffs(
tmp ) ) ) {
1393 tmp =
tmp ^ ( 1 << (
i - 1 ) );
1404 unsigned int event, umask, num_masks;
1415 ret = pfm_get_num_event_masks( event, &num_masks );
1416 SUBDBG(
"pfm_get_num_event_masks: event=%d num_masks=%d\n", event,
1418 if (
ret != PFMLIB_SUCCESS ) {
1419 PAPIERROR(
"pfm_get_num_event_masks(%d,%p): %s", event, &num_masks,
1420 pfm_strerror(
ret ) );
1425 SUBDBG(
"This is umask %d of %d\n", umask, num_masks );
1434 if ( umask + 1 < (
unsigned ) ( 1 << num_masks ) ) {
1440 int thisbit = ffs( umask );
1442 SUBDBG(
"First bit is %d in %08x\b\n", thisbit - 1, umask );
1443 thisbit = 1 << thisbit;
1445 if ( thisbit & ( ( 1 << num_masks ) - 1 ) ) {
1464 pfmlib_event_t event;
1465 unsigned int i, mask = 0;
1468 SUBDBG(
"pfm_find_full_event(%s,%p)\n",
name, &event );
1469 ret = pfm_find_full_event(
name, &event );
1470 if (
ret == PFMLIB_SUCCESS ) {
1473 SUBDBG(
"num_masks (%d) > max masks (%d)\n", event.num_masks,
1478 for (
i = 0;
i <
event.num_masks;
i++ ) {
1480 SUBDBG(
"mask index (%d) > max masks (%d)\n",
1484 mask |= 1 <<
event.unit_masks[
i];
1487 SUBDBG(
"event_code: %#x event: %d num_masks: %d\n", *event_code,
1488 event.event, event.num_masks );
1491 }
else if (
ret == PFMLIB_ERR_UMASK ) {
1492 ret = pfm_find_event(
name, &event.event );
1493 if (
ret == PFMLIB_SUCCESS ) {
1505 unsigned int event, umask;
1506 pfmlib_event_t gete;
1508 memset( &gete, 0,
sizeof ( gete ) );
1515 if ( gete.num_masks == 0 )
1516 ret = pfm_get_event_name( gete.event, ntv_name, len );
1518 ret = pfm_get_full_event_name( &gete, ntv_name, len );
1519 if (
ret != PFMLIB_SUCCESS ) {
1521 pfm_get_event_name( gete.event,
tmp, sizeof (
tmp ) );
1523 (
"pfm_get_full_event_name(%p(event %d,%s,%d masks),%p,%d): %d -- %s",
1524 &gete, gete.event,
tmp, gete.num_masks, ntv_name, len,
ret,
1525 pfm_strerror(
ret ) );
1526 if (
ret == PFMLIB_ERR_FULL )
1536 unsigned int event, umask;
1537 char *eventd, **maskd, *
tmp;
1538 int i,
ret, total_len = 0;
1539 pfmlib_event_t gete;
1541 memset( &gete, 0,
sizeof ( gete ) );
1546 ret = pfm_get_event_description( event, &eventd );
1547 if (
ret != PFMLIB_SUCCESS ) {
1548 PAPIERROR(
"pfm_get_event_description(%d,%p): %s",
1549 event, &eventd, pfm_strerror(
ret ) );
1553 if ( ( gete.num_masks =
prepare_umask( umask, gete.unit_masks ) ) ) {
1554 maskd = (
char ** ) malloc( gete.num_masks * sizeof (
char * ) );
1555 if ( maskd == NULL ) {
1559 for (
i = 0;
i < ( int ) gete.num_masks;
i++ ) {
1561 pfm_get_event_mask_description( event, gete.unit_masks[
i],
1563 if (
ret != PFMLIB_SUCCESS ) {
1564 PAPIERROR(
"pfm_get_event_mask_description(%d,%d,%p): %s",
1565 event, umask, &maskd, pfm_strerror(
ret ) );
1567 for ( ;
i >= 0;
i-- )
1572 total_len += strlen( maskd[
i] );
1575 (
char * ) malloc( strlen( eventd ) + strlen(
", masks:" ) +
1576 total_len + gete.num_masks + 1 );
1577 if (
tmp == NULL ) {
1578 for (
i = gete.num_masks - 1;
i >= 0;
i-- )
1584 strcat(
tmp, eventd );
1585 strcat(
tmp,
", masks:" );
1586 for (
i = 0;
i < ( int ) gete.num_masks;
i++ ) {
1589 strcat(
tmp, maskd[
i] );
1594 tmp = (
char * ) malloc( strlen( eventd ) + 1 );
1595 if (
tmp == NULL ) {
1600 strcat(
tmp, eventd );
1603 strncpy( ntv_descr,
tmp, len );
1604 if ( strlen(
tmp ) > (
unsigned int ) len - 1 )
1633 int pnum,
i = 0,
cnt;
1644 if ( psmap == NULL )
1658 while ( *findme != NULL ) {
1660 PAPIERROR(
"Count (%d) == MAX_COUNTER_TERMS (%d)\n",
cnt,
1668 (
unsigned int * ) &psmap[
i].data.
native[
cnt] ) !=
1670 PAPIERROR(
"_papi_pfm_ntv_name_to_code(%s) failed\n",
1677 if ( pfm_find_event_byname
1679 (
unsigned int * ) &psmap[
i].data.
native[
cnt] ) !=
1681 PAPIERROR(
"pfm_find_event_byname(%s) failed\n", *findme );
1707 while ( fgets( line, 256,
f ) != NULL ) {
1708 if ( strstr( line, search_str ) != NULL ) {
1710 for (
s = line; *
s && ( *
s !=
':' ); ++
s );
1723 int mode = 0, did = 0,
i;
1746 pfm_ita_pmc_reg_t value;
1747 SUBDBG(
"slot %d, register %lud active, config value %#lx\n",
1752 value.pmc_ita_count_reg.pmc_plm = mode;
1755 SUBDBG(
"new config value %#lx\n",
1766 int mode = 0, did = 0,
i;
1789 pfm_ita2_pmc_reg_t value;
1790 SUBDBG(
"slot %d, register %lud active, config value %#lx\n",
1795 value.pmc_ita2_counter_reg.pmc_plm = mode;
1798 SUBDBG(
"new config value %#lx\n",
1809 int mode = 0, did = 0,
i;
1832 pfm_mont_pmc_reg_t value;
1833 SUBDBG(
"slot %d, register %lud active, config value %#lx\n",
1838 value.pmc_mont_counter_reg.pmc_plm = mode;
1841 SUBDBG(
"new config value %#lx\n",
1853 case PFMLIB_ITANIUM_PMU:
1856 case PFMLIB_ITANIUM2_PMU:
1859 case PFMLIB_MONTECITO_PMU:
1863 PAPIERROR(
"PMU type %d is not supported by this component",
1872 ( void ) this_state;
1889 long long **
events,
int flags )
1896 memset( readem, 0x0,
sizeof readem );
1908 SUBDBG(
"perfmonctl error READ_PMDS errno %d\n",
errno );
1915 readem[
i].reg_value;
1916 SUBDBG(
"read counters is %ld\n", readem[
i].reg_value );
1920 pfm_ita_pmc_reg_t flop_hack;
1924 if ( flop_hack.pmc_ita_count_reg.pmc_es == 0xa )
1936 long long **
events,
int flags )
1943 memset( readem, 0x0,
sizeof readem );
1955 SUBDBG(
"perfmonctl error READ_PMDS errno %d\n",
errno );
1962 readem[
i].reg_value;
1963 SUBDBG(
"read counters is %ld\n", readem[
i].reg_value );
1973 long long **
events,
int flags )
1976 case PFMLIB_ITANIUM_PMU:
1979 case PFMLIB_ITANIUM2_PMU:
1982 case PFMLIB_MONTECITO_PMU:
1986 PAPIERROR(
"PMU type %d is not supported by this component",
2024 pfmlib_options_t pfmlib_options;
2032 if ( pfm_initialize( ) != PFMLIB_SUCCESS )
2035 if ( pfm_get_version( &
version ) != PFMLIB_SUCCESS )
2038 if ( PFM_VERSION_MAJOR(
version ) != PFM_VERSION_MAJOR( PFMLIB_VERSION ) ) {
2039 PAPIERROR(
"Version mismatch of libpfm: compiled %#x vs. installed %#x",
2040 PFM_VERSION_MAJOR( PFMLIB_VERSION ),
2041 PFM_VERSION_MAJOR(
version ) );
2045 memset( &pfmlib_options, 0,
sizeof ( pfmlib_options ) );
2048 pfmlib_options.pfm_debug = 1;
2049 pfmlib_options.pfm_verbose = 1;
2053 if ( pfm_set_options( &pfmlib_options ) )
2056 if ( pfm_get_pmu_type( &type ) != PFMLIB_SUCCESS )
2064 case PFMLIB_ITANIUM_PMU:
2067 case PFMLIB_ITANIUM2_PMU:
2070 case PFMLIB_MONTECITO_PMU:
2074 PAPIERROR(
"PMU type %d is not supported by this component", type );
2089 "%08x", PFMLIB_VERSION );
2131 #if defined(USE_PROC_PTTIMER) 2135 sprintf(
buf,
"/proc/%d/task/%d/stat", getpid( ),
mygettid( ) );
2156 memset( writeem, 0,
sizeof writeem );
2161 writeem[
i].reg_value = machdep->pd[
i].reg_long_reset;
2164 ( ctx->tid, ctx->fd, PFM_WRITE_PMDS, writeem,
2202 PFM_WRITE_PMDS, current_state->pd,
2228 return ns + leftover_ns;
2304 #if defined(USE_PROC_PTTIMER) 2305 close( ctx->stat_fd );
2317 unsigned long buf_pos;
2318 unsigned long entry_size;
2320 unsigned int i, EventCode = 0, eventindex, native_index = 0;
2322 pfm_ita_pmd_reg_t *reg;
2323 unsigned long overflow_vector, pc;
2337 buf_pos = (
unsigned long ) ( hdr + 1 );
2338 for (
i = 0;
i < hdr->hdr_count;
i++ ) {
2342 overflow_vector = 1 << ent->ovfl_pmd;
2344 SUBDBG(
"Entry %d PID:%d CPU:%d ovfl_vector:%#lx IIP:%#016lx\n",
2345 i, ent->pid, ent->cpu, overflow_vector, ent->ip );
2347 while ( overflow_vector ) {
2348 reg_num = ffs( overflow_vector ) - 1;
2364 (
"wrong count: %d vs. ESI->profile.event_counter %d\n",
2371 if ( pfm_ita_is_dear( native_index ) ) {
2372 reg = ( pfm_ita_pmd_reg_t * ) ( ent + 1 );
2375 pc = ( reg->pmd17_ita_reg.dear_iaddr << 4 ) | ( reg->
2384 overflow_vector ^= (
unsigned long ) 1 << reg_num;
2387 buf_pos += entry_size;
2398 unsigned long buf_pos;
2399 unsigned long entry_size;
2401 unsigned int i, EventCode = 0, eventindex, native_index = 0;
2403 pfm_ita2_pmd_reg_t *reg;
2404 unsigned long overflow_vector, pc;
2418 buf_pos = (
unsigned long ) ( hdr + 1 );
2419 for (
i = 0;
i < hdr->hdr_count;
i++ ) {
2423 overflow_vector = 1 << ent->ovfl_pmd;
2425 SUBDBG(
"Entry %d PID:%d CPU:%d ovfl_vector:%#lx IIP:%#016lx\n",
2426 i, ent->pid, ent->cpu, overflow_vector, ent->ip );
2428 while ( overflow_vector ) {
2429 reg_num = ffs( overflow_vector ) - 1;
2445 (
"wrong count: %d vs. ESI->profile.event_counter %d\n",
2452 if ( pfm_ita2_is_dear( native_index ) ) {
2453 reg = ( pfm_ita2_pmd_reg_t * ) ( ent + 1 );
2456 pc = ( ( reg->pmd17_ita2_reg.dear_iaddr +
2457 reg->pmd17_ita2_reg.dear_bn ) << 4 )
2458 | reg->pmd17_ita2_reg.dear_slot;
2466 overflow_vector ^= (
unsigned long ) 1 << reg_num;
2469 buf_pos += entry_size;
2480 unsigned long buf_pos;
2481 unsigned long entry_size;
2483 unsigned int i, EventCode = 0, eventindex, native_index = 0;
2485 pfm_mont_pmd_reg_t *reg;
2486 unsigned long overflow_vector, pc;
2501 buf_pos = (
unsigned long ) ( hdr + 1 );
2502 for (
i = 0;
i < hdr->hdr_count;
i++ ) {
2506 overflow_vector = 1 << ent->ovfl_pmd;
2508 SUBDBG(
"Entry %d PID:%d CPU:%d ovfl_vector:%#lx IIP:%#016lx\n",
2509 i, ent->pid, ent->cpu, overflow_vector, ent->ip );
2511 while ( overflow_vector ) {
2512 reg_num = ffs( overflow_vector ) - 1;
2529 (
"wrong count: %d vs. ESI->profile.event_counter %d\n",
2536 if ( pfm_mont_is_dear( native_index ) ) {
2537 reg = ( pfm_mont_pmd_reg_t * ) ( ent + 1 );
2540 pc = ( ( reg->pmd36_mont_reg.dear_iaddr +
2541 reg->pmd36_mont_reg.dear_bn ) << 4 )
2542 | reg->pmd36_mont_reg.dear_slot;
2549 overflow_vector ^= (
unsigned long ) 1 << reg_num;
2552 buf_pos += entry_size;
2561 case PFMLIB_ITANIUM_PMU:
2564 case PFMLIB_ITANIUM2_PMU:
2567 case PFMLIB_MONTECITO_PMU:
2571 PAPIERROR(
"PMU type %d is not supported by this component",
2588 PAPIERROR(
"thread == NULL in _papi_hwd_dispatch_timer!" );
2602 if (
thread->running_eventset[
cidx]->overflow.
2615 if (
errno == EINTR ) {
2616 SUBDBG(
"read(%d) interrupted, retrying\n",
fd );
2621 }
else if (
ret !=
sizeof ( msg ) ) {
2622 PAPIERROR(
"read(%d): short %d vs. %d bytes",
fd,
ret,
sizeof ( msg ) );
2625 #if defined(HAVE_PFM_MSG_TYPE) 2626 if ( msg.type == PFM_MSG_END ) {
2627 SUBDBG(
"PFM_MSG_END\n" );
2630 if ( msg.type != PFM_MSG_OVFL ) {
2631 PAPIERROR(
"unexpected msg type %d", msg.type );
2635 if ( msg.pfm_gen_msg.msg_type == PFM_MSG_END ) {
2636 SUBDBG(
"PFM_MSG_END\n" );
2639 if ( msg.pfm_gen_msg.msg_type != PFM_MSG_OVFL ) {
2640 PAPIERROR(
"unexpected msg type %d", msg.pfm_gen_msg.msg_type );
2660 strerror(
errno ) );
2675 unsigned int hwcntr;
2685 SUBDBG(
"Found hw counter %d in %d, flags %d\n", hwcntr,
i,
2751 SUBDBG(
"Hardware counter %d used in overflow, threshold %d\n", j,
2765 this_state->pd[j].reg_value = 0;
2766 this_state->pd[j].reg_long_reset = 0;
2767 this_state->pd[j].reg_short_reset = 0;
2777 set_notify( ESI, EventIndex, PFM_REGFL_OVFL_NOTIFY );
2779 this_state->pd[j].reg_value =
2780 ( ~0UL ) - (
unsigned long )
threshold + 1;
2781 this_state->pd[j].reg_short_reset =
2782 ( ~0UL ) - (
unsigned long )
threshold + 1;
2783 this_state->pd[j].reg_long_reset =
2784 ( ~0UL ) - (
unsigned long )
threshold + 1;
2804 strncpy( ntv_name,
name, len );
2815 #if defined(HAVE_PFM_GET_EVENT_DESCRIPTION) 2828 switch ( modifier ) {
2875 evt = &( ptr->
evt );
2895 evt = &( ptr->
evt );
2917 evt = &( ptr->
evt );
2935 case PFMLIB_ITANIUM_PMU:
2938 case PFMLIB_ITANIUM2_PMU:
2941 case PFMLIB_MONTECITO_PMU:
2945 PAPIERROR(
"PMU type %d is not supported by this component",
2955 ( void ) this_state;
2956 ( void ) nativeInfo;
2969 unsigned int i, j, event, umask, EventCode;
2970 pfmlib_event_t gete;
2978 memset( &evt->
inp.pfp_unavail_pmcs, 0, sizeof ( pfmlib_regmask_t ) );
2991 memset( &evt->
inp.pfp_unavail_pmcs, 0, sizeof ( pfmlib_regmask_t ) );
2993 SUBDBG(
" original count is %d\n", org_cnt );
2996 for (
i = 0;
i < (
unsigned int )
count;
i++ ) {
2997 memset( &gete, 0,
sizeof ( gete ) );
2998 EventCode =
native[
i].ni_event;
3003 SUBDBG(
" evtcode=%#x evtindex=%d name: %s\n", EventCode, event,
3007 evt->
inp.pfp_events[
i].num_masks = 0;
3010 if ( gete.num_masks ) {
3011 evt->
inp.pfp_events[
i].num_masks = gete.num_masks;
3012 for ( j = 0; j < gete.num_masks; j++ )
3013 evt->
inp.pfp_events[
i].unit_masks[j] = gete.unit_masks[j];
3019 SUBDBG(
"pfmw_dispatch_events fail\n" );
3033 SUBDBG(
"event_code is %d, reg_num is %d\n",
3057 memset( &evt->
inp.pfp_unavail_pmcs, 0, sizeof ( pfmlib_regmask_t ) );
3069 memset( &evt->
inp.pfp_unavail_pmcs, 0, sizeof ( pfmlib_regmask_t ) );
3071 SUBDBG(
" original count is %d\n", org_cnt );
3074 for (
i = 0;
i < (
unsigned int )
count;
i++ ) {
3081 SUBDBG(
"pfmw_dispatch_events fail\n" );
3095 SUBDBG(
"event_code is %d, reg_num is %d\n",
3109 case PFMLIB_ITANIUM_PMU:
3113 case PFMLIB_ITANIUM2_PMU:
3117 case PFMLIB_MONTECITO_PMU:
3122 PAPIERROR(
"PMU type %d is not supported by this component",
3130 .
name =
"perfmon-ia64.c",
3141 .fast_real_timer = 1,
3142 .fast_virtual_timer = 0,
3144 .attach_must_ptrace = 0,
3145 .kernel_profile = 1,
int _ia64_ntv_enum_events(unsigned int *EventCode, int modifier)
pfmw_ita_param_t ita_lib_param
ssize_t read(int fd, void *buf, size_t count)
int _ia64_stop_profiling(ThreadInfo_t *thread, EventSetInfo_t *ESI)
int _ia64_mont_update_control_state(hwd_control_state_t *this_state, NativeInfo_t *native, int count, hwd_context_t *zero)
static int prepare_umask(unsigned int foo, unsigned int *values)
_papi_int_inherit_t inherit
static int pfmw_recreate_context(EventSetInfo_t *ESI, hwd_context_t *thr_ctx, void **smpl_vaddr, int EventIndex)
pfmlib_output_param_t outp
static itanium_preset_search_t ia1_preset_search_map[]
#define PFMON_MONT_MAX_IBRS
static void pfmw_stop(hwd_context_t *ctx)
int _ia64_ctl(hwd_context_t *zero, int code, _papi_int_option_t *option)
static void pfmw_start(hwd_context_t *ctx)
#define PAPI_DEF_ITIMER_NS
#define MONT_DEAR_REGS_MASK
int _ia64_init(hwd_context_t *zero)
#define PFMW_PEVT_DFLPLM(evt)
static int set_pmds_to_write(EventSetInfo_t *ESI, int index, unsigned long value)
static void pfmw_get_event_description(unsigned int idx, char *dest, int len)
#define PAPI_INSTR_ADDRESS
static int ia64_process_profile_buffer(ThreadInfo_t *thread, EventSetInfo_t *ESI)
int _ia64_mont_set_domain(hwd_control_state_t *this_state, int domain)
int _papi_pfm_ntv_code_to_descr(unsigned int EventCode, char *ntv_descr, int len)
_papi_int_addr_range_t address_range
int _perfmon2_pfm_pmu_type
char operation[MAX_COUNTERS *5]
int(* set_overflow)(EventSetInfo_t *, int, int)
int _ia64_shutdown(hwd_context_t *ctx)
int _ia64_ita_init_control_state(hwd_control_state_t *this_state)
static char * search_cpu_info(FILE *f, char *search_str, char *line)
#define PAPI_DATA_ADDRESS
int _ia64_init_component(int cidx)
static int pfmw_get_num_counters(int *num)
pfm_default_smpl_entry_t pfmw_smpl_entry_t
static int pfmw_perfmonctl(pid_t tid, int fd, int cmd, void *arg, int narg)
static int set_irange(hwd_context_t *ctx, hwd_control_state_t *current_state, _papi_int_option_t *option)
void _ia64_remove_native(hwd_control_state_t *this_state, NativeInfo_t *nativeInfo)
pfmw_ita1_param_t ita_param
#define PFMON_ITA2_MAX_IBRS
pfmlib_mont_input_param_t mont_input_param
papi_vector_t _ia64_vector
static int ia64_ita_process_profile_buffer(ThreadInfo_t *thread, EventSetInfo_t *ESI)
static int install_drange(hwd_context_t *pctx, hwd_control_state_t *current_state)
static int pfmw_create_context(hwd_context_t *thr_ctx)
static pid_t mygettid(void)
#define PFMW_PEVT_PFPPC_REG_VAL(evt, idx)
PAPI_component_info_t cmp_info
int _ia64_reset(hwd_context_t *ctx, hwd_control_state_t *machdep)
int _papi_pfm_ntv_enum_events(unsigned int *EventCode, int modifier)
#define PFMW_PEVT_PFPPC_REG_FLG(evt, idx)
Return codes and api definitions.
char support_version[PAPI_MIN_STR_LEN]
int _papi_pfm_ntv_code_to_name(unsigned int EventCode, char *ntv_name, int len)
char events[MAX_EVENTS][BUFSIZ]
static int _papi_pfm_ntv_name_to_code(const char *name, unsigned int *event_code)
_papi_int_itimer_t itimer
static itanium_preset_search_t ia3_preset_search_map[]
#define PFMW_PEVT_PFPPD(evt)
static int pfmw_is_dear(unsigned int i)
pfm_default_smpl_hdr_t pfmw_smpl_hdr_t
#define PAPI_2MAX_STR_LEN
static int pfmw_get_num_events(int *num)
unsigned int PAPI_NATIVE_UMASK_SHIFT
static int pfmw_destroy_context(hwd_context_t *thr_ctx)
#define PAPI_MAX_PRESET_EVENTS
#define PFMW_ARCH_REG_PMCVAL(reg)
static int pfmw_is_iear(unsigned int i)
int open(const char *pathname, int flags, mode_t mode)
unsigned int PAPI_NATIVE_UMASK_MAX
unsigned int PAPI_NATIVE_EVENT_AND_MASK
int _papi_hwi_setup_all_presets(hwi_search_t *findem, int cidx)
EventSetOverflowInfo_t overflow
#define PAPI_OVERFLOW_HARDWARE
PAPI_os_info_t _papi_os_info
int _linux_get_memory_info(PAPI_hw_info_t *hwinfo, int cpu_type)
struct _ThreadInfo * master
#define PFMW_PEVT_PFPPC(evt)
char kernel_version[PAPI_MIN_STR_LEN]
#define PFMW_PEVT_EVENT(evt, idx)
static int round_requested_ns(int ns)
hwd_ucontext_t * ucontext
hwi_search_t * preset_search_map
int _ia64_ita_set_domain(hwd_control_state_t *this_state, int domain)
static int pfmw_support_darr(unsigned int i)
int native[PAPI_EVENTS_IN_DERIVED_EVENT]
int _ia64_ita2_set_domain(hwd_control_state_t *this_state, int domain)
pfmw_ita2_param_t ita2_param
#define SUBDBG(format, args...)
#define MAX_COUNTER_TERMS
int _ia64_read(hwd_context_t *ctx, hwd_control_state_t *machdep, long long **events, int flags)
unsigned int PAPI_NATIVE_UMASK_AND_MASK
_papi_int_granularity_t granularity
static int ia64_ita2_process_profile_buffer(ThreadInfo_t *thread, EventSetInfo_t *ESI)
void PAPIERROR(char *format,...)
static int encode_native_event_raw(unsigned int event, unsigned int mask)
#define PMU_FIRST_COUNTER
static int set_inherit(int arg)
static int ia64_mont_process_profile_buffer(ThreadInfo_t *thread, EventSetInfo_t *ESI)
char name[PAPI_MAX_STR_LEN]
int _ia64_ita23_read(hwd_context_t *ctx, hwd_control_state_t *machdep, long long **events, int flags)
char operation[PAPI_2MAX_STR_LEN]
char * findme[MAX_COUNTERS]
pfmlib_ita2_output_param_t ita2_output_param
pfmlib_ita2_input_param_t ita2_input_param
int cnt[ctr_pcp_ntv_code_to_info+1]
_papi_int_multiplex_t multiplex
static int _ia64_modify_event(unsigned int event, int modifier)
NativeInfo_t * NativeInfoArray
int _ia64_set_profile(EventSetInfo_t *ESI, int EventIndex, int threshold)
EventInfo_t * EventInfoArray
static int pfmw_support_iarr(unsigned int i)
static int pfmw_dispatch_events(pfmw_param_t *evt)
int _ia64_set_overflow(EventSetInfo_t *ESI, int EventIndex, int threshold)
papi_mdi_t _papi_hwi_system_info
int _ia64_stop(hwd_context_t *ctx, hwd_control_state_t *zero)
int pos[PAPI_EVENTS_IN_DERIVED_EVENT]
static void check_ibrp_events(hwd_control_state_t *current_state)
#define PFMW_PEVT_EVTCOUNT(evt)
#define PFMW_PEVT_PFPPC_REG_NUM(evt, idx)
int _ia64_start(hwd_context_t *ctx, hwd_control_state_t *current_state)
__sighandler_t signal(int __sig, __sighandler_t __handler) __attribute__((__nothrow__
static itanium_preset_search_t ia2_preset_search_map[]
int generate_preset_search_map(hwi_search_t **maploc, itanium_preset_search_t *oldmap, int num_cnt)
int _ia64_set_domain(hwd_control_state_t *this_state, int domain)
int _ia64_ita_update_control_state(hwd_control_state_t *this_state, NativeInfo_t *native, int count, hwd_context_t *zero)
int _ia64_ita2_init_control_state(hwd_control_state_t *this_state)
static int set_default_domain(hwd_control_state_t *this_state, int domain)
#define PAPI_OVERFLOW_FORCE_SW
static int set_drange(hwd_context_t *ctx, hwd_control_state_t *current_state, _papi_int_option_t *option)
int _ia64_ntv_code_to_name(unsigned int EventCode, char *ntv_name, int len)
pfmlib_mont_output_param_t mont_output_param
static int install_irange(hwd_context_t *pctx, hwd_control_state_t *current_state)
int _ia64_mont_init_control_state(hwd_control_state_t *this_state)
static void ia64_dispatch_sigprof(int n, hwd_siginfo_t *info, hwd_ucontext_t *sc)
inline_static ThreadInfo_t * _papi_hwi_lookup_thread(int custom_tid)
pfmw_mont_param_t mont_param
#define PAPI_NATIVE_AND_MASK
#define PAPI_PROFIL_FORCE_SW
_papi_int_domain_t domain
int _ia64_update_control_state(hwd_control_state_t *this_state, NativeInfo_t *native, int count, hwd_context_t *zero)
static int pfmw_create_ctx_common(hwd_context_t *ctx)
unsigned int PAPI_NATIVE_EVENT_SHIFT
static int pfmw_get_event_name(char *name, unsigned int idx)
EventSetProfileInfo_t profile
int _ia64_ntv_code_to_descr(unsigned int EventCode, char *ntv_descr, int len)
static int set_default_granularity(hwd_control_state_t *this_state, int granularity)
hwd_control_state_t * ctl_state
static long long values[NUM_EVENTS]
static int set_granularity(hwd_control_state_t *this_state, int domain)
static int set_notify(EventSetInfo_t *ESI, int index, int value)
#define GET_OVERFLOW_ADDRESS(ctx)
volatile int buf[CACHE_FLUSH_BUFFER_SIZE_INTS]
#define PFMW_PEVT_PFPPC_COUNT(evt)
static int pfmw_support_opcm(unsigned int i)
int _ia64_init_control_state(hwd_control_state_t *this_state)
static int _pfm_decode_native_event(unsigned int EventCode, unsigned int *event, unsigned int *umask)
int _ia64_ita_read(hwd_context_t *ctx, hwd_control_state_t *machdep, long long **events, int flags)
void _ia64_dispatch_timer(int signal, hwd_siginfo_t *info, void *context)
#define MONT_ETB_REGS_MASK