2 %parse-param {void *_data}
3 %parse-param {void *scanner}
4 %lex-param {void* scanner}
11 #include <linux/compiler.h>
12 #include <linux/list.h>
13 #include <linux/types.h>
15 #include "parse-events.h"
16 #include "parse-events-bison.h"
18 #define ABORT_ON(val) \
24 #define ALLOC_LIST(list) \
26 list = malloc(sizeof(*list)); \
28 INIT_LIST_HEAD(list); \
31 static void inc_group_count(struct list_head *list,
32 struct parse_events_evlist *data)
34 /* Count groups only have more than 1 members */
35 if (!list_is_last(list->next, list))
41 %token PE_START_EVENTS PE_START_TERMS
42 %token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
45 %token PE_BPF_OBJECT PE_BPF_SOURCE
46 %token PE_MODIFIER_EVENT PE_MODIFIER_BP
47 %token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
48 %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
50 %token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
51 %token PE_ARRAY_ALL PE_ARRAY_RANGE
52 %token PE_DRV_CFG_TERM
54 %type <num> PE_VALUE_SYM_HW
55 %type <num> PE_VALUE_SYM_SW
59 %type <str> PE_BPF_OBJECT
60 %type <str> PE_BPF_SOURCE
61 %type <str> PE_NAME_CACHE_TYPE
62 %type <str> PE_NAME_CACHE_OP_RESULT
63 %type <str> PE_MODIFIER_EVENT
64 %type <str> PE_MODIFIER_BP
65 %type <str> PE_EVENT_NAME
66 %type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
67 %type <str> PE_DRV_CFG_TERM
69 %type <head> event_config
70 %type <head> opt_event_config
71 %type <head> opt_pmu_config
72 %type <term> event_term
73 %type <head> event_pmu
74 %type <head> event_legacy_symbol
75 %type <head> event_legacy_cache
76 %type <head> event_legacy_mem
77 %type <head> event_legacy_tracepoint
78 %type <tracepoint_name> tracepoint_name
79 %type <head> event_legacy_numeric
80 %type <head> event_legacy_raw
81 %type <head> event_bpf_file
82 %type <head> event_def
83 %type <head> event_mod
84 %type <head> event_name
87 %type <head> group_def
91 %type <array> array_term
92 %type <array> array_terms
98 struct list_head *head;
99 struct parse_events_term *term;
100 struct tracepoint_name {
104 struct parse_events_array array;
109 PE_START_EVENTS start_events
111 PE_START_TERMS start_terms
115 struct parse_events_evlist *data = _data;
117 parse_events_update_lists($1, &data->list);
123 struct list_head *list = $1;
124 struct list_head *group = $3;
126 parse_events_update_lists(group, list);
132 struct list_head *list = $1;
133 struct list_head *event = $3;
135 parse_events_update_lists(event, list);
144 group_def ':' PE_MODIFIER_EVENT
146 struct list_head *list = $1;
148 ABORT_ON(parse_events__modifier_group(list, $3));
155 PE_NAME '{' events '}'
157 struct list_head *list = $3;
159 inc_group_count(list, _data);
160 parse_events__set_leader($1, list);
166 struct list_head *list = $2;
168 inc_group_count(list, _data);
169 parse_events__set_leader(NULL, list);
176 struct list_head *event = $3;
177 struct list_head *list = $1;
179 parse_events_update_lists(event, list);
188 event_name PE_MODIFIER_EVENT
190 struct list_head *list = $1;
193 * Apply modifier on all events added by single event definition
194 * (there could be more events added for multiple tracepoint
195 * definitions via '*?'.
197 ABORT_ON(parse_events__modifier_event(list, $2, false));
204 PE_EVENT_NAME event_def
206 ABORT_ON(parse_events_name($2, $1));
213 event_def: event_pmu |
214 event_legacy_symbol |
215 event_legacy_cache sep_dc |
217 event_legacy_tracepoint sep_dc |
218 event_legacy_numeric sep_dc |
219 event_legacy_raw sep_dc |
223 PE_NAME opt_pmu_config
225 struct parse_events_evlist *data = _data;
226 struct list_head *list;
229 ABORT_ON(parse_events_add_pmu(data, list, $1, $2));
230 parse_events_terms__delete($2);
234 PE_KERNEL_PMU_EVENT sep_dc
236 struct parse_events_evlist *data = _data;
237 struct list_head *head;
238 struct parse_events_term *term;
239 struct list_head *list;
242 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
244 list_add_tail(&term->list, head);
247 ABORT_ON(parse_events_add_pmu(data, list, "cpu", head));
248 parse_events_terms__delete(head);
252 PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
254 struct parse_events_evlist *data = _data;
255 struct list_head *head;
256 struct parse_events_term *term;
257 struct list_head *list;
259 snprintf(&pmu_name, 128, "%s-%s", $1, $3);
262 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
263 &pmu_name, 1, &@1, NULL));
264 list_add_tail(&term->list, head);
267 ABORT_ON(parse_events_add_pmu(data, list, "cpu", head));
268 parse_events_terms__delete(head);
278 value_sym '/' event_config '/'
280 struct parse_events_evlist *data = _data;
281 struct list_head *list;
283 int config = $1 & 255;
286 ABORT_ON(parse_events_add_numeric(data, list, type, config, $3));
287 parse_events_terms__delete($3);
291 value_sym sep_slash_dc
293 struct parse_events_evlist *data = _data;
294 struct list_head *list;
296 int config = $1 & 255;
299 ABORT_ON(parse_events_add_numeric(data, list, type, config, NULL));
304 PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_event_config
306 struct parse_events_evlist *data = _data;
307 struct parse_events_error *error = data->error;
308 struct list_head *list;
311 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, $5, error, $6));
312 parse_events_terms__delete($6);
316 PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config
318 struct parse_events_evlist *data = _data;
319 struct parse_events_error *error = data->error;
320 struct list_head *list;
323 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, NULL, error, $4));
324 parse_events_terms__delete($4);
328 PE_NAME_CACHE_TYPE opt_event_config
330 struct parse_events_evlist *data = _data;
331 struct parse_events_error *error = data->error;
332 struct list_head *list;
335 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, NULL, NULL, error, $2));
336 parse_events_terms__delete($2);
341 PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc
343 struct parse_events_evlist *data = _data;
344 struct list_head *list;
347 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
348 (void *) $2, $6, $4));
352 PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc
354 struct parse_events_evlist *data = _data;
355 struct list_head *list;
358 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
359 (void *) $2, NULL, $4));
363 PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
365 struct parse_events_evlist *data = _data;
366 struct list_head *list;
369 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
370 (void *) $2, $4, 0));
374 PE_PREFIX_MEM PE_VALUE sep_dc
376 struct parse_events_evlist *data = _data;
377 struct list_head *list;
380 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
381 (void *) $2, NULL, 0));
385 event_legacy_tracepoint:
386 tracepoint_name opt_event_config
388 struct parse_events_evlist *data = _data;
389 struct parse_events_error *error = data->error;
390 struct list_head *list;
394 error->idx = @1.first_column;
396 if (parse_events_add_tracepoint(list, &data->idx, $1.sys, $1.event,
404 PE_NAME '-' PE_NAME ':' PE_NAME
407 struct tracepoint_name tracepoint;
409 snprintf(&sys_name, 128, "%s-%s", $1, $3);
410 tracepoint.sys = &sys_name;
411 tracepoint.event = $5;
418 struct tracepoint_name tracepoint = {$1, $3};
423 event_legacy_numeric:
424 PE_VALUE ':' PE_VALUE opt_event_config
426 struct parse_events_evlist *data = _data;
427 struct list_head *list;
430 ABORT_ON(parse_events_add_numeric(data, list, (u32)$1, $3, $4));
431 parse_events_terms__delete($4);
436 PE_RAW opt_event_config
438 struct parse_events_evlist *data = _data;
439 struct list_head *list;
442 ABORT_ON(parse_events_add_numeric(data, list, PERF_TYPE_RAW, $1, $2));
443 parse_events_terms__delete($2);
448 PE_BPF_OBJECT opt_event_config
450 struct parse_events_evlist *data = _data;
451 struct parse_events_error *error = data->error;
452 struct list_head *list;
455 ABORT_ON(parse_events_load_bpf(data, list, $1, false, $2));
456 parse_events_terms__delete($2);
460 PE_BPF_SOURCE opt_event_config
462 struct parse_events_evlist *data = _data;
463 struct list_head *list;
466 ABORT_ON(parse_events_load_bpf(data, list, $1, true, $2));
467 parse_events_terms__delete($2);
497 start_terms: event_config
499 struct parse_events_terms *data = _data;
504 event_config ',' event_term
506 struct list_head *head = $1;
507 struct parse_events_term *term = $3;
510 list_add_tail(&term->list, head);
516 struct list_head *head = malloc(sizeof(*head));
517 struct parse_events_term *term = $1;
520 INIT_LIST_HEAD(head);
521 list_add_tail(&term->list, head);
528 struct parse_events_term *term;
530 ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
537 struct parse_events_term *term;
539 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
544 PE_NAME '=' PE_VALUE_SYM_HW
546 struct parse_events_term *term;
547 int config = $3 & 255;
549 ABORT_ON(parse_events_term__sym_hw(&term, $1, config));
555 struct parse_events_term *term;
557 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
564 struct parse_events_term *term;
565 int config = $1 & 255;
567 ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
573 struct parse_events_term *term;
575 ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3));
581 struct parse_events_term *term;
583 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, &@1, &@3));
589 struct parse_events_term *term;
591 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, &@1, NULL));
595 PE_NAME array '=' PE_NAME
597 struct parse_events_term *term;
600 ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
607 PE_NAME array '=' PE_VALUE
609 struct parse_events_term *term;
611 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
619 struct parse_events_term *term;
621 ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG,
639 array_terms ',' array_term
641 struct parse_events_array new_array;
643 new_array.nr_ranges = $1.nr_ranges + $3.nr_ranges;
644 new_array.ranges = malloc(sizeof(new_array.ranges[0]) *
645 new_array.nr_ranges);
646 ABORT_ON(!new_array.ranges);
647 memcpy(&new_array.ranges[0], $1.ranges,
648 $1.nr_ranges * sizeof(new_array.ranges[0]));
649 memcpy(&new_array.ranges[$1.nr_ranges], $3.ranges,
650 $3.nr_ranges * sizeof(new_array.ranges[0]));
661 struct parse_events_array array;
664 array.ranges = malloc(sizeof(array.ranges[0]));
665 ABORT_ON(!array.ranges);
666 array.ranges[0].start = $1;
667 array.ranges[0].length = 1;
671 PE_VALUE PE_ARRAY_RANGE PE_VALUE
673 struct parse_events_array array;
677 array.ranges = malloc(sizeof(array.ranges[0]));
678 ABORT_ON(!array.ranges);
679 array.ranges[0].start = $1;
680 array.ranges[0].length = $3 - $1 + 1;
686 sep_slash_dc: '/' | ':' |
690 void parse_events_error(YYLTYPE *loc, void *data,
691 void *scanner __maybe_unused,
692 char const *msg __maybe_unused)
694 parse_events_evlist_error(data, loc->last_column, "parser error");