~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/perf/util/parse-events.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef __PERF_PARSE_EVENTS_H
  3 #define __PERF_PARSE_EVENTS_H
  4 /*
  5  * Parse symbolic events/counts passed in as options:
  6  */
  7 
  8 #include <linux/list.h>
  9 #include <stdbool.h>
 10 #include <linux/types.h>
 11 #include <linux/perf_event.h>
 12 #include <stdio.h>
 13 #include <string.h>
 14 
 15 struct evsel;
 16 struct evlist;
 17 struct parse_events_error;
 18 
 19 struct option;
 20 struct perf_pmu;
 21 struct strbuf;
 22 
 23 const char *event_type(int type);
 24 
 25 /* Arguments encoded in opt->value. */
 26 struct parse_events_option_args {
 27         struct evlist **evlistp;
 28         const char *pmu_filter;
 29 };
 30 int parse_events_option(const struct option *opt, const char *str, int unset);
 31 int parse_events_option_new_evlist(const struct option *opt, const char *str, int unset);
 32 __attribute__((nonnull(1, 2, 4)))
 33 int __parse_events(struct evlist *evlist, const char *str, const char *pmu_filter,
 34                    struct parse_events_error *error, struct perf_pmu *fake_pmu,
 35                    bool warn_if_reordered, bool fake_tp);
 36 
 37 __attribute__((nonnull(1, 2, 3)))
 38 static inline int parse_events(struct evlist *evlist, const char *str,
 39                                struct parse_events_error *err)
 40 {
 41         return __parse_events(evlist, str, /*pmu_filter=*/NULL, err, /*fake_pmu=*/NULL,
 42                               /*warn_if_reordered=*/true, /*fake_tp=*/false);
 43 }
 44 
 45 int parse_event(struct evlist *evlist, const char *str);
 46 
 47 int parse_filter(const struct option *opt, const char *str, int unset);
 48 int exclude_perf(const struct option *opt, const char *arg, int unset);
 49 
 50 enum parse_events__term_val_type {
 51         PARSE_EVENTS__TERM_TYPE_NUM,
 52         PARSE_EVENTS__TERM_TYPE_STR,
 53 };
 54 
 55 enum parse_events__term_type {
 56         PARSE_EVENTS__TERM_TYPE_USER,
 57         PARSE_EVENTS__TERM_TYPE_CONFIG,
 58         PARSE_EVENTS__TERM_TYPE_CONFIG1,
 59         PARSE_EVENTS__TERM_TYPE_CONFIG2,
 60         PARSE_EVENTS__TERM_TYPE_CONFIG3,
 61         PARSE_EVENTS__TERM_TYPE_NAME,
 62         PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
 63         PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ,
 64         PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
 65         PARSE_EVENTS__TERM_TYPE_TIME,
 66         PARSE_EVENTS__TERM_TYPE_CALLGRAPH,
 67         PARSE_EVENTS__TERM_TYPE_STACKSIZE,
 68         PARSE_EVENTS__TERM_TYPE_NOINHERIT,
 69         PARSE_EVENTS__TERM_TYPE_INHERIT,
 70         PARSE_EVENTS__TERM_TYPE_MAX_STACK,
 71         PARSE_EVENTS__TERM_TYPE_MAX_EVENTS,
 72         PARSE_EVENTS__TERM_TYPE_NOOVERWRITE,
 73         PARSE_EVENTS__TERM_TYPE_OVERWRITE,
 74         PARSE_EVENTS__TERM_TYPE_DRV_CFG,
 75         PARSE_EVENTS__TERM_TYPE_PERCORE,
 76         PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT,
 77         PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE,
 78         PARSE_EVENTS__TERM_TYPE_METRIC_ID,
 79         PARSE_EVENTS__TERM_TYPE_RAW,
 80         PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE,
 81         PARSE_EVENTS__TERM_TYPE_HARDWARE,
 82 #define __PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_HARDWARE + 1)
 83 };
 84 
 85 struct parse_events_term {
 86         /** @list: The term list the term is a part of. */
 87         struct list_head list;
 88         /**
 89          * @config: The left-hand side of a term assignment, so the term
 90          * "event=8" would have the config be "event"
 91          */
 92         const char *config;
 93         /**
 94          * @val: The right-hand side of a term assignment that can either be a
 95          * string or a number depending on type_val.
 96          */
 97         union {
 98                 char *str;
 99                 u64  num;
100         } val;
101         /** @type_val: The union variable in val to be used for the term. */
102         enum parse_events__term_val_type type_val;
103         /**
104          * @type_term: A predefined term type or PARSE_EVENTS__TERM_TYPE_USER
105          * when not inbuilt.
106          */
107         enum parse_events__term_type type_term;
108         /**
109          * @err_term: The column index of the term from parsing, used during
110          * error output.
111          */
112         int err_term;
113         /**
114          * @err_val: The column index of the val from parsing, used during error
115          * output.
116          */
117         int err_val;
118         /** @used: Was the term used during parameterized-eval. */
119         bool used;
120         /**
121          * @weak: A term from the sysfs or json encoding of an event that
122          * shouldn't override terms coming from the command line.
123          */
124         bool weak;
125         /**
126          * @no_value: Is there no value. If a numeric term has no value then the
127          * value is assumed to be 1. An event name also has no value.
128          */
129         bool no_value;
130 };
131 
132 struct parse_events_error {
133         /** @list: The head of a list of errors. */
134         struct list_head list;
135 };
136 
137 /* A wrapper around a list of terms for the sake of better type safety. */
138 struct parse_events_terms {
139         struct list_head terms;
140 };
141 
142 struct parse_events_state {
143         /* The list parsed events are placed on. */
144         struct list_head           list;
145         /* The updated index used by entries as they are added. */
146         int                        idx;
147         /* Error information. */
148         struct parse_events_error *error;
149         /* Holds returned terms for term parsing. */
150         struct parse_events_terms *terms;
151         /* Start token. */
152         int                        stoken;
153         /* Special fake PMU marker for testing. */
154         struct perf_pmu           *fake_pmu;
155         /* Skip actual tracepoint processing for testing. */
156         bool                       fake_tp;
157         /* If non-null, when wildcard matching only match the given PMU. */
158         const char                *pmu_filter;
159         /* Should PE_LEGACY_NAME tokens be generated for config terms? */
160         bool                       match_legacy_cache_terms;
161         /* Were multiple PMUs scanned to find events? */
162         bool                       wild_card_pmus;
163 };
164 
165 bool parse_events__filter_pmu(const struct parse_events_state *parse_state,
166                               const struct perf_pmu *pmu);
167 void parse_events__shrink_config_terms(void);
168 int parse_events__is_hardcoded_term(struct parse_events_term *term);
169 int parse_events_term__num(struct parse_events_term **term,
170                            enum parse_events__term_type type_term,
171                            const char *config, u64 num,
172                            bool novalue,
173                            void *loc_term, void *loc_val);
174 int parse_events_term__str(struct parse_events_term **term,
175                            enum parse_events__term_type type_term,
176                            char *config, char *str,
177                            void *loc_term, void *loc_val);
178 int parse_events_term__term(struct parse_events_term **term,
179                             enum parse_events__term_type term_lhs,
180                             enum parse_events__term_type term_rhs,
181                             void *loc_term, void *loc_val);
182 int parse_events_term__clone(struct parse_events_term **new,
183                              const struct parse_events_term *term);
184 void parse_events_term__delete(struct parse_events_term *term);
185 
186 void parse_events_terms__delete(struct parse_events_terms *terms);
187 void parse_events_terms__init(struct parse_events_terms *terms);
188 void parse_events_terms__exit(struct parse_events_terms *terms);
189 int parse_events_terms(struct parse_events_terms *terms, const char *str, FILE *input);
190 int parse_events_terms__to_strbuf(const struct parse_events_terms *terms, struct strbuf *sb);
191 
192 struct parse_events_modifier {
193         u8 precise;     /* Number of repeated 'p' for precision. */
194         bool precise_max : 1;   /* 'P' */
195         bool non_idle : 1;      /* 'I' */
196         bool sample_read : 1;   /* 'S' */
197         bool pinned : 1;        /* 'D' */
198         bool exclusive : 1;     /* 'e' */
199         bool weak : 1;          /* 'W' */
200         bool bpf : 1;           /* 'b' */
201         bool user : 1;          /* 'u' */
202         bool kernel : 1;        /* 'k' */
203         bool hypervisor : 1;    /* 'h' */
204         bool guest : 1;         /* 'G' */
205         bool host : 1;          /* 'H' */
206 };
207 
208 int parse_events__modifier_event(struct parse_events_state *parse_state, void *loc,
209                                  struct list_head *list, struct parse_events_modifier mod);
210 int parse_events__modifier_group(struct parse_events_state *parse_state, void *loc,
211                                  struct list_head *list, struct parse_events_modifier mod);
212 int parse_events__set_default_name(struct list_head *list, char *name);
213 int parse_events_add_tracepoint(struct parse_events_state *parse_state,
214                                 struct list_head *list,
215                                 const char *sys, const char *event,
216                                 struct parse_events_error *error,
217                                 struct parse_events_terms *head_config, void *loc);
218 int parse_events_add_numeric(struct parse_events_state *parse_state,
219                              struct list_head *list,
220                              u32 type, u64 config,
221                              const struct parse_events_terms *head_config,
222                              bool wildcard);
223 int parse_events_add_tool(struct parse_events_state *parse_state,
224                           struct list_head *list,
225                           int tool_event);
226 int parse_events_add_cache(struct list_head *list, int *idx, const char *name,
227                            struct parse_events_state *parse_state,
228                            struct parse_events_terms *parsed_terms);
229 int parse_events__decode_legacy_cache(const char *name, int pmu_type, __u64 *config);
230 int parse_events_add_breakpoint(struct parse_events_state *parse_state,
231                                 struct list_head *list,
232                                 u64 addr, char *type, u64 len,
233                                 struct parse_events_terms *head_config);
234 
235 struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,
236                                       const char *name, const char *metric_id,
237                                       struct perf_pmu *pmu);
238 
239 int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
240                                const char *event_name,
241                                const struct parse_events_terms *const_parsed_terms,
242                                struct list_head **listp, void *loc);
243 
244 int parse_events_multi_pmu_add_or_add_pmu(struct parse_events_state *parse_state,
245                                         const char *event_or_pmu,
246                                         const struct parse_events_terms *const_parsed_terms,
247                                         struct list_head **listp,
248                                         void *loc_);
249 
250 void parse_events__set_leader(char *name, struct list_head *list);
251 
252 struct event_symbol {
253         const char      *symbol;
254         const char      *alias;
255 };
256 extern const struct event_symbol event_symbols_hw[];
257 extern const struct event_symbol event_symbols_sw[];
258 
259 char *parse_events_formats_error_string(char *additional_terms);
260 
261 void parse_events_error__init(struct parse_events_error *err);
262 void parse_events_error__exit(struct parse_events_error *err);
263 void parse_events_error__handle(struct parse_events_error *err, int idx,
264                                 char *str, char *help);
265 void parse_events_error__print(const struct parse_events_error *err,
266                                const char *event);
267 bool parse_events_error__contains(const struct parse_events_error *err,
268                                   const char *needle);
269 #ifdef HAVE_LIBELF_SUPPORT
270 /*
271  * If the probe point starts with '%',
272  * or starts with "sdt_" and has a ':' but no '=',
273  * then it should be a SDT/cached probe point.
274  */
275 static inline bool is_sdt_event(char *str)
276 {
277         return (str[0] == '%' ||
278                 (!strncmp(str, "sdt_", 4) &&
279                  !!strchr(str, ':') && !strchr(str, '=')));
280 }
281 #else
282 static inline bool is_sdt_event(char *str __maybe_unused)
283 {
284         return false;
285 }
286 #endif /* HAVE_LIBELF_SUPPORT */
287 
288 #endif /* __PERF_PARSE_EVENTS_H */
289 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php