There are events and masks in the AMD64 PMU that are supported only by certain revisions. If some event or mask is unsupported, pfm_get_event_name() or pfm_get_event_mask_name() return PFMLIB_ERR_BADHOST. This patch changes pfmon in a way that those events or masks are skipped if the functions above return an error.
Signed-off-by: Robert Richter <robert.rich...@amd.com> --- pfmon/pfmon.c | 35 ++++++++++++++++++++--------------- 1 files changed, 20 insertions(+), 15 deletions(-) diff --git a/pfmon/pfmon.c b/pfmon/pfmon.c index dde3d6e..8df02b7 100644 --- a/pfmon/pfmon.c +++ b/pfmon/pfmon.c @@ -611,13 +611,15 @@ show_event_name(unsigned int idx, const char *name, int mode) if (!mask_name) fatal_error("cannot allocate memory for mask name\n"); - pfm_get_num_event_masks(idx, &n); + if (pfm_get_num_event_masks(idx, &n) != PFMLIB_SUCCESS) + return; if (n == 0 || mode == 0) { printf("%s\n", name); return; } for (i = 0; n; n--, i++) { - pfm_get_event_mask_name(idx, i, mask_name, l); + if (pfm_get_event_mask_name(idx, i, mask_name, l) != PFMLIB_SUCCESS) + continue; printf("%s:%s\n", name, mask_name); } free(mask_name); @@ -650,18 +652,19 @@ pfmon_list_all_events(char *pattern, int mode) fatal_error("error in regular expression for event \"%s\"\n", pattern); for(i=0; i < count; i++) { - pfm_get_event_name(i, name, len); - - if (regexec(&preg, name, 0, NULL, 0) == 0) { - show_event_name(i, name, mode); - done = 1; - } + if (pfm_get_event_name(i, name, len) != PFMLIB_SUCCESS) + continue; + if (regexec(&preg, name, 0, NULL, 0) != 0) + continue; + show_event_name(i, name, mode); + done = 1; } if (done == 0) fatal_error("event not found\n"); } else { for(i=0; i < count; i++) { - pfm_get_event_name(i, name, len); + if (pfm_get_event_name(i, name, len) != PFMLIB_SUCCESS) + continue; show_event_name(i, name, mode); } } @@ -1238,7 +1241,8 @@ __pfmon_show_event_info(unsigned int idx) free(desc); for (i = 0; n; n--, i++) { pfm_get_event_mask_description(idx, i, &desc); - pfm_get_event_mask_name(idx, i, name, PFMON_MAX_EVTNAME_LEN); + if (pfm_get_event_mask_name(idx, i, name, PFMON_MAX_EVTNAME_LEN) != PFMLIB_SUCCESS) + continue; pfm_get_event_mask_code(idx, i, &c); printf("Umask-%02u : 0x%02x : [%s] : %s\n", i, c, name, desc); free(desc); @@ -1283,11 +1287,12 @@ pfmon_show_event_info(char *event) pfm_get_num_events(&c); for(i=0; i < c; i++) { - pfm_get_event_name(i, name, PFMON_MAX_EVTNAME_LEN); - if (regexec(&preg, name, 0, NULL, 0) == 0) { - __pfmon_show_event_info(i); - found = 1; - } + if (pfm_get_event_name(i, name, PFMON_MAX_EVTNAME_LEN) != PFMLIB_SUCCESS) + continue; + if (regexec(&preg, name, 0, NULL, 0) != 0) + continue; + __pfmon_show_event_info(i); + found = 1; } if (!found) fatal_error("event \"%s\" not found\n", event); -- 1.6.1.2 ------------------------------------------------------------------------------ _______________________________________________ perfmon2-devel mailing list perfmon2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/perfmon2-devel