xref: /linux/tools/perf/util/parse-events.h (revision d7f21df0c991f0909a992c0c7e2d31d4c46d40b4)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
28b40f521SJohn Kacur #ifndef __PERF_PARSE_EVENTS_H
38b40f521SJohn Kacur #define __PERF_PARSE_EVENTS_H
45242519bSIngo Molnar /*
55242519bSIngo Molnar  * Parse symbolic events/counts passed in as options:
65242519bSIngo Molnar  */
75242519bSIngo Molnar 
8f50246e2SJiri Olsa #include <linux/list.h>
9c651214eSRobert Richter #include <stdbool.h>
10d944c4eeSBorislav Petkov #include <linux/types.h>
11d2709c7cSDavid Howells #include <linux/perf_event.h>
12af9100adSRavi Bangoria #include <string.h>
1369aad6f1SArnaldo Carvalho de Melo 
1432dcd021SJiri Olsa struct evsel;
1563503dbaSJiri Olsa struct evlist;
16b39b8393SJiri Olsa struct parse_events_error;
1769aad6f1SArnaldo Carvalho de Melo 
185beeded1SJason Baron struct option;
1970943490SStephane Eranian struct perf_pmu;
205beeded1SJason Baron 
2171c86cdaSZhengjun Xing bool is_event_supported(u8 type, u64 config);
221ef2ed10SFrederic Weisbecker 
231424dc96SDavid Ahern const char *event_type(int type);
248ad8db37SIngo Molnar 
253938bad4SArnaldo Carvalho de Melo int parse_events_option(const struct option *opt, const char *str, int unset);
26d0abbc3cSArnaldo Carvalho de Melo int parse_events_option_new_evlist(const struct option *opt, const char *str, int unset);
27806731a9SAdrian Hunter __attribute__((nonnull(1, 2, 3)))
283bf91aa5SArnaldo Carvalho de Melo int __parse_events(struct evlist *evlist, const char *str, struct parse_events_error *error,
29a4c7d7c5SIan Rogers 		   struct perf_pmu *fake_pmu, bool warn_if_reordered);
303bf91aa5SArnaldo Carvalho de Melo 
31a4c7d7c5SIan Rogers __attribute__((nonnull(1, 2, 3)))
323bf91aa5SArnaldo Carvalho de Melo static inline int parse_events(struct evlist *evlist, const char *str,
333bf91aa5SArnaldo Carvalho de Melo 			       struct parse_events_error *err)
343bf91aa5SArnaldo Carvalho de Melo {
35a4c7d7c5SIan Rogers 	return __parse_events(evlist, str, err, /*fake_pmu=*/NULL, /*warn_if_reordered=*/true);
363bf91aa5SArnaldo Carvalho de Melo }
373bf91aa5SArnaldo Carvalho de Melo 
38806731a9SAdrian Hunter int parse_event(struct evlist *evlist, const char *str);
39806731a9SAdrian Hunter 
403938bad4SArnaldo Carvalho de Melo int parse_events_terms(struct list_head *terms, const char *str);
413938bad4SArnaldo Carvalho de Melo int parse_filter(const struct option *opt, const char *str, int unset);
423938bad4SArnaldo Carvalho de Melo int exclude_perf(const struct option *opt, const char *arg, int unset);
438ad8db37SIngo Molnar 
448f707d84SJiri Olsa enum {
4516fa7e82SJiri Olsa 	PARSE_EVENTS__TERM_TYPE_NUM,
4616fa7e82SJiri Olsa 	PARSE_EVENTS__TERM_TYPE_STR,
4716fa7e82SJiri Olsa };
4816fa7e82SJiri Olsa 
4916fa7e82SJiri Olsa enum {
5016fa7e82SJiri Olsa 	PARSE_EVENTS__TERM_TYPE_USER,
518f707d84SJiri Olsa 	PARSE_EVENTS__TERM_TYPE_CONFIG,
528f707d84SJiri Olsa 	PARSE_EVENTS__TERM_TYPE_CONFIG1,
538f707d84SJiri Olsa 	PARSE_EVENTS__TERM_TYPE_CONFIG2,
54204e7c49SRob Herring 	PARSE_EVENTS__TERM_TYPE_CONFIG3,
556b5fc39bSJiri Olsa 	PARSE_EVENTS__TERM_TYPE_NAME,
568f707d84SJiri Olsa 	PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
5709af2a55SNamhyung Kim 	PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ,
588f707d84SJiri Olsa 	PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
5932067712SKan Liang 	PARSE_EVENTS__TERM_TYPE_TIME,
60d457c963SKan Liang 	PARSE_EVENTS__TERM_TYPE_CALLGRAPH,
61d457c963SKan Liang 	PARSE_EVENTS__TERM_TYPE_STACKSIZE,
62374ce938SWang Nan 	PARSE_EVENTS__TERM_TYPE_NOINHERIT,
6317cb5f84SWang Nan 	PARSE_EVENTS__TERM_TYPE_INHERIT,
64792d48b4SArnaldo Carvalho de Melo 	PARSE_EVENTS__TERM_TYPE_MAX_STACK,
652fda5adaSArnaldo Carvalho de Melo 	PARSE_EVENTS__TERM_TYPE_MAX_EVENTS,
66626a6b78SWang Nan 	PARSE_EVENTS__TERM_TYPE_NOOVERWRITE,
67626a6b78SWang Nan 	PARSE_EVENTS__TERM_TYPE_OVERWRITE,
68dd60fba7SMathieu Poirier 	PARSE_EVENTS__TERM_TYPE_DRV_CFG,
69064b4e82SJin Yao 	PARSE_EVENTS__TERM_TYPE_PERCORE,
701b992154SAdrian Hunter 	PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT,
71eb7a52d4SAdrian Hunter 	PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE,
722b62b3a6SIan Rogers 	PARSE_EVENTS__TERM_TYPE_METRIC_ID,
7370c90e4aSIan Rogers 	PARSE_EVENTS__TERM_TYPE_RAW,
746fd1e519SIan Rogers 	PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE,
7517cb5f84SWang Nan 	__PARSE_EVENTS__TERM_TYPE_NR,
768f707d84SJiri Olsa };
778f707d84SJiri Olsa 
782d055bf2SWang Nan struct parse_events_array {
792d055bf2SWang Nan 	size_t nr_ranges;
802d055bf2SWang Nan 	struct {
812d055bf2SWang Nan 		unsigned int start;
822d055bf2SWang Nan 		size_t length;
832d055bf2SWang Nan 	} *ranges;
842d055bf2SWang Nan };
852d055bf2SWang Nan 
866cee6cd3SArnaldo Carvalho de Melo struct parse_events_term {
878f707d84SJiri Olsa 	char *config;
882d055bf2SWang Nan 	struct parse_events_array array;
898f707d84SJiri Olsa 	union {
908f707d84SJiri Olsa 		char *str;
91b527bab5SRobert Richter 		u64  num;
928f707d84SJiri Olsa 	} val;
9316fa7e82SJiri Olsa 	int type_val;
9416fa7e82SJiri Olsa 	int type_term;
958f707d84SJiri Olsa 	struct list_head list;
96688d4dfcSCody P Schafer 	bool used;
9799e7138eSJiri Olsa 	bool no_value;
98cecf3a2eSJiri Olsa 
99cecf3a2eSJiri Olsa 	/* error string indexes for within parsed string */
100cecf3a2eSJiri Olsa 	int err_term;
101cecf3a2eSJiri Olsa 	int err_val;
10259622fd4SAndi Kleen 
10359622fd4SAndi Kleen 	/* Coming from implicit alias */
10459622fd4SAndi Kleen 	bool weak;
1058f707d84SJiri Olsa };
1068f707d84SJiri Olsa 
107b39b8393SJiri Olsa struct parse_events_error {
108a910e466SIan Rogers 	int   num_errors;       /* number of errors encountered */
109b39b8393SJiri Olsa 	int   idx;	/* index in the parsed string */
110b39b8393SJiri Olsa 	char *str;      /* string to display at the index */
111b39b8393SJiri Olsa 	char *help;	/* optional help string */
112a910e466SIan Rogers 	int   first_idx;/* as above, but for the first encountered error */
113a910e466SIan Rogers 	char *first_str;
114a910e466SIan Rogers 	char *first_help;
115b39b8393SJiri Olsa };
116b39b8393SJiri Olsa 
1175d369a75SArnaldo Carvalho de Melo struct parse_events_state {
11846010ab2SJiri Olsa 	struct list_head	   list;
11946010ab2SJiri Olsa 	int			   idx;
120b39b8393SJiri Olsa 	struct parse_events_error *error;
12163503dbaSJiri Olsa 	struct evlist		  *evlist;
12290e2b22dSJiri Olsa 	struct list_head	  *terms;
1231244a327SJiri Olsa 	int			   stoken;
124387ad33fSJiri Olsa 	struct perf_pmu		  *fake_pmu;
125c93afadcSJin Yao 	char			  *hybrid_pmu_name;
1266fd1e519SIan Rogers 	/* Should PE_LEGACY_NAME tokens be generated for config terms? */
1276fd1e519SIan Rogers 	bool			   match_legacy_cache_terms;
128a4c7d7c5SIan Rogers 	bool			   wild_card_pmus;
12990e2b22dSJiri Olsa };
13090e2b22dSJiri Olsa 
1311669e509SWang Nan void parse_events__shrink_config_terms(void);
1326cee6cd3SArnaldo Carvalho de Melo int parse_events__is_hardcoded_term(struct parse_events_term *term);
133bb78ce7dSAdrian Hunter int parse_events_term__num(struct parse_events_term **term,
134bb78ce7dSAdrian Hunter 			   int type_term, char *config, u64 num,
13599e7138eSJiri Olsa 			   bool novalue,
136bb78ce7dSAdrian Hunter 			   void *loc_term, void *loc_val);
137bb78ce7dSAdrian Hunter int parse_events_term__str(struct parse_events_term **term,
138bb78ce7dSAdrian Hunter 			   int type_term, char *config, char *str,
139bb78ce7dSAdrian Hunter 			   void *loc_term, void *loc_val);
1406cee6cd3SArnaldo Carvalho de Melo int parse_events_term__sym_hw(struct parse_events_term **term,
1411d33d6dcSJiri Olsa 			      char *config, unsigned idx);
1426cee6cd3SArnaldo Carvalho de Melo int parse_events_term__clone(struct parse_events_term **new,
1436cee6cd3SArnaldo Carvalho de Melo 			     struct parse_events_term *term);
1441dc92556SIan Rogers void parse_events_term__delete(struct parse_events_term *term);
1452146afc6SArnaldo Carvalho de Melo void parse_events_terms__delete(struct list_head *terms);
146fc0a2c1dSArnaldo Carvalho de Melo void parse_events_terms__purge(struct list_head *terms);
1472d055bf2SWang Nan void parse_events__clear_array(struct parse_events_array *a);
148f5b1135bSJiri Olsa int parse_events__modifier_event(struct list_head *list, char *str, bool add);
14989efb029SJiri Olsa int parse_events__modifier_group(struct list_head *list, char *event_mod);
1508e8bbfb3SIan Rogers int parse_events_name(struct list_head *list, const char *name);
151c5cd8ac0SDavid Ahern int parse_events_add_tracepoint(struct list_head *list, int *idx,
1528c619d6aSWang Nan 				const char *sys, const char *event,
153e637d177SHe Kuang 				struct parse_events_error *error,
154e637d177SHe Kuang 				struct list_head *head_config);
1555d9cdc11SArnaldo Carvalho de Melo int parse_events_load_bpf(struct parse_events_state *parse_state,
15684c86ca1SWang Nan 			  struct list_head *list,
157d509db04SWang Nan 			  char *bpf_file_name,
158a34f3be7SWang Nan 			  bool source,
159a34f3be7SWang Nan 			  struct list_head *head_config);
16084c86ca1SWang Nan /* Provide this function for perf test */
16184c86ca1SWang Nan struct bpf_object;
1625d9cdc11SArnaldo Carvalho de Melo int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
16384c86ca1SWang Nan 			      struct list_head *list,
16495088a59SWang Nan 			      struct bpf_object *obj,
16595088a59SWang Nan 			      struct list_head *head_config);
1665d9cdc11SArnaldo Carvalho de Melo int parse_events_add_numeric(struct parse_events_state *parse_state,
16787d650beSJiri Olsa 			     struct list_head *list,
168b527bab5SRobert Richter 			     u32 type, u64 config,
1698f707d84SJiri Olsa 			     struct list_head *head_config);
170f0fbb114SAndi Kleen int parse_events_add_tool(struct parse_events_state *parse_state,
171f0fbb114SAndi Kleen 			  struct list_head *list,
1728228e936SIan Rogers 			  int tool_event);
17370c90e4aSIan Rogers int parse_events_add_cache(struct list_head *list, int *idx, const char *name,
17443d0b978SWang Nan 			   struct parse_events_error *error,
1752bdf4d7eSIan Rogers 			   struct list_head *head_config);
176*d7f21df0SIan Rogers int parse_events__decode_legacy_cache(const char *name, int pmu_type, __u64 *config);
177c5cd8ac0SDavid Ahern int parse_events_add_breakpoint(struct list_head *list, int *idx,
178aa98d848SIan Rogers 				u64 addr, char *type, u64 len);
1795d9cdc11SArnaldo Carvalho de Melo int parse_events_add_pmu(struct parse_events_state *parse_state,
18036adec85SJiri Olsa 			 struct list_head *list, char *name,
181369b2308SKan Liang 			 struct list_head *head_config,
182e733f87eSIan Rogers 			 bool auto_merge_stats);
1832073ad33SAndi Kleen 
18470943490SStephane Eranian struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,
1852b62b3a6SIan Rogers 				      const char *name, const char *metric_id,
1862b62b3a6SIan Rogers 				      struct perf_pmu *pmu);
18770943490SStephane Eranian 
1885d9cdc11SArnaldo Carvalho de Melo int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
1892073ad33SAndi Kleen 			       char *str,
190fb081153SIan Rogers 			       struct list_head *head_config,
1912073ad33SAndi Kleen 			       struct list_head **listp);
1922073ad33SAndi Kleen 
1938255718fSAndi Kleen int parse_events_copy_term_list(struct list_head *old,
1948255718fSAndi Kleen 				 struct list_head **new);
1958255718fSAndi Kleen 
196347c2f0aSIan Rogers void parse_events__set_leader(char *name, struct list_head *list);
1975d7be90eSJiri Olsa void parse_events_update_lists(struct list_head *list_event,
1985d7be90eSJiri Olsa 			       struct list_head *list_all);
1995d9cdc11SArnaldo Carvalho de Melo void parse_events_evlist_error(struct parse_events_state *parse_state,
200b39b8393SJiri Olsa 			       int idx, const char *str);
20189812fc8SJiri Olsa 
202705750f2SYunlong Song struct event_symbol {
203705750f2SYunlong Song 	const char	*symbol;
204705750f2SYunlong Song 	const char	*alias;
205705750f2SYunlong Song };
206705750f2SYunlong Song extern struct event_symbol event_symbols_hw[];
207705750f2SYunlong Song extern struct event_symbol event_symbols_sw[];
2088ad8db37SIngo Molnar 
209ffeb883eSHe Kuang char *parse_events_formats_error_string(char *additional_terms);
2105beeded1SJason Baron 
21107eafd4eSIan Rogers void parse_events_error__init(struct parse_events_error *err);
21207eafd4eSIan Rogers void parse_events_error__exit(struct parse_events_error *err);
2136c191289SIan Rogers void parse_events_error__handle(struct parse_events_error *err, int idx,
2146c191289SIan Rogers 				char *str, char *help);
2156c191289SIan Rogers void parse_events_error__print(struct parse_events_error *err,
216333b5665SAndi Kleen 			       const char *event);
217333b5665SAndi Kleen 
218af9100adSRavi Bangoria #ifdef HAVE_LIBELF_SUPPORT
219af9100adSRavi Bangoria /*
220af9100adSRavi Bangoria  * If the probe point starts with '%',
221af9100adSRavi Bangoria  * or starts with "sdt_" and has a ':' but no '=',
222af9100adSRavi Bangoria  * then it should be a SDT/cached probe point.
223af9100adSRavi Bangoria  */
224af9100adSRavi Bangoria static inline bool is_sdt_event(char *str)
225af9100adSRavi Bangoria {
226af9100adSRavi Bangoria 	return (str[0] == '%' ||
227af9100adSRavi Bangoria 		(!strncmp(str, "sdt_", 4) &&
228af9100adSRavi Bangoria 		 !!strchr(str, ':') && !strchr(str, '=')));
229af9100adSRavi Bangoria }
230af9100adSRavi Bangoria #else
231af9100adSRavi Bangoria static inline bool is_sdt_event(char *str __maybe_unused)
232af9100adSRavi Bangoria {
233af9100adSRavi Bangoria 	return false;
234af9100adSRavi Bangoria }
235af9100adSRavi Bangoria #endif /* HAVE_LIBELF_SUPPORT */
236af9100adSRavi Bangoria 
2379cbfa2f6SJin Yao struct evsel *parse_events__add_event_hybrid(struct list_head *list, int *idx,
2389cbfa2f6SJin Yao 					     struct perf_event_attr *attr,
2398e8bbfb3SIan Rogers 					     const char *name,
2402b62b3a6SIan Rogers 					     const char *metric_id,
2418e8bbfb3SIan Rogers 					     struct perf_pmu *pmu,
2429cbfa2f6SJin Yao 					     struct list_head *config_terms);
2439cbfa2f6SJin Yao 
2448b40f521SJohn Kacur #endif /* __PERF_PARSE_EVENTS_H */
245