Lines Matching +full:dont +full:- +full:validate

1 // SPDX-License-Identifier: GPL-2.0
13 #include <subcmd/parse-options.h>
14 #include "parse-events.h"
20 #include <util/parse-events-bison.h>
21 #include <util/parse-events-flex.h>
25 #include "util/parse-branch-options.h"
28 #include "util/bpf-filter.h"
43 .symbol = "cpu-cycles",
51 .symbol = "cache-references",
55 .symbol = "cache-misses",
59 .symbol = "branch-instructions",
63 .symbol = "branch-misses",
67 .symbol = "bus-cycles",
71 .symbol = "stalled-cycles-frontend",
72 .alias = "idle-cycles-frontend",
75 .symbol = "stalled-cycles-backend",
76 .alias = "idle-cycles-backend",
79 .symbol = "ref-cycles",
86 .symbol = "cpu-clock",
90 .symbol = "task-clock",
94 .symbol = "page-faults",
98 .symbol = "context-switches",
102 .symbol = "cpu-migrations",
106 .symbol = "minor-faults",
110 .symbol = "major-faults",
114 .symbol = "alignment-faults",
118 .symbol = "emulation-faults",
126 .symbol = "bpf-output",
130 .symbol = "cgroup-switches",
148 return "hardware-cache"; in event_type()
165 list_for_each_entry(term, &head_terms->terms, list) in get_config_str()
166 if (term->type_term == type_term) in get_config_str()
167 return term->val.str; in get_config_str()
183 * fix_raw - For each raw term see if there is an event (aka alias) in pmu that
187 * a raw hex encoding of 0xead. The fix-up is done late so the PMU of
189 * ahead-of-time.
197 list_for_each_entry(term, &config_terms->terms, list) { in fix_raw()
200 if (term->type_term != PARSE_EVENTS__TERM_TYPE_RAW) in fix_raw()
203 if (perf_pmu__have_event(pmu, term->val.str)) { in fix_raw()
204 zfree(&term->config); in fix_raw()
205 term->config = term->val.str; in fix_raw()
206 term->type_val = PARSE_EVENTS__TERM_TYPE_NUM; in fix_raw()
207 term->type_term = PARSE_EVENTS__TERM_TYPE_USER; in fix_raw()
208 term->val.num = 1; in fix_raw()
209 term->no_value = true; in fix_raw()
213 zfree(&term->config); in fix_raw()
214 term->config = strdup("config"); in fix_raw()
216 num = strtoull(term->val.str + 1, NULL, 16); in fix_raw()
218 free(term->val.str); in fix_raw()
219 term->type_val = PARSE_EVENTS__TERM_TYPE_NUM; in fix_raw()
220 term->type_term = PARSE_EVENTS__TERM_TYPE_CONFIG; in fix_raw()
221 term->val.num = num; in fix_raw()
222 term->no_value = false; in fix_raw()
235 struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) : in __add_event()
241 if (pmu && (attr->type == PERF_TYPE_RAW || attr->type >= PERF_TYPE_MAX)) { in __add_event()
242 perf_pmu__warn_invalid_config(pmu, attr->config, name, in __add_event()
244 perf_pmu__warn_invalid_config(pmu, attr->config1, name, in __add_event()
246 perf_pmu__warn_invalid_config(pmu, attr->config2, name, in __add_event()
248 perf_pmu__warn_invalid_config(pmu, attr->config3, name, in __add_event()
261 evsel->core.cpus = cpus; in __add_event()
262 evsel->core.own_cpus = perf_cpu_map__get(cpus); in __add_event()
263 evsel->core.requires_cpu = pmu ? pmu->is_uncore : false; in __add_event()
264 evsel->core.is_pmu_core = pmu ? pmu->is_core : false; in __add_event()
265 evsel->auto_merge_stats = auto_merge_stats; in __add_event()
266 evsel->pmu = pmu; in __add_event()
267 evsel->pmu_name = pmu ? strdup(pmu->name) : NULL; in __add_event()
270 evsel->name = strdup(name); in __add_event()
273 evsel->metric_id = strdup(metric_id); in __add_event()
276 list_splice_init(config_terms, &evsel->config_terms); in __add_event()
279 list_add_tail(&evsel->core.node, list); in __add_event()
299 /*auto_merge_stats=*/false, /*cpu_list=*/NULL) ? 0 : -ENOMEM; in add_event()
316 return -ENOMEM; in add_event_tool()
317 evsel->tool_event = tool_event; in add_event_tool()
321 free((char *)evsel->unit); in add_event_tool()
322 evsel->unit = strdup("ns"); in add_event_tool()
328 * parse_aliases - search names for entries beginning or equalling str ignoring
339 *longest = -1; in parse_aliases()
351 return -1; in parse_aliases()
366 * parse_events__decode_legacy_cache - Search name for the legacy cache event
377 int len, cache_type = -1, cache_op = -1, cache_result = -1; in parse_events__decode_legacy_cache()
382 if (cache_type == -1) in parse_events__decode_legacy_cache()
383 return -EINVAL; in parse_events__decode_legacy_cache()
391 return -EINVAL; in parse_events__decode_legacy_cache()
406 return -EINVAL; in parse_events__decode_legacy_cache()
417 if (cache_op == -1) in parse_events__decode_legacy_cache()
423 if (cache_result == -1) in parse_events__decode_legacy_cache()
433 * parse_events__filter_pmu - returns false if a wildcard PMU should be
439 if (parse_state->pmu_filter == NULL) in parse_events__filter_pmu()
442 return strcmp(parse_state->pmu_filter, pmu->name) != 0; in parse_events__filter_pmu()
466 ret = parse_events__decode_legacy_cache(name, pmu->type, &attr.config); in parse_events_add_cache()
473 if (config_attr(&attr, head_config, parse_state->error, config_term_common)) in parse_events_add_cache()
474 return -EINVAL; in parse_events_add_cache()
477 return -ENOMEM; in parse_events_add_cache()
483 return -ENOMEM; in parse_events_add_cache()
487 return found_supported ? 0 : -EINVAL; in parse_events_add_cache()
531 tracepoint_error(err, PTR_ERR(evsel), sys_name, evt_name, loc->first_column); in add_tracepoint()
539 return -ENOMEM; in add_tracepoint()
540 list_splice(&config_terms, &evsel->config_terms); in add_tracepoint()
543 list_add_tail(&evsel->core.node, list); in add_tracepoint()
559 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_event()
560 return -1; in add_tracepoint_multi_event()
565 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_event()
566 return -1; in add_tracepoint_multi_event()
570 if (!strcmp(evt_ent->d_name, ".") in add_tracepoint_multi_event()
571 || !strcmp(evt_ent->d_name, "..") in add_tracepoint_multi_event()
572 || !strcmp(evt_ent->d_name, "enable") in add_tracepoint_multi_event()
573 || !strcmp(evt_ent->d_name, "filter")) in add_tracepoint_multi_event()
576 if (!strglobmatch(evt_ent->d_name, evt_name)) in add_tracepoint_multi_event()
581 ret = add_tracepoint(list, idx, sys_name, evt_ent->d_name, in add_tracepoint_multi_event()
586 tracepoint_error(err, ENOENT, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_event()
587 ret = -1; in add_tracepoint_multi_event()
618 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_sys()
619 return -1; in add_tracepoint_multi_sys()
623 if (!strcmp(events_ent->d_name, ".") in add_tracepoint_multi_sys()
624 || !strcmp(events_ent->d_name, "..") in add_tracepoint_multi_sys()
625 || !strcmp(events_ent->d_name, "enable") in add_tracepoint_multi_sys()
626 || !strcmp(events_ent->d_name, "header_event") in add_tracepoint_multi_sys()
627 || !strcmp(events_ent->d_name, "header_page")) in add_tracepoint_multi_sys()
630 if (!strglobmatch(events_ent->d_name, sys_name)) in add_tracepoint_multi_sys()
633 ret = add_tracepoint_event(list, idx, events_ent->d_name, in add_tracepoint_multi_sys()
653 if (attr->bp_type & bit) \ in parse_breakpoint_type()
654 return -EINVAL; \ in parse_breakpoint_type()
656 attr->bp_type |= bit; \ in parse_breakpoint_type()
670 return -EINVAL; in parse_breakpoint_type()
676 if (!attr->bp_type) /* Default */ in parse_breakpoint_type()
677 attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; in parse_breakpoint_type()
695 return -EINVAL; in parse_events_add_breakpoint()
711 if (config_attr(&attr, head_config, parse_state->error, in parse_events_add_breakpoint()
713 return -EINVAL; in parse_events_add_breakpoint()
716 return -ENOMEM; in parse_events_add_breakpoint()
721 return add_event(list, &parse_state->idx, &attr, name, /*mertic_id=*/NULL, in parse_events_add_breakpoint()
729 if (type == term->type_val) in check_type_val()
733 parse_events_error__handle(err, term->err_val, in check_type_val()
739 return -EINVAL; in check_type_val()
747 * Update according to parse-events.l in config_term_name()
760 [PARSE_EVENTS__TERM_TYPE_CALLGRAPH] = "call-graph", in config_term_name()
761 [PARSE_EVENTS__TERM_TYPE_STACKSIZE] = "stack-size", in config_term_name()
762 [PARSE_EVENTS__TERM_TYPE_NOINHERIT] = "no-inherit", in config_term_name()
764 [PARSE_EVENTS__TERM_TYPE_MAX_STACK] = "max-stack", in config_term_name()
767 [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite", in config_term_name()
768 [PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config", in config_term_name()
770 [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] = "aux-output", in config_term_name()
771 [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] = "aux-sample-size", in config_term_name()
772 [PARSE_EVENTS__TERM_TYPE_METRIC_ID] = "metric-id", in config_term_name()
774 [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] = "legacy-cache", in config_term_name()
789 parse_events_error__handle(err, -1, in config_term_avail()
831 parse_events_error__handle(err, -1, err_str, NULL); in config_term_avail()
848 return -EINVAL; \ in config_term_common()
851 switch (term->type_term) { in config_term_common()
854 attr->config = term->val.num; in config_term_common()
858 attr->config1 = term->val.num; in config_term_common()
862 attr->config2 = term->val.num; in config_term_common()
866 attr->config3 = term->val.num; in config_term_common()
876 if (strcmp(term->val.str, "no") && in config_term_common()
877 parse_branch_str(term->val.str, in config_term_common()
878 &attr->branch_sample_type)) { in config_term_common()
879 parse_events_error__handle(err, term->err_val, in config_term_common()
882 return -EINVAL; in config_term_common()
887 if (term->val.num > 1) { in config_term_common()
888 parse_events_error__handle(err, term->err_val, in config_term_common()
891 return -EINVAL; in config_term_common()
929 if ((unsigned int)term->val.num > 1) { in config_term_common()
930 parse_events_error__handle(err, term->err_val, in config_term_common()
933 return -EINVAL; in config_term_common()
941 if (term->val.num > UINT_MAX) { in config_term_common()
942 parse_events_error__handle(err, term->err_val, in config_term_common()
945 return -EINVAL; in config_term_common()
953 parse_events_error__handle(err, term->err_term, in config_term_common()
954 strdup(config_term_name(term->type_term)), in config_term_common()
956 return -EINVAL; in config_term_common()
968 if (!config_term_avail(term->type_term, err)) in config_term_common()
969 return -EINVAL; in config_term_common()
978 if (term->type_term == PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE) { in config_term_pmu()
979 struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type); in config_term_pmu()
984 if (asprintf(&err_str, "Failed to find PMU for type %d", attr->type) >= 0) in config_term_pmu()
985 parse_events_error__handle(err, term->err_term, in config_term_pmu()
987 return -EINVAL; in config_term_pmu()
995 !perf_pmu__have_event(pmu, term->config)) { in config_term_pmu()
996 attr->type = PERF_TYPE_HW_CACHE; in config_term_pmu()
997 return parse_events__decode_legacy_cache(term->config, pmu->type, in config_term_pmu()
998 &attr->config); in config_term_pmu()
1000 term->type_term = PARSE_EVENTS__TERM_TYPE_USER; in config_term_pmu()
1001 term->no_value = true; in config_term_pmu()
1004 if (term->type_term == PARSE_EVENTS__TERM_TYPE_HARDWARE) { in config_term_pmu()
1005 struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type); in config_term_pmu()
1010 if (asprintf(&err_str, "Failed to find PMU for type %d", attr->type) >= 0) in config_term_pmu()
1011 parse_events_error__handle(err, term->err_term, in config_term_pmu()
1013 return -EINVAL; in config_term_pmu()
1019 if (perf_pmu__have_event(pmu, term->config)) { in config_term_pmu()
1020 term->type_term = PARSE_EVENTS__TERM_TYPE_USER; in config_term_pmu()
1021 term->no_value = true; in config_term_pmu()
1023 attr->type = PERF_TYPE_HARDWARE; in config_term_pmu()
1024 attr->config = term->val.num; in config_term_pmu()
1026 attr->config |= (__u64)pmu->type << PERF_PMU_TYPE_SHIFT; in config_term_pmu()
1030 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER || in config_term_pmu()
1031 term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG) { in config_term_pmu()
1033 * Always succeed for sysfs terms, as we dont know in config_term_pmu()
1046 switch (term->type_term) { in config_term_tracepoint()
1076 parse_events_error__handle(err, term->err_term, in config_term_tracepoint()
1077 strdup(config_term_name(term->type_term)), in config_term_tracepoint()
1078 strdup("valid terms: call-graph,stack-size\n")); in config_term_tracepoint()
1080 return -EINVAL; in config_term_tracepoint()
1094 list_for_each_entry(term, &head->terms, list) in config_attr()
1096 return -EINVAL; in config_attr()
1108 return -ENOMEM; \ in get_config_terms()
1110 INIT_LIST_HEAD(&__t->list); \ in get_config_terms()
1111 __t->type = EVSEL__CONFIG_TERM_ ## __type; \ in get_config_terms()
1112 __t->weak = __weak; \ in get_config_terms()
1113 list_add_tail(&__t->list, head_terms) in get_config_terms()
1118 __t->val.__name = __val; \ in get_config_terms()
1124 __t->val.str = strdup(__val); \ in get_config_terms()
1125 if (!__t->val.str) { \ in get_config_terms()
1127 return -ENOMEM; \ in get_config_terms()
1129 __t->free_str = true; \ in get_config_terms()
1134 list_for_each_entry(term, &head_config->terms, list) { in get_config_terms()
1135 switch (term->type_term) { in get_config_terms()
1137 ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num, term->weak); in get_config_terms()
1140 ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num, term->weak); in get_config_terms()
1143 ADD_CONFIG_TERM_VAL(TIME, time, term->val.num, term->weak); in get_config_terms()
1146 ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str, term->weak); in get_config_terms()
1149 ADD_CONFIG_TERM_STR(BRANCH, term->val.str, term->weak); in get_config_terms()
1153 term->val.num, term->weak); in get_config_terms()
1157 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1161 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1165 term->val.num, term->weak); in get_config_terms()
1169 term->val.num, term->weak); in get_config_terms()
1173 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1177 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1180 ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str, term->weak); in get_config_terms()
1184 term->val.num ? true : false, term->weak); in get_config_terms()
1188 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1192 term->val.num, term->weak); in get_config_terms()
1213 * each bit of attr->config that the user has changed.
1222 list_for_each_entry(term, &head_config->terms, list) { in get_config_chgs()
1223 switch (term->type_term) { in get_config_chgs()
1225 type = perf_pmu__format_type(pmu, term->config); in get_config_chgs()
1228 bits |= perf_pmu__format_bits(pmu, term->config); in get_config_chgs()
1281 return -EINVAL; in parse_events_add_tracepoint()
1296 parse_events_error__handle(err, loc->first_column, strdup("unsupported tracepoint"), in parse_events_add_tracepoint()
1298 return -1; in parse_events_add_tracepoint()
1321 if (config_attr(&attr, head_config, parse_state->error, in __parse_events_add_numeric()
1323 return -EINVAL; in __parse_events_add_numeric()
1326 return -ENOMEM; in __parse_events_add_numeric()
1331 ret = __add_event(list, &parse_state->idx, &attr, /*init_attr*/true, name, in __parse_events_add_numeric()
1333 /*cpu_list=*/NULL) ? 0 : -ENOMEM; in __parse_events_add_numeric()
1357 type, pmu->type, in parse_events_add_numeric()
1373 return add_event_tool(list, &parse_state->idx, tool_event); in parse_events_add_tool()
1381 if (term->type == EVSEL__CONFIG_TERM_PERCORE) in config_term_percore()
1382 return term->val.percore; in config_term_percore()
1397 struct parse_events_error *err = parse_state->error; in parse_events_add_pmu()
1403 pmu = parse_state->fake_pmu ?: perf_pmus__find(name); in parse_events_add_pmu()
1411 parse_events_error__handle(err, loc->first_column, err_str, NULL); in parse_events_add_pmu()
1412 return -EINVAL; in parse_events_add_pmu()
1427 if (pmu->selectable && list_empty(&parsed_terms.terms)) { in parse_events_add_pmu()
1440 if (pmu->perf_event_attr_init_default) in parse_events_add_pmu()
1441 pmu->perf_event_attr_init_default(pmu, &attr); in parse_events_add_pmu()
1443 attr.type = pmu->type; in parse_events_add_pmu()
1446 evsel = __add_event(list, &parse_state->idx, &attr, in parse_events_add_pmu()
1451 return evsel ? 0 : -ENOMEM; in parse_events_add_pmu()
1455 if (config_attr(&attr, &parsed_terms, parse_state->error, config_term_pmu)) { in parse_events_add_pmu()
1457 return -EINVAL; in parse_events_add_pmu()
1461 if (!parse_state->fake_pmu && perf_pmu__check_alias(pmu, &parsed_terms, in parse_events_add_pmu()
1464 return -EINVAL; in parse_events_add_pmu()
1478 config_attr(&attr, &parsed_terms, parse_state->error, config_term_pmu)) { in parse_events_add_pmu()
1480 return -EINVAL; in parse_events_add_pmu()
1485 return -ENOMEM; in parse_events_add_pmu()
1489 * When using default config, record which bits of attr->config were in parse_events_add_pmu()
1492 if (pmu->perf_event_attr_init_default && in parse_events_add_pmu()
1495 return -ENOMEM; in parse_events_add_pmu()
1498 if (!parse_state->fake_pmu && in parse_events_add_pmu()
1499 perf_pmu__config(pmu, &attr, &parsed_terms, parse_state->error)) { in parse_events_add_pmu()
1502 return -EINVAL; in parse_events_add_pmu()
1505 evsel = __add_event(list, &parse_state->idx, &attr, /*init_attr=*/true, in parse_events_add_pmu()
1511 return -ENOMEM; in parse_events_add_pmu()
1514 if (evsel->name) in parse_events_add_pmu()
1515 evsel->use_config_name = true; in parse_events_add_pmu()
1517 evsel->percore = config_term_percore(&evsel->config_terms); in parse_events_add_pmu()
1519 if (parse_state->fake_pmu) { in parse_events_add_pmu()
1525 free((char *)evsel->unit); in parse_events_add_pmu()
1526 evsel->unit = strdup(info.unit); in parse_events_add_pmu()
1527 evsel->scale = info.scale; in parse_events_add_pmu()
1528 evsel->per_pkg = info.per_pkg; in parse_events_add_pmu()
1529 evsel->snapshot = info.snapshot; in parse_events_add_pmu()
1567 list_add_tail(&term->list, &parsed_terms.terms); in parse_events_multi_pmu_add()
1586 if (!parse_events_add_pmu(parse_state, list, pmu->name, in parse_events_multi_pmu_add()
1592 pr_debug("%s -> %s/%s/\n", event_name, pmu->name, sb.buf); in parse_events_multi_pmu_add()
1598 if (parse_state->fake_pmu) { in parse_events_multi_pmu_add()
1605 pr_debug("%s -> %s/%s/\n", event_name, "fake_pmu", sb.buf); in parse_events_multi_pmu_add()
1618 return ok ? 0 : -1; in parse_events_multi_pmu_add()
1637 __perf_evlist__set_leader(list, &leader->core); in parse_events__set_leader()
1638 leader->group_name = name; in parse_events__set_leader()
1674 int eu = evsel ? evsel->core.attr.exclude_user : 0; in get_event_modifier()
1675 int ek = evsel ? evsel->core.attr.exclude_kernel : 0; in get_event_modifier()
1676 int eh = evsel ? evsel->core.attr.exclude_hv : 0; in get_event_modifier()
1677 int eH = evsel ? evsel->core.attr.exclude_host : 0; in get_event_modifier()
1678 int eG = evsel ? evsel->core.attr.exclude_guest : 0; in get_event_modifier()
1679 int eI = evsel ? evsel->core.attr.exclude_idle : 0; in get_event_modifier()
1680 int precise = evsel ? evsel->core.attr.precise_ip : 0; in get_event_modifier()
1683 int pinned = evsel ? evsel->core.attr.pinned : 0; in get_event_modifier()
1684 int exclusive = evsel ? evsel->core.attr.exclusive : 0; in get_event_modifier()
1687 int exclude_GH = evsel ? evsel->exclude_GH : 0; in get_event_modifier()
1744 * 0 - SAMPLE_IP can have arbitrary skid in get_event_modifier()
1745 * 1 - SAMPLE_IP must have constant skid in get_event_modifier()
1746 * 2 - SAMPLE_IP requested to have 0 skid in get_event_modifier()
1747 * 3 - SAMPLE_IP must have 0 skid in get_event_modifier()
1752 return -EINVAL; in get_event_modifier()
1754 mod->eu = eu; in get_event_modifier()
1755 mod->ek = ek; in get_event_modifier()
1756 mod->eh = eh; in get_event_modifier()
1757 mod->eH = eH; in get_event_modifier()
1758 mod->eG = eG; in get_event_modifier()
1759 mod->eI = eI; in get_event_modifier()
1760 mod->precise = precise; in get_event_modifier()
1761 mod->precise_max = precise_max; in get_event_modifier()
1762 mod->exclude_GH = exclude_GH; in get_event_modifier()
1763 mod->sample_read = sample_read; in get_event_modifier()
1764 mod->pinned = pinned; in get_event_modifier()
1765 mod->weak = weak; in get_event_modifier()
1766 mod->bpf_counter = bpf_counter; in get_event_modifier()
1767 mod->exclusive = exclusive; in get_event_modifier()
1773 * Basic modifier sanity check to validate it contains only one
1781 if (strlen(str) > (sizeof("ukhGHpppPSDIWeb") - 1)) in check_modifier()
1782 return -1; in check_modifier()
1786 return -1; in check_modifier()
1802 return -EINVAL; in parse_events__modifier_event()
1805 return -EINVAL; in parse_events__modifier_event()
1809 return -EINVAL; in parse_events__modifier_event()
1811 evsel->core.attr.exclude_user = mod.eu; in parse_events__modifier_event()
1812 evsel->core.attr.exclude_kernel = mod.ek; in parse_events__modifier_event()
1813 evsel->core.attr.exclude_hv = mod.eh; in parse_events__modifier_event()
1814 evsel->core.attr.precise_ip = mod.precise; in parse_events__modifier_event()
1815 evsel->core.attr.exclude_host = mod.eH; in parse_events__modifier_event()
1816 evsel->core.attr.exclude_guest = mod.eG; in parse_events__modifier_event()
1817 evsel->core.attr.exclude_idle = mod.eI; in parse_events__modifier_event()
1818 evsel->exclude_GH = mod.exclude_GH; in parse_events__modifier_event()
1819 evsel->sample_read = mod.sample_read; in parse_events__modifier_event()
1820 evsel->precise_max = mod.precise_max; in parse_events__modifier_event()
1821 evsel->weak_group = mod.weak; in parse_events__modifier_event()
1822 evsel->bpf_counter = mod.bpf_counter; in parse_events__modifier_event()
1825 evsel->core.attr.pinned = mod.pinned; in parse_events__modifier_event()
1826 evsel->core.attr.exclusive = mod.exclusive; in parse_events__modifier_event()
1838 if (!evsel->name) { in parse_events_name()
1839 evsel->name = strdup(name); in parse_events_name()
1840 if (!evsel->name) in parse_events_name()
1841 return -ENOMEM; in parse_events_name()
1892 list_splice(&parse_state.terms->terms, &terms->terms); in parse_events_terms()
1916 return -EINVAL; in evsel__compute_group_pmu_name()
1918 group_pmu_name = pmu->name; in evsel__compute_group_pmu_name()
1921 * the pmu_name of the first non-software event to avoid breaking the in evsel__compute_group_pmu_name()
1936 * non-software PMU. for_each_group_(member|evsel) isn't used as in evsel__compute_group_pmu_name()
1941 group_pmu_name = leader_pmu->name; in evsel__compute_group_pmu_name()
1942 } else if (leader->core.nr_members > 1) { in evsel__compute_group_pmu_name()
1954 group_pmu_name = pos_pmu->name; in evsel__compute_group_pmu_name()
1961 evsel->group_pmu_name = strdup(group_pmu_name ?: "fake"); in evsel__compute_group_pmu_name()
1962 return evsel->group_pmu_name ? 0 : -ENOMEM; in evsel__compute_group_pmu_name()
1968 return lhs->core.idx - rhs->core.idx; in arch_evlist__cmp()
1986 * occurs. If both events don't have a group we want to fall-through to in evlist__cmp()
1990 if (lhs_core->leader != lhs_core || lhs_core->nr_members > 1) { in evlist__cmp()
1992 lhs_sort_idx = lhs_core->leader->idx; in evlist__cmp()
1995 lhs_sort_idx = *force_grouped_idx != -1 && arch_evsel__must_be_in_group(lhs) in evlist__cmp()
1997 : lhs_core->idx; in evlist__cmp()
1999 if (rhs_core->leader != rhs_core || rhs_core->nr_members > 1) { in evlist__cmp()
2001 rhs_sort_idx = rhs_core->leader->idx; in evlist__cmp()
2004 rhs_sort_idx = *force_grouped_idx != -1 && arch_evsel__must_be_in_group(rhs) in evlist__cmp()
2006 : rhs_core->idx; in evlist__cmp()
2010 return lhs_sort_idx - rhs_sort_idx; in evlist__cmp()
2014 lhs_pmu_name = lhs->group_pmu_name; in evlist__cmp()
2015 rhs_pmu_name = rhs->group_pmu_name; in evlist__cmp()
2027 int idx = 0, force_grouped_idx = -1; in parse_events__sort_events_and_fix_groups()
2053 pos->core.idx = idx++; in parse_events__sort_events_and_fix_groups()
2056 if (force_grouped_idx == -1 && pos == pos_leader && pos->core.nr_members < 2 && in parse_events__sort_events_and_fix_groups()
2058 force_grouped_idx = pos->core.idx; in parse_events__sort_events_and_fix_groups()
2071 const char *pos_pmu_name = pos->group_pmu_name; in parse_events__sort_events_and_fix_groups()
2073 bool pos_force_grouped = force_grouped_idx != -1 && in parse_events__sort_events_and_fix_groups()
2077 if (pos->core.idx != idx) in parse_events__sort_events_and_fix_groups()
2079 pos->core.idx = idx++; in parse_events__sort_events_and_fix_groups()
2080 pos->core.nr_members = 0; in parse_events__sort_events_and_fix_groups()
2089 cur_leader_pmu_name = cur_leader->group_pmu_name; in parse_events__sort_events_and_fix_groups()
2090 if ((cur_leaders_grp != pos->core.leader && in parse_events__sort_events_and_fix_groups()
2100 cur_leaders_grp = pos->core.leader; in parse_events__sort_events_and_fix_groups()
2117 pos_leader->core.nr_members++; in parse_events__sort_events_and_fix_groups()
2128 .idx = evlist->core.nr_entries, in __parse_events()
2141 return -1; in __parse_events()
2160 last->cmdline_group_boundary = true; in __parse_events()
2166 * There are 2 users - builtin-record and builtin-test objects. in __parse_events()
2167 * Both call evlist__delete in case of error, so we dont in __parse_events()
2191 zfree(&err->str); in parse_events_error__exit()
2192 zfree(&err->help); in parse_events_error__exit()
2193 zfree(&err->first_str); in parse_events_error__exit()
2194 zfree(&err->first_help); in parse_events_error__exit()
2202 switch (err->num_errors) { in parse_events_error__handle()
2204 err->idx = idx; in parse_events_error__handle()
2205 err->str = str; in parse_events_error__handle()
2206 err->help = help; in parse_events_error__handle()
2209 err->first_idx = err->idx; in parse_events_error__handle()
2210 err->idx = idx; in parse_events_error__handle()
2211 err->first_str = err->str; in parse_events_error__handle()
2212 err->str = str; in parse_events_error__handle()
2213 err->first_help = err->help; in parse_events_error__handle()
2214 err->help = help; in parse_events_error__handle()
2218 err->str, err->help ?: "<no help>"); in parse_events_error__handle()
2219 free(err->str); in parse_events_error__handle()
2220 err->str = str; in parse_events_error__handle()
2221 free(err->help); in parse_events_error__handle()
2222 err->help = help; in parse_events_error__handle()
2225 err->num_errors++; in parse_events_error__handle()
2250 /* -2 for extra '' in the final fprintf */ in __parse_events_error__print()
2251 int width = get_term_width() - 2; in __parse_events_error__print()
2267 max_len = width - len_str; in __parse_events_error__print()
2273 cut = err_idx - max_err_idx; in __parse_events_error__print()
2281 if ((len_event - cut) > max_len) { in __parse_events_error__print()
2282 buf[max_len - 1] = buf[max_len - 2] = '.'; in __parse_events_error__print()
2286 idx = len_str + err_idx - cut; in __parse_events_error__print()
2300 if (!err->num_errors) in parse_events_error__print()
2303 __parse_events_error__print(err->idx, err->str, err->help, event); in parse_events_error__print()
2305 if (err->num_errors > 1) { in parse_events_error__print()
2307 __parse_events_error__print(err->first_idx, err->first_str, in parse_events_error__print()
2308 err->first_help, event); in parse_events_error__print()
2317 struct parse_events_option_args *args = opt->value; in parse_events_option()
2322 ret = __parse_events(*args->evlistp, str, args->pmu_filter, &err, in parse_events_option()
2336 struct parse_events_option_args *args = opt->value; in parse_events_option_new_evlist()
2339 if (*args->evlistp == NULL) { in parse_events_option_new_evlist()
2340 *args->evlistp = evlist__new(); in parse_events_option_new_evlist()
2342 if (*args->evlistp == NULL) { in parse_events_option_new_evlist()
2344 return -1; in parse_events_option_new_evlist()
2349 evlist__delete(*args->evlistp); in parse_events_option_new_evlist()
2350 *args->evlistp = NULL; in parse_events_option_new_evlist()
2371 if (evlist->core.nr_entries > 0) in foreach_evsel_in_last_glob()
2377 return -1; in foreach_evsel_in_last_glob()
2381 if (last->core.node.prev == &evlist->core.entries) in foreach_evsel_in_last_glob()
2383 last = list_entry(last->core.node.prev, struct evsel, core.node); in foreach_evsel_in_last_glob()
2384 } while (!last->cmdline_group_boundary); in foreach_evsel_in_last_glob()
2398 "--filter option should follow a -e tracepoint or HW tracer option\n"); in set_filter()
2399 return -1; in set_filter()
2402 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) { in set_filter()
2406 return -1; in set_filter()
2413 if (pmu->type == evsel->core.attr.type) { in set_filter()
2423 return perf_bpf_filter__parse(&evsel->bpf_filters, str); in set_filter()
2428 return -1; in set_filter()
2437 struct evlist *evlist = *(struct evlist **)opt->value; in parse_filter()
2448 if (evsel == NULL || evsel->core.attr.type != PERF_TYPE_TRACEPOINT) { in add_exclude_perf_filter()
2450 "--exclude-perf option should follow a -e tracepoint option\n"); in add_exclude_perf_filter()
2451 return -1; in add_exclude_perf_filter()
2459 return -1; in add_exclude_perf_filter()
2469 struct evlist *evlist = *(struct evlist **)opt->value; in exclude_perf()
2477 return term->type_term != PARSE_EVENTS__TERM_TYPE_USER; in parse_events__is_hardcoded_term()
2488 return -ENOMEM; in new_term()
2491 INIT_LIST_HEAD(&term->list); in new_term()
2492 term->weak = false; in new_term()
2494 switch (term->type_val) { in new_term()
2496 term->val.num = num; in new_term()
2499 term->val.str = str; in new_term()
2503 return -EINVAL; in new_term()
2524 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__num()
2525 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__num()
2543 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__str()
2544 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__str()
2567 if (term->config) { in parse_events_term__clone()
2568 temp.config = strdup(term->config); in parse_events_term__clone()
2570 return -ENOMEM; in parse_events_term__clone()
2572 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__clone()
2573 return new_term(new, &temp, /*str=*/NULL, term->val.num); in parse_events_term__clone()
2575 str = strdup(term->val.str); in parse_events_term__clone()
2578 return -ENOMEM; in parse_events_term__clone()
2585 if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__delete()
2586 zfree(&term->val.str); in parse_events_term__delete()
2588 zfree(&term->config); in parse_events_term__delete()
2597 list_for_each_entry (term, &src->terms, list) { in parse_events_terms__copy()
2605 list_add_tail(&n->list, &dest->terms); in parse_events_terms__copy()
2612 INIT_LIST_HEAD(&terms->terms); in parse_events_terms__init()
2619 list_for_each_entry_safe(term, h, &terms->terms, list) { in parse_events_terms__exit()
2620 list_del_init(&term->list); in parse_events_terms__exit()
2641 list_for_each_entry(term, &terms->terms, list) { in parse_events_terms__to_strbuf()
2651 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_terms__to_strbuf()
2652 if (term->no_value) { in parse_events_terms__to_strbuf()
2653 assert(term->val.num == 1); in parse_events_terms__to_strbuf()
2654 ret = strbuf_addf(sb, "%s", term->config); in parse_events_terms__to_strbuf()
2656 ret = strbuf_addf(sb, "%s=%#"PRIx64, term->config, term->val.num); in parse_events_terms__to_strbuf()
2657 else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) { in parse_events_terms__to_strbuf()
2658 if (term->config) { in parse_events_terms__to_strbuf()
2659 ret = strbuf_addf(sb, "%s=", term->config); in parse_events_terms__to_strbuf()
2662 } else if ((unsigned int)term->type_term < __PARSE_EVENTS__TERM_TYPE_NR) { in parse_events_terms__to_strbuf()
2663 ret = strbuf_addf(sb, "%s=", config_term_name(term->type_term)); in parse_events_terms__to_strbuf()
2667 assert(!term->no_value); in parse_events_terms__to_strbuf()
2668 ret = strbuf_addf(sb, "%s", term->val.str); in parse_events_terms__to_strbuf()
2679 if (!parse_state->error) in parse_events_evlist_error()
2682 parse_events_error__handle(parse_state->error, idx, strdup(str), NULL); in parse_events_evlist_error()
2719 /* "no-overwrite" is the longest name */ in parse_events_formats_error_string()
2721 (sizeof("no-overwrite") - 1)]; in parse_events_formats_error_string()