834 {
835
836 SUBDBG(
"ENTER: PapiEventCode: %p, *PapiEventCode: %#x, modifier: %d, event_table: %p\n", PapiEventCode, *PapiEventCode, modifier, event_table);
837
838 int code,ret, pnum;
839 int max_umasks;
840 char event_string[BUFSIZ];
841 pfm_pmu_info_t pinfo;
842 pfm_event_info_t einfo;
844
845
849 if (code < 0 ) {
850 SUBDBG(
"EXIT: Invalid component first event code: %d\n", code);
851 return code;
852 }
853
854
855 memset( &einfo, 0, sizeof( pfm_event_info_t ));
856 einfo.size = sizeof(pfm_event_info_t);
857 if ((ret = pfm_get_event_info(code, PFM_OS_PERF_EVENT_EXT, &einfo)) != PFM_SUCCESS) {
858 SUBDBG(
"EXIT: pfm_get_event_info returned: %d\n", ret);
860 }
861
862
863 memset( &pinfo, 0, sizeof(pfm_pmu_info_t) );
864 pinfo.size = sizeof(pfm_pmu_info_t);
865 ret=pfm_get_pmu_info(einfo.pmu, &pinfo);
866 if (ret!=PFM_SUCCESS) {
867 SUBDBG(
"EXIT: pfm_get_pmu_info returned: %d\n", ret);
868 return ret;
869 }
870
871
872 sprintf (event_string, "%s::%s", pinfo.name, einfo.name);
873 SUBDBG(
"code: %#x, pmu: %s, event: %s, event_string: %s\n", code, pinfo.name, einfo.name, event_string);
874
875
877
878
879
880 int evt_idx;
882 SUBDBG(
"EXIT: Allocating event: '%s' failed\n", event_string);
884 }
885
886
888 SUBDBG(
"EXIT: event code: %#x\n", *PapiEventCode);
890 }
891
893
894 SUBDBG(
"EXIT: *PapiEventCode: %#x\n", *PapiEventCode);
896 }
897
898
901
902
903 if ((code = pfm_get_event_next(*PapiEventCode)) < 0) {
904
905
906 memset( &einfo, 0, sizeof( pfm_event_info_t ));
907 einfo.size = sizeof(pfm_event_info_t);
908 if ((ret = pfm_get_event_info(*PapiEventCode, PFM_OS_PERF_EVENT_EXT, &einfo)) != PFM_SUCCESS) {
909 SUBDBG(
"EXIT: pfm_get_event_info returned: %d\n", ret);
911 }
912 SUBDBG(
"*PapiEventCode: %#x, event: %s\n", *PapiEventCode, einfo.name);
913
914
915 pnum = einfo.pmu;
916
917 SUBDBG(
"pnum: %d\n", pnum);
919 if (code < 0) {
920 SUBDBG(
"EXIT: No more PMUs to list, returning: %d\n", code);
921 return code;
922 }
923 }
924
925
926
927 memset( &einfo, 0, sizeof( pfm_event_info_t ));
928 einfo.size = sizeof(pfm_event_info_t);
929 if ((ret = pfm_get_event_info(code, PFM_OS_PERF_EVENT_EXT, &einfo)) != PFM_SUCCESS) {
930 SUBDBG(
"EXIT: pfm_get_event_info returned: %d\n", ret);
932 }
933
934
935 memset( &pinfo, 0, sizeof(pfm_pmu_info_t) );
936 pinfo.size = sizeof(pfm_pmu_info_t);
937 ret=pfm_get_pmu_info(einfo.pmu, &pinfo);
938 if (ret!=PFM_SUCCESS) {
939 SUBDBG(
"EXIT: pfm_get_pmu_info returned: %d\n", ret);
940 return ret;
941 }
942
943
944 sprintf (event_string, "%s::%s", pinfo.name, einfo.name);
945 SUBDBG(
"code: %#x, pmu: %s, event: %s, event_string: %s\n", code, pinfo.name, einfo.name, event_string);
946
947
949
950
951
952 int evt_idx;
954 SUBDBG(
"EXIT: Allocating event: '%s' failed\n", event_string);
956 }
957
958
960 SUBDBG(
"EXIT: event code: %#x\n", *PapiEventCode);
962 }
963
964
966
967 SUBDBG(
"EXIT: *PapiEventCode: %#x\n", *PapiEventCode);
969 }
970
971
973 SUBDBG(
"EXIT: do not support umask combos yet\n");
975 }
976
977
979
980 memset( &einfo, 0, sizeof( pfm_event_info_t ));
981 einfo.size = sizeof(pfm_event_info_t);
982 if ((ret = pfm_get_event_info(*PapiEventCode, PFM_OS_PERF_EVENT_EXT, &einfo)) != PFM_SUCCESS) {
983 SUBDBG(
"EXIT: pfm_get_event_info returned: %d\n", ret);
985 }
986
987
988
989 max_umasks = einfo.nattrs;
990
991
993 SUBDBG(
"EXIT: already processed all umasks: attr_idx: %d\n",
attr_idx);
995 }
996
997
999 if (ntv_idx < 0) {
1000 SUBDBG(
"EXIT: _papi_hwi_get_ntv_idx returned: %d\n", ntv_idx);
1001 return ntv_idx;
1002 }
1004 if ((ename == NULL) || (strlen(ename) >= sizeof(event_string))) {
1005 SUBDBG(
"EXIT: Event name will not fit into buffer\n");
1007 }
1008 strcpy (event_string, ename);
1009 SUBDBG(
"event_string: %s\n", event_string);
1010
1011
1012
1013 pfm_event_attr_info_t ainfo;
1014 memset (&ainfo, 0, sizeof(pfm_event_attr_info_t));
1015 ainfo.size = sizeof(pfm_event_attr_info_t);
1016 ret = pfm_get_event_attr_info(*PapiEventCode,
attr_idx, PFM_OS_PERF_EVENT_EXT, &ainfo);
1017 if (ret != PFM_SUCCESS) {
1020 }
1021 SUBDBG(
"*PapiEventCode: %#x, attr_idx: %d, type: %d, name: %s, description: %s\n", *PapiEventCode,
attr_idx, ainfo.type, ainfo.name, ainfo.desc);
1022
1023 if (strlen(event_string) + strlen(ainfo.name) + 35 > sizeof(event_string)) {
1024 SUBDBG(
"EXIT: Event name and mask will not fit into buffer\n");
1026 }
1027
1028 strcat (event_string, ":");
1029 strcat (event_string, ainfo.name);
1030 switch (ainfo.type) {
1031 case PFM_ATTR_UMASK:
1032 break;
1033 case PFM_ATTR_MOD_BOOL:
1034 case PFM_ATTR_MOD_INTEGER:
1035
1036 strcat(event_string,"=0");
1037 break;
1038 default:
1039 SUBDBG(
"EXIT: Unsupported attribute type: %d", ainfo.type);
1041 }
1042
1043
1045
1046
1047
1048 int evt_idx;
1050 SUBDBG(
"EXIT: Allocating event: '%s' failed\n", event_string);
1052 }
1053
1055
1057 SUBDBG(
"EXIT: event code: %#x\n", *PapiEventCode);
1059 }
1060
1061
1063
1064
1066
1067 SUBDBG(
"EXIT: event code: %#x\n", *PapiEventCode);
1069 }
1070
1071
1073 SUBDBG(
"EXIT: do not support enumerating groups in this component\n");
1075 }
1076
1077
1078
1079 SUBDBG(
"EXIT: Invalid modifier argument provided\n");
1081}
convert libpfm error codes to PAPI error codes
Allocates a native event.
looks up an event, returns it if it exists
return the first available event that's on an active PMU
#define PAPI_NTV_ENUM_UMASK_COMBOS
#define PAPI_NTV_ENUM_UMASKS
int _papi_hwi_get_ntv_idx(unsigned int papi_evt_code)