diff options
Diffstat (limited to 'tools/perf/util/parse-events.c')
| -rw-r--r-- | tools/perf/util/parse-events.c | 121 | 
1 files changed, 71 insertions, 50 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 952b4ae3d95..41982c373fa 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -31,34 +31,36 @@ char debugfs_path[MAXPATHLEN];  #define CSW(x) .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_##x  static struct event_symbol event_symbols[] = { -  { CHW(CPU_CYCLES),		"cpu-cycles",		"cycles"	}, -  { CHW(INSTRUCTIONS),		"instructions",		""		}, -  { CHW(CACHE_REFERENCES),	"cache-references",	""		}, -  { CHW(CACHE_MISSES),		"cache-misses",		""		}, -  { CHW(BRANCH_INSTRUCTIONS),	"branch-instructions",	"branches"	}, -  { CHW(BRANCH_MISSES),		"branch-misses",	""		}, -  { CHW(BUS_CYCLES),		"bus-cycles",		""		}, +  { CHW(CPU_CYCLES),			"cpu-cycles",			"cycles"		}, +  { CHW(STALLED_CYCLES_FRONTEND),	"stalled-cycles-frontend",	"idle-cycles-frontend"	}, +  { CHW(STALLED_CYCLES_BACKEND),	"stalled-cycles-backend",	"idle-cycles-backend"	}, +  { CHW(INSTRUCTIONS),			"instructions",			""			}, +  { CHW(CACHE_REFERENCES),		"cache-references",		""			}, +  { CHW(CACHE_MISSES),			"cache-misses",			""			}, +  { CHW(BRANCH_INSTRUCTIONS),		"branch-instructions",		"branches"		}, +  { CHW(BRANCH_MISSES),			"branch-misses",		""			}, +  { CHW(BUS_CYCLES),			"bus-cycles",			""			}, -  { CSW(CPU_CLOCK),		"cpu-clock",		""		}, -  { CSW(TASK_CLOCK),		"task-clock",		""		}, -  { CSW(PAGE_FAULTS),		"page-faults",		"faults"	}, -  { CSW(PAGE_FAULTS_MIN),	"minor-faults",		""		}, -  { CSW(PAGE_FAULTS_MAJ),	"major-faults",		""		}, -  { CSW(CONTEXT_SWITCHES),	"context-switches",	"cs"		}, -  { CSW(CPU_MIGRATIONS),	"cpu-migrations",	"migrations"	}, -  { CSW(ALIGNMENT_FAULTS),	"alignment-faults",	""		}, -  { CSW(EMULATION_FAULTS),	"emulation-faults",	""		}, +  { CSW(CPU_CLOCK),			"cpu-clock",			""			}, +  { CSW(TASK_CLOCK),			"task-clock",			""			}, +  { CSW(PAGE_FAULTS),			"page-faults",			"faults"		}, +  { CSW(PAGE_FAULTS_MIN),		"minor-faults",			""			}, +  { CSW(PAGE_FAULTS_MAJ),		"major-faults",			""			}, +  { CSW(CONTEXT_SWITCHES),		"context-switches",		"cs"			}, +  { CSW(CPU_MIGRATIONS),		"cpu-migrations",		"migrations"		}, +  { CSW(ALIGNMENT_FAULTS),		"alignment-faults",		""			}, +  { CSW(EMULATION_FAULTS),		"emulation-faults",		""			},  };  #define __PERF_EVENT_FIELD(config, name) \  	((config & PERF_EVENT_##name##_MASK) >> PERF_EVENT_##name##_SHIFT) -#define PERF_EVENT_RAW(config)	__PERF_EVENT_FIELD(config, RAW) +#define PERF_EVENT_RAW(config)		__PERF_EVENT_FIELD(config, RAW)  #define PERF_EVENT_CONFIG(config)	__PERF_EVENT_FIELD(config, CONFIG) -#define PERF_EVENT_TYPE(config)	__PERF_EVENT_FIELD(config, TYPE) +#define PERF_EVENT_TYPE(config)		__PERF_EVENT_FIELD(config, TYPE)  #define PERF_EVENT_ID(config)		__PERF_EVENT_FIELD(config, EVENT) -static const char *hw_event_names[] = { +static const char *hw_event_names[PERF_COUNT_HW_MAX] = {  	"cycles",  	"instructions",  	"cache-references", @@ -66,11 +68,13 @@ static const char *hw_event_names[] = {  	"branches",  	"branch-misses",  	"bus-cycles", +	"stalled-cycles-frontend", +	"stalled-cycles-backend",  }; -static const char *sw_event_names[] = { -	"cpu-clock-msecs", -	"task-clock-msecs", +static const char *sw_event_names[PERF_COUNT_SW_MAX] = { +	"cpu-clock", +	"task-clock",  	"page-faults",  	"context-switches",  	"CPU-migrations", @@ -307,7 +311,7 @@ const char *__event_name(int type, u64 config)  	switch (type) {  	case PERF_TYPE_HARDWARE: -		if (config < PERF_COUNT_HW_MAX) +		if (config < PERF_COUNT_HW_MAX && hw_event_names[config])  			return hw_event_names[config];  		return "unknown-hardware"; @@ -333,7 +337,7 @@ const char *__event_name(int type, u64 config)  	}  	case PERF_TYPE_SOFTWARE: -		if (config < PERF_COUNT_SW_MAX) +		if (config < PERF_COUNT_SW_MAX && sw_event_names[config])  			return sw_event_names[config];  		return "unknown-software"; @@ -648,13 +652,15 @@ static int check_events(const char *str, unsigned int i)  	int n;  	n = strlen(event_symbols[i].symbol); -	if (!strncmp(str, event_symbols[i].symbol, n)) +	if (!strncasecmp(str, event_symbols[i].symbol, n))  		return n;  	n = strlen(event_symbols[i].alias); -	if (n) -		if (!strncmp(str, event_symbols[i].alias, n)) +	if (n) { +		if (!strncasecmp(str, event_symbols[i].alias, n))  			return n; +	} +  	return 0;  } @@ -718,15 +724,22 @@ parse_numeric_event(const char **strp, struct perf_event_attr *attr)  	return EVT_FAILED;  } -static enum event_result +static int  parse_event_modifier(const char **strp, struct perf_event_attr *attr)  {  	const char *str = *strp;  	int exclude = 0;  	int eu = 0, ek = 0, eh = 0, precise = 0; -	if (*str++ != ':') +	if (!*str) +		return 0; + +	if (*str == ',')  		return 0; + +	if (*str++ != ':') +		return -1; +  	while (*str) {  		if (*str == 'u') {  			if (!exclude) @@ -747,14 +760,16 @@ parse_event_modifier(const char **strp, struct perf_event_attr *attr)  		++str;  	} -	if (str >= *strp + 2) { -		*strp = str; -		attr->exclude_user   = eu; -		attr->exclude_kernel = ek; -		attr->exclude_hv     = eh; -		attr->precise_ip     = precise; -		return 1; -	} +	if (str < *strp + 2) +		return -1; + +	*strp = str; + +	attr->exclude_user   = eu; +	attr->exclude_kernel = ek; +	attr->exclude_hv     = eh; +	attr->precise_ip     = precise; +  	return 0;  } @@ -797,7 +812,12 @@ parse_event_symbols(const struct option *opt, const char **str,  	return EVT_FAILED;  modifier: -	parse_event_modifier(str, attr); +	if (parse_event_modifier(str, attr) < 0) { +		fprintf(stderr, "invalid event modifier: '%s'\n", *str); +		fprintf(stderr, "Run 'perf list' for a list of valid events and modifiers\n"); + +		return EVT_FAILED; +	}  	return ret;  } @@ -912,7 +932,7 @@ void print_tracepoint_events(const char *subsys_glob, const char *event_glob)  			snprintf(evt_path, MAXPATHLEN, "%s:%s",  				 sys_dirent.d_name, evt_dirent.d_name); -			printf("  %-42s [%s]\n", evt_path, +			printf("  %-50s [%s]\n", evt_path,  				event_type_descriptors[PERF_TYPE_TRACEPOINT]);  		}  		closedir(evt_dir); @@ -977,7 +997,7 @@ void print_events_type(u8 type)  		else  			snprintf(name, sizeof(name), "%s", syms->symbol); -		printf("  %-42s [%s]\n", name, +		printf("  %-50s [%s]\n", name,  			event_type_descriptors[type]);  	}  } @@ -995,11 +1015,10 @@ int print_hwcache_events(const char *event_glob)  			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {  				char *name = event_cache_name(type, op, i); -				if (event_glob != NULL &&  -				    !strglobmatch(name, event_glob)) +				if (event_glob != NULL && !strglobmatch(name, event_glob))  					continue; -				printf("  %-42s [%s]\n", name, +				printf("  %-50s [%s]\n", name,  					event_type_descriptors[PERF_TYPE_HW_CACHE]);  				++printed;  			} @@ -1009,14 +1028,16 @@ int print_hwcache_events(const char *event_glob)  	return printed;  } +#define MAX_NAME_LEN 100 +  /*   * Print the help text for the event symbols:   */  void print_events(const char *event_glob)  { -	struct event_symbol *syms = event_symbols;  	unsigned int i, type, prev_type = -1, printed = 0, ntypes_printed = 0; -	char name[40]; +	struct event_symbol *syms = event_symbols; +	char name[MAX_NAME_LEN];  	printf("\n");  	printf("List of pre-defined events (to be used in -e):\n"); @@ -1036,10 +1057,10 @@ void print_events(const char *event_glob)  			continue;  		if (strlen(syms->alias)) -			sprintf(name, "%s OR %s", syms->symbol, syms->alias); +			snprintf(name, MAX_NAME_LEN, "%s OR %s", syms->symbol, syms->alias);  		else -			strcpy(name, syms->symbol); -		printf("  %-42s [%s]\n", name, +			strncpy(name, syms->symbol, MAX_NAME_LEN); +		printf("  %-50s [%s]\n", name,  			event_type_descriptors[type]);  		prev_type = type; @@ -1056,12 +1077,12 @@ void print_events(const char *event_glob)  		return;  	printf("\n"); -	printf("  %-42s [%s]\n", +	printf("  %-50s [%s]\n",  		"rNNN (see 'perf list --help' on how to encode it)",  	       event_type_descriptors[PERF_TYPE_RAW]);  	printf("\n"); -	printf("  %-42s [%s]\n", +	printf("  %-50s [%s]\n",  			"mem:<addr>[:access]",  			event_type_descriptors[PERF_TYPE_BREAKPOINT]);  	printf("\n");  |