Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/hw_breakpoint.h>
3#include <linux/err.h>
4#include <linux/list_sort.h>
5#include <linux/zalloc.h>
6#include <dirent.h>
7#include <errno.h>
8#include <sys/ioctl.h>
9#include <sys/param.h>
10#include "term.h"
11#include "evlist.h"
12#include "evsel.h"
13#include <subcmd/parse-options.h>
14#include "parse-events.h"
15#include "string2.h"
16#include "strbuf.h"
17#include "debug.h"
18#include <api/fs/tracing_path.h>
19#include <perf/cpumap.h>
20#include <util/parse-events-bison.h>
21#include <util/parse-events-flex.h>
22#include "pmu.h"
23#include "pmus.h"
24#include "asm/bug.h"
25#include "util/parse-branch-options.h"
26#include "util/evsel_config.h"
27#include "util/event.h"
28#include "util/bpf-filter.h"
29#include "util/util.h"
30#include "tracepoint.h"
31
32#define MAX_NAME_LEN 100
33
34#ifdef PARSER_DEBUG
35extern int parse_events_debug;
36#endif
37static int get_config_terms(struct parse_events_terms *head_config, struct list_head *head_terms);
38static int parse_events_terms__copy(const struct parse_events_terms *src,
39 struct parse_events_terms *dest);
40
41struct event_symbol event_symbols_hw[PERF_COUNT_HW_MAX] = {
42 [PERF_COUNT_HW_CPU_CYCLES] = {
43 .symbol = "cpu-cycles",
44 .alias = "cycles",
45 },
46 [PERF_COUNT_HW_INSTRUCTIONS] = {
47 .symbol = "instructions",
48 .alias = "",
49 },
50 [PERF_COUNT_HW_CACHE_REFERENCES] = {
51 .symbol = "cache-references",
52 .alias = "",
53 },
54 [PERF_COUNT_HW_CACHE_MISSES] = {
55 .symbol = "cache-misses",
56 .alias = "",
57 },
58 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = {
59 .symbol = "branch-instructions",
60 .alias = "branches",
61 },
62 [PERF_COUNT_HW_BRANCH_MISSES] = {
63 .symbol = "branch-misses",
64 .alias = "",
65 },
66 [PERF_COUNT_HW_BUS_CYCLES] = {
67 .symbol = "bus-cycles",
68 .alias = "",
69 },
70 [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = {
71 .symbol = "stalled-cycles-frontend",
72 .alias = "idle-cycles-frontend",
73 },
74 [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = {
75 .symbol = "stalled-cycles-backend",
76 .alias = "idle-cycles-backend",
77 },
78 [PERF_COUNT_HW_REF_CPU_CYCLES] = {
79 .symbol = "ref-cycles",
80 .alias = "",
81 },
82};
83
84struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
85 [PERF_COUNT_SW_CPU_CLOCK] = {
86 .symbol = "cpu-clock",
87 .alias = "",
88 },
89 [PERF_COUNT_SW_TASK_CLOCK] = {
90 .symbol = "task-clock",
91 .alias = "",
92 },
93 [PERF_COUNT_SW_PAGE_FAULTS] = {
94 .symbol = "page-faults",
95 .alias = "faults",
96 },
97 [PERF_COUNT_SW_CONTEXT_SWITCHES] = {
98 .symbol = "context-switches",
99 .alias = "cs",
100 },
101 [PERF_COUNT_SW_CPU_MIGRATIONS] = {
102 .symbol = "cpu-migrations",
103 .alias = "migrations",
104 },
105 [PERF_COUNT_SW_PAGE_FAULTS_MIN] = {
106 .symbol = "minor-faults",
107 .alias = "",
108 },
109 [PERF_COUNT_SW_PAGE_FAULTS_MAJ] = {
110 .symbol = "major-faults",
111 .alias = "",
112 },
113 [PERF_COUNT_SW_ALIGNMENT_FAULTS] = {
114 .symbol = "alignment-faults",
115 .alias = "",
116 },
117 [PERF_COUNT_SW_EMULATION_FAULTS] = {
118 .symbol = "emulation-faults",
119 .alias = "",
120 },
121 [PERF_COUNT_SW_DUMMY] = {
122 .symbol = "dummy",
123 .alias = "",
124 },
125 [PERF_COUNT_SW_BPF_OUTPUT] = {
126 .symbol = "bpf-output",
127 .alias = "",
128 },
129 [PERF_COUNT_SW_CGROUP_SWITCHES] = {
130 .symbol = "cgroup-switches",
131 .alias = "",
132 },
133};
134
135const char *event_type(int type)
136{
137 switch (type) {
138 case PERF_TYPE_HARDWARE:
139 return "hardware";
140
141 case PERF_TYPE_SOFTWARE:
142 return "software";
143
144 case PERF_TYPE_TRACEPOINT:
145 return "tracepoint";
146
147 case PERF_TYPE_HW_CACHE:
148 return "hardware-cache";
149
150 default:
151 break;
152 }
153
154 return "unknown";
155}
156
157static char *get_config_str(struct parse_events_terms *head_terms,
158 enum parse_events__term_type type_term)
159{
160 struct parse_events_term *term;
161
162 if (!head_terms)
163 return NULL;
164
165 list_for_each_entry(term, &head_terms->terms, list)
166 if (term->type_term == type_term)
167 return term->val.str;
168
169 return NULL;
170}
171
172static char *get_config_metric_id(struct parse_events_terms *head_terms)
173{
174 return get_config_str(head_terms, PARSE_EVENTS__TERM_TYPE_METRIC_ID);
175}
176
177static char *get_config_name(struct parse_events_terms *head_terms)
178{
179 return get_config_str(head_terms, PARSE_EVENTS__TERM_TYPE_NAME);
180}
181
182/**
183 * fix_raw - For each raw term see if there is an event (aka alias) in pmu that
184 * matches the raw's string value. If the string value matches an
185 * event then change the term to be an event, if not then change it to
186 * be a config term. For example, "read" may be an event of the PMU or
187 * a raw hex encoding of 0xead. The fix-up is done late so the PMU of
188 * the event can be determined and we don't need to scan all PMUs
189 * ahead-of-time.
190 * @config_terms: the list of terms that may contain a raw term.
191 * @pmu: the PMU to scan for events from.
192 */
193static void fix_raw(struct parse_events_terms *config_terms, struct perf_pmu *pmu)
194{
195 struct parse_events_term *term;
196
197 list_for_each_entry(term, &config_terms->terms, list) {
198 u64 num;
199
200 if (term->type_term != PARSE_EVENTS__TERM_TYPE_RAW)
201 continue;
202
203 if (perf_pmu__have_event(pmu, term->val.str)) {
204 zfree(&term->config);
205 term->config = term->val.str;
206 term->type_val = PARSE_EVENTS__TERM_TYPE_NUM;
207 term->type_term = PARSE_EVENTS__TERM_TYPE_USER;
208 term->val.num = 1;
209 term->no_value = true;
210 continue;
211 }
212
213 zfree(&term->config);
214 term->config = strdup("config");
215 errno = 0;
216 num = strtoull(term->val.str + 1, NULL, 16);
217 assert(errno == 0);
218 free(term->val.str);
219 term->type_val = PARSE_EVENTS__TERM_TYPE_NUM;
220 term->type_term = PARSE_EVENTS__TERM_TYPE_CONFIG;
221 term->val.num = num;
222 term->no_value = false;
223 }
224}
225
226static struct evsel *
227__add_event(struct list_head *list, int *idx,
228 struct perf_event_attr *attr,
229 bool init_attr,
230 const char *name, const char *metric_id, struct perf_pmu *pmu,
231 struct list_head *config_terms, bool auto_merge_stats,
232 const char *cpu_list)
233{
234 struct evsel *evsel;
235 struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) :
236 cpu_list ? perf_cpu_map__new(cpu_list) : NULL;
237
238 if (pmu)
239 perf_pmu__warn_invalid_formats(pmu);
240
241 if (pmu && (attr->type == PERF_TYPE_RAW || attr->type >= PERF_TYPE_MAX)) {
242 perf_pmu__warn_invalid_config(pmu, attr->config, name,
243 PERF_PMU_FORMAT_VALUE_CONFIG, "config");
244 perf_pmu__warn_invalid_config(pmu, attr->config1, name,
245 PERF_PMU_FORMAT_VALUE_CONFIG1, "config1");
246 perf_pmu__warn_invalid_config(pmu, attr->config2, name,
247 PERF_PMU_FORMAT_VALUE_CONFIG2, "config2");
248 perf_pmu__warn_invalid_config(pmu, attr->config3, name,
249 PERF_PMU_FORMAT_VALUE_CONFIG3, "config3");
250 }
251 if (init_attr)
252 event_attr_init(attr);
253
254 evsel = evsel__new_idx(attr, *idx);
255 if (!evsel) {
256 perf_cpu_map__put(cpus);
257 return NULL;
258 }
259
260 (*idx)++;
261 evsel->core.cpus = cpus;
262 evsel->core.own_cpus = perf_cpu_map__get(cpus);
263 evsel->core.requires_cpu = pmu ? pmu->is_uncore : false;
264 evsel->core.is_pmu_core = pmu ? pmu->is_core : false;
265 evsel->auto_merge_stats = auto_merge_stats;
266 evsel->pmu = pmu;
267 evsel->pmu_name = pmu ? strdup(pmu->name) : NULL;
268
269 if (name)
270 evsel->name = strdup(name);
271
272 if (metric_id)
273 evsel->metric_id = strdup(metric_id);
274
275 if (config_terms)
276 list_splice_init(config_terms, &evsel->config_terms);
277
278 if (list)
279 list_add_tail(&evsel->core.node, list);
280
281 return evsel;
282}
283
284struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,
285 const char *name, const char *metric_id,
286 struct perf_pmu *pmu)
287{
288 return __add_event(/*list=*/NULL, &idx, attr, /*init_attr=*/false, name,
289 metric_id, pmu, /*config_terms=*/NULL,
290 /*auto_merge_stats=*/false, /*cpu_list=*/NULL);
291}
292
293static int add_event(struct list_head *list, int *idx,
294 struct perf_event_attr *attr, const char *name,
295 const char *metric_id, struct list_head *config_terms)
296{
297 return __add_event(list, idx, attr, /*init_attr*/true, name, metric_id,
298 /*pmu=*/NULL, config_terms,
299 /*auto_merge_stats=*/false, /*cpu_list=*/NULL) ? 0 : -ENOMEM;
300}
301
302static int add_event_tool(struct list_head *list, int *idx,
303 enum perf_tool_event tool_event)
304{
305 struct evsel *evsel;
306 struct perf_event_attr attr = {
307 .type = PERF_TYPE_SOFTWARE,
308 .config = PERF_COUNT_SW_DUMMY,
309 };
310
311 evsel = __add_event(list, idx, &attr, /*init_attr=*/true, /*name=*/NULL,
312 /*metric_id=*/NULL, /*pmu=*/NULL,
313 /*config_terms=*/NULL, /*auto_merge_stats=*/false,
314 /*cpu_list=*/"0");
315 if (!evsel)
316 return -ENOMEM;
317 evsel->tool_event = tool_event;
318 if (tool_event == PERF_TOOL_DURATION_TIME
319 || tool_event == PERF_TOOL_USER_TIME
320 || tool_event == PERF_TOOL_SYSTEM_TIME) {
321 free((char *)evsel->unit);
322 evsel->unit = strdup("ns");
323 }
324 return 0;
325}
326
327/**
328 * parse_aliases - search names for entries beginning or equalling str ignoring
329 * case. If mutliple entries in names match str then the longest
330 * is chosen.
331 * @str: The needle to look for.
332 * @names: The haystack to search.
333 * @size: The size of the haystack.
334 * @longest: Out argument giving the length of the matching entry.
335 */
336static int parse_aliases(const char *str, const char *const names[][EVSEL__MAX_ALIASES], int size,
337 int *longest)
338{
339 *longest = -1;
340 for (int i = 0; i < size; i++) {
341 for (int j = 0; j < EVSEL__MAX_ALIASES && names[i][j]; j++) {
342 int n = strlen(names[i][j]);
343
344 if (n > *longest && !strncasecmp(str, names[i][j], n))
345 *longest = n;
346 }
347 if (*longest > 0)
348 return i;
349 }
350
351 return -1;
352}
353
354typedef int config_term_func_t(struct perf_event_attr *attr,
355 struct parse_events_term *term,
356 struct parse_events_error *err);
357static int config_term_common(struct perf_event_attr *attr,
358 struct parse_events_term *term,
359 struct parse_events_error *err);
360static int config_attr(struct perf_event_attr *attr,
361 struct parse_events_terms *head,
362 struct parse_events_error *err,
363 config_term_func_t config_term);
364
365/**
366 * parse_events__decode_legacy_cache - Search name for the legacy cache event
367 * name composed of 1, 2 or 3 hyphen
368 * separated sections. The first section is
369 * the cache type while the others are the
370 * optional op and optional result. To make
371 * life hard the names in the table also
372 * contain hyphens and the longest name
373 * should always be selected.
374 */
375int parse_events__decode_legacy_cache(const char *name, int extended_pmu_type, __u64 *config)
376{
377 int len, cache_type = -1, cache_op = -1, cache_result = -1;
378 const char *name_end = &name[strlen(name) + 1];
379 const char *str = name;
380
381 cache_type = parse_aliases(str, evsel__hw_cache, PERF_COUNT_HW_CACHE_MAX, &len);
382 if (cache_type == -1)
383 return -EINVAL;
384 str += len + 1;
385
386 if (str < name_end) {
387 cache_op = parse_aliases(str, evsel__hw_cache_op,
388 PERF_COUNT_HW_CACHE_OP_MAX, &len);
389 if (cache_op >= 0) {
390 if (!evsel__is_cache_op_valid(cache_type, cache_op))
391 return -EINVAL;
392 str += len + 1;
393 } else {
394 cache_result = parse_aliases(str, evsel__hw_cache_result,
395 PERF_COUNT_HW_CACHE_RESULT_MAX, &len);
396 if (cache_result >= 0)
397 str += len + 1;
398 }
399 }
400 if (str < name_end) {
401 if (cache_op < 0) {
402 cache_op = parse_aliases(str, evsel__hw_cache_op,
403 PERF_COUNT_HW_CACHE_OP_MAX, &len);
404 if (cache_op >= 0) {
405 if (!evsel__is_cache_op_valid(cache_type, cache_op))
406 return -EINVAL;
407 }
408 } else if (cache_result < 0) {
409 cache_result = parse_aliases(str, evsel__hw_cache_result,
410 PERF_COUNT_HW_CACHE_RESULT_MAX, &len);
411 }
412 }
413
414 /*
415 * Fall back to reads:
416 */
417 if (cache_op == -1)
418 cache_op = PERF_COUNT_HW_CACHE_OP_READ;
419
420 /*
421 * Fall back to accesses:
422 */
423 if (cache_result == -1)
424 cache_result = PERF_COUNT_HW_CACHE_RESULT_ACCESS;
425
426 *config = cache_type | (cache_op << 8) | (cache_result << 16);
427 if (perf_pmus__supports_extended_type())
428 *config |= (__u64)extended_pmu_type << PERF_PMU_TYPE_SHIFT;
429 return 0;
430}
431
432/**
433 * parse_events__filter_pmu - returns false if a wildcard PMU should be
434 * considered, true if it should be filtered.
435 */
436bool parse_events__filter_pmu(const struct parse_events_state *parse_state,
437 const struct perf_pmu *pmu)
438{
439 if (parse_state->pmu_filter == NULL)
440 return false;
441
442 return strcmp(parse_state->pmu_filter, pmu->name) != 0;
443}
444
445int parse_events_add_cache(struct list_head *list, int *idx, const char *name,
446 struct parse_events_state *parse_state,
447 struct parse_events_terms *head_config)
448{
449 struct perf_pmu *pmu = NULL;
450 bool found_supported = false;
451 const char *config_name = get_config_name(head_config);
452 const char *metric_id = get_config_metric_id(head_config);
453
454 /* Legacy cache events are only supported by core PMUs. */
455 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) {
456 LIST_HEAD(config_terms);
457 struct perf_event_attr attr;
458 int ret;
459
460 if (parse_events__filter_pmu(parse_state, pmu))
461 continue;
462
463 memset(&attr, 0, sizeof(attr));
464 attr.type = PERF_TYPE_HW_CACHE;
465
466 ret = parse_events__decode_legacy_cache(name, pmu->type, &attr.config);
467 if (ret)
468 return ret;
469
470 found_supported = true;
471
472 if (head_config) {
473 if (config_attr(&attr, head_config, parse_state->error, config_term_common))
474 return -EINVAL;
475
476 if (get_config_terms(head_config, &config_terms))
477 return -ENOMEM;
478 }
479
480 if (__add_event(list, idx, &attr, /*init_attr*/true, config_name ?: name,
481 metric_id, pmu, &config_terms, /*auto_merge_stats=*/false,
482 /*cpu_list=*/NULL) == NULL)
483 return -ENOMEM;
484
485 free_config_terms(&config_terms);
486 }
487 return found_supported ? 0 : -EINVAL;
488}
489
490#ifdef HAVE_LIBTRACEEVENT
491static void tracepoint_error(struct parse_events_error *e, int err,
492 const char *sys, const char *name, int column)
493{
494 const char *str;
495 char help[BUFSIZ];
496
497 if (!e)
498 return;
499
500 /*
501 * We get error directly from syscall errno ( > 0),
502 * or from encoded pointer's error ( < 0).
503 */
504 err = abs(err);
505
506 switch (err) {
507 case EACCES:
508 str = "can't access trace events";
509 break;
510 case ENOENT:
511 str = "unknown tracepoint";
512 break;
513 default:
514 str = "failed to add tracepoint";
515 break;
516 }
517
518 tracing_path__strerror_open_tp(err, help, sizeof(help), sys, name);
519 parse_events_error__handle(e, column, strdup(str), strdup(help));
520}
521
522static int add_tracepoint(struct list_head *list, int *idx,
523 const char *sys_name, const char *evt_name,
524 struct parse_events_error *err,
525 struct parse_events_terms *head_config, void *loc_)
526{
527 YYLTYPE *loc = loc_;
528 struct evsel *evsel = evsel__newtp_idx(sys_name, evt_name, (*idx)++);
529
530 if (IS_ERR(evsel)) {
531 tracepoint_error(err, PTR_ERR(evsel), sys_name, evt_name, loc->first_column);
532 return PTR_ERR(evsel);
533 }
534
535 if (head_config) {
536 LIST_HEAD(config_terms);
537
538 if (get_config_terms(head_config, &config_terms))
539 return -ENOMEM;
540 list_splice(&config_terms, &evsel->config_terms);
541 }
542
543 list_add_tail(&evsel->core.node, list);
544 return 0;
545}
546
547static int add_tracepoint_multi_event(struct list_head *list, int *idx,
548 const char *sys_name, const char *evt_name,
549 struct parse_events_error *err,
550 struct parse_events_terms *head_config, YYLTYPE *loc)
551{
552 char *evt_path;
553 struct dirent *evt_ent;
554 DIR *evt_dir;
555 int ret = 0, found = 0;
556
557 evt_path = get_events_file(sys_name);
558 if (!evt_path) {
559 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column);
560 return -1;
561 }
562 evt_dir = opendir(evt_path);
563 if (!evt_dir) {
564 put_events_file(evt_path);
565 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column);
566 return -1;
567 }
568
569 while (!ret && (evt_ent = readdir(evt_dir))) {
570 if (!strcmp(evt_ent->d_name, ".")
571 || !strcmp(evt_ent->d_name, "..")
572 || !strcmp(evt_ent->d_name, "enable")
573 || !strcmp(evt_ent->d_name, "filter"))
574 continue;
575
576 if (!strglobmatch(evt_ent->d_name, evt_name))
577 continue;
578
579 found++;
580
581 ret = add_tracepoint(list, idx, sys_name, evt_ent->d_name,
582 err, head_config, loc);
583 }
584
585 if (!found) {
586 tracepoint_error(err, ENOENT, sys_name, evt_name, loc->first_column);
587 ret = -1;
588 }
589
590 put_events_file(evt_path);
591 closedir(evt_dir);
592 return ret;
593}
594
595static int add_tracepoint_event(struct list_head *list, int *idx,
596 const char *sys_name, const char *evt_name,
597 struct parse_events_error *err,
598 struct parse_events_terms *head_config, YYLTYPE *loc)
599{
600 return strpbrk(evt_name, "*?") ?
601 add_tracepoint_multi_event(list, idx, sys_name, evt_name,
602 err, head_config, loc) :
603 add_tracepoint(list, idx, sys_name, evt_name,
604 err, head_config, loc);
605}
606
607static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
608 const char *sys_name, const char *evt_name,
609 struct parse_events_error *err,
610 struct parse_events_terms *head_config, YYLTYPE *loc)
611{
612 struct dirent *events_ent;
613 DIR *events_dir;
614 int ret = 0;
615
616 events_dir = tracing_events__opendir();
617 if (!events_dir) {
618 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column);
619 return -1;
620 }
621
622 while (!ret && (events_ent = readdir(events_dir))) {
623 if (!strcmp(events_ent->d_name, ".")
624 || !strcmp(events_ent->d_name, "..")
625 || !strcmp(events_ent->d_name, "enable")
626 || !strcmp(events_ent->d_name, "header_event")
627 || !strcmp(events_ent->d_name, "header_page"))
628 continue;
629
630 if (!strglobmatch(events_ent->d_name, sys_name))
631 continue;
632
633 ret = add_tracepoint_event(list, idx, events_ent->d_name,
634 evt_name, err, head_config, loc);
635 }
636
637 closedir(events_dir);
638 return ret;
639}
640#endif /* HAVE_LIBTRACEEVENT */
641
642static int
643parse_breakpoint_type(const char *type, struct perf_event_attr *attr)
644{
645 int i;
646
647 for (i = 0; i < 3; i++) {
648 if (!type || !type[i])
649 break;
650
651#define CHECK_SET_TYPE(bit) \
652do { \
653 if (attr->bp_type & bit) \
654 return -EINVAL; \
655 else \
656 attr->bp_type |= bit; \
657} while (0)
658
659 switch (type[i]) {
660 case 'r':
661 CHECK_SET_TYPE(HW_BREAKPOINT_R);
662 break;
663 case 'w':
664 CHECK_SET_TYPE(HW_BREAKPOINT_W);
665 break;
666 case 'x':
667 CHECK_SET_TYPE(HW_BREAKPOINT_X);
668 break;
669 default:
670 return -EINVAL;
671 }
672 }
673
674#undef CHECK_SET_TYPE
675
676 if (!attr->bp_type) /* Default */
677 attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W;
678
679 return 0;
680}
681
682int parse_events_add_breakpoint(struct parse_events_state *parse_state,
683 struct list_head *list,
684 u64 addr, char *type, u64 len,
685 struct parse_events_terms *head_config)
686{
687 struct perf_event_attr attr;
688 LIST_HEAD(config_terms);
689 const char *name;
690
691 memset(&attr, 0, sizeof(attr));
692 attr.bp_addr = addr;
693
694 if (parse_breakpoint_type(type, &attr))
695 return -EINVAL;
696
697 /* Provide some defaults if len is not specified */
698 if (!len) {
699 if (attr.bp_type == HW_BREAKPOINT_X)
700 len = sizeof(long);
701 else
702 len = HW_BREAKPOINT_LEN_4;
703 }
704
705 attr.bp_len = len;
706
707 attr.type = PERF_TYPE_BREAKPOINT;
708 attr.sample_period = 1;
709
710 if (head_config) {
711 if (config_attr(&attr, head_config, parse_state->error,
712 config_term_common))
713 return -EINVAL;
714
715 if (get_config_terms(head_config, &config_terms))
716 return -ENOMEM;
717 }
718
719 name = get_config_name(head_config);
720
721 return add_event(list, &parse_state->idx, &attr, name, /*mertic_id=*/NULL,
722 &config_terms);
723}
724
725static int check_type_val(struct parse_events_term *term,
726 struct parse_events_error *err,
727 enum parse_events__term_val_type type)
728{
729 if (type == term->type_val)
730 return 0;
731
732 if (err) {
733 parse_events_error__handle(err, term->err_val,
734 type == PARSE_EVENTS__TERM_TYPE_NUM
735 ? strdup("expected numeric value")
736 : strdup("expected string value"),
737 NULL);
738 }
739 return -EINVAL;
740}
741
742static bool config_term_shrinked;
743
744static const char *config_term_name(enum parse_events__term_type term_type)
745{
746 /*
747 * Update according to parse-events.l
748 */
749 static const char *config_term_names[__PARSE_EVENTS__TERM_TYPE_NR] = {
750 [PARSE_EVENTS__TERM_TYPE_USER] = "<sysfs term>",
751 [PARSE_EVENTS__TERM_TYPE_CONFIG] = "config",
752 [PARSE_EVENTS__TERM_TYPE_CONFIG1] = "config1",
753 [PARSE_EVENTS__TERM_TYPE_CONFIG2] = "config2",
754 [PARSE_EVENTS__TERM_TYPE_CONFIG3] = "config3",
755 [PARSE_EVENTS__TERM_TYPE_NAME] = "name",
756 [PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD] = "period",
757 [PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ] = "freq",
758 [PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE] = "branch_type",
759 [PARSE_EVENTS__TERM_TYPE_TIME] = "time",
760 [PARSE_EVENTS__TERM_TYPE_CALLGRAPH] = "call-graph",
761 [PARSE_EVENTS__TERM_TYPE_STACKSIZE] = "stack-size",
762 [PARSE_EVENTS__TERM_TYPE_NOINHERIT] = "no-inherit",
763 [PARSE_EVENTS__TERM_TYPE_INHERIT] = "inherit",
764 [PARSE_EVENTS__TERM_TYPE_MAX_STACK] = "max-stack",
765 [PARSE_EVENTS__TERM_TYPE_MAX_EVENTS] = "nr",
766 [PARSE_EVENTS__TERM_TYPE_OVERWRITE] = "overwrite",
767 [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite",
768 [PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config",
769 [PARSE_EVENTS__TERM_TYPE_PERCORE] = "percore",
770 [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] = "aux-output",
771 [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] = "aux-sample-size",
772 [PARSE_EVENTS__TERM_TYPE_METRIC_ID] = "metric-id",
773 [PARSE_EVENTS__TERM_TYPE_RAW] = "raw",
774 [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] = "legacy-cache",
775 [PARSE_EVENTS__TERM_TYPE_HARDWARE] = "hardware",
776 };
777 if ((unsigned int)term_type >= __PARSE_EVENTS__TERM_TYPE_NR)
778 return "unknown term";
779
780 return config_term_names[term_type];
781}
782
783static bool
784config_term_avail(enum parse_events__term_type term_type, struct parse_events_error *err)
785{
786 char *err_str;
787
788 if (term_type < 0 || term_type >= __PARSE_EVENTS__TERM_TYPE_NR) {
789 parse_events_error__handle(err, -1,
790 strdup("Invalid term_type"), NULL);
791 return false;
792 }
793 if (!config_term_shrinked)
794 return true;
795
796 switch (term_type) {
797 case PARSE_EVENTS__TERM_TYPE_CONFIG:
798 case PARSE_EVENTS__TERM_TYPE_CONFIG1:
799 case PARSE_EVENTS__TERM_TYPE_CONFIG2:
800 case PARSE_EVENTS__TERM_TYPE_CONFIG3:
801 case PARSE_EVENTS__TERM_TYPE_NAME:
802 case PARSE_EVENTS__TERM_TYPE_METRIC_ID:
803 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
804 case PARSE_EVENTS__TERM_TYPE_PERCORE:
805 return true;
806 case PARSE_EVENTS__TERM_TYPE_USER:
807 case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
808 case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
809 case PARSE_EVENTS__TERM_TYPE_TIME:
810 case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
811 case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
812 case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
813 case PARSE_EVENTS__TERM_TYPE_INHERIT:
814 case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
815 case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
816 case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
817 case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
818 case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
819 case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
820 case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
821 case PARSE_EVENTS__TERM_TYPE_RAW:
822 case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE:
823 case PARSE_EVENTS__TERM_TYPE_HARDWARE:
824 default:
825 if (!err)
826 return false;
827
828 /* term_type is validated so indexing is safe */
829 if (asprintf(&err_str, "'%s' is not usable in 'perf stat'",
830 config_term_name(term_type)) >= 0)
831 parse_events_error__handle(err, -1, err_str, NULL);
832 return false;
833 }
834}
835
836void parse_events__shrink_config_terms(void)
837{
838 config_term_shrinked = true;
839}
840
841static int config_term_common(struct perf_event_attr *attr,
842 struct parse_events_term *term,
843 struct parse_events_error *err)
844{
845#define CHECK_TYPE_VAL(type) \
846do { \
847 if (check_type_val(term, err, PARSE_EVENTS__TERM_TYPE_ ## type)) \
848 return -EINVAL; \
849} while (0)
850
851 switch (term->type_term) {
852 case PARSE_EVENTS__TERM_TYPE_CONFIG:
853 CHECK_TYPE_VAL(NUM);
854 attr->config = term->val.num;
855 break;
856 case PARSE_EVENTS__TERM_TYPE_CONFIG1:
857 CHECK_TYPE_VAL(NUM);
858 attr->config1 = term->val.num;
859 break;
860 case PARSE_EVENTS__TERM_TYPE_CONFIG2:
861 CHECK_TYPE_VAL(NUM);
862 attr->config2 = term->val.num;
863 break;
864 case PARSE_EVENTS__TERM_TYPE_CONFIG3:
865 CHECK_TYPE_VAL(NUM);
866 attr->config3 = term->val.num;
867 break;
868 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
869 CHECK_TYPE_VAL(NUM);
870 break;
871 case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
872 CHECK_TYPE_VAL(NUM);
873 break;
874 case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
875 CHECK_TYPE_VAL(STR);
876 if (strcmp(term->val.str, "no") &&
877 parse_branch_str(term->val.str,
878 &attr->branch_sample_type)) {
879 parse_events_error__handle(err, term->err_val,
880 strdup("invalid branch sample type"),
881 NULL);
882 return -EINVAL;
883 }
884 break;
885 case PARSE_EVENTS__TERM_TYPE_TIME:
886 CHECK_TYPE_VAL(NUM);
887 if (term->val.num > 1) {
888 parse_events_error__handle(err, term->err_val,
889 strdup("expected 0 or 1"),
890 NULL);
891 return -EINVAL;
892 }
893 break;
894 case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
895 CHECK_TYPE_VAL(STR);
896 break;
897 case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
898 CHECK_TYPE_VAL(NUM);
899 break;
900 case PARSE_EVENTS__TERM_TYPE_INHERIT:
901 CHECK_TYPE_VAL(NUM);
902 break;
903 case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
904 CHECK_TYPE_VAL(NUM);
905 break;
906 case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
907 CHECK_TYPE_VAL(NUM);
908 break;
909 case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
910 CHECK_TYPE_VAL(NUM);
911 break;
912 case PARSE_EVENTS__TERM_TYPE_NAME:
913 CHECK_TYPE_VAL(STR);
914 break;
915 case PARSE_EVENTS__TERM_TYPE_METRIC_ID:
916 CHECK_TYPE_VAL(STR);
917 break;
918 case PARSE_EVENTS__TERM_TYPE_RAW:
919 CHECK_TYPE_VAL(STR);
920 break;
921 case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
922 CHECK_TYPE_VAL(NUM);
923 break;
924 case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
925 CHECK_TYPE_VAL(NUM);
926 break;
927 case PARSE_EVENTS__TERM_TYPE_PERCORE:
928 CHECK_TYPE_VAL(NUM);
929 if ((unsigned int)term->val.num > 1) {
930 parse_events_error__handle(err, term->err_val,
931 strdup("expected 0 or 1"),
932 NULL);
933 return -EINVAL;
934 }
935 break;
936 case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
937 CHECK_TYPE_VAL(NUM);
938 break;
939 case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
940 CHECK_TYPE_VAL(NUM);
941 if (term->val.num > UINT_MAX) {
942 parse_events_error__handle(err, term->err_val,
943 strdup("too big"),
944 NULL);
945 return -EINVAL;
946 }
947 break;
948 case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
949 case PARSE_EVENTS__TERM_TYPE_USER:
950 case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE:
951 case PARSE_EVENTS__TERM_TYPE_HARDWARE:
952 default:
953 parse_events_error__handle(err, term->err_term,
954 strdup(config_term_name(term->type_term)),
955 parse_events_formats_error_string(NULL));
956 return -EINVAL;
957 }
958
959 /*
960 * Check term availability after basic checking so
961 * PARSE_EVENTS__TERM_TYPE_USER can be found and filtered.
962 *
963 * If check availability at the entry of this function,
964 * user will see "'<sysfs term>' is not usable in 'perf stat'"
965 * if an invalid config term is provided for legacy events
966 * (for example, instructions/badterm/...), which is confusing.
967 */
968 if (!config_term_avail(term->type_term, err))
969 return -EINVAL;
970 return 0;
971#undef CHECK_TYPE_VAL
972}
973
974static int config_term_pmu(struct perf_event_attr *attr,
975 struct parse_events_term *term,
976 struct parse_events_error *err)
977{
978 if (term->type_term == PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE) {
979 const struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type);
980
981 if (!pmu) {
982 char *err_str;
983
984 if (asprintf(&err_str, "Failed to find PMU for type %d", attr->type) >= 0)
985 parse_events_error__handle(err, term->err_term,
986 err_str, /*help=*/NULL);
987 return -EINVAL;
988 }
989 if (perf_pmu__supports_legacy_cache(pmu)) {
990 attr->type = PERF_TYPE_HW_CACHE;
991 return parse_events__decode_legacy_cache(term->config, pmu->type,
992 &attr->config);
993 } else
994 term->type_term = PARSE_EVENTS__TERM_TYPE_USER;
995 }
996 if (term->type_term == PARSE_EVENTS__TERM_TYPE_HARDWARE) {
997 const struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type);
998
999 if (!pmu) {
1000 char *err_str;
1001
1002 if (asprintf(&err_str, "Failed to find PMU for type %d", attr->type) >= 0)
1003 parse_events_error__handle(err, term->err_term,
1004 err_str, /*help=*/NULL);
1005 return -EINVAL;
1006 }
1007 attr->type = PERF_TYPE_HARDWARE;
1008 attr->config = term->val.num;
1009 if (perf_pmus__supports_extended_type())
1010 attr->config |= (__u64)pmu->type << PERF_PMU_TYPE_SHIFT;
1011 return 0;
1012 }
1013 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER ||
1014 term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG) {
1015 /*
1016 * Always succeed for sysfs terms, as we dont know
1017 * at this point what type they need to have.
1018 */
1019 return 0;
1020 }
1021 return config_term_common(attr, term, err);
1022}
1023
1024#ifdef HAVE_LIBTRACEEVENT
1025static int config_term_tracepoint(struct perf_event_attr *attr,
1026 struct parse_events_term *term,
1027 struct parse_events_error *err)
1028{
1029 switch (term->type_term) {
1030 case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
1031 case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
1032 case PARSE_EVENTS__TERM_TYPE_INHERIT:
1033 case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
1034 case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
1035 case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
1036 case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
1037 case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
1038 case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
1039 case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
1040 return config_term_common(attr, term, err);
1041 case PARSE_EVENTS__TERM_TYPE_USER:
1042 case PARSE_EVENTS__TERM_TYPE_CONFIG:
1043 case PARSE_EVENTS__TERM_TYPE_CONFIG1:
1044 case PARSE_EVENTS__TERM_TYPE_CONFIG2:
1045 case PARSE_EVENTS__TERM_TYPE_CONFIG3:
1046 case PARSE_EVENTS__TERM_TYPE_NAME:
1047 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
1048 case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
1049 case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
1050 case PARSE_EVENTS__TERM_TYPE_TIME:
1051 case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
1052 case PARSE_EVENTS__TERM_TYPE_PERCORE:
1053 case PARSE_EVENTS__TERM_TYPE_METRIC_ID:
1054 case PARSE_EVENTS__TERM_TYPE_RAW:
1055 case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE:
1056 case PARSE_EVENTS__TERM_TYPE_HARDWARE:
1057 default:
1058 if (err) {
1059 parse_events_error__handle(err, term->err_term,
1060 strdup(config_term_name(term->type_term)),
1061 strdup("valid terms: call-graph,stack-size\n"));
1062 }
1063 return -EINVAL;
1064 }
1065
1066 return 0;
1067}
1068#endif
1069
1070static int config_attr(struct perf_event_attr *attr,
1071 struct parse_events_terms *head,
1072 struct parse_events_error *err,
1073 config_term_func_t config_term)
1074{
1075 struct parse_events_term *term;
1076
1077 list_for_each_entry(term, &head->terms, list)
1078 if (config_term(attr, term, err))
1079 return -EINVAL;
1080
1081 return 0;
1082}
1083
1084static int get_config_terms(struct parse_events_terms *head_config, struct list_head *head_terms)
1085{
1086#define ADD_CONFIG_TERM(__type, __weak) \
1087 struct evsel_config_term *__t; \
1088 \
1089 __t = zalloc(sizeof(*__t)); \
1090 if (!__t) \
1091 return -ENOMEM; \
1092 \
1093 INIT_LIST_HEAD(&__t->list); \
1094 __t->type = EVSEL__CONFIG_TERM_ ## __type; \
1095 __t->weak = __weak; \
1096 list_add_tail(&__t->list, head_terms)
1097
1098#define ADD_CONFIG_TERM_VAL(__type, __name, __val, __weak) \
1099do { \
1100 ADD_CONFIG_TERM(__type, __weak); \
1101 __t->val.__name = __val; \
1102} while (0)
1103
1104#define ADD_CONFIG_TERM_STR(__type, __val, __weak) \
1105do { \
1106 ADD_CONFIG_TERM(__type, __weak); \
1107 __t->val.str = strdup(__val); \
1108 if (!__t->val.str) { \
1109 zfree(&__t); \
1110 return -ENOMEM; \
1111 } \
1112 __t->free_str = true; \
1113} while (0)
1114
1115 struct parse_events_term *term;
1116
1117 list_for_each_entry(term, &head_config->terms, list) {
1118 switch (term->type_term) {
1119 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
1120 ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num, term->weak);
1121 break;
1122 case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
1123 ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num, term->weak);
1124 break;
1125 case PARSE_EVENTS__TERM_TYPE_TIME:
1126 ADD_CONFIG_TERM_VAL(TIME, time, term->val.num, term->weak);
1127 break;
1128 case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
1129 ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str, term->weak);
1130 break;
1131 case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
1132 ADD_CONFIG_TERM_STR(BRANCH, term->val.str, term->weak);
1133 break;
1134 case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
1135 ADD_CONFIG_TERM_VAL(STACK_USER, stack_user,
1136 term->val.num, term->weak);
1137 break;
1138 case PARSE_EVENTS__TERM_TYPE_INHERIT:
1139 ADD_CONFIG_TERM_VAL(INHERIT, inherit,
1140 term->val.num ? 1 : 0, term->weak);
1141 break;
1142 case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
1143 ADD_CONFIG_TERM_VAL(INHERIT, inherit,
1144 term->val.num ? 0 : 1, term->weak);
1145 break;
1146 case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
1147 ADD_CONFIG_TERM_VAL(MAX_STACK, max_stack,
1148 term->val.num, term->weak);
1149 break;
1150 case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
1151 ADD_CONFIG_TERM_VAL(MAX_EVENTS, max_events,
1152 term->val.num, term->weak);
1153 break;
1154 case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
1155 ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite,
1156 term->val.num ? 1 : 0, term->weak);
1157 break;
1158 case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
1159 ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite,
1160 term->val.num ? 0 : 1, term->weak);
1161 break;
1162 case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
1163 ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str, term->weak);
1164 break;
1165 case PARSE_EVENTS__TERM_TYPE_PERCORE:
1166 ADD_CONFIG_TERM_VAL(PERCORE, percore,
1167 term->val.num ? true : false, term->weak);
1168 break;
1169 case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
1170 ADD_CONFIG_TERM_VAL(AUX_OUTPUT, aux_output,
1171 term->val.num ? 1 : 0, term->weak);
1172 break;
1173 case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
1174 ADD_CONFIG_TERM_VAL(AUX_SAMPLE_SIZE, aux_sample_size,
1175 term->val.num, term->weak);
1176 break;
1177 case PARSE_EVENTS__TERM_TYPE_USER:
1178 case PARSE_EVENTS__TERM_TYPE_CONFIG:
1179 case PARSE_EVENTS__TERM_TYPE_CONFIG1:
1180 case PARSE_EVENTS__TERM_TYPE_CONFIG2:
1181 case PARSE_EVENTS__TERM_TYPE_CONFIG3:
1182 case PARSE_EVENTS__TERM_TYPE_NAME:
1183 case PARSE_EVENTS__TERM_TYPE_METRIC_ID:
1184 case PARSE_EVENTS__TERM_TYPE_RAW:
1185 case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE:
1186 case PARSE_EVENTS__TERM_TYPE_HARDWARE:
1187 default:
1188 break;
1189 }
1190 }
1191 return 0;
1192}
1193
1194/*
1195 * Add EVSEL__CONFIG_TERM_CFG_CHG where cfg_chg will have a bit set for
1196 * each bit of attr->config that the user has changed.
1197 */
1198static int get_config_chgs(struct perf_pmu *pmu, struct parse_events_terms *head_config,
1199 struct list_head *head_terms)
1200{
1201 struct parse_events_term *term;
1202 u64 bits = 0;
1203 int type;
1204
1205 list_for_each_entry(term, &head_config->terms, list) {
1206 switch (term->type_term) {
1207 case PARSE_EVENTS__TERM_TYPE_USER:
1208 type = perf_pmu__format_type(pmu, term->config);
1209 if (type != PERF_PMU_FORMAT_VALUE_CONFIG)
1210 continue;
1211 bits |= perf_pmu__format_bits(pmu, term->config);
1212 break;
1213 case PARSE_EVENTS__TERM_TYPE_CONFIG:
1214 bits = ~(u64)0;
1215 break;
1216 case PARSE_EVENTS__TERM_TYPE_CONFIG1:
1217 case PARSE_EVENTS__TERM_TYPE_CONFIG2:
1218 case PARSE_EVENTS__TERM_TYPE_CONFIG3:
1219 case PARSE_EVENTS__TERM_TYPE_NAME:
1220 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
1221 case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
1222 case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
1223 case PARSE_EVENTS__TERM_TYPE_TIME:
1224 case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
1225 case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
1226 case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
1227 case PARSE_EVENTS__TERM_TYPE_INHERIT:
1228 case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
1229 case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
1230 case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
1231 case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
1232 case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
1233 case PARSE_EVENTS__TERM_TYPE_PERCORE:
1234 case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
1235 case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
1236 case PARSE_EVENTS__TERM_TYPE_METRIC_ID:
1237 case PARSE_EVENTS__TERM_TYPE_RAW:
1238 case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE:
1239 case PARSE_EVENTS__TERM_TYPE_HARDWARE:
1240 default:
1241 break;
1242 }
1243 }
1244
1245 if (bits)
1246 ADD_CONFIG_TERM_VAL(CFG_CHG, cfg_chg, bits, false);
1247
1248#undef ADD_CONFIG_TERM
1249 return 0;
1250}
1251
1252int parse_events_add_tracepoint(struct list_head *list, int *idx,
1253 const char *sys, const char *event,
1254 struct parse_events_error *err,
1255 struct parse_events_terms *head_config, void *loc_)
1256{
1257 YYLTYPE *loc = loc_;
1258#ifdef HAVE_LIBTRACEEVENT
1259 if (head_config) {
1260 struct perf_event_attr attr;
1261
1262 if (config_attr(&attr, head_config, err,
1263 config_term_tracepoint))
1264 return -EINVAL;
1265 }
1266
1267 if (strpbrk(sys, "*?"))
1268 return add_tracepoint_multi_sys(list, idx, sys, event,
1269 err, head_config, loc);
1270 else
1271 return add_tracepoint_event(list, idx, sys, event,
1272 err, head_config, loc);
1273#else
1274 (void)list;
1275 (void)idx;
1276 (void)sys;
1277 (void)event;
1278 (void)head_config;
1279 parse_events_error__handle(err, loc->first_column, strdup("unsupported tracepoint"),
1280 strdup("libtraceevent is necessary for tracepoint support"));
1281 return -1;
1282#endif
1283}
1284
1285static int __parse_events_add_numeric(struct parse_events_state *parse_state,
1286 struct list_head *list,
1287 struct perf_pmu *pmu, u32 type, u32 extended_type,
1288 u64 config, struct parse_events_terms *head_config)
1289{
1290 struct perf_event_attr attr;
1291 LIST_HEAD(config_terms);
1292 const char *name, *metric_id;
1293 int ret;
1294
1295 memset(&attr, 0, sizeof(attr));
1296 attr.type = type;
1297 attr.config = config;
1298 if (extended_type && (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE)) {
1299 assert(perf_pmus__supports_extended_type());
1300 attr.config |= (u64)extended_type << PERF_PMU_TYPE_SHIFT;
1301 }
1302
1303 if (head_config) {
1304 if (config_attr(&attr, head_config, parse_state->error,
1305 config_term_common))
1306 return -EINVAL;
1307
1308 if (get_config_terms(head_config, &config_terms))
1309 return -ENOMEM;
1310 }
1311
1312 name = get_config_name(head_config);
1313 metric_id = get_config_metric_id(head_config);
1314 ret = __add_event(list, &parse_state->idx, &attr, /*init_attr*/true, name,
1315 metric_id, pmu, &config_terms, /*auto_merge_stats=*/false,
1316 /*cpu_list=*/NULL) ? 0 : -ENOMEM;
1317 free_config_terms(&config_terms);
1318 return ret;
1319}
1320
1321int parse_events_add_numeric(struct parse_events_state *parse_state,
1322 struct list_head *list,
1323 u32 type, u64 config,
1324 struct parse_events_terms *head_config,
1325 bool wildcard)
1326{
1327 struct perf_pmu *pmu = NULL;
1328 bool found_supported = false;
1329
1330 /* Wildcards on numeric values are only supported by core PMUs. */
1331 if (wildcard && perf_pmus__supports_extended_type()) {
1332 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) {
1333 int ret;
1334
1335 found_supported = true;
1336 if (parse_events__filter_pmu(parse_state, pmu))
1337 continue;
1338
1339 ret = __parse_events_add_numeric(parse_state, list, pmu,
1340 type, pmu->type,
1341 config, head_config);
1342 if (ret)
1343 return ret;
1344 }
1345 if (found_supported)
1346 return 0;
1347 }
1348 return __parse_events_add_numeric(parse_state, list, perf_pmus__find_by_type(type),
1349 type, /*extended_type=*/0, config, head_config);
1350}
1351
1352int parse_events_add_tool(struct parse_events_state *parse_state,
1353 struct list_head *list,
1354 int tool_event)
1355{
1356 return add_event_tool(list, &parse_state->idx, tool_event);
1357}
1358
1359static bool config_term_percore(struct list_head *config_terms)
1360{
1361 struct evsel_config_term *term;
1362
1363 list_for_each_entry(term, config_terms, list) {
1364 if (term->type == EVSEL__CONFIG_TERM_PERCORE)
1365 return term->val.percore;
1366 }
1367
1368 return false;
1369}
1370
1371int parse_events_add_pmu(struct parse_events_state *parse_state,
1372 struct list_head *list, const char *name,
1373 const struct parse_events_terms *const_parsed_terms,
1374 bool auto_merge_stats, void *loc_)
1375{
1376 struct perf_event_attr attr;
1377 struct perf_pmu_info info;
1378 struct perf_pmu *pmu;
1379 struct evsel *evsel;
1380 struct parse_events_error *err = parse_state->error;
1381 YYLTYPE *loc = loc_;
1382 LIST_HEAD(config_terms);
1383 struct parse_events_terms parsed_terms;
1384
1385 pmu = parse_state->fake_pmu ?: perf_pmus__find(name);
1386
1387 if (!pmu) {
1388 char *err_str;
1389
1390 if (asprintf(&err_str,
1391 "Cannot find PMU `%s'. Missing kernel support?",
1392 name) >= 0)
1393 parse_events_error__handle(err, loc->first_column, err_str, NULL);
1394 return -EINVAL;
1395 }
1396
1397 parse_events_terms__init(&parsed_terms);
1398 if (const_parsed_terms) {
1399 int ret = parse_events_terms__copy(const_parsed_terms, &parsed_terms);
1400
1401 if (ret)
1402 return ret;
1403 }
1404
1405 if (verbose > 1) {
1406 struct strbuf sb;
1407
1408 strbuf_init(&sb, /*hint=*/ 0);
1409 if (pmu->selectable && list_empty(&parsed_terms.terms)) {
1410 strbuf_addf(&sb, "%s//", name);
1411 } else {
1412 strbuf_addf(&sb, "%s/", name);
1413 parse_events_terms__to_strbuf(&parsed_terms, &sb);
1414 strbuf_addch(&sb, '/');
1415 }
1416 fprintf(stderr, "Attempt to add: %s\n", sb.buf);
1417 strbuf_release(&sb);
1418 }
1419 fix_raw(&parsed_terms, pmu);
1420
1421 memset(&attr, 0, sizeof(attr));
1422 if (pmu->perf_event_attr_init_default)
1423 pmu->perf_event_attr_init_default(pmu, &attr);
1424
1425 attr.type = pmu->type;
1426
1427 if (list_empty(&parsed_terms.terms)) {
1428 evsel = __add_event(list, &parse_state->idx, &attr,
1429 /*init_attr=*/true, /*name=*/NULL,
1430 /*metric_id=*/NULL, pmu,
1431 /*config_terms=*/NULL, auto_merge_stats,
1432 /*cpu_list=*/NULL);
1433 return evsel ? 0 : -ENOMEM;
1434 }
1435
1436 if (!parse_state->fake_pmu && perf_pmu__check_alias(pmu, &parsed_terms, &info, err)) {
1437 parse_events_terms__exit(&parsed_terms);
1438 return -EINVAL;
1439 }
1440
1441 if (verbose > 1) {
1442 struct strbuf sb;
1443
1444 strbuf_init(&sb, /*hint=*/ 0);
1445 parse_events_terms__to_strbuf(&parsed_terms, &sb);
1446 fprintf(stderr, "..after resolving event: %s/%s/\n", name, sb.buf);
1447 strbuf_release(&sb);
1448 }
1449
1450 /*
1451 * Configure hardcoded terms first, no need to check
1452 * return value when called with fail == 0 ;)
1453 */
1454 if (config_attr(&attr, &parsed_terms, parse_state->error, config_term_pmu)) {
1455 parse_events_terms__exit(&parsed_terms);
1456 return -EINVAL;
1457 }
1458
1459 if (get_config_terms(&parsed_terms, &config_terms)) {
1460 parse_events_terms__exit(&parsed_terms);
1461 return -ENOMEM;
1462 }
1463
1464 /*
1465 * When using default config, record which bits of attr->config were
1466 * changed by the user.
1467 */
1468 if (pmu->perf_event_attr_init_default &&
1469 get_config_chgs(pmu, &parsed_terms, &config_terms)) {
1470 parse_events_terms__exit(&parsed_terms);
1471 return -ENOMEM;
1472 }
1473
1474 if (!parse_state->fake_pmu &&
1475 perf_pmu__config(pmu, &attr, &parsed_terms, parse_state->error)) {
1476 free_config_terms(&config_terms);
1477 parse_events_terms__exit(&parsed_terms);
1478 return -EINVAL;
1479 }
1480
1481 evsel = __add_event(list, &parse_state->idx, &attr, /*init_attr=*/true,
1482 get_config_name(&parsed_terms),
1483 get_config_metric_id(&parsed_terms), pmu,
1484 &config_terms, auto_merge_stats, /*cpu_list=*/NULL);
1485 if (!evsel) {
1486 parse_events_terms__exit(&parsed_terms);
1487 return -ENOMEM;
1488 }
1489
1490 if (evsel->name)
1491 evsel->use_config_name = true;
1492
1493 evsel->percore = config_term_percore(&evsel->config_terms);
1494
1495 if (parse_state->fake_pmu) {
1496 parse_events_terms__exit(&parsed_terms);
1497 return 0;
1498 }
1499
1500 parse_events_terms__exit(&parsed_terms);
1501 free((char *)evsel->unit);
1502 evsel->unit = strdup(info.unit);
1503 evsel->scale = info.scale;
1504 evsel->per_pkg = info.per_pkg;
1505 evsel->snapshot = info.snapshot;
1506 return 0;
1507}
1508
1509int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
1510 const char *event_name,
1511 const struct parse_events_terms *const_parsed_terms,
1512 struct list_head **listp, void *loc_)
1513{
1514 struct parse_events_term *term;
1515 struct list_head *list = NULL;
1516 struct perf_pmu *pmu = NULL;
1517 YYLTYPE *loc = loc_;
1518 int ok = 0;
1519 const char *config;
1520 struct parse_events_terms parsed_terms;
1521
1522 *listp = NULL;
1523
1524 parse_events_terms__init(&parsed_terms);
1525 if (const_parsed_terms) {
1526 int ret = parse_events_terms__copy(const_parsed_terms, &parsed_terms);
1527
1528 if (ret)
1529 return ret;
1530 }
1531
1532 config = strdup(event_name);
1533 if (!config)
1534 goto out_err;
1535
1536 if (parse_events_term__num(&term,
1537 PARSE_EVENTS__TERM_TYPE_USER,
1538 config, /*num=*/1, /*novalue=*/true,
1539 loc, /*loc_val=*/NULL) < 0) {
1540 zfree(&config);
1541 goto out_err;
1542 }
1543 list_add_tail(&term->list, &parsed_terms.terms);
1544
1545 /* Add it for all PMUs that support the alias */
1546 list = malloc(sizeof(struct list_head));
1547 if (!list)
1548 goto out_err;
1549
1550 INIT_LIST_HEAD(list);
1551
1552 while ((pmu = perf_pmus__scan(pmu)) != NULL) {
1553 bool auto_merge_stats;
1554
1555 if (parse_events__filter_pmu(parse_state, pmu))
1556 continue;
1557
1558 if (!perf_pmu__have_event(pmu, event_name))
1559 continue;
1560
1561 auto_merge_stats = perf_pmu__auto_merge_stats(pmu);
1562 if (!parse_events_add_pmu(parse_state, list, pmu->name,
1563 &parsed_terms, auto_merge_stats, loc)) {
1564 struct strbuf sb;
1565
1566 strbuf_init(&sb, /*hint=*/ 0);
1567 parse_events_terms__to_strbuf(&parsed_terms, &sb);
1568 pr_debug("%s -> %s/%s/\n", event_name, pmu->name, sb.buf);
1569 strbuf_release(&sb);
1570 ok++;
1571 }
1572 }
1573
1574 if (parse_state->fake_pmu) {
1575 if (!parse_events_add_pmu(parse_state, list, event_name, &parsed_terms,
1576 /*auto_merge_stats=*/true, loc)) {
1577 struct strbuf sb;
1578
1579 strbuf_init(&sb, /*hint=*/ 0);
1580 parse_events_terms__to_strbuf(&parsed_terms, &sb);
1581 pr_debug("%s -> %s/%s/\n", event_name, "fake_pmu", sb.buf);
1582 strbuf_release(&sb);
1583 ok++;
1584 }
1585 }
1586
1587out_err:
1588 parse_events_terms__exit(&parsed_terms);
1589 if (ok)
1590 *listp = list;
1591 else
1592 free(list);
1593
1594 return ok ? 0 : -1;
1595}
1596
1597int parse_events__modifier_group(struct list_head *list,
1598 char *event_mod)
1599{
1600 return parse_events__modifier_event(list, event_mod, true);
1601}
1602
1603void parse_events__set_leader(char *name, struct list_head *list)
1604{
1605 struct evsel *leader;
1606
1607 if (list_empty(list)) {
1608 WARN_ONCE(true, "WARNING: failed to set leader: empty list");
1609 return;
1610 }
1611
1612 leader = list_first_entry(list, struct evsel, core.node);
1613 __perf_evlist__set_leader(list, &leader->core);
1614 leader->group_name = name;
1615}
1616
1617/* list_event is assumed to point to malloc'ed memory */
1618void parse_events_update_lists(struct list_head *list_event,
1619 struct list_head *list_all)
1620{
1621 /*
1622 * Called for single event definition. Update the
1623 * 'all event' list, and reinit the 'single event'
1624 * list, for next event definition.
1625 */
1626 list_splice_tail(list_event, list_all);
1627 free(list_event);
1628}
1629
1630struct event_modifier {
1631 int eu;
1632 int ek;
1633 int eh;
1634 int eH;
1635 int eG;
1636 int eI;
1637 int precise;
1638 int precise_max;
1639 int exclude_GH;
1640 int sample_read;
1641 int pinned;
1642 int weak;
1643 int exclusive;
1644 int bpf_counter;
1645};
1646
1647static int get_event_modifier(struct event_modifier *mod, char *str,
1648 struct evsel *evsel)
1649{
1650 int eu = evsel ? evsel->core.attr.exclude_user : 0;
1651 int ek = evsel ? evsel->core.attr.exclude_kernel : 0;
1652 int eh = evsel ? evsel->core.attr.exclude_hv : 0;
1653 int eH = evsel ? evsel->core.attr.exclude_host : 0;
1654 int eG = evsel ? evsel->core.attr.exclude_guest : 0;
1655 int eI = evsel ? evsel->core.attr.exclude_idle : 0;
1656 int precise = evsel ? evsel->core.attr.precise_ip : 0;
1657 int precise_max = 0;
1658 int sample_read = 0;
1659 int pinned = evsel ? evsel->core.attr.pinned : 0;
1660 int exclusive = evsel ? evsel->core.attr.exclusive : 0;
1661
1662 int exclude = eu | ek | eh;
1663 int exclude_GH = evsel ? evsel->exclude_GH : 0;
1664 int weak = 0;
1665 int bpf_counter = 0;
1666
1667 memset(mod, 0, sizeof(*mod));
1668
1669 while (*str) {
1670 if (*str == 'u') {
1671 if (!exclude)
1672 exclude = eu = ek = eh = 1;
1673 if (!exclude_GH && !perf_guest)
1674 eG = 1;
1675 eu = 0;
1676 } else if (*str == 'k') {
1677 if (!exclude)
1678 exclude = eu = ek = eh = 1;
1679 ek = 0;
1680 } else if (*str == 'h') {
1681 if (!exclude)
1682 exclude = eu = ek = eh = 1;
1683 eh = 0;
1684 } else if (*str == 'G') {
1685 if (!exclude_GH)
1686 exclude_GH = eG = eH = 1;
1687 eG = 0;
1688 } else if (*str == 'H') {
1689 if (!exclude_GH)
1690 exclude_GH = eG = eH = 1;
1691 eH = 0;
1692 } else if (*str == 'I') {
1693 eI = 1;
1694 } else if (*str == 'p') {
1695 precise++;
1696 /* use of precise requires exclude_guest */
1697 if (!exclude_GH)
1698 eG = 1;
1699 } else if (*str == 'P') {
1700 precise_max = 1;
1701 } else if (*str == 'S') {
1702 sample_read = 1;
1703 } else if (*str == 'D') {
1704 pinned = 1;
1705 } else if (*str == 'e') {
1706 exclusive = 1;
1707 } else if (*str == 'W') {
1708 weak = 1;
1709 } else if (*str == 'b') {
1710 bpf_counter = 1;
1711 } else
1712 break;
1713
1714 ++str;
1715 }
1716
1717 /*
1718 * precise ip:
1719 *
1720 * 0 - SAMPLE_IP can have arbitrary skid
1721 * 1 - SAMPLE_IP must have constant skid
1722 * 2 - SAMPLE_IP requested to have 0 skid
1723 * 3 - SAMPLE_IP must have 0 skid
1724 *
1725 * See also PERF_RECORD_MISC_EXACT_IP
1726 */
1727 if (precise > 3)
1728 return -EINVAL;
1729
1730 mod->eu = eu;
1731 mod->ek = ek;
1732 mod->eh = eh;
1733 mod->eH = eH;
1734 mod->eG = eG;
1735 mod->eI = eI;
1736 mod->precise = precise;
1737 mod->precise_max = precise_max;
1738 mod->exclude_GH = exclude_GH;
1739 mod->sample_read = sample_read;
1740 mod->pinned = pinned;
1741 mod->weak = weak;
1742 mod->bpf_counter = bpf_counter;
1743 mod->exclusive = exclusive;
1744
1745 return 0;
1746}
1747
1748/*
1749 * Basic modifier sanity check to validate it contains only one
1750 * instance of any modifier (apart from 'p') present.
1751 */
1752static int check_modifier(char *str)
1753{
1754 char *p = str;
1755
1756 /* The sizeof includes 0 byte as well. */
1757 if (strlen(str) > (sizeof("ukhGHpppPSDIWeb") - 1))
1758 return -1;
1759
1760 while (*p) {
1761 if (*p != 'p' && strchr(p + 1, *p))
1762 return -1;
1763 p++;
1764 }
1765
1766 return 0;
1767}
1768
1769int parse_events__modifier_event(struct list_head *list, char *str, bool add)
1770{
1771 struct evsel *evsel;
1772 struct event_modifier mod;
1773
1774 if (str == NULL)
1775 return 0;
1776
1777 if (check_modifier(str))
1778 return -EINVAL;
1779
1780 if (!add && get_event_modifier(&mod, str, NULL))
1781 return -EINVAL;
1782
1783 __evlist__for_each_entry(list, evsel) {
1784 if (add && get_event_modifier(&mod, str, evsel))
1785 return -EINVAL;
1786
1787 evsel->core.attr.exclude_user = mod.eu;
1788 evsel->core.attr.exclude_kernel = mod.ek;
1789 evsel->core.attr.exclude_hv = mod.eh;
1790 evsel->core.attr.precise_ip = mod.precise;
1791 evsel->core.attr.exclude_host = mod.eH;
1792 evsel->core.attr.exclude_guest = mod.eG;
1793 evsel->core.attr.exclude_idle = mod.eI;
1794 evsel->exclude_GH = mod.exclude_GH;
1795 evsel->sample_read = mod.sample_read;
1796 evsel->precise_max = mod.precise_max;
1797 evsel->weak_group = mod.weak;
1798 evsel->bpf_counter = mod.bpf_counter;
1799
1800 if (evsel__is_group_leader(evsel)) {
1801 evsel->core.attr.pinned = mod.pinned;
1802 evsel->core.attr.exclusive = mod.exclusive;
1803 }
1804 }
1805
1806 return 0;
1807}
1808
1809int parse_events_name(struct list_head *list, const char *name)
1810{
1811 struct evsel *evsel;
1812
1813 __evlist__for_each_entry(list, evsel) {
1814 if (!evsel->name) {
1815 evsel->name = strdup(name);
1816 if (!evsel->name)
1817 return -ENOMEM;
1818 }
1819 }
1820
1821 return 0;
1822}
1823
1824static int parse_events__scanner(const char *str,
1825 FILE *input,
1826 struct parse_events_state *parse_state)
1827{
1828 YY_BUFFER_STATE buffer;
1829 void *scanner;
1830 int ret;
1831
1832 ret = parse_events_lex_init_extra(parse_state, &scanner);
1833 if (ret)
1834 return ret;
1835
1836 if (str)
1837 buffer = parse_events__scan_string(str, scanner);
1838 else
1839 parse_events_set_in(input, scanner);
1840
1841#ifdef PARSER_DEBUG
1842 parse_events_debug = 1;
1843 parse_events_set_debug(1, scanner);
1844#endif
1845 ret = parse_events_parse(parse_state, scanner);
1846
1847 if (str) {
1848 parse_events__flush_buffer(buffer, scanner);
1849 parse_events__delete_buffer(buffer, scanner);
1850 }
1851 parse_events_lex_destroy(scanner);
1852 return ret;
1853}
1854
1855/*
1856 * parse event config string, return a list of event terms.
1857 */
1858int parse_events_terms(struct parse_events_terms *terms, const char *str, FILE *input)
1859{
1860 struct parse_events_state parse_state = {
1861 .terms = NULL,
1862 .stoken = PE_START_TERMS,
1863 };
1864 int ret;
1865
1866 ret = parse_events__scanner(str, input, &parse_state);
1867 if (!ret)
1868 list_splice(&parse_state.terms->terms, &terms->terms);
1869
1870 zfree(&parse_state.terms);
1871 return ret;
1872}
1873
1874static int evsel__compute_group_pmu_name(struct evsel *evsel,
1875 const struct list_head *head)
1876{
1877 struct evsel *leader = evsel__leader(evsel);
1878 struct evsel *pos;
1879 const char *group_pmu_name;
1880 struct perf_pmu *pmu = evsel__find_pmu(evsel);
1881
1882 if (!pmu) {
1883 /*
1884 * For PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACHE types the PMU
1885 * is a core PMU, but in heterogeneous systems this is
1886 * unknown. For now pick the first core PMU.
1887 */
1888 pmu = perf_pmus__scan_core(NULL);
1889 }
1890 if (!pmu) {
1891 pr_debug("No PMU found for '%s'\n", evsel__name(evsel));
1892 return -EINVAL;
1893 }
1894 group_pmu_name = pmu->name;
1895 /*
1896 * Software events may be in a group with other uncore PMU events. Use
1897 * the pmu_name of the first non-software event to avoid breaking the
1898 * software event out of the group.
1899 *
1900 * Aux event leaders, like intel_pt, expect a group with events from
1901 * other PMUs, so substitute the AUX event's PMU in this case.
1902 */
1903 if (perf_pmu__is_software(pmu) || evsel__is_aux_event(leader)) {
1904 struct perf_pmu *leader_pmu = evsel__find_pmu(leader);
1905
1906 if (!leader_pmu) {
1907 /* As with determining pmu above. */
1908 leader_pmu = perf_pmus__scan_core(NULL);
1909 }
1910 /*
1911 * Starting with the leader, find the first event with a named
1912 * non-software PMU. for_each_group_(member|evsel) isn't used as
1913 * the list isn't yet sorted putting evsel's in the same group
1914 * together.
1915 */
1916 if (leader_pmu && !perf_pmu__is_software(leader_pmu)) {
1917 group_pmu_name = leader_pmu->name;
1918 } else if (leader->core.nr_members > 1) {
1919 list_for_each_entry(pos, head, core.node) {
1920 struct perf_pmu *pos_pmu;
1921
1922 if (pos == leader || evsel__leader(pos) != leader)
1923 continue;
1924 pos_pmu = evsel__find_pmu(pos);
1925 if (!pos_pmu) {
1926 /* As with determining pmu above. */
1927 pos_pmu = perf_pmus__scan_core(NULL);
1928 }
1929 if (pos_pmu && !perf_pmu__is_software(pos_pmu)) {
1930 group_pmu_name = pos_pmu->name;
1931 break;
1932 }
1933 }
1934 }
1935 }
1936 /* Assign the actual name taking care that the fake PMU lacks a name. */
1937 evsel->group_pmu_name = strdup(group_pmu_name ?: "fake");
1938 return evsel->group_pmu_name ? 0 : -ENOMEM;
1939}
1940
1941__weak int arch_evlist__cmp(const struct evsel *lhs, const struct evsel *rhs)
1942{
1943 /* Order by insertion index. */
1944 return lhs->core.idx - rhs->core.idx;
1945}
1946
1947static int evlist__cmp(void *_fg_idx, const struct list_head *l, const struct list_head *r)
1948{
1949 const struct perf_evsel *lhs_core = container_of(l, struct perf_evsel, node);
1950 const struct evsel *lhs = container_of(lhs_core, struct evsel, core);
1951 const struct perf_evsel *rhs_core = container_of(r, struct perf_evsel, node);
1952 const struct evsel *rhs = container_of(rhs_core, struct evsel, core);
1953 int *force_grouped_idx = _fg_idx;
1954 int lhs_sort_idx, rhs_sort_idx, ret;
1955 const char *lhs_pmu_name, *rhs_pmu_name;
1956 bool lhs_has_group, rhs_has_group;
1957
1958 /*
1959 * First sort by grouping/leader. Read the leader idx only if the evsel
1960 * is part of a group, by default ungrouped events will be sorted
1961 * relative to grouped events based on where the first ungrouped event
1962 * occurs. If both events don't have a group we want to fall-through to
1963 * the arch specific sorting, that can reorder and fix things like
1964 * Intel's topdown events.
1965 */
1966 if (lhs_core->leader != lhs_core || lhs_core->nr_members > 1) {
1967 lhs_has_group = true;
1968 lhs_sort_idx = lhs_core->leader->idx;
1969 } else {
1970 lhs_has_group = false;
1971 lhs_sort_idx = *force_grouped_idx != -1 && arch_evsel__must_be_in_group(lhs)
1972 ? *force_grouped_idx
1973 : lhs_core->idx;
1974 }
1975 if (rhs_core->leader != rhs_core || rhs_core->nr_members > 1) {
1976 rhs_has_group = true;
1977 rhs_sort_idx = rhs_core->leader->idx;
1978 } else {
1979 rhs_has_group = false;
1980 rhs_sort_idx = *force_grouped_idx != -1 && arch_evsel__must_be_in_group(rhs)
1981 ? *force_grouped_idx
1982 : rhs_core->idx;
1983 }
1984
1985 if (lhs_sort_idx != rhs_sort_idx)
1986 return lhs_sort_idx - rhs_sort_idx;
1987
1988 /* Group by PMU if there is a group. Groups can't span PMUs. */
1989 if (lhs_has_group && rhs_has_group) {
1990 lhs_pmu_name = lhs->group_pmu_name;
1991 rhs_pmu_name = rhs->group_pmu_name;
1992 ret = strcmp(lhs_pmu_name, rhs_pmu_name);
1993 if (ret)
1994 return ret;
1995 }
1996
1997 /* Architecture specific sorting. */
1998 return arch_evlist__cmp(lhs, rhs);
1999}
2000
2001static int parse_events__sort_events_and_fix_groups(struct list_head *list)
2002{
2003 int idx = 0, force_grouped_idx = -1;
2004 struct evsel *pos, *cur_leader = NULL;
2005 struct perf_evsel *cur_leaders_grp = NULL;
2006 bool idx_changed = false, cur_leader_force_grouped = false;
2007 int orig_num_leaders = 0, num_leaders = 0;
2008 int ret;
2009
2010 /*
2011 * Compute index to insert ungrouped events at. Place them where the
2012 * first ungrouped event appears.
2013 */
2014 list_for_each_entry(pos, list, core.node) {
2015 const struct evsel *pos_leader = evsel__leader(pos);
2016
2017 ret = evsel__compute_group_pmu_name(pos, list);
2018 if (ret)
2019 return ret;
2020
2021 if (pos == pos_leader)
2022 orig_num_leaders++;
2023
2024 /*
2025 * Ensure indexes are sequential, in particular for multiple
2026 * event lists being merged. The indexes are used to detect when
2027 * the user order is modified.
2028 */
2029 pos->core.idx = idx++;
2030
2031 /* Remember an index to sort all forced grouped events together to. */
2032 if (force_grouped_idx == -1 && pos == pos_leader && pos->core.nr_members < 2 &&
2033 arch_evsel__must_be_in_group(pos))
2034 force_grouped_idx = pos->core.idx;
2035 }
2036
2037 /* Sort events. */
2038 list_sort(&force_grouped_idx, list, evlist__cmp);
2039
2040 /*
2041 * Recompute groups, splitting for PMUs and adding groups for events
2042 * that require them.
2043 */
2044 idx = 0;
2045 list_for_each_entry(pos, list, core.node) {
2046 const struct evsel *pos_leader = evsel__leader(pos);
2047 const char *pos_pmu_name = pos->group_pmu_name;
2048 const char *cur_leader_pmu_name;
2049 bool pos_force_grouped = force_grouped_idx != -1 &&
2050 arch_evsel__must_be_in_group(pos);
2051
2052 /* Reset index and nr_members. */
2053 if (pos->core.idx != idx)
2054 idx_changed = true;
2055 pos->core.idx = idx++;
2056 pos->core.nr_members = 0;
2057
2058 /*
2059 * Set the group leader respecting the given groupings and that
2060 * groups can't span PMUs.
2061 */
2062 if (!cur_leader)
2063 cur_leader = pos;
2064
2065 cur_leader_pmu_name = cur_leader->group_pmu_name;
2066 if ((cur_leaders_grp != pos->core.leader &&
2067 (!pos_force_grouped || !cur_leader_force_grouped)) ||
2068 strcmp(cur_leader_pmu_name, pos_pmu_name)) {
2069 /* Event is for a different group/PMU than last. */
2070 cur_leader = pos;
2071 /*
2072 * Remember the leader's group before it is overwritten,
2073 * so that later events match as being in the same
2074 * group.
2075 */
2076 cur_leaders_grp = pos->core.leader;
2077 /*
2078 * Avoid forcing events into groups with events that
2079 * don't need to be in the group.
2080 */
2081 cur_leader_force_grouped = pos_force_grouped;
2082 }
2083 if (pos_leader != cur_leader) {
2084 /* The leader changed so update it. */
2085 evsel__set_leader(pos, cur_leader);
2086 }
2087 }
2088 list_for_each_entry(pos, list, core.node) {
2089 struct evsel *pos_leader = evsel__leader(pos);
2090
2091 if (pos == pos_leader)
2092 num_leaders++;
2093 pos_leader->core.nr_members++;
2094 }
2095 return (idx_changed || num_leaders != orig_num_leaders) ? 1 : 0;
2096}
2097
2098int __parse_events(struct evlist *evlist, const char *str, const char *pmu_filter,
2099 struct parse_events_error *err, struct perf_pmu *fake_pmu,
2100 bool warn_if_reordered)
2101{
2102 struct parse_events_state parse_state = {
2103 .list = LIST_HEAD_INIT(parse_state.list),
2104 .idx = evlist->core.nr_entries,
2105 .error = err,
2106 .stoken = PE_START_EVENTS,
2107 .fake_pmu = fake_pmu,
2108 .pmu_filter = pmu_filter,
2109 .match_legacy_cache_terms = true,
2110 };
2111 int ret, ret2;
2112
2113 ret = parse_events__scanner(str, /*input=*/ NULL, &parse_state);
2114
2115 if (!ret && list_empty(&parse_state.list)) {
2116 WARN_ONCE(true, "WARNING: event parser found nothing\n");
2117 return -1;
2118 }
2119
2120 ret2 = parse_events__sort_events_and_fix_groups(&parse_state.list);
2121 if (ret2 < 0)
2122 return ret;
2123
2124 if (ret2 && warn_if_reordered && !parse_state.wild_card_pmus)
2125 pr_warning("WARNING: events were regrouped to match PMUs\n");
2126
2127 /*
2128 * Add list to the evlist even with errors to allow callers to clean up.
2129 */
2130 evlist__splice_list_tail(evlist, &parse_state.list);
2131
2132 if (!ret) {
2133 struct evsel *last;
2134
2135 last = evlist__last(evlist);
2136 last->cmdline_group_boundary = true;
2137
2138 return 0;
2139 }
2140
2141 /*
2142 * There are 2 users - builtin-record and builtin-test objects.
2143 * Both call evlist__delete in case of error, so we dont
2144 * need to bother.
2145 */
2146 return ret;
2147}
2148
2149int parse_event(struct evlist *evlist, const char *str)
2150{
2151 struct parse_events_error err;
2152 int ret;
2153
2154 parse_events_error__init(&err);
2155 ret = parse_events(evlist, str, &err);
2156 parse_events_error__exit(&err);
2157 return ret;
2158}
2159
2160void parse_events_error__init(struct parse_events_error *err)
2161{
2162 bzero(err, sizeof(*err));
2163}
2164
2165void parse_events_error__exit(struct parse_events_error *err)
2166{
2167 zfree(&err->str);
2168 zfree(&err->help);
2169 zfree(&err->first_str);
2170 zfree(&err->first_help);
2171}
2172
2173void parse_events_error__handle(struct parse_events_error *err, int idx,
2174 char *str, char *help)
2175{
2176 if (WARN(!str || !err, "WARNING: failed to provide error string or struct\n"))
2177 goto out_free;
2178 switch (err->num_errors) {
2179 case 0:
2180 err->idx = idx;
2181 err->str = str;
2182 err->help = help;
2183 break;
2184 case 1:
2185 err->first_idx = err->idx;
2186 err->idx = idx;
2187 err->first_str = err->str;
2188 err->str = str;
2189 err->first_help = err->help;
2190 err->help = help;
2191 break;
2192 default:
2193 pr_debug("Multiple errors dropping message: %s (%s)\n",
2194 err->str, err->help ?: "<no help>");
2195 free(err->str);
2196 err->str = str;
2197 free(err->help);
2198 err->help = help;
2199 break;
2200 }
2201 err->num_errors++;
2202 return;
2203
2204out_free:
2205 free(str);
2206 free(help);
2207}
2208
2209#define MAX_WIDTH 1000
2210static int get_term_width(void)
2211{
2212 struct winsize ws;
2213
2214 get_term_dimensions(&ws);
2215 return ws.ws_col > MAX_WIDTH ? MAX_WIDTH : ws.ws_col;
2216}
2217
2218static void __parse_events_error__print(int err_idx, const char *err_str,
2219 const char *err_help, const char *event)
2220{
2221 const char *str = "invalid or unsupported event: ";
2222 char _buf[MAX_WIDTH];
2223 char *buf = (char *) event;
2224 int idx = 0;
2225 if (err_str) {
2226 /* -2 for extra '' in the final fprintf */
2227 int width = get_term_width() - 2;
2228 int len_event = strlen(event);
2229 int len_str, max_len, cut = 0;
2230
2231 /*
2232 * Maximum error index indent, we will cut
2233 * the event string if it's bigger.
2234 */
2235 int max_err_idx = 13;
2236
2237 /*
2238 * Let's be specific with the message when
2239 * we have the precise error.
2240 */
2241 str = "event syntax error: ";
2242 len_str = strlen(str);
2243 max_len = width - len_str;
2244
2245 buf = _buf;
2246
2247 /* We're cutting from the beginning. */
2248 if (err_idx > max_err_idx)
2249 cut = err_idx - max_err_idx;
2250
2251 strncpy(buf, event + cut, max_len);
2252
2253 /* Mark cut parts with '..' on both sides. */
2254 if (cut)
2255 buf[0] = buf[1] = '.';
2256
2257 if ((len_event - cut) > max_len) {
2258 buf[max_len - 1] = buf[max_len - 2] = '.';
2259 buf[max_len] = 0;
2260 }
2261
2262 idx = len_str + err_idx - cut;
2263 }
2264
2265 fprintf(stderr, "%s'%s'\n", str, buf);
2266 if (idx) {
2267 fprintf(stderr, "%*s\\___ %s\n", idx + 1, "", err_str);
2268 if (err_help)
2269 fprintf(stderr, "\n%s\n", err_help);
2270 }
2271}
2272
2273void parse_events_error__print(struct parse_events_error *err,
2274 const char *event)
2275{
2276 if (!err->num_errors)
2277 return;
2278
2279 __parse_events_error__print(err->idx, err->str, err->help, event);
2280
2281 if (err->num_errors > 1) {
2282 fputs("\nInitial error:\n", stderr);
2283 __parse_events_error__print(err->first_idx, err->first_str,
2284 err->first_help, event);
2285 }
2286}
2287
2288#undef MAX_WIDTH
2289
2290int parse_events_option(const struct option *opt, const char *str,
2291 int unset __maybe_unused)
2292{
2293 struct parse_events_option_args *args = opt->value;
2294 struct parse_events_error err;
2295 int ret;
2296
2297 parse_events_error__init(&err);
2298 ret = __parse_events(*args->evlistp, str, args->pmu_filter, &err,
2299 /*fake_pmu=*/NULL, /*warn_if_reordered=*/true);
2300
2301 if (ret) {
2302 parse_events_error__print(&err, str);
2303 fprintf(stderr, "Run 'perf list' for a list of valid events\n");
2304 }
2305 parse_events_error__exit(&err);
2306
2307 return ret;
2308}
2309
2310int parse_events_option_new_evlist(const struct option *opt, const char *str, int unset)
2311{
2312 struct parse_events_option_args *args = opt->value;
2313 int ret;
2314
2315 if (*args->evlistp == NULL) {
2316 *args->evlistp = evlist__new();
2317
2318 if (*args->evlistp == NULL) {
2319 fprintf(stderr, "Not enough memory to create evlist\n");
2320 return -1;
2321 }
2322 }
2323 ret = parse_events_option(opt, str, unset);
2324 if (ret) {
2325 evlist__delete(*args->evlistp);
2326 *args->evlistp = NULL;
2327 }
2328
2329 return ret;
2330}
2331
2332static int
2333foreach_evsel_in_last_glob(struct evlist *evlist,
2334 int (*func)(struct evsel *evsel,
2335 const void *arg),
2336 const void *arg)
2337{
2338 struct evsel *last = NULL;
2339 int err;
2340
2341 /*
2342 * Don't return when list_empty, give func a chance to report
2343 * error when it found last == NULL.
2344 *
2345 * So no need to WARN here, let *func do this.
2346 */
2347 if (evlist->core.nr_entries > 0)
2348 last = evlist__last(evlist);
2349
2350 do {
2351 err = (*func)(last, arg);
2352 if (err)
2353 return -1;
2354 if (!last)
2355 return 0;
2356
2357 if (last->core.node.prev == &evlist->core.entries)
2358 return 0;
2359 last = list_entry(last->core.node.prev, struct evsel, core.node);
2360 } while (!last->cmdline_group_boundary);
2361
2362 return 0;
2363}
2364
2365static int set_filter(struct evsel *evsel, const void *arg)
2366{
2367 const char *str = arg;
2368 bool found = false;
2369 int nr_addr_filters = 0;
2370 struct perf_pmu *pmu = NULL;
2371
2372 if (evsel == NULL) {
2373 fprintf(stderr,
2374 "--filter option should follow a -e tracepoint or HW tracer option\n");
2375 return -1;
2376 }
2377
2378 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) {
2379 if (evsel__append_tp_filter(evsel, str) < 0) {
2380 fprintf(stderr,
2381 "not enough memory to hold filter string\n");
2382 return -1;
2383 }
2384
2385 return 0;
2386 }
2387
2388 while ((pmu = perf_pmus__scan(pmu)) != NULL)
2389 if (pmu->type == evsel->core.attr.type) {
2390 found = true;
2391 break;
2392 }
2393
2394 if (found)
2395 perf_pmu__scan_file(pmu, "nr_addr_filters",
2396 "%d", &nr_addr_filters);
2397
2398 if (!nr_addr_filters)
2399 return perf_bpf_filter__parse(&evsel->bpf_filters, str);
2400
2401 if (evsel__append_addr_filter(evsel, str) < 0) {
2402 fprintf(stderr,
2403 "not enough memory to hold filter string\n");
2404 return -1;
2405 }
2406
2407 return 0;
2408}
2409
2410int parse_filter(const struct option *opt, const char *str,
2411 int unset __maybe_unused)
2412{
2413 struct evlist *evlist = *(struct evlist **)opt->value;
2414
2415 return foreach_evsel_in_last_glob(evlist, set_filter,
2416 (const void *)str);
2417}
2418
2419static int add_exclude_perf_filter(struct evsel *evsel,
2420 const void *arg __maybe_unused)
2421{
2422 char new_filter[64];
2423
2424 if (evsel == NULL || evsel->core.attr.type != PERF_TYPE_TRACEPOINT) {
2425 fprintf(stderr,
2426 "--exclude-perf option should follow a -e tracepoint option\n");
2427 return -1;
2428 }
2429
2430 snprintf(new_filter, sizeof(new_filter), "common_pid != %d", getpid());
2431
2432 if (evsel__append_tp_filter(evsel, new_filter) < 0) {
2433 fprintf(stderr,
2434 "not enough memory to hold filter string\n");
2435 return -1;
2436 }
2437
2438 return 0;
2439}
2440
2441int exclude_perf(const struct option *opt,
2442 const char *arg __maybe_unused,
2443 int unset __maybe_unused)
2444{
2445 struct evlist *evlist = *(struct evlist **)opt->value;
2446
2447 return foreach_evsel_in_last_glob(evlist, add_exclude_perf_filter,
2448 NULL);
2449}
2450
2451int parse_events__is_hardcoded_term(struct parse_events_term *term)
2452{
2453 return term->type_term != PARSE_EVENTS__TERM_TYPE_USER;
2454}
2455
2456static int new_term(struct parse_events_term **_term,
2457 struct parse_events_term *temp,
2458 char *str, u64 num)
2459{
2460 struct parse_events_term *term;
2461
2462 term = malloc(sizeof(*term));
2463 if (!term)
2464 return -ENOMEM;
2465
2466 *term = *temp;
2467 INIT_LIST_HEAD(&term->list);
2468 term->weak = false;
2469
2470 switch (term->type_val) {
2471 case PARSE_EVENTS__TERM_TYPE_NUM:
2472 term->val.num = num;
2473 break;
2474 case PARSE_EVENTS__TERM_TYPE_STR:
2475 term->val.str = str;
2476 break;
2477 default:
2478 free(term);
2479 return -EINVAL;
2480 }
2481
2482 *_term = term;
2483 return 0;
2484}
2485
2486int parse_events_term__num(struct parse_events_term **term,
2487 enum parse_events__term_type type_term,
2488 const char *config, u64 num,
2489 bool no_value,
2490 void *loc_term_, void *loc_val_)
2491{
2492 YYLTYPE *loc_term = loc_term_;
2493 YYLTYPE *loc_val = loc_val_;
2494
2495 struct parse_events_term temp = {
2496 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
2497 .type_term = type_term,
2498 .config = config ? : strdup(config_term_name(type_term)),
2499 .no_value = no_value,
2500 .err_term = loc_term ? loc_term->first_column : 0,
2501 .err_val = loc_val ? loc_val->first_column : 0,
2502 };
2503
2504 return new_term(term, &temp, /*str=*/NULL, num);
2505}
2506
2507int parse_events_term__str(struct parse_events_term **term,
2508 enum parse_events__term_type type_term,
2509 char *config, char *str,
2510 void *loc_term_, void *loc_val_)
2511{
2512 YYLTYPE *loc_term = loc_term_;
2513 YYLTYPE *loc_val = loc_val_;
2514
2515 struct parse_events_term temp = {
2516 .type_val = PARSE_EVENTS__TERM_TYPE_STR,
2517 .type_term = type_term,
2518 .config = config,
2519 .err_term = loc_term ? loc_term->first_column : 0,
2520 .err_val = loc_val ? loc_val->first_column : 0,
2521 };
2522
2523 return new_term(term, &temp, str, /*num=*/0);
2524}
2525
2526int parse_events_term__term(struct parse_events_term **term,
2527 enum parse_events__term_type term_lhs,
2528 enum parse_events__term_type term_rhs,
2529 void *loc_term, void *loc_val)
2530{
2531 return parse_events_term__str(term, term_lhs, NULL,
2532 strdup(config_term_name(term_rhs)),
2533 loc_term, loc_val);
2534}
2535
2536int parse_events_term__clone(struct parse_events_term **new,
2537 struct parse_events_term *term)
2538{
2539 char *str;
2540 struct parse_events_term temp = *term;
2541
2542 temp.used = false;
2543 if (term->config) {
2544 temp.config = strdup(term->config);
2545 if (!temp.config)
2546 return -ENOMEM;
2547 }
2548 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
2549 return new_term(new, &temp, /*str=*/NULL, term->val.num);
2550
2551 str = strdup(term->val.str);
2552 if (!str) {
2553 zfree(&temp.config);
2554 return -ENOMEM;
2555 }
2556 return new_term(new, &temp, str, /*num=*/0);
2557}
2558
2559void parse_events_term__delete(struct parse_events_term *term)
2560{
2561 if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM)
2562 zfree(&term->val.str);
2563
2564 zfree(&term->config);
2565 free(term);
2566}
2567
2568static int parse_events_terms__copy(const struct parse_events_terms *src,
2569 struct parse_events_terms *dest)
2570{
2571 struct parse_events_term *term;
2572
2573 list_for_each_entry (term, &src->terms, list) {
2574 struct parse_events_term *n;
2575 int ret;
2576
2577 ret = parse_events_term__clone(&n, term);
2578 if (ret)
2579 return ret;
2580
2581 list_add_tail(&n->list, &dest->terms);
2582 }
2583 return 0;
2584}
2585
2586void parse_events_terms__init(struct parse_events_terms *terms)
2587{
2588 INIT_LIST_HEAD(&terms->terms);
2589}
2590
2591void parse_events_terms__exit(struct parse_events_terms *terms)
2592{
2593 struct parse_events_term *term, *h;
2594
2595 list_for_each_entry_safe(term, h, &terms->terms, list) {
2596 list_del_init(&term->list);
2597 parse_events_term__delete(term);
2598 }
2599}
2600
2601void parse_events_terms__delete(struct parse_events_terms *terms)
2602{
2603 if (!terms)
2604 return;
2605 parse_events_terms__exit(terms);
2606 free(terms);
2607}
2608
2609int parse_events_terms__to_strbuf(const struct parse_events_terms *terms, struct strbuf *sb)
2610{
2611 struct parse_events_term *term;
2612 bool first = true;
2613
2614 if (!terms)
2615 return 0;
2616
2617 list_for_each_entry(term, &terms->terms, list) {
2618 int ret;
2619
2620 if (!first) {
2621 ret = strbuf_addch(sb, ',');
2622 if (ret < 0)
2623 return ret;
2624 }
2625 first = false;
2626
2627 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
2628 if (term->no_value) {
2629 assert(term->val.num == 1);
2630 ret = strbuf_addf(sb, "%s", term->config);
2631 } else
2632 ret = strbuf_addf(sb, "%s=%#"PRIx64, term->config, term->val.num);
2633 else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
2634 if (term->config) {
2635 ret = strbuf_addf(sb, "%s=", term->config);
2636 if (ret < 0)
2637 return ret;
2638 } else if ((unsigned int)term->type_term < __PARSE_EVENTS__TERM_TYPE_NR) {
2639 ret = strbuf_addf(sb, "%s=", config_term_name(term->type_term));
2640 if (ret < 0)
2641 return ret;
2642 }
2643 assert(!term->no_value);
2644 ret = strbuf_addf(sb, "%s", term->val.str);
2645 }
2646 if (ret < 0)
2647 return ret;
2648 }
2649 return 0;
2650}
2651
2652void parse_events_evlist_error(struct parse_events_state *parse_state,
2653 int idx, const char *str)
2654{
2655 if (!parse_state->error)
2656 return;
2657
2658 parse_events_error__handle(parse_state->error, idx, strdup(str), NULL);
2659}
2660
2661static void config_terms_list(char *buf, size_t buf_sz)
2662{
2663 int i;
2664 bool first = true;
2665
2666 buf[0] = '\0';
2667 for (i = 0; i < __PARSE_EVENTS__TERM_TYPE_NR; i++) {
2668 const char *name = config_term_name(i);
2669
2670 if (!config_term_avail(i, NULL))
2671 continue;
2672 if (!name)
2673 continue;
2674 if (name[0] == '<')
2675 continue;
2676
2677 if (strlen(buf) + strlen(name) + 2 >= buf_sz)
2678 return;
2679
2680 if (!first)
2681 strcat(buf, ",");
2682 else
2683 first = false;
2684 strcat(buf, name);
2685 }
2686}
2687
2688/*
2689 * Return string contains valid config terms of an event.
2690 * @additional_terms: For terms such as PMU sysfs terms.
2691 */
2692char *parse_events_formats_error_string(char *additional_terms)
2693{
2694 char *str;
2695 /* "no-overwrite" is the longest name */
2696 char static_terms[__PARSE_EVENTS__TERM_TYPE_NR *
2697 (sizeof("no-overwrite") - 1)];
2698
2699 config_terms_list(static_terms, sizeof(static_terms));
2700 /* valid terms */
2701 if (additional_terms) {
2702 if (asprintf(&str, "valid terms: %s,%s",
2703 additional_terms, static_terms) < 0)
2704 goto fail;
2705 } else {
2706 if (asprintf(&str, "valid terms: %s", static_terms) < 0)
2707 goto fail;
2708 }
2709 return str;
2710
2711fail:
2712 return NULL;
2713}