diff options
Diffstat (limited to 'tools/perf/util/print-events.c')
| -rw-r--r-- | tools/perf/util/print-events.c | 39 | 
1 files changed, 39 insertions, 0 deletions
diff --git a/tools/perf/util/print-events.c b/tools/perf/util/print-events.c index d148842b205a..69492cbd6921 100644 --- a/tools/perf/util/print-events.c +++ b/tools/perf/util/print-events.c @@ -27,6 +27,7 @@  #include "tracepoint.h"  #include "pfm.h"  #include "pmu-hybrid.h" +#include "thread_map.h"  #define MAX_NAME_LEN 100 @@ -228,6 +229,44 @@ void print_sdt_events(const struct print_callbacks *print_cb, void *print_state)  	strlist__delete(sdtlist);  } +static bool is_event_supported(u8 type, u64 config) +{ +	bool ret = true; +	int open_return; +	struct evsel *evsel; +	struct perf_event_attr attr = { +		.type = type, +		.config = config, +		.disabled = 1, +	}; +	struct perf_thread_map *tmap = thread_map__new_by_tid(0); + +	if (tmap == NULL) +		return false; + +	evsel = evsel__new(&attr); +	if (evsel) { +		open_return = evsel__open(evsel, NULL, tmap); +		ret = open_return >= 0; + +		if (open_return == -EACCES) { +			/* +			 * This happens if the paranoid value +			 * /proc/sys/kernel/perf_event_paranoid is set to 2 +			 * Re-run with exclude_kernel set; we don't do that +			 * by default as some ARM machines do not support it. +			 * +			 */ +			evsel->core.attr.exclude_kernel = 1; +			ret = evsel__open(evsel, NULL, tmap) >= 0; +		} +		evsel__delete(evsel); +	} + +	perf_thread_map__put(tmap); +	return ret; +} +  int print_hwcache_events(const struct print_callbacks *print_cb, void *print_state)  {  	struct perf_pmu *pmu = NULL;  | 
