17 #include "perfmon/perfmon.h" 18 #include "perfmon/pfmlib.h" 51 SUBDBG(
"Old native index was %#08x with %#08x mask\n",
tmp, mask );
63 unsigned int *mask_values )
67 SUBDBG(
"Native base event is %#08x with %d masks\n",
tmp, num_mask );
68 for (
i = 0;
i < num_mask;
i++ ) {
69 SUBDBG(
"Mask index is %#08x\n", mask_values[
i] );
82 unsigned int tevent, major, minor;
92 SUBDBG(
"EventCode %#08x is event %d, umask %#x\n", EventCode, major,
101 unsigned int tmp = foo,
i;
105 while ( (
i = (
unsigned int ) ffs( (
int )
tmp ) ) ) {
106 tmp =
tmp ^ ( 1 << (
i - 1 ) );
115 static inline unsigned int 119 unsigned int i, code,
tmp = 0;
121 for (
i = 0;
i < gete->num_masks;
i++ ) {
123 pfm_get_event_mask_code( gete->event, gete->unit_masks[
i],
124 &code ) ) == PFMLIB_SUCCESS ) {
125 SUBDBG(
"Mask value is %#08x\n", code );
128 PAPIERROR(
"pfm_get_event_mask_code(%#x,%d,%p): %s", gete->event,
129 i, &code, pfm_strerror(
ret ) );
140 memset( &gete, 0,
sizeof ( gete ) );
142 gete.num_masks = (
unsigned int )
prepare_umask( umask, gete.unit_masks );
151 switch ( pfm_error ) {
152 case PFMLIB_SUCCESS:
return PAPI_OK;
165 case PFMLIB_ERR_BADHOST:
return PAPI_ESYS;
170 case PFMLIB_ERR_IRRTOOBIG:
171 case PFMLIB_ERR_IRREMPTY:
172 case PFMLIB_ERR_IRRINVAL:
173 case PFMLIB_ERR_IRRTOOMANY:
174 case PFMLIB_ERR_DRRINVAL:
175 case PFMLIB_ERR_DRRTOOMANY:
176 case PFMLIB_ERR_IRRALIGN:
177 case PFMLIB_ERR_IRRFLAGS:
186 pfmlib_event_t event;
190 SUBDBG(
"pfm_find_full_event(%s,%p)\n",
name, &event );
191 ret = pfm_find_full_event(
name, &event );
192 if (
ret == PFMLIB_SUCCESS ) {
193 SUBDBG(
"Full event name found\n" );
196 SUBDBG(
"num_masks (%d) > max masks (%d)\n", event.num_masks,
201 for (
i = 0;
i <
event.num_masks;
i++ ) {
203 SUBDBG(
"mask index (%d) > max masks (%d)\n",
213 }
else if (
ret == PFMLIB_ERR_UMASK ) {
214 SUBDBG(
"UMASK error, looking for base event only\n" );
215 ret = pfm_find_event(
name, &event.event );
216 if (
ret == PFMLIB_SUCCESS ) {
228 unsigned int event, umask;
231 memset( &gete, 0,
sizeof ( gete ) );
237 gete.num_masks = (
unsigned int )
prepare_umask( umask, gete.unit_masks );
238 if ( gete.num_masks == 0 )
239 ret = pfm_get_event_name( gete.event, ntv_name, (
size_t ) len );
241 ret = pfm_get_full_event_name( &gete, ntv_name, (
size_t ) len );
242 if (
ret != PFMLIB_SUCCESS ) {
244 pfm_get_event_name( gete.event,
tmp, sizeof (
tmp ) );
247 if (
ret != PFMLIB_ERR_BADHOST )
249 (
"pfm_get_full_event_name(%p(event %d,%s,%d masks),%p,%d): %d -- %s",
250 &gete, gete.event,
tmp, gete.num_masks, ntv_name, len,
ret,
251 pfm_strerror(
ret ) );
252 if (
ret == PFMLIB_ERR_FULL ) {
264 unsigned int event, umask;
265 char *eventd, **maskd, *
tmp;
268 size_t total_len = 0;
270 memset( &gete, 0,
sizeof ( gete ) );
275 ret = pfm_get_event_description( event, &eventd );
276 if (
ret != PFMLIB_SUCCESS ) {
277 PAPIERROR(
"pfm_get_event_description(%d,%p): %s",
278 event, &eventd, pfm_strerror(
ret ) );
282 if ( ( gete.num_masks =
283 (
unsigned int )
prepare_umask( umask, gete.unit_masks ) ) ) {
284 maskd = (
char ** ) malloc( gete.num_masks * sizeof (
char * ) );
285 if ( maskd == NULL ) {
289 for (
i = 0;
i < ( int ) gete.num_masks;
i++ ) {
291 pfm_get_event_mask_description( event, gete.unit_masks[
i],
293 if (
ret != PFMLIB_SUCCESS ) {
294 PAPIERROR(
"pfm_get_event_mask_description(%d,%d,%p): %s",
295 event, umask, &maskd, pfm_strerror(
ret ) );
297 for ( ;
i >= 0;
i-- )
302 total_len += strlen( maskd[
i] );
305 (
char * ) malloc( strlen( eventd ) + strlen(
", masks:" ) +
306 total_len + gete.num_masks + 1 );
308 for (
i = (
int ) gete.num_masks - 1;
i >= 0;
i-- )
314 strcat(
tmp, eventd );
315 strcat(
tmp,
", masks:" );
316 for (
i = 0;
i < ( int ) gete.num_masks;
i++ ) {
319 strcat(
tmp, maskd[
i] );
324 tmp = (
char * ) malloc( strlen( eventd ) + 1 );
330 strcat(
tmp, eventd );
333 strncpy( ntv_descr,
tmp, (
size_t ) len );
334 if ( (
int ) strlen(
tmp ) > len - 1 )
347 SUBDBG(
"ENTER %#x\n",EventCode);
362 unsigned int event, umask, num_masks;
373 ret = pfm_get_num_event_masks( event, &num_masks );
374 if (
ret != PFMLIB_SUCCESS ) {
375 PAPIERROR(
"pfm_get_num_event_masks(%d,%p): %s", event, &num_masks,
376 pfm_strerror(
ret ) );
381 SUBDBG(
"This is umask %d of %d\n", umask, num_masks );
391 if ( umask + 1 < (
unsigned int ) ( 1 << num_masks ) ) {
398 int thisbit = ffs( (
int ) umask );
400 SUBDBG(
"First bit is %d in %08x\b\n", thisbit - 1, umask );
401 thisbit = 1 << thisbit;
403 if ( thisbit & ( ( 1 << num_masks ) - 1 ) ) {
418 unsigned int event, umask;
425 memset( &gete, 0x0,
sizeof ( pfmlib_event_t ) );
430 memcpy( bits, &gete,
sizeof ( pfmlib_event_t ) );
452 SUBDBG(
"pfm_initialize()\n" );
453 if ( (
retval = pfm_initialize( ) ) != PFMLIB_SUCCESS ) {
460 if ( pfm_get_version( &
version ) != PFMLIB_SUCCESS ) {
470 if ( PFM_VERSION_MAJOR(
version ) != PFM_VERSION_MAJOR( PFMLIB_VERSION ) ) {
471 PAPIERROR(
"Version mismatch of libpfm: compiled %#x vs. installed %#x\n",
472 PFM_VERSION_MAJOR( PFMLIB_VERSION ),
473 PFM_VERSION_MAJOR(
version ) );
504 SUBDBG(
"pfm_get_num_events(%p)\n", &ncnt );
505 if ( (
retval = pfm_get_num_events( &ncnt ) ) != PFMLIB_SUCCESS ) {
506 PAPIERROR(
"pfm_get_num_events(%p): %s\n", &ncnt,
510 SUBDBG(
"pfm_get_num_events: %d\n", ncnt );
539 long long escr_addr) {
555 P4_EVENT_TC_DELIVER_MODE,
556 P4_EVENT_BPU_FETCH_REQUEST,
557 P4_EVENT_ITLB_REFERENCE,
558 P4_EVENT_MEMORY_CANCEL,
559 P4_EVENT_MEMORY_COMPLETE,
560 P4_EVENT_LOAD_PORT_REPLAY,
561 P4_EVENT_STORE_PORT_REPLAY,
562 P4_EVENT_MOB_LOAD_REPLAY,
563 P4_EVENT_PAGE_WALK_TYPE,
564 P4_EVENT_BSQ_CACHE_REFERENCE,
565 P4_EVENT_IOQ_ALLOCATION,
566 P4_EVENT_IOQ_ACTIVE_ENTRIES,
567 P4_EVENT_FSB_DATA_ACTIVITY,
568 P4_EVENT_BSQ_ALLOCATION,
569 P4_EVENT_BSQ_ACTIVE_ENTRIES,
570 P4_EVENT_SSE_INPUT_ASSIST,
571 P4_EVENT_PACKED_SP_UOP,
572 P4_EVENT_PACKED_DP_UOP,
573 P4_EVENT_SCALAR_SP_UOP,
574 P4_EVENT_SCALAR_DP_UOP,
575 P4_EVENT_64BIT_MMX_UOP,
576 P4_EVENT_128BIT_MMX_UOP,
579 P4_EVENT_GLOBAL_POWER_EVENTS,
581 P4_EVENT_UOP_QUEUE_WRITES,
582 P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE,
583 P4_EVENT_RETIRED_BRANCH_TYPE,
584 P4_EVENT_RESOURCE_STALL,
590 P4_EVENT_FRONT_END_EVENT,
591 P4_EVENT_EXECUTION_EVENT,
592 P4_EVENT_REPLAY_EVENT,
593 P4_EVENT_INSTR_RETIRED,
594 P4_EVENT_UOPS_RETIRED,
596 P4_EVENT_BRANCH_RETIRED,
597 P4_EVENT_MISPRED_BRANCH_RETIRED,
599 P4_EVENT_MACHINE_CLEAR,
600 P4_EVENT_INSTR_COMPLETED,
604 int eventsel=(escr>>25)&0x3f;
605 int cccrsel=(cccr>>13)&0x7;
610 case 0x1:
if (cccrsel==1) {
611 if (escr_addr>0x3c8) {
613 event_key=P4_EVENT_TC_DELIVER_MODE;
617 event_key=P4_EVENT_RESOURCE_STALL;
621 if (escr_addr<0x3af) {
623 event_key=P4_EVENT_PAGE_WALK_TYPE;
627 event_key=P4_EVENT_UOPS_RETIRED;
631 case 0x2:
if (cccrsel==5) {
632 if (escr_addr<0x3a8) {
634 event_key=P4_EVENT_MEMORY_CANCEL;
637 event_key=P4_EVENT_MACHINE_CLEAR;
639 }
else if (cccrsel==1) {
640 event_key=P4_EVENT_64BIT_MMX_UOP;
641 }
else if (cccrsel==4) {
642 event_key=P4_EVENT_INSTR_RETIRED;
643 }
else if (cccrsel==2) {
644 event_key=P4_EVENT_UOP_TYPE;
647 case 0x3:
if (cccrsel==0) {
648 event_key=P4_EVENT_BPU_FETCH_REQUEST;
651 event_key=P4_EVENT_MOB_LOAD_REPLAY;
654 event_key=P4_EVENT_IOQ_ALLOCATION;
657 event_key=P4_EVENT_MISPRED_BRANCH_RETIRED;
660 event_key=P4_EVENT_X87_ASSIST;
663 case 0x4:
if (cccrsel==2) {
664 if (escr_addr<0x3b0) {
666 event_key=P4_EVENT_LOAD_PORT_REPLAY;
670 event_key=P4_EVENT_RETIRED_BRANCH_TYPE;
674 event_key=P4_EVENT_X87_FP_UOP;
677 event_key=P4_EVENT_RESPONSE;
680 case 0x5:
if (cccrsel==2) {
681 if (escr_addr<0x3b0) {
683 event_key=P4_EVENT_STORE_PORT_REPLAY;
687 event_key=P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE;
691 event_key=P4_EVENT_BSQ_ALLOCATION;
694 event_key=P4_EVENT_TC_MS_XFER;
697 event_key=P4_EVENT_WC_BUFFER;
700 case 0x6:
if (cccrsel==7) {
701 event_key=P4_EVENT_BSQ_ACTIVE_ENTRIES;
704 event_key=P4_EVENT_TC_MISC;
707 event_key=P4_EVENT_SNOOP;
710 event_key=P4_EVENT_BRANCH_RETIRED;
713 case 0x7: event_key=P4_EVENT_INSTR_COMPLETED;
break;
714 case 0x8:
if (cccrsel==2) {
715 event_key=P4_EVENT_MEMORY_COMPLETE;
718 event_key=P4_EVENT_PACKED_SP_UOP;
721 event_key=P4_EVENT_BNR;
724 event_key=P4_EVENT_FRONT_END_EVENT;
727 case 0x9:
if (cccrsel==0) {
728 event_key=P4_EVENT_UOP_QUEUE_WRITES;
731 event_key=P4_EVENT_REPLAY_EVENT;
734 case 0xa: event_key=P4_EVENT_SCALAR_SP_UOP;
break;
735 case 0xc:
if (cccrsel==7) {
736 event_key=P4_EVENT_BSQ_CACHE_REFERENCE;
739 event_key=P4_EVENT_PACKED_DP_UOP;
742 event_key=P4_EVENT_EXECUTION_EVENT;
745 case 0xe: event_key=P4_EVENT_SCALAR_DP_UOP;
break;
746 case 0x13: event_key=P4_EVENT_GLOBAL_POWER_EVENTS;
break;
747 case 0x16: event_key=P4_EVENT_B2B_CYCLES;
break;
748 case 0x17: event_key=P4_EVENT_FSB_DATA_ACTIVITY;
break;
749 case 0x18: event_key=P4_EVENT_ITLB_REFERENCE;
break;
750 case 0x1a:
if (cccrsel==6) {
751 event_key=P4_EVENT_IOQ_ACTIVE_ENTRIES;
754 event_key=P4_EVENT_128BIT_MMX_UOP;
757 case 0x34: event_key= P4_EVENT_SSE_INPUT_ASSIST;
break;
760 pe_event=(escr&0x1ffffff)<<32;
761 pe_event|=(cccr&0xfffff000);
762 pe_event|=(((
long long)(event_key))<<57);
782 #if defined(__powerpc__) 784 ret = pfm_get_event_code_counter( ( (
pfm_register_t * ) ni_bits )->event, 0, &code );
790 SUBDBG(
"Stuffing native event index (code %#x, raw code %#x) into events array.\n",
794 pfmlib_input_param_t inp;
795 pfmlib_output_param_t outp;
797 memset( &inp, 0,
sizeof ( inp ) );
798 memset( &outp, 0,
sizeof ( outp ) );
799 inp.pfp_event_count = 1;
801 pfm_regmask_set( &inp.pfp_unavail_pmcs, 16 );
804 ret = pfm_dispatch_events( &inp, NULL, &outp, NULL );
805 if (
ret != PFMLIB_SUCCESS) {
806 SUBDBG(
"Error: pfm_dispatch_events returned: %d\n",
ret);
815 outp.pfp_pmcs[1].reg_value,
816 outp.pfp_pmcs[0].reg_addr);
819 pe_event = outp.pfp_pmcs[0].reg_value;
821 SUBDBG(
"pe_event: %#llx\n", outp.pfp_pmcs[0].reg_value );
int _papi_libpfm_ntv_name_to_code(const char *name, unsigned int *event_code)
int _papi_libpfm_init(papi_vector_t *my_vector, int cidx)
long long generate_p4_event(long long escr, long long cccr, long long escr_addr)
static unsigned int convert_pfm_masks(pfmlib_event_t *gete)
static int encode_native_event_raw(unsigned int event, unsigned int mask)
static int encode_native_event(unsigned int event, unsigned int num_mask, unsigned int *mask_values)
int _papi_libpfm_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info)
int _pfm_decode_native_event(unsigned int EventCode, unsigned int *event, unsigned int *umask)
int _papi_libpfm_ntv_enum_events(unsigned int *EventCode, int modifier)
unsigned int PAPI_NATIVE_UMASK_AND_MASK
char long_descr[PAPI_HUGE_STR_LEN]
PAPI_component_info_t cmp_info
Return codes and api definitions.
char support_version[PAPI_MIN_STR_LEN]
#define PAPI_2MAX_STR_LEN
int _papi_libpfm_ntv_code_to_name(unsigned int EventCode, char *ntv_name, int len)
char symbol[PAPI_HUGE_STR_LEN]
unsigned int _pfm_convert_umask(unsigned int event, unsigned int umask)
#define SUBDBG(format, args...)
void PAPIERROR(char *format,...)
int _papi_load_preset_table(char *pmu_str, int pmu_type, int cidx)
int _papi_libpfm_error(int pfm_error)
int _papi_libpfm_ntv_code_to_descr(unsigned int EventCode, char *ntv_descr, int len)
int _papi_libpfm_shutdown(void)
papi_mdi_t _papi_hwi_system_info
#define PAPI_VENDOR_INTEL
pfmlib_event_t pfm_register_t
int _perfmon2_pfm_pmu_type
int prepare_umask(unsigned int foo, unsigned int *values)
#define PAPI_NATIVE_AND_MASK
int _papi_libpfm_ntv_code_to_bits(unsigned int EventCode, hwd_register_t *bits)
pfmlib_event_t pfm_register_t
unsigned int PAPI_NATIVE_UMASK_SHIFT
static long long values[NUM_EVENTS]
unsigned int PAPI_NATIVE_UMASK_MAX
int _papi_libpfm_setup_counters(struct perf_event_attr *attr, hwd_register_t *ni_bits)
unsigned int PAPI_NATIVE_EVENT_AND_MASK
unsigned int PAPI_NATIVE_EVENT_SHIFT