Lines Matching +full:long +full:- +full:term
1 // SPDX-License-Identifier: GPL-2.0
12 #include "term.h"
13 #include "build-id.h"
17 #include <subcmd/parse-options.h>
18 #include "parse-events.h"
19 #include <subcmd/exec-cmd.h>
24 #include "bpf-loader.h"
28 #include "parse-events-bison.h"
30 #include "parse-events-flex.h"
33 #include "probe-file.h"
35 #include "util/parse-branch-options.h"
40 #include "util/parse-events-hybrid.h"
41 #include "util/pmu-hybrid.h"
60 * -1 means failed to init, don't try anymore
67 .symbol = "cpu-cycles",
75 .symbol = "cache-references",
79 .symbol = "cache-misses",
83 .symbol = "branch-instructions",
87 .symbol = "branch-misses",
91 .symbol = "bus-cycles",
95 .symbol = "stalled-cycles-frontend",
96 .alias = "idle-cycles-frontend",
99 .symbol = "stalled-cycles-backend",
100 .alias = "idle-cycles-backend",
103 .symbol = "ref-cycles",
110 .symbol = "cpu-clock",
114 .symbol = "task-clock",
118 .symbol = "page-faults",
122 .symbol = "context-switches",
126 .symbol = "cpu-migrations",
130 .symbol = "minor-faults",
134 .symbol = "major-faults",
138 .symbol = "alignment-faults",
142 .symbol = "emulation-faults",
150 .symbol = "bpf-output",
154 .symbol = "cgroup-switches",
169 if (sys_dirent->d_type == DT_DIR && \
170 (strcmp(sys_dirent->d_name, ".")) && \
171 (strcmp(sys_dirent->d_name, "..")))
178 snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, evt_dir->d_name); in tp_event_has_id()
181 return -EINVAL; in tp_event_has_id()
189 if (evt_dirent->d_type == DT_DIR && \
190 (strcmp(evt_dirent->d_name, ".")) && \
191 (strcmp(evt_dirent->d_name, "..")) && \
203 switch (err->num_errors) { in parse_events__handle_error()
205 err->idx = idx; in parse_events__handle_error()
206 err->str = str; in parse_events__handle_error()
207 err->help = help; in parse_events__handle_error()
210 err->first_idx = err->idx; in parse_events__handle_error()
211 err->idx = idx; in parse_events__handle_error()
212 err->first_str = err->str; in parse_events__handle_error()
213 err->str = str; in parse_events__handle_error()
214 err->first_help = err->help; in parse_events__handle_error()
215 err->help = help; in parse_events__handle_error()
219 err->str, err->help); in parse_events__handle_error()
220 free(err->str); in parse_events__handle_error()
221 err->str = str; in parse_events__handle_error()
222 free(err->help); in parse_events__handle_error()
223 err->help = help; in parse_events__handle_error()
226 err->num_errors++; in parse_events__handle_error()
245 dir_path = get_events_file(sys_dirent->d_name); in tracepoint_id_to_path()
255 evt_dirent->d_name); in tracepoint_id_to_path()
272 if (asprintf(&path->system, "%.*s", MAX_EVENT_LENGTH, sys_dirent->d_name) < 0) { in tracepoint_id_to_path()
276 if (asprintf(&path->name, "%.*s", MAX_EVENT_LENGTH, evt_dirent->d_name) < 0) { in tracepoint_id_to_path()
277 zfree(&path->system); in tracepoint_id_to_path()
303 path->system = strndup(name, str - name); in tracepoint_name_to_path()
304 path->name = strdup(str+1); in tracepoint_name_to_path()
306 if (path->system == NULL || path->name == NULL) { in tracepoint_name_to_path()
307 zfree(&path->system); in tracepoint_name_to_path()
308 zfree(&path->name); in tracepoint_name_to_path()
328 return "hardware-cache"; in event_type()
337 static int parse_events__is_name_term(struct parse_events_term *term) in parse_events__is_name_term() argument
339 return term->type_term == PARSE_EVENTS__TERM_TYPE_NAME; in parse_events__is_name_term()
344 struct parse_events_term *term; in get_config_name() local
349 list_for_each_entry(term, head_terms, list) in get_config_name()
350 if (parse_events__is_name_term(term)) in get_config_name()
351 return term->val.str; in get_config_name()
365 struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) : in __add_event()
368 if (pmu && attr->type == PERF_TYPE_RAW) in __add_event()
369 perf_pmu__warn_invalid_config(pmu, attr->config, name); in __add_event()
381 evsel->core.cpus = cpus; in __add_event()
382 evsel->core.own_cpus = perf_cpu_map__get(cpus); in __add_event()
383 evsel->core.system_wide = pmu ? pmu->is_uncore : false; in __add_event()
384 evsel->auto_merge_stats = auto_merge_stats; in __add_event()
387 evsel->name = strdup(name); in __add_event()
390 list_splice_init(config_terms, &evsel->config_terms); in __add_event()
393 list_add_tail(&evsel->core.node, list); in __add_event()
410 false, NULL) ? 0 : -ENOMEM; in add_event()
425 return -ENOMEM; in add_event_tool()
426 evsel->tool_event = tool_event; in add_event_tool()
428 evsel->unit = "ns"; in add_event_tool()
435 int n, longest = -1; in parse_aliases()
447 return -1; in parse_aliases()
451 struct parse_events_term *term,
454 struct parse_events_term *term,
470 int cache_type = -1, cache_op = -1, cache_result = -1; in parse_events_add_cache()
476 * No fallback - if we cannot get a clear cache type in parse_events_add_cache()
480 if (cache_type == -1) in parse_events_add_cache()
481 return -EINVAL; in parse_events_add_cache()
489 n += snprintf(name + n, MAX_NAME_LEN - n, "-%s", str); in parse_events_add_cache()
491 if (cache_op == -1) { in parse_events_add_cache()
496 return -EINVAL; in parse_events_add_cache()
501 if (cache_result == -1) { in parse_events_add_cache()
512 if (cache_op == -1) in parse_events_add_cache()
518 if (cache_result == -1) in parse_events_add_cache()
528 return -EINVAL; in parse_events_add_cache()
531 return -ENOMEM; in parse_events_add_cache()
593 return -ENOMEM; in add_tracepoint()
594 list_splice(&config_terms, &evsel->config_terms); in add_tracepoint()
597 list_add_tail(&evsel->core.node, list); in add_tracepoint()
614 return -1; in add_tracepoint_multi_event()
620 return -1; in add_tracepoint_multi_event()
624 if (!strcmp(evt_ent->d_name, ".") in add_tracepoint_multi_event()
625 || !strcmp(evt_ent->d_name, "..") in add_tracepoint_multi_event()
626 || !strcmp(evt_ent->d_name, "enable") in add_tracepoint_multi_event()
627 || !strcmp(evt_ent->d_name, "filter")) in add_tracepoint_multi_event()
630 if (!strglobmatch(evt_ent->d_name, evt_name)) in add_tracepoint_multi_event()
635 ret = add_tracepoint(list, idx, sys_name, evt_ent->d_name, in add_tracepoint_multi_event()
641 ret = -1; in add_tracepoint_multi_event()
673 return -1; in add_tracepoint_multi_sys()
677 if (!strcmp(events_ent->d_name, ".") in add_tracepoint_multi_sys()
678 || !strcmp(events_ent->d_name, "..") in add_tracepoint_multi_sys()
679 || !strcmp(events_ent->d_name, "enable") in add_tracepoint_multi_sys()
680 || !strcmp(events_ent->d_name, "header_event") in add_tracepoint_multi_sys()
681 || !strcmp(events_ent->d_name, "header_page")) in add_tracepoint_multi_sys()
684 if (!strglobmatch(events_ent->d_name, sys_name)) in add_tracepoint_multi_sys()
687 ret = add_tracepoint_event(list, idx, events_ent->d_name, in add_tracepoint_multi_sys()
707 struct parse_events_state *parse_state = param->parse_state; in add_bpf_event()
708 struct list_head *list = param->list; in add_bpf_event()
724 err = parse_events_add_tracepoint(&new_evsels, &parse_state->idx, group, in add_bpf_event()
725 event, parse_state->error, in add_bpf_event()
726 param->head_config); in add_bpf_event()
733 list_del_init(&evsel->core.node); in add_bpf_event()
743 pos->bpf_fd = fd; in add_bpf_event()
744 pos->bpf_obj = obj; in add_bpf_event()
763 err = -EINVAL; in parse_events_load_bpf_obj()
798 parse_events__handle_error(parse_state->error, 0, in parse_events_load_bpf_obj()
799 strdup(errbuf), strdup("(add -v to see detail)")); in parse_events_load_bpf_obj()
808 struct parse_events_term *term; in parse_events_config_bpf() local
814 list_for_each_entry(term, head_config, list) { in parse_events_config_bpf()
817 if (term->type_term != PARSE_EVENTS__TERM_TYPE_USER) { in parse_events_config_bpf()
818 parse_events__handle_error(parse_state->error, term->err_term, in parse_events_config_bpf()
819 strdup("Invalid config term for BPF object"), in parse_events_config_bpf()
821 return -EINVAL; in parse_events_config_bpf()
824 err = bpf__config_obj(obj, term, parse_state->evlist, &error_pos); in parse_events_config_bpf()
829 bpf__strerror_config_obj(obj, term, parse_state->evlist, in parse_events_config_bpf()
833 if (err == -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE) in parse_events_config_bpf()
834 idx = term->err_val; in parse_events_config_bpf()
836 idx = term->err_term + error_pos; in parse_events_config_bpf()
838 parse_events__handle_error(parse_state->error, idx, in parse_events_config_bpf()
846 " \t(add -v to see detail)")); in parse_events_config_bpf()
855 * perf record -e bpf.c/call-graph=fp,map:array.value[0]=1/ ...
856 * 'call-graph=fp' is 'evt config', should be applied to each
867 struct parse_events_term *term, *temp; in split_bpf_config_terms() local
870 * Currently, all possible user config term in split_bpf_config_terms()
877 list_for_each_entry_safe(term, temp, evt_head_config, list) in split_bpf_config_terms()
878 if (!parse_events__is_hardcoded_term(term)) in split_bpf_config_terms()
879 list_move_tail(&term->list, obj_head_config); in split_bpf_config_terms()
901 if (err == -ENOTSUP) in parse_events_load_bpf()
907 -err, errbuf, in parse_events_load_bpf()
910 parse_events__handle_error(parse_state->error, 0, in parse_events_load_bpf()
911 strdup(errbuf), strdup("(add -v to see detail)")); in parse_events_load_bpf()
934 parse_events__handle_error(parse_state->error, 0, in parse_events_load_bpf_obj()
936 strdup("Make sure libbpf-devel is available at build time.")); in parse_events_load_bpf_obj()
937 return -ENOTSUP; in parse_events_load_bpf_obj()
946 parse_events__handle_error(parse_state->error, 0, in parse_events_load_bpf()
948 strdup("Make sure libbpf-devel is available at build time.")); in parse_events_load_bpf()
949 return -ENOTSUP; in parse_events_load_bpf()
964 if (attr->bp_type & bit) \ in parse_breakpoint_type()
965 return -EINVAL; \ in parse_breakpoint_type()
967 attr->bp_type |= bit; \ in parse_breakpoint_type()
981 return -EINVAL; in parse_breakpoint_type()
987 if (!attr->bp_type) /* Default */ in parse_breakpoint_type()
988 attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; in parse_breakpoint_type()
1002 return -EINVAL; in parse_events_add_breakpoint()
1007 len = sizeof(long); in parse_events_add_breakpoint()
1020 static int check_type_val(struct parse_events_term *term, in check_type_val() argument
1024 if (type == term->type_val) in check_type_val()
1028 parse_events__handle_error(err, term->err_val, in check_type_val()
1034 return -EINVAL; in check_type_val()
1038 * Update according to parse-events.l
1041 [PARSE_EVENTS__TERM_TYPE_USER] = "<sysfs term>",
1050 [PARSE_EVENTS__TERM_TYPE_CALLGRAPH] = "call-graph",
1051 [PARSE_EVENTS__TERM_TYPE_STACKSIZE] = "stack-size",
1052 [PARSE_EVENTS__TERM_TYPE_NOINHERIT] = "no-inherit",
1054 [PARSE_EVENTS__TERM_TYPE_MAX_STACK] = "max-stack",
1057 [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite",
1058 [PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config",
1060 [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] = "aux-output",
1061 [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] = "aux-sample-size",
1072 parse_events__handle_error(err, -1, in config_term_avail()
1094 parse_events__handle_error(err, -1, err_str, NULL); in config_term_avail()
1105 struct parse_events_term *term, in config_term_common() argument
1110 if (check_type_val(term, err, PARSE_EVENTS__TERM_TYPE_ ## type)) \ in config_term_common()
1111 return -EINVAL; \ in config_term_common()
1114 switch (term->type_term) { in config_term_common()
1117 attr->config = term->val.num; in config_term_common()
1121 attr->config1 = term->val.num; in config_term_common()
1125 attr->config2 = term->val.num; in config_term_common()
1135 if (strcmp(term->val.str, "no") && in config_term_common()
1136 parse_branch_str(term->val.str, in config_term_common()
1137 &attr->branch_sample_type)) { in config_term_common()
1138 parse_events__handle_error(err, term->err_val, in config_term_common()
1141 return -EINVAL; in config_term_common()
1146 if (term->val.num > 1) { in config_term_common()
1147 parse_events__handle_error(err, term->err_val, in config_term_common()
1150 return -EINVAL; in config_term_common()
1182 if ((unsigned int)term->val.num > 1) { in config_term_common()
1183 parse_events__handle_error(err, term->err_val, in config_term_common()
1186 return -EINVAL; in config_term_common()
1194 if (term->val.num > UINT_MAX) { in config_term_common()
1195 parse_events__handle_error(err, term->err_val, in config_term_common()
1198 return -EINVAL; in config_term_common()
1202 parse_events__handle_error(err, term->err_term, in config_term_common()
1203 strdup("unknown term"), in config_term_common()
1205 return -EINVAL; in config_term_common()
1209 * Check term availability after basic checking so in config_term_common()
1213 * user will see "'<sysfs term>' is not usable in 'perf stat'" in config_term_common()
1214 * if an invalid config term is provided for legacy events in config_term_common()
1217 if (!config_term_avail(term->type_term, err)) in config_term_common()
1218 return -EINVAL; in config_term_common()
1224 struct parse_events_term *term, in config_term_pmu() argument
1227 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER || in config_term_pmu()
1228 term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG) in config_term_pmu()
1235 return config_term_common(attr, term, err); in config_term_pmu()
1239 struct parse_events_term *term, in config_term_tracepoint() argument
1242 switch (term->type_term) { in config_term_tracepoint()
1253 return config_term_common(attr, term, err); in config_term_tracepoint()
1256 parse_events__handle_error(err, term->err_term, in config_term_tracepoint()
1257 strdup("unknown term"), in config_term_tracepoint()
1258 strdup("valid terms: call-graph,stack-size\n")); in config_term_tracepoint()
1260 return -EINVAL; in config_term_tracepoint()
1271 struct parse_events_term *term; in config_attr() local
1273 list_for_each_entry(term, head, list) in config_attr()
1274 if (config_term(attr, term, err)) in config_attr()
1275 return -EINVAL; in config_attr()
1288 return -ENOMEM; \ in get_config_terms()
1290 INIT_LIST_HEAD(&__t->list); \ in get_config_terms()
1291 __t->type = EVSEL__CONFIG_TERM_ ## __type; \ in get_config_terms()
1292 __t->weak = __weak; \ in get_config_terms()
1293 list_add_tail(&__t->list, head_terms) in get_config_terms()
1298 __t->val.__name = __val; \ in get_config_terms()
1304 __t->val.str = strdup(__val); \ in get_config_terms()
1305 if (!__t->val.str) { \ in get_config_terms()
1307 return -ENOMEM; \ in get_config_terms()
1309 __t->free_str = true; \ in get_config_terms()
1312 struct parse_events_term *term; in get_config_terms() local
1314 list_for_each_entry(term, head_config, list) { in get_config_terms()
1315 switch (term->type_term) { in get_config_terms()
1317 ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num, term->weak); in get_config_terms()
1320 ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num, term->weak); in get_config_terms()
1323 ADD_CONFIG_TERM_VAL(TIME, time, term->val.num, term->weak); in get_config_terms()
1326 ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str, term->weak); in get_config_terms()
1329 ADD_CONFIG_TERM_STR(BRANCH, term->val.str, term->weak); in get_config_terms()
1333 term->val.num, term->weak); in get_config_terms()
1337 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1341 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1345 term->val.num, term->weak); in get_config_terms()
1349 term->val.num, term->weak); in get_config_terms()
1353 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1357 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1360 ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str, term->weak); in get_config_terms()
1364 term->val.num ? true : false, term->weak); in get_config_terms()
1368 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1372 term->val.num, term->weak); in get_config_terms()
1383 * each bit of attr->config that the user has changed.
1388 struct parse_events_term *term; in get_config_chgs() local
1392 list_for_each_entry(term, head_config, list) { in get_config_chgs()
1393 switch (term->type_term) { in get_config_chgs()
1395 type = perf_pmu__format_type(&pmu->format, term->config); in get_config_chgs()
1398 bits |= perf_pmu__format_bits(&pmu->format, term->config); in get_config_chgs()
1425 return -EINVAL; in parse_events_add_tracepoint()
1451 if (config_attr(&attr, head_config, parse_state->error, in parse_events_add_numeric()
1453 return -EINVAL; in parse_events_add_numeric()
1456 return -ENOMEM; in parse_events_add_numeric()
1465 ret = add_event(list, &parse_state->idx, &attr, in parse_events_add_numeric()
1476 return add_event_tool(list, &parse_state->idx, tool_event); in parse_events_add_tool()
1481 struct evsel_config_term *term; in config_term_percore() local
1483 list_for_each_entry(term, config_terms, list) { in config_term_percore()
1484 if (term->type == EVSEL__CONFIG_TERM_PERCORE) in config_term_percore()
1485 return term->val.percore; in config_term_percore()
1495 struct parse_events_term *term; in parse_events__inside_hybrid_pmu() local
1496 int ret = -1; in parse_events__inside_hybrid_pmu()
1498 if (parse_state->fake_pmu || !head_config || list_empty(head_config) || in parse_events__inside_hybrid_pmu()
1500 return -1; in parse_events__inside_hybrid_pmu()
1504 * More than one term in list. in parse_events__inside_hybrid_pmu()
1506 if (head_config->next && head_config->next->next != head_config) in parse_events__inside_hybrid_pmu()
1507 return -1; in parse_events__inside_hybrid_pmu()
1509 term = list_first_entry(head_config, struct parse_events_term, list); in parse_events__inside_hybrid_pmu()
1510 if (term && term->config && strcmp(term->config, "event")) { in parse_events__inside_hybrid_pmu()
1511 ret = parse_events__with_hybrid_pmu(parse_state, term->config, in parse_events__inside_hybrid_pmu()
1528 struct parse_events_error *err = parse_state->error; in parse_events_add_pmu()
1536 struct parse_events_term *term; in parse_events_add_pmu() local
1538 list_for_each_entry(term, head_config, list) { in parse_events_add_pmu()
1539 fprintf(stderr, "%s,", term->config); in parse_events_add_pmu()
1542 fprintf(stderr, "' that may result in non-fatal errors\n"); in parse_events_add_pmu()
1545 pmu = parse_state->fake_pmu ?: perf_pmu__find(name); in parse_events_add_pmu()
1553 return -EINVAL; in parse_events_add_pmu()
1556 if (pmu->default_config) { in parse_events_add_pmu()
1557 memcpy(&attr, pmu->default_config, in parse_events_add_pmu()
1563 use_uncore_alias = (pmu->is_uncore && use_alias); in parse_events_add_pmu()
1566 attr.type = pmu->type; in parse_events_add_pmu()
1567 evsel = __add_event(list, &parse_state->idx, &attr, true, NULL, in parse_events_add_pmu()
1570 evsel->pmu_name = name ? strdup(name) : NULL; in parse_events_add_pmu()
1571 evsel->use_uncore_alias = use_uncore_alias; in parse_events_add_pmu()
1574 return -ENOMEM; in parse_events_add_pmu()
1578 if (!parse_state->fake_pmu && perf_pmu__check_alias(pmu, head_config, &info)) in parse_events_add_pmu()
1579 return -EINVAL; in parse_events_add_pmu()
1585 struct parse_events_term *term; in parse_events_add_pmu() local
1587 list_for_each_entry(term, head_config, list) { in parse_events_add_pmu()
1588 fprintf(stderr, "%s,", term->config); in parse_events_add_pmu()
1591 fprintf(stderr, "' that may result in non-fatal errors\n"); in parse_events_add_pmu()
1598 if (config_attr(&attr, head_config, parse_state->error, config_term_pmu)) in parse_events_add_pmu()
1599 return -EINVAL; in parse_events_add_pmu()
1602 return -ENOMEM; in parse_events_add_pmu()
1605 * When using default config, record which bits of attr->config were in parse_events_add_pmu()
1608 if (pmu->default_config && get_config_chgs(pmu, head_config, &config_terms)) in parse_events_add_pmu()
1609 return -ENOMEM; in parse_events_add_pmu()
1616 if (!parse_state->fake_pmu && perf_pmu__config(pmu, &attr, head_config, parse_state->error)) { in parse_events_add_pmu()
1618 return -EINVAL; in parse_events_add_pmu()
1621 evsel = __add_event(list, &parse_state->idx, &attr, true, in parse_events_add_pmu()
1625 return -ENOMEM; in parse_events_add_pmu()
1627 if (evsel->name) in parse_events_add_pmu()
1628 evsel->use_config_name = true; in parse_events_add_pmu()
1630 evsel->pmu_name = name ? strdup(name) : NULL; in parse_events_add_pmu()
1631 evsel->use_uncore_alias = use_uncore_alias; in parse_events_add_pmu()
1632 evsel->percore = config_term_percore(&evsel->config_terms); in parse_events_add_pmu()
1634 if (parse_state->fake_pmu) in parse_events_add_pmu()
1637 evsel->unit = info.unit; in parse_events_add_pmu()
1638 evsel->scale = info.scale; in parse_events_add_pmu()
1639 evsel->per_pkg = info.per_pkg; in parse_events_add_pmu()
1640 evsel->snapshot = info.snapshot; in parse_events_add_pmu()
1641 evsel->metric_expr = info.metric_expr; in parse_events_add_pmu()
1642 evsel->metric_name = info.metric_name; in parse_events_add_pmu()
1649 struct parse_events_term *term; in parse_events_multi_pmu_add() local
1658 return -1; in parse_events_multi_pmu_add()
1663 list_for_each_entry(alias, &pmu->aliases, list) { in parse_events_multi_pmu_add()
1664 if (!strcasecmp(alias->name, str)) { in parse_events_multi_pmu_add()
1670 return -1; in parse_events_multi_pmu_add()
1674 return -1; in parse_events_multi_pmu_add()
1675 if (parse_events_term__num(&term, in parse_events_multi_pmu_add()
1681 return -1; in parse_events_multi_pmu_add()
1683 list_add_tail(&term->list, head); in parse_events_multi_pmu_add()
1686 pmu->name, head, in parse_events_multi_pmu_add()
1688 pr_debug("%s -> %s/%s/\n", str, in parse_events_multi_pmu_add()
1689 pmu->name, alias->str); in parse_events_multi_pmu_add()
1699 return -1; in parse_events_multi_pmu_add()
1725 if ((end_a - pmu_name_a) != (end_b - pmu_name_b)) in is_same_uncore_block()
1728 return (strncmp(pmu_name_a, pmu_name_b, end_a - pmu_name_a) == 0); in is_same_uncore_block()
1742 total_members = evsel->core.idx - leader->core.idx + 1; in parse_events__set_leader_for_uncore_aliase()
1756 if (!evsel->use_uncore_alias) in parse_events__set_leader_for_uncore_aliase()
1760 if (!is_same_uncore_block(leader->pmu_name, evsel->pmu_name)) in parse_events__set_leader_for_uncore_aliase()
1771 !strcmp(leader->pmu_name, evsel->pmu_name)) { in parse_events__set_leader_for_uncore_aliase()
1782 parse_state->nr_groups--; in parse_events__set_leader_for_uncore_aliase()
1808 evsel->core.nr_members = total_members / nr_pmu; in parse_events__set_leader_for_uncore_aliase()
1809 evsel->group_name = name ? strdup(name) : NULL; in parse_events__set_leader_for_uncore_aliase()
1813 parse_state->nr_groups += nr_pmu - 1; in parse_events__set_leader_for_uncore_aliase()
1836 leader = list_entry(list->next, struct evsel, core.node); in parse_events__set_leader()
1837 leader->group_name = name ? strdup(name) : NULL; in parse_events__set_leader()
1873 int eu = evsel ? evsel->core.attr.exclude_user : 0; in get_event_modifier()
1874 int ek = evsel ? evsel->core.attr.exclude_kernel : 0; in get_event_modifier()
1875 int eh = evsel ? evsel->core.attr.exclude_hv : 0; in get_event_modifier()
1876 int eH = evsel ? evsel->core.attr.exclude_host : 0; in get_event_modifier()
1877 int eG = evsel ? evsel->core.attr.exclude_guest : 0; in get_event_modifier()
1878 int eI = evsel ? evsel->core.attr.exclude_idle : 0; in get_event_modifier()
1879 int precise = evsel ? evsel->core.attr.precise_ip : 0; in get_event_modifier()
1882 int pinned = evsel ? evsel->core.attr.pinned : 0; in get_event_modifier()
1883 int exclusive = evsel ? evsel->core.attr.exclusive : 0; in get_event_modifier()
1886 int exclude_GH = evsel ? evsel->exclude_GH : 0; in get_event_modifier()
1943 * 0 - SAMPLE_IP can have arbitrary skid in get_event_modifier()
1944 * 1 - SAMPLE_IP must have constant skid in get_event_modifier()
1945 * 2 - SAMPLE_IP requested to have 0 skid in get_event_modifier()
1946 * 3 - SAMPLE_IP must have 0 skid in get_event_modifier()
1951 return -EINVAL; in get_event_modifier()
1953 mod->eu = eu; in get_event_modifier()
1954 mod->ek = ek; in get_event_modifier()
1955 mod->eh = eh; in get_event_modifier()
1956 mod->eH = eH; in get_event_modifier()
1957 mod->eG = eG; in get_event_modifier()
1958 mod->eI = eI; in get_event_modifier()
1959 mod->precise = precise; in get_event_modifier()
1960 mod->precise_max = precise_max; in get_event_modifier()
1961 mod->exclude_GH = exclude_GH; in get_event_modifier()
1962 mod->sample_read = sample_read; in get_event_modifier()
1963 mod->pinned = pinned; in get_event_modifier()
1964 mod->weak = weak; in get_event_modifier()
1965 mod->bpf_counter = bpf_counter; in get_event_modifier()
1966 mod->exclusive = exclusive; in get_event_modifier()
1980 if (strlen(str) > (sizeof("ukhGHpppPSDIWeb") - 1)) in check_modifier()
1981 return -1; in check_modifier()
1985 return -1; in check_modifier()
2001 return -EINVAL; in parse_events__modifier_event()
2004 return -EINVAL; in parse_events__modifier_event()
2008 return -EINVAL; in parse_events__modifier_event()
2010 evsel->core.attr.exclude_user = mod.eu; in parse_events__modifier_event()
2011 evsel->core.attr.exclude_kernel = mod.ek; in parse_events__modifier_event()
2012 evsel->core.attr.exclude_hv = mod.eh; in parse_events__modifier_event()
2013 evsel->core.attr.precise_ip = mod.precise; in parse_events__modifier_event()
2014 evsel->core.attr.exclude_host = mod.eH; in parse_events__modifier_event()
2015 evsel->core.attr.exclude_guest = mod.eG; in parse_events__modifier_event()
2016 evsel->core.attr.exclude_idle = mod.eI; in parse_events__modifier_event()
2017 evsel->exclude_GH = mod.exclude_GH; in parse_events__modifier_event()
2018 evsel->sample_read = mod.sample_read; in parse_events__modifier_event()
2019 evsel->precise_max = mod.precise_max; in parse_events__modifier_event()
2020 evsel->weak_group = mod.weak; in parse_events__modifier_event()
2021 evsel->bpf_counter = mod.bpf_counter; in parse_events__modifier_event()
2024 evsel->core.attr.pinned = mod.pinned; in parse_events__modifier_event()
2025 evsel->core.attr.exclusive = mod.exclusive; in parse_events__modifier_event()
2037 if (!evsel->name) in parse_events_name()
2038 evsel->name = strdup(name); in parse_events_name()
2050 return strcasecmp(pmu1->symbol, pmu2->symbol); in comp_pmu()
2061 zfree(&p->symbol); in perf_pmu__parse_cleanup()
2070 p->symbol = str; \
2071 if (!p->symbol) \
2073 p->type = stype; \
2089 list_for_each_entry(alias, &pmu->aliases, list) { in perf_pmu__parse_init()
2090 if (strchr(alias->name, '-')) in perf_pmu__parse_init()
2097 perf_pmu_events_list_num = -1; in perf_pmu__parse_init()
2108 list_for_each_entry(alias, &pmu->aliases, list) { in perf_pmu__parse_init()
2110 char *tmp = strchr(alias->name, '-'); in perf_pmu__parse_init()
2113 SET_SYMBOL(strndup(alias->name, tmp - alias->name), in perf_pmu__parse_init()
2119 SET_SYMBOL(strdup(alias->name), PMU_EVENT_SYMBOL); in perf_pmu__parse_init()
2133 * This function injects special term in
2143 return -ENOMEM; in perf_pmu__test_parse_init()
2145 list->type = PMU_EVENT_SYMBOL; in perf_pmu__test_parse_init()
2146 list->symbol = strdup("read"); in perf_pmu__test_parse_init()
2148 if (!list->symbol) { in perf_pmu__test_parse_init()
2150 return -ENOMEM; in perf_pmu__test_parse_init()
2167 * name "cpu" could be prefix of cpu-cycles or cpu// events. in perf_pmu__parse_check()
2168 * cpu-cycles has been handled by hardcode. in perf_pmu__parse_check()
2179 return r ? r->type : PMU_EVENT_SYMBOL_ERR; in perf_pmu__parse_check()
2239 .idx = parse_state->idx, in parse_events__with_hybrid_pmu()
2249 parse_state->idx = ps.idx; in parse_events__with_hybrid_pmu()
2252 return -1; in parse_events__with_hybrid_pmu()
2263 .idx = evlist->core.nr_entries, in __parse_events()
2276 return -1; in __parse_events()
2287 evlist->core.nr_groups += parse_state.nr_groups; in __parse_events()
2289 last->cmdline_group_boundary = true; in __parse_events()
2295 * There are 2 users - builtin-record and builtin-test objects. in __parse_events()
2319 /* -2 for extra '' in the final fprintf */ in __parse_events_print_error()
2320 int width = get_term_width() - 2; in __parse_events_print_error()
2336 max_len = width - len_str; in __parse_events_print_error()
2342 cut = err_idx - max_err_idx; in __parse_events_print_error()
2350 if ((len_event - cut) > max_len) { in __parse_events_print_error()
2351 buf[max_len - 1] = buf[max_len - 2] = '.'; in __parse_events_print_error()
2355 idx = len_str + err_idx - cut; in __parse_events_print_error()
2369 if (!err->num_errors) in parse_events_print_error()
2372 __parse_events_print_error(err->idx, err->str, err->help, event); in parse_events_print_error()
2373 zfree(&err->str); in parse_events_print_error()
2374 zfree(&err->help); in parse_events_print_error()
2376 if (err->num_errors > 1) { in parse_events_print_error()
2378 __parse_events_print_error(err->first_idx, err->first_str, in parse_events_print_error()
2379 err->first_help, event); in parse_events_print_error()
2380 zfree(&err->first_str); in parse_events_print_error()
2381 zfree(&err->first_help); in parse_events_print_error()
2390 struct evlist *evlist = *(struct evlist **)opt->value; in parse_events_option()
2407 struct evlist **evlistp = opt->value; in parse_events_option_new_evlist()
2415 return -1; in parse_events_option_new_evlist()
2443 if (evlist->core.nr_entries > 0) in foreach_evsel_in_last_glob()
2449 return -1; in foreach_evsel_in_last_glob()
2453 if (last->core.node.prev == &evlist->core.entries) in foreach_evsel_in_last_glob()
2455 last = list_entry(last->core.node.prev, struct evsel, core.node); in foreach_evsel_in_last_glob()
2456 } while (!last->cmdline_group_boundary); in foreach_evsel_in_last_glob()
2470 "--filter option should follow a -e tracepoint or HW tracer option\n"); in set_filter()
2471 return -1; in set_filter()
2474 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) { in set_filter()
2478 return -1; in set_filter()
2485 if (pmu->type == evsel->core.attr.type) { in set_filter()
2497 return -1; in set_filter()
2503 return -1; in set_filter()
2512 struct evlist *evlist = *(struct evlist **)opt->value; in parse_filter()
2523 if (evsel == NULL || evsel->core.attr.type != PERF_TYPE_TRACEPOINT) { in add_exclude_perf_filter()
2525 "--exclude-perf option should follow a -e tracepoint option\n"); in add_exclude_perf_filter()
2526 return -1; in add_exclude_perf_filter()
2534 return -1; in add_exclude_perf_filter()
2544 struct evlist *evlist = *(struct evlist **)opt->value; in exclude_perf()
2595 !strglobmatch(sys_dirent->d_name, subsys_glob)) in print_tracepoint_events()
2598 dir_path = get_events_file(sys_dirent->d_name); in print_tracepoint_events()
2607 !strglobmatch(evt_dirent->d_name, event_glob)) in print_tracepoint_events()
2616 sys_dirent->d_name, evt_dirent->d_name); in print_tracepoint_events()
2642 printf(" %-50s [%s]\n", evt_list[evt_i++], in print_tracepoint_events()
2682 dir_path = get_events_file(sys_dirent->d_name); in is_valid_tracepoint()
2691 sys_dirent->d_name, evt_dirent->d_name); in is_valid_tracepoint()
2726 if (open_return == -EACCES) { in is_event_supported()
2730 * Re-run with exclude_kernel set; we don't do that in is_event_supported()
2734 evsel->core.attr.exclude_kernel = 1; in is_event_supported()
2767 pcache = probe_cache__new(nd->s, NULL); in print_sdt_events()
2770 list_for_each_entry(ent, &pcache->entries, node) { in print_sdt_events()
2771 if (!ent->sdt) in print_sdt_events()
2774 !strglobmatch(ent->pev.group, subsys_glob)) in print_sdt_events()
2777 !strglobmatch(ent->pev.event, event_glob)) in print_sdt_events()
2779 ret = asprintf(&buf, "%s:%s@%s", ent->pev.group, in print_sdt_events()
2780 ent->pev.event, nd->s); in print_sdt_events()
2789 buf = strchr(nd->s, '@'); in print_sdt_events()
2793 printf("%s ", nd->s); in print_sdt_events()
2798 ptr = strchr(nd2->s, '@'); in print_sdt_events()
2801 if (strcmp(nd->s, nd2->s) == 0) in print_sdt_events()
2806 ret = asprintf(&buf, "%s@%s(%.12s)", nd->s, path, buf); in print_sdt_events()
2808 printf(" %-50s [%s]\n", buf, "SDT event"); in print_sdt_events()
2813 printf(" %-50s [%s]\n", nd->s, "SDT event"); in print_sdt_events()
2815 if (strcmp(nd->s, nd2->s) != 0) in print_sdt_events()
2877 printf(" %-50s [%s]\n", evt_list[evt_i++], in print_hwcache_events()
2905 printf(" %-50s [%s]\n", name, "Tool event"); in print_tool_event()
2930 syms -= max; in print_symbol_events()
2938 if (syms->symbol == NULL) in print_symbol_events()
2941 if (event_glob != NULL && !(strglobmatch(syms->symbol, event_glob) || in print_symbol_events()
2942 (syms->alias && strglobmatch(syms->alias, event_glob)))) in print_symbol_events()
2953 if (!name_only && strlen(syms->alias)) in print_symbol_events()
2954 snprintf(name, MAX_NAME_LEN, "%s OR %s", syms->symbol, syms->alias); in print_symbol_events()
2956 strlcpy(name, syms->symbol, MAX_NAME_LEN); in print_symbol_events()
2975 printf(" %-50s [%s]\n", evt_list[evt_i++], event_type_descriptors[type]); in print_symbol_events()
3015 printf(" %-50s [%s]\n", in print_events()
3018 printf(" %-50s [%s]\n", in print_events()
3022 printf(" (see 'man perf-list' on how to encode it)\n\n"); in print_events()
3024 printf(" %-50s [%s]\n", in print_events()
3040 int parse_events__is_hardcoded_term(struct parse_events_term *term) in parse_events__is_hardcoded_term() argument
3042 return term->type_term != PARSE_EVENTS__TERM_TYPE_USER; in parse_events__is_hardcoded_term()
3049 struct parse_events_term *term; in new_term() local
3051 term = malloc(sizeof(*term)); in new_term()
3052 if (!term) in new_term()
3053 return -ENOMEM; in new_term()
3055 *term = *temp; in new_term()
3056 INIT_LIST_HEAD(&term->list); in new_term()
3057 term->weak = false; in new_term()
3059 switch (term->type_val) { in new_term()
3061 term->val.num = num; in new_term()
3064 term->val.str = str; in new_term()
3067 free(term); in new_term()
3068 return -EINVAL; in new_term()
3071 *_term = term; in new_term()
3075 int parse_events_term__num(struct parse_events_term **term, in parse_events_term__num() argument
3088 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__num()
3089 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__num()
3092 return new_term(term, &temp, NULL, num); in parse_events_term__num()
3095 int parse_events_term__str(struct parse_events_term **term, in parse_events_term__str() argument
3106 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__str()
3107 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__str()
3110 return new_term(term, &temp, str, 0); in parse_events_term__str()
3113 int parse_events_term__sym_hw(struct parse_events_term **term, in parse_events_term__sym_hw() argument
3127 return -ENOMEM; in parse_events_term__sym_hw()
3132 str = strdup(sym->symbol); in parse_events_term__sym_hw()
3134 return -ENOMEM; in parse_events_term__sym_hw()
3135 return new_term(term, &temp, str, 0); in parse_events_term__sym_hw()
3139 struct parse_events_term *term) in parse_events_term__clone() argument
3143 .type_val = term->type_val, in parse_events_term__clone()
3144 .type_term = term->type_term, in parse_events_term__clone()
3146 .err_term = term->err_term, in parse_events_term__clone()
3147 .err_val = term->err_val, in parse_events_term__clone()
3150 if (term->config) { in parse_events_term__clone()
3151 temp.config = strdup(term->config); in parse_events_term__clone()
3153 return -ENOMEM; in parse_events_term__clone()
3155 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__clone()
3156 return new_term(new, &temp, NULL, term->val.num); in parse_events_term__clone()
3158 str = strdup(term->val.str); in parse_events_term__clone()
3160 return -ENOMEM; in parse_events_term__clone()
3164 void parse_events_term__delete(struct parse_events_term *term) in parse_events_term__delete() argument
3166 if (term->array.nr_ranges) in parse_events_term__delete()
3167 zfree(&term->array.ranges); in parse_events_term__delete()
3169 if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__delete()
3170 zfree(&term->val.str); in parse_events_term__delete()
3172 zfree(&term->config); in parse_events_term__delete()
3173 free(term); in parse_events_term__delete()
3179 struct parse_events_term *term, *n; in parse_events_copy_term_list() local
3189 return -ENOMEM; in parse_events_copy_term_list()
3192 list_for_each_entry (term, old, list) { in parse_events_copy_term_list()
3193 ret = parse_events_term__clone(&n, term); in parse_events_copy_term_list()
3196 list_add_tail(&n->list, *new); in parse_events_copy_term_list()
3203 struct parse_events_term *term, *h; in parse_events_terms__purge() local
3205 list_for_each_entry_safe(term, h, terms, list) { in parse_events_terms__purge()
3206 list_del_init(&term->list); in parse_events_terms__purge()
3207 parse_events_term__delete(term); in parse_events_terms__purge()
3221 zfree(&a->ranges); in parse_events__clear_array()
3227 if (!parse_state->error) in parse_events_evlist_error()
3230 parse_events__handle_error(parse_state->error, idx, strdup(str), NULL); in parse_events_evlist_error()
3267 /* "no-overwrite" is the longest name */ in parse_events_formats_error_string()
3269 (sizeof("no-overwrite") - 1)]; in parse_events_formats_error_string()