2 %parse-param {void *_data}
3 %parse-param {void *scanner}
4 %lex-param {void* scanner}
10 #include <linux/compiler.h>
11 #include <linux/list.h>
14 #include "parse-events.h"
15 #include "parse-events-bison.h"
17 extern int parse_events_lex (YYSTYPE* lvalp, void* scanner);
19 #define ABORT_ON(val) \
25 static inc_group_count(struct list_head *list,
26 struct parse_events_evlist *data)
28 /* Count groups only have more than 1 members */
29 if (!list_is_last(list->next, list))
35 %token PE_START_EVENTS PE_START_TERMS
36 %token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
39 %token PE_MODIFIER_EVENT PE_MODIFIER_BP
40 %token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
41 %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
44 %type <num> PE_VALUE_SYM_HW
45 %type <num> PE_VALUE_SYM_SW
49 %type <str> PE_NAME_CACHE_TYPE
50 %type <str> PE_NAME_CACHE_OP_RESULT
51 %type <str> PE_MODIFIER_EVENT
52 %type <str> PE_MODIFIER_BP
53 %type <str> PE_EVENT_NAME
55 %type <head> event_config
56 %type <term> event_term
57 %type <head> event_pmu
58 %type <head> event_legacy_symbol
59 %type <head> event_legacy_cache
60 %type <head> event_legacy_mem
61 %type <head> event_legacy_tracepoint
62 %type <head> event_legacy_numeric
63 %type <head> event_legacy_raw
64 %type <head> event_def
65 %type <head> event_mod
66 %type <head> event_name
69 %type <head> group_def
77 struct list_head *head;
78 struct parse_events_term *term;
83 PE_START_EVENTS start_events
85 PE_START_TERMS start_terms
89 struct parse_events_evlist *data = _data;
91 parse_events_update_lists($1, &data->list);
97 struct list_head *list = $1;
98 struct list_head *group = $3;
100 parse_events_update_lists(group, list);
106 struct list_head *list = $1;
107 struct list_head *event = $3;
109 parse_events_update_lists(event, list);
118 group_def ':' PE_MODIFIER_EVENT
120 struct list_head *list = $1;
122 ABORT_ON(parse_events__modifier_group(list, $3));
129 PE_NAME '{' events '}'
131 struct list_head *list = $3;
133 inc_group_count(list, _data);
134 parse_events__set_leader($1, list);
140 struct list_head *list = $2;
142 inc_group_count(list, _data);
143 parse_events__set_leader(NULL, list);
150 struct list_head *event = $3;
151 struct list_head *list = $1;
153 parse_events_update_lists(event, list);
162 event_name PE_MODIFIER_EVENT
164 struct list_head *list = $1;
167 * Apply modifier on all events added by single event definition
168 * (there could be more events added for multiple tracepoint
169 * definitions via '*?'.
171 ABORT_ON(parse_events__modifier_event(list, $2, false));
178 PE_EVENT_NAME event_def
180 ABORT_ON(parse_events_name($2, $1));
187 event_def: event_pmu |
188 event_legacy_symbol |
189 event_legacy_cache sep_dc |
191 event_legacy_tracepoint sep_dc |
192 event_legacy_numeric sep_dc |
193 event_legacy_raw sep_dc
196 PE_NAME '/' event_config '/'
198 struct parse_events_evlist *data = _data;
199 struct list_head *list = NULL;
201 ABORT_ON(parse_events_add_pmu(&list, &data->idx, $1, $3));
202 parse_events__free_terms($3);
212 value_sym '/' event_config '/'
214 struct parse_events_evlist *data = _data;
215 struct list_head *list = NULL;
217 int config = $1 & 255;
219 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
221 parse_events__free_terms($3);
225 value_sym sep_slash_dc
227 struct parse_events_evlist *data = _data;
228 struct list_head *list = NULL;
230 int config = $1 & 255;
232 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
233 type, config, NULL));
238 PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT
240 struct parse_events_evlist *data = _data;
241 struct list_head *list = NULL;
243 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, $5));
247 PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT
249 struct parse_events_evlist *data = _data;
250 struct list_head *list = NULL;
252 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, NULL));
258 struct parse_events_evlist *data = _data;
259 struct list_head *list = NULL;
261 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, NULL, NULL));
266 PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
268 struct parse_events_evlist *data = _data;
269 struct list_head *list = NULL;
271 ABORT_ON(parse_events_add_breakpoint(&list, &data->idx,
276 PE_PREFIX_MEM PE_VALUE sep_dc
278 struct parse_events_evlist *data = _data;
279 struct list_head *list = NULL;
281 ABORT_ON(parse_events_add_breakpoint(&list, &data->idx,
286 event_legacy_tracepoint:
289 struct parse_events_evlist *data = _data;
290 struct list_head *list = NULL;
292 ABORT_ON(parse_events_add_tracepoint(&list, &data->idx, $1, $3));
296 event_legacy_numeric:
297 PE_VALUE ':' PE_VALUE
299 struct parse_events_evlist *data = _data;
300 struct list_head *list = NULL;
302 ABORT_ON(parse_events_add_numeric(&list, &data->idx, (u32)$1, $3, NULL));
309 struct parse_events_evlist *data = _data;
310 struct list_head *list = NULL;
312 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
313 PERF_TYPE_RAW, $1, NULL));
317 start_terms: event_config
319 struct parse_events_terms *data = _data;
324 event_config ',' event_term
326 struct list_head *head = $1;
327 struct parse_events_term *term = $3;
330 list_add_tail(&term->list, head);
336 struct list_head *head = malloc(sizeof(*head));
337 struct parse_events_term *term = $1;
340 INIT_LIST_HEAD(head);
341 list_add_tail(&term->list, head);
348 struct parse_events_term *term;
350 ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
357 struct parse_events_term *term;
359 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
364 PE_NAME '=' PE_VALUE_SYM_HW
366 struct parse_events_term *term;
367 int config = $3 & 255;
369 ABORT_ON(parse_events_term__sym_hw(&term, $1, config));
375 struct parse_events_term *term;
377 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
384 struct parse_events_term *term;
385 int config = $1 & 255;
387 ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
393 struct parse_events_term *term;
395 ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3));
401 struct parse_events_term *term;
403 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3));
409 struct parse_events_term *term;
411 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1));
417 sep_slash_dc: '/' | ':' |
421 void parse_events_error(void *data __maybe_unused, void *scanner __maybe_unused,
422 char const *msg __maybe_unused)