diff options
Diffstat (limited to 'tools/perf/util/parse-events.c')
| -rw-r--r-- | tools/perf/util/parse-events.c | 39 | 
1 files changed, 39 insertions, 0 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index f05e15acd33f..f3b2c2a87456 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -28,6 +28,7 @@  #include "util/parse-events-hybrid.h"  #include "util/pmu-hybrid.h"  #include "tracepoint.h" +#include "thread_map.h"  #define MAX_NAME_LEN 100 @@ -157,6 +158,44 @@ struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {  #define PERF_EVENT_TYPE(config)		__PERF_EVENT_FIELD(config, TYPE)  #define PERF_EVENT_ID(config)		__PERF_EVENT_FIELD(config, EVENT) +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; +} +  const char *event_type(int type)  {  	switch (type) {  |