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"
55 * -1 means failed to init, don't try anymore
62 .symbol = "cpu-cycles",
70 .symbol = "cache-references",
74 .symbol = "cache-misses",
78 .symbol = "branch-instructions",
82 .symbol = "branch-misses",
86 .symbol = "bus-cycles",
90 .symbol = "stalled-cycles-frontend",
91 .alias = "idle-cycles-frontend",
94 .symbol = "stalled-cycles-backend",
95 .alias = "idle-cycles-backend",
98 .symbol = "ref-cycles",
105 .symbol = "cpu-clock",
109 .symbol = "task-clock",
113 .symbol = "page-faults",
117 .symbol = "context-switches",
121 .symbol = "cpu-migrations",
125 .symbol = "minor-faults",
129 .symbol = "major-faults",
133 .symbol = "alignment-faults",
137 .symbol = "emulation-faults",
145 .symbol = "bpf-output",
160 if (sys_dirent->d_type == DT_DIR && \
161 (strcmp(sys_dirent->d_name, ".")) && \
162 (strcmp(sys_dirent->d_name, "..")))
169 snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, evt_dir->d_name); in tp_event_has_id()
172 return -EINVAL; in tp_event_has_id()
180 if (evt_dirent->d_type == DT_DIR && \
181 (strcmp(evt_dirent->d_name, ".")) && \
182 (strcmp(evt_dirent->d_name, "..")) && \
194 switch (err->num_errors) { in parse_events__handle_error()
196 err->idx = idx; in parse_events__handle_error()
197 err->str = str; in parse_events__handle_error()
198 err->help = help; in parse_events__handle_error()
201 err->first_idx = err->idx; in parse_events__handle_error()
202 err->idx = idx; in parse_events__handle_error()
203 err->first_str = err->str; in parse_events__handle_error()
204 err->str = str; in parse_events__handle_error()
205 err->first_help = err->help; in parse_events__handle_error()
206 err->help = help; in parse_events__handle_error()
210 err->str, err->help); in parse_events__handle_error()
211 free(err->str); in parse_events__handle_error()
212 err->str = str; in parse_events__handle_error()
213 free(err->help); in parse_events__handle_error()
214 err->help = help; in parse_events__handle_error()
217 err->num_errors++; in parse_events__handle_error()
236 dir_path = get_events_file(sys_dirent->d_name); in tracepoint_id_to_path()
246 evt_dirent->d_name); in tracepoint_id_to_path()
263 if (asprintf(&path->system, "%.*s", MAX_EVENT_LENGTH, sys_dirent->d_name) < 0) { in tracepoint_id_to_path()
267 if (asprintf(&path->name, "%.*s", MAX_EVENT_LENGTH, evt_dirent->d_name) < 0) { in tracepoint_id_to_path()
268 zfree(&path->system); in tracepoint_id_to_path()
294 path->system = strndup(name, str - name); in tracepoint_name_to_path()
295 path->name = strdup(str+1); in tracepoint_name_to_path()
297 if (path->system == NULL || path->name == NULL) { in tracepoint_name_to_path()
298 zfree(&path->system); in tracepoint_name_to_path()
299 zfree(&path->name); in tracepoint_name_to_path()
319 return "hardware-cache"; in event_type()
328 static int parse_events__is_name_term(struct parse_events_term *term) in parse_events__is_name_term() argument
330 return term->type_term == PARSE_EVENTS__TERM_TYPE_NAME; in parse_events__is_name_term()
335 struct parse_events_term *term; in get_config_name() local
340 list_for_each_entry(term, head_terms, list) in get_config_name()
341 if (parse_events__is_name_term(term)) in get_config_name()
342 return term->val.str; in get_config_name()
356 struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) : in __add_event()
369 evsel->core.cpus = cpus; in __add_event()
370 evsel->core.own_cpus = perf_cpu_map__get(cpus); in __add_event()
371 evsel->core.system_wide = pmu ? pmu->is_uncore : false; in __add_event()
372 evsel->auto_merge_stats = auto_merge_stats; in __add_event()
375 evsel->name = strdup(name); in __add_event()
378 list_splice(config_terms, &evsel->config_terms); in __add_event()
381 list_add_tail(&evsel->core.node, list); in __add_event()
398 false, NULL) ? 0 : -ENOMEM; in add_event()
413 return -ENOMEM; in add_event_tool()
414 evsel->tool_event = tool_event; in add_event_tool()
416 evsel->unit = "ns"; in add_event_tool()
423 int n, longest = -1; in parse_aliases()
435 return -1; in parse_aliases()
439 struct parse_events_term *term,
442 struct parse_events_term *term,
457 int cache_type = -1, cache_op = -1, cache_result = -1; in parse_events_add_cache()
462 * No fallback - if we cannot get a clear cache type in parse_events_add_cache()
466 if (cache_type == -1) in parse_events_add_cache()
467 return -EINVAL; in parse_events_add_cache()
475 n += snprintf(name + n, MAX_NAME_LEN - n, "-%s", str); in parse_events_add_cache()
477 if (cache_op == -1) { in parse_events_add_cache()
482 return -EINVAL; in parse_events_add_cache()
487 if (cache_result == -1) { in parse_events_add_cache()
498 if (cache_op == -1) in parse_events_add_cache()
504 if (cache_result == -1) in parse_events_add_cache()
514 return -EINVAL; in parse_events_add_cache()
517 return -ENOMEM; in parse_events_add_cache()
569 return -ENOMEM; in add_tracepoint()
570 list_splice(&config_terms, &evsel->config_terms); in add_tracepoint()
573 list_add_tail(&evsel->core.node, list); in add_tracepoint()
590 return -1; in add_tracepoint_multi_event()
596 return -1; in add_tracepoint_multi_event()
600 if (!strcmp(evt_ent->d_name, ".") in add_tracepoint_multi_event()
601 || !strcmp(evt_ent->d_name, "..") in add_tracepoint_multi_event()
602 || !strcmp(evt_ent->d_name, "enable") in add_tracepoint_multi_event()
603 || !strcmp(evt_ent->d_name, "filter")) in add_tracepoint_multi_event()
606 if (!strglobmatch(evt_ent->d_name, evt_name)) in add_tracepoint_multi_event()
611 ret = add_tracepoint(list, idx, sys_name, evt_ent->d_name, in add_tracepoint_multi_event()
617 ret = -1; in add_tracepoint_multi_event()
649 return -1; in add_tracepoint_multi_sys()
653 if (!strcmp(events_ent->d_name, ".") in add_tracepoint_multi_sys()
654 || !strcmp(events_ent->d_name, "..") in add_tracepoint_multi_sys()
655 || !strcmp(events_ent->d_name, "enable") in add_tracepoint_multi_sys()
656 || !strcmp(events_ent->d_name, "header_event") in add_tracepoint_multi_sys()
657 || !strcmp(events_ent->d_name, "header_page")) in add_tracepoint_multi_sys()
660 if (!strglobmatch(events_ent->d_name, sys_name)) in add_tracepoint_multi_sys()
663 ret = add_tracepoint_event(list, idx, events_ent->d_name, in add_tracepoint_multi_sys()
682 struct parse_events_state *parse_state = param->parse_state; in add_bpf_event()
683 struct list_head *list = param->list; in add_bpf_event()
699 err = parse_events_add_tracepoint(&new_evsels, &parse_state->idx, group, in add_bpf_event()
700 event, parse_state->error, in add_bpf_event()
701 param->head_config); in add_bpf_event()
708 list_del_init(&evsel->core.node); in add_bpf_event()
718 pos->bpf_fd = fd; in add_bpf_event()
719 pos->bpf_obj = obj; in add_bpf_event()
738 err = -EINVAL; in parse_events_load_bpf_obj()
773 parse_events__handle_error(parse_state->error, 0, in parse_events_load_bpf_obj()
774 strdup(errbuf), strdup("(add -v to see detail)")); in parse_events_load_bpf_obj()
783 struct parse_events_term *term; in parse_events_config_bpf() local
789 list_for_each_entry(term, head_config, list) { in parse_events_config_bpf()
792 if (term->type_term != PARSE_EVENTS__TERM_TYPE_USER) { in parse_events_config_bpf()
793 parse_events__handle_error(parse_state->error, term->err_term, in parse_events_config_bpf()
794 strdup("Invalid config term for BPF object"), in parse_events_config_bpf()
796 return -EINVAL; in parse_events_config_bpf()
799 err = bpf__config_obj(obj, term, parse_state->evlist, &error_pos); in parse_events_config_bpf()
804 bpf__strerror_config_obj(obj, term, parse_state->evlist, in parse_events_config_bpf()
808 if (err == -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE) in parse_events_config_bpf()
809 idx = term->err_val; in parse_events_config_bpf()
811 idx = term->err_term + error_pos; in parse_events_config_bpf()
813 parse_events__handle_error(parse_state->error, idx, in parse_events_config_bpf()
821 " \t(add -v to see detail)")); in parse_events_config_bpf()
830 * perf record -e bpf.c/call-graph=fp,map:array.value[0]=1/ ...
831 * 'call-graph=fp' is 'evt config', should be applied to each
842 struct parse_events_term *term, *temp; in split_bpf_config_terms() local
845 * Currectly, all possible user config term in split_bpf_config_terms()
852 list_for_each_entry_safe(term, temp, evt_head_config, list) in split_bpf_config_terms()
853 if (!parse_events__is_hardcoded_term(term)) in split_bpf_config_terms()
854 list_move_tail(&term->list, obj_head_config); in split_bpf_config_terms()
876 if (err == -ENOTSUP) in parse_events_load_bpf()
882 -err, errbuf, in parse_events_load_bpf()
885 parse_events__handle_error(parse_state->error, 0, in parse_events_load_bpf()
886 strdup(errbuf), strdup("(add -v to see detail)")); in parse_events_load_bpf()
915 if (attr->bp_type & bit) \ in parse_breakpoint_type()
916 return -EINVAL; \ in parse_breakpoint_type()
918 attr->bp_type |= bit; \ in parse_breakpoint_type()
932 return -EINVAL; in parse_breakpoint_type()
938 if (!attr->bp_type) /* Default */ in parse_breakpoint_type()
939 attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; in parse_breakpoint_type()
953 return -EINVAL; in parse_events_add_breakpoint()
958 len = sizeof(long); in parse_events_add_breakpoint()
971 static int check_type_val(struct parse_events_term *term, in check_type_val() argument
975 if (type == term->type_val) in check_type_val()
979 parse_events__handle_error(err, term->err_val, in check_type_val()
985 return -EINVAL; in check_type_val()
989 * Update according to parse-events.l
992 [PARSE_EVENTS__TERM_TYPE_USER] = "<sysfs term>",
1001 [PARSE_EVENTS__TERM_TYPE_CALLGRAPH] = "call-graph",
1002 [PARSE_EVENTS__TERM_TYPE_STACKSIZE] = "stack-size",
1003 [PARSE_EVENTS__TERM_TYPE_NOINHERIT] = "no-inherit",
1005 [PARSE_EVENTS__TERM_TYPE_MAX_STACK] = "max-stack",
1008 [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite",
1009 [PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config",
1011 [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] = "aux-output",
1012 [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] = "aux-sample-size",
1023 parse_events__handle_error(err, -1, in config_term_avail()
1045 parse_events__handle_error(err, -1, err_str, NULL); in config_term_avail()
1056 struct parse_events_term *term, in config_term_common() argument
1061 if (check_type_val(term, err, PARSE_EVENTS__TERM_TYPE_ ## type)) \ in config_term_common()
1062 return -EINVAL; \ in config_term_common()
1065 switch (term->type_term) { in config_term_common()
1068 attr->config = term->val.num; in config_term_common()
1072 attr->config1 = term->val.num; in config_term_common()
1076 attr->config2 = term->val.num; in config_term_common()
1086 if (strcmp(term->val.str, "no") && in config_term_common()
1087 parse_branch_str(term->val.str, in config_term_common()
1088 &attr->branch_sample_type)) { in config_term_common()
1089 parse_events__handle_error(err, term->err_val, in config_term_common()
1092 return -EINVAL; in config_term_common()
1097 if (term->val.num > 1) { in config_term_common()
1098 parse_events__handle_error(err, term->err_val, in config_term_common()
1101 return -EINVAL; in config_term_common()
1133 if ((unsigned int)term->val.num > 1) { in config_term_common()
1134 parse_events__handle_error(err, term->err_val, in config_term_common()
1137 return -EINVAL; in config_term_common()
1145 if (term->val.num > UINT_MAX) { in config_term_common()
1146 parse_events__handle_error(err, term->err_val, in config_term_common()
1149 return -EINVAL; in config_term_common()
1153 parse_events__handle_error(err, term->err_term, in config_term_common()
1154 strdup("unknown term"), in config_term_common()
1156 return -EINVAL; in config_term_common()
1160 * Check term availbility after basic checking so in config_term_common()
1164 * user will see "'<sysfs term>' is not usable in 'perf stat'" in config_term_common()
1165 * if an invalid config term is provided for legacy events in config_term_common()
1168 if (!config_term_avail(term->type_term, err)) in config_term_common()
1169 return -EINVAL; in config_term_common()
1175 struct parse_events_term *term, in config_term_pmu() argument
1178 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER || in config_term_pmu()
1179 term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG) in config_term_pmu()
1186 return config_term_common(attr, term, err); in config_term_pmu()
1190 struct parse_events_term *term, in config_term_tracepoint() argument
1193 switch (term->type_term) { in config_term_tracepoint()
1204 return config_term_common(attr, term, err); in config_term_tracepoint()
1207 parse_events__handle_error(err, term->err_term, in config_term_tracepoint()
1208 strdup("unknown term"), in config_term_tracepoint()
1209 strdup("valid terms: call-graph,stack-size\n")); in config_term_tracepoint()
1211 return -EINVAL; in config_term_tracepoint()
1222 struct parse_events_term *term; in config_attr() local
1224 list_for_each_entry(term, head, list) in config_attr()
1225 if (config_term(attr, term, err)) in config_attr()
1226 return -EINVAL; in config_attr()
1239 return -ENOMEM; \ in get_config_terms()
1241 INIT_LIST_HEAD(&__t->list); \ in get_config_terms()
1242 __t->type = EVSEL__CONFIG_TERM_ ## __type; \ in get_config_terms()
1243 __t->weak = __weak; \ in get_config_terms()
1244 list_add_tail(&__t->list, head_terms) in get_config_terms()
1249 __t->val.__name = __val; \ in get_config_terms()
1255 __t->val.str = strdup(__val); \ in get_config_terms()
1256 if (!__t->val.str) { \ in get_config_terms()
1258 return -ENOMEM; \ in get_config_terms()
1260 __t->free_str = true; \ in get_config_terms()
1263 struct parse_events_term *term; in get_config_terms() local
1265 list_for_each_entry(term, head_config, list) { in get_config_terms()
1266 switch (term->type_term) { in get_config_terms()
1268 ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num, term->weak); in get_config_terms()
1271 ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num, term->weak); in get_config_terms()
1274 ADD_CONFIG_TERM_VAL(TIME, time, term->val.num, term->weak); in get_config_terms()
1277 ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str, term->weak); in get_config_terms()
1280 ADD_CONFIG_TERM_STR(BRANCH, term->val.str, term->weak); in get_config_terms()
1284 term->val.num, term->weak); in get_config_terms()
1288 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1292 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1296 term->val.num, term->weak); in get_config_terms()
1300 term->val.num, term->weak); in get_config_terms()
1304 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1308 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1311 ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str, term->weak); in get_config_terms()
1315 term->val.num ? true : false, term->weak); in get_config_terms()
1319 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1323 term->val.num, term->weak); in get_config_terms()
1334 * each bit of attr->config that the user has changed.
1339 struct parse_events_term *term; in get_config_chgs() local
1343 list_for_each_entry(term, head_config, list) { in get_config_chgs()
1344 switch (term->type_term) { in get_config_chgs()
1346 type = perf_pmu__format_type(&pmu->format, term->config); in get_config_chgs()
1349 bits |= perf_pmu__format_bits(&pmu->format, term->config); in get_config_chgs()
1376 return -EINVAL; in parse_events_add_tracepoint()
1400 if (config_attr(&attr, head_config, parse_state->error, in parse_events_add_numeric()
1402 return -EINVAL; in parse_events_add_numeric()
1405 return -ENOMEM; in parse_events_add_numeric()
1408 return add_event(list, &parse_state->idx, &attr, in parse_events_add_numeric()
1416 return add_event_tool(list, &parse_state->idx, tool_event); in parse_events_add_tool()
1421 struct evsel_config_term *term; in config_term_percore() local
1423 list_for_each_entry(term, config_terms, list) { in config_term_percore()
1424 if (term->type == EVSEL__CONFIG_TERM_PERCORE) in config_term_percore()
1425 return term->val.percore; in config_term_percore()
1441 struct parse_events_error *err = parse_state->error; in parse_events_add_pmu()
1449 struct parse_events_term *term; in parse_events_add_pmu() local
1451 list_for_each_entry(term, head_config, list) { in parse_events_add_pmu()
1452 fprintf(stderr, "%s,", term->config); in parse_events_add_pmu()
1455 fprintf(stderr, "' that may result in non-fatal errors\n"); in parse_events_add_pmu()
1458 pmu = parse_state->fake_pmu ?: perf_pmu__find(name); in parse_events_add_pmu()
1466 return -EINVAL; in parse_events_add_pmu()
1469 if (pmu->default_config) { in parse_events_add_pmu()
1470 memcpy(&attr, pmu->default_config, in parse_events_add_pmu()
1476 use_uncore_alias = (pmu->is_uncore && use_alias); in parse_events_add_pmu()
1479 attr.type = pmu->type; in parse_events_add_pmu()
1480 evsel = __add_event(list, &parse_state->idx, &attr, true, NULL, in parse_events_add_pmu()
1483 evsel->pmu_name = name ? strdup(name) : NULL; in parse_events_add_pmu()
1484 evsel->use_uncore_alias = use_uncore_alias; in parse_events_add_pmu()
1487 return -ENOMEM; in parse_events_add_pmu()
1491 if (!parse_state->fake_pmu && perf_pmu__check_alias(pmu, head_config, &info)) in parse_events_add_pmu()
1492 return -EINVAL; in parse_events_add_pmu()
1498 struct parse_events_term *term; in parse_events_add_pmu() local
1500 list_for_each_entry(term, head_config, list) { in parse_events_add_pmu()
1501 fprintf(stderr, "%s,", term->config); in parse_events_add_pmu()
1504 fprintf(stderr, "' that may result in non-fatal errors\n"); in parse_events_add_pmu()
1511 if (config_attr(&attr, head_config, parse_state->error, config_term_pmu)) in parse_events_add_pmu()
1512 return -EINVAL; in parse_events_add_pmu()
1515 return -ENOMEM; in parse_events_add_pmu()
1518 * When using default config, record which bits of attr->config were in parse_events_add_pmu()
1521 if (pmu->default_config && get_config_chgs(pmu, head_config, &config_terms)) in parse_events_add_pmu()
1522 return -ENOMEM; in parse_events_add_pmu()
1524 if (!parse_state->fake_pmu && perf_pmu__config(pmu, &attr, head_config, parse_state->error)) { in parse_events_add_pmu()
1528 list_del_init(&pos->list); in parse_events_add_pmu()
1529 if (pos->free_str) in parse_events_add_pmu()
1530 zfree(&pos->val.str); in parse_events_add_pmu()
1533 return -EINVAL; in parse_events_add_pmu()
1536 evsel = __add_event(list, &parse_state->idx, &attr, true, in parse_events_add_pmu()
1540 return -ENOMEM; in parse_events_add_pmu()
1542 evsel->pmu_name = name ? strdup(name) : NULL; in parse_events_add_pmu()
1543 evsel->use_uncore_alias = use_uncore_alias; in parse_events_add_pmu()
1544 evsel->percore = config_term_percore(&evsel->config_terms); in parse_events_add_pmu()
1546 if (parse_state->fake_pmu) in parse_events_add_pmu()
1549 evsel->unit = info.unit; in parse_events_add_pmu()
1550 evsel->scale = info.scale; in parse_events_add_pmu()
1551 evsel->per_pkg = info.per_pkg; in parse_events_add_pmu()
1552 evsel->snapshot = info.snapshot; in parse_events_add_pmu()
1553 evsel->metric_expr = info.metric_expr; in parse_events_add_pmu()
1554 evsel->metric_name = info.metric_name; in parse_events_add_pmu()
1561 struct parse_events_term *term; in parse_events_multi_pmu_add() local
1570 return -1; in parse_events_multi_pmu_add()
1575 list_for_each_entry(alias, &pmu->aliases, list) { in parse_events_multi_pmu_add()
1576 if (!strcasecmp(alias->name, str)) { in parse_events_multi_pmu_add()
1582 return -1; in parse_events_multi_pmu_add()
1586 return -1; in parse_events_multi_pmu_add()
1587 if (parse_events_term__num(&term, in parse_events_multi_pmu_add()
1593 return -1; in parse_events_multi_pmu_add()
1595 list_add_tail(&term->list, head); in parse_events_multi_pmu_add()
1598 pmu->name, head, in parse_events_multi_pmu_add()
1600 pr_debug("%s -> %s/%s/\n", str, in parse_events_multi_pmu_add()
1601 pmu->name, alias->str); in parse_events_multi_pmu_add()
1611 return -1; in parse_events_multi_pmu_add()
1637 if ((end_a - pmu_name_a) != (end_b - pmu_name_b)) in is_same_uncore_block()
1640 return (strncmp(pmu_name_a, pmu_name_b, end_a - pmu_name_a) == 0); in is_same_uncore_block()
1654 total_members = evsel->idx - leader->idx + 1; in parse_events__set_leader_for_uncore_aliase()
1668 if (!evsel->use_uncore_alias) in parse_events__set_leader_for_uncore_aliase()
1672 if (!is_same_uncore_block(leader->pmu_name, evsel->pmu_name)) in parse_events__set_leader_for_uncore_aliase()
1683 !strcmp(leader->pmu_name, evsel->pmu_name)) { in parse_events__set_leader_for_uncore_aliase()
1694 parse_state->nr_groups--; in parse_events__set_leader_for_uncore_aliase()
1714 evsel->leader = (struct evsel *) leaders[i++]; in parse_events__set_leader_for_uncore_aliase()
1720 evsel->core.nr_members = total_members / nr_pmu; in parse_events__set_leader_for_uncore_aliase()
1721 evsel->group_name = name ? strdup(name) : NULL; in parse_events__set_leader_for_uncore_aliase()
1725 parse_state->nr_groups += nr_pmu - 1; in parse_events__set_leader_for_uncore_aliase()
1748 leader = list_entry(list->next, struct evsel, core.node); in parse_events__set_leader()
1749 leader->group_name = name ? strdup(name) : NULL; in parse_events__set_leader()
1784 int eu = evsel ? evsel->core.attr.exclude_user : 0; in get_event_modifier()
1785 int ek = evsel ? evsel->core.attr.exclude_kernel : 0; in get_event_modifier()
1786 int eh = evsel ? evsel->core.attr.exclude_hv : 0; in get_event_modifier()
1787 int eH = evsel ? evsel->core.attr.exclude_host : 0; in get_event_modifier()
1788 int eG = evsel ? evsel->core.attr.exclude_guest : 0; in get_event_modifier()
1789 int eI = evsel ? evsel->core.attr.exclude_idle : 0; in get_event_modifier()
1790 int precise = evsel ? evsel->core.attr.precise_ip : 0; in get_event_modifier()
1793 int pinned = evsel ? evsel->core.attr.pinned : 0; in get_event_modifier()
1794 int exclusive = evsel ? evsel->core.attr.exclusive : 0; in get_event_modifier()
1797 int exclude_GH = evsel ? evsel->exclude_GH : 0; in get_event_modifier()
1851 * 0 - SAMPLE_IP can have arbitrary skid in get_event_modifier()
1852 * 1 - SAMPLE_IP must have constant skid in get_event_modifier()
1853 * 2 - SAMPLE_IP requested to have 0 skid in get_event_modifier()
1854 * 3 - SAMPLE_IP must have 0 skid in get_event_modifier()
1859 return -EINVAL; in get_event_modifier()
1861 mod->eu = eu; in get_event_modifier()
1862 mod->ek = ek; in get_event_modifier()
1863 mod->eh = eh; in get_event_modifier()
1864 mod->eH = eH; in get_event_modifier()
1865 mod->eG = eG; in get_event_modifier()
1866 mod->eI = eI; in get_event_modifier()
1867 mod->precise = precise; in get_event_modifier()
1868 mod->precise_max = precise_max; in get_event_modifier()
1869 mod->exclude_GH = exclude_GH; in get_event_modifier()
1870 mod->sample_read = sample_read; in get_event_modifier()
1871 mod->pinned = pinned; in get_event_modifier()
1872 mod->weak = weak; in get_event_modifier()
1873 mod->exclusive = exclusive; in get_event_modifier()
1887 if (strlen(str) > (sizeof("ukhGHpppPSDIWe") - 1)) in check_modifier()
1888 return -1; in check_modifier()
1892 return -1; in check_modifier()
1908 return -EINVAL; in parse_events__modifier_event()
1911 return -EINVAL; in parse_events__modifier_event()
1915 return -EINVAL; in parse_events__modifier_event()
1917 evsel->core.attr.exclude_user = mod.eu; in parse_events__modifier_event()
1918 evsel->core.attr.exclude_kernel = mod.ek; in parse_events__modifier_event()
1919 evsel->core.attr.exclude_hv = mod.eh; in parse_events__modifier_event()
1920 evsel->core.attr.precise_ip = mod.precise; in parse_events__modifier_event()
1921 evsel->core.attr.exclude_host = mod.eH; in parse_events__modifier_event()
1922 evsel->core.attr.exclude_guest = mod.eG; in parse_events__modifier_event()
1923 evsel->core.attr.exclude_idle = mod.eI; in parse_events__modifier_event()
1924 evsel->exclude_GH = mod.exclude_GH; in parse_events__modifier_event()
1925 evsel->sample_read = mod.sample_read; in parse_events__modifier_event()
1926 evsel->precise_max = mod.precise_max; in parse_events__modifier_event()
1927 evsel->weak_group = mod.weak; in parse_events__modifier_event()
1930 evsel->core.attr.pinned = mod.pinned; in parse_events__modifier_event()
1931 evsel->core.attr.exclusive = mod.exclusive; in parse_events__modifier_event()
1943 if (!evsel->name) in parse_events_name()
1944 evsel->name = strdup(name); in parse_events_name()
1956 return strcasecmp(pmu1->symbol, pmu2->symbol); in comp_pmu()
1967 zfree(&p->symbol); in perf_pmu__parse_cleanup()
1976 p->symbol = str; \
1977 if (!p->symbol) \
1979 p->type = stype; \
1995 list_for_each_entry(alias, &pmu->aliases, list) { in perf_pmu__parse_init()
1996 if (strchr(alias->name, '-')) in perf_pmu__parse_init()
2003 perf_pmu_events_list_num = -1; in perf_pmu__parse_init()
2014 list_for_each_entry(alias, &pmu->aliases, list) { in perf_pmu__parse_init()
2016 char *tmp = strchr(alias->name, '-'); in perf_pmu__parse_init()
2019 SET_SYMBOL(strndup(alias->name, tmp - alias->name), in perf_pmu__parse_init()
2025 SET_SYMBOL(strdup(alias->name), PMU_EVENT_SYMBOL); in perf_pmu__parse_init()
2039 * This function injects special term in
2049 return -ENOMEM; in perf_pmu__test_parse_init()
2051 list->type = PMU_EVENT_SYMBOL; in perf_pmu__test_parse_init()
2052 list->symbol = strdup("read"); in perf_pmu__test_parse_init()
2054 if (!list->symbol) { in perf_pmu__test_parse_init()
2056 return -ENOMEM; in perf_pmu__test_parse_init()
2073 * name "cpu" could be prefix of cpu-cycles or cpu// events. in perf_pmu__parse_check()
2074 * cpu-cycles has been handled by hardcode. in perf_pmu__parse_check()
2085 return r ? r->type : PMU_EVENT_SYMBOL_ERR; in perf_pmu__parse_check()
2142 .idx = evlist->core.nr_entries, in __parse_events()
2155 return -1; in __parse_events()
2166 evlist->nr_groups += parse_state.nr_groups; in __parse_events()
2168 last->cmdline_group_boundary = true; in __parse_events()
2174 * There are 2 users - builtin-record and builtin-test objects. in __parse_events()
2198 /* -2 for extra '' in the final fprintf */ in __parse_events_print_error()
2199 int width = get_term_width() - 2; in __parse_events_print_error()
2215 max_len = width - len_str; in __parse_events_print_error()
2221 cut = err_idx - max_err_idx; in __parse_events_print_error()
2229 if ((len_event - cut) > max_len) { in __parse_events_print_error()
2230 buf[max_len - 1] = buf[max_len - 2] = '.'; in __parse_events_print_error()
2234 idx = len_str + err_idx - cut; in __parse_events_print_error()
2248 if (!err->num_errors) in parse_events_print_error()
2251 __parse_events_print_error(err->idx, err->str, err->help, event); in parse_events_print_error()
2252 zfree(&err->str); in parse_events_print_error()
2253 zfree(&err->help); in parse_events_print_error()
2255 if (err->num_errors > 1) { in parse_events_print_error()
2257 __parse_events_print_error(err->first_idx, err->first_str, in parse_events_print_error()
2258 err->first_help, event); in parse_events_print_error()
2259 zfree(&err->first_str); in parse_events_print_error()
2260 zfree(&err->first_help); in parse_events_print_error()
2269 struct evlist *evlist = *(struct evlist **)opt->value; in parse_events_option()
2286 struct evlist **evlistp = opt->value; in parse_events_option_new_evlist()
2294 return -1; in parse_events_option_new_evlist()
2322 if (evlist->core.nr_entries > 0) in foreach_evsel_in_last_glob()
2328 return -1; in foreach_evsel_in_last_glob()
2332 if (last->core.node.prev == &evlist->core.entries) in foreach_evsel_in_last_glob()
2334 last = list_entry(last->core.node.prev, struct evsel, core.node); in foreach_evsel_in_last_glob()
2335 } while (!last->cmdline_group_boundary); in foreach_evsel_in_last_glob()
2349 "--filter option should follow a -e tracepoint or HW tracer option\n"); in set_filter()
2350 return -1; in set_filter()
2353 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) { in set_filter()
2357 return -1; in set_filter()
2364 if (pmu->type == evsel->core.attr.type) { in set_filter()
2376 return -1; in set_filter()
2382 return -1; in set_filter()
2391 struct evlist *evlist = *(struct evlist **)opt->value; in parse_filter()
2402 if (evsel == NULL || evsel->core.attr.type != PERF_TYPE_TRACEPOINT) { in add_exclude_perf_filter()
2404 "--exclude-perf option should follow a -e tracepoint option\n"); in add_exclude_perf_filter()
2405 return -1; in add_exclude_perf_filter()
2413 return -1; in add_exclude_perf_filter()
2423 struct evlist *evlist = *(struct evlist **)opt->value; in exclude_perf()
2474 !strglobmatch(sys_dirent->d_name, subsys_glob)) in print_tracepoint_events()
2477 dir_path = get_events_file(sys_dirent->d_name); in print_tracepoint_events()
2486 !strglobmatch(evt_dirent->d_name, event_glob)) in print_tracepoint_events()
2495 sys_dirent->d_name, evt_dirent->d_name); in print_tracepoint_events()
2521 printf(" %-50s [%s]\n", evt_list[evt_i++], in print_tracepoint_events()
2561 dir_path = get_events_file(sys_dirent->d_name); in is_valid_tracepoint()
2570 sys_dirent->d_name, evt_dirent->d_name); in is_valid_tracepoint()
2605 if (open_return == -EACCES) { in is_event_supported()
2609 * Re-run with exclude_kernel set; we don't do that in is_event_supported()
2613 evsel->core.attr.exclude_kernel = 1; in is_event_supported()
2646 pcache = probe_cache__new(nd->s, NULL); in print_sdt_events()
2649 list_for_each_entry(ent, &pcache->entries, node) { in print_sdt_events()
2650 if (!ent->sdt) in print_sdt_events()
2653 !strglobmatch(ent->pev.group, subsys_glob)) in print_sdt_events()
2656 !strglobmatch(ent->pev.event, event_glob)) in print_sdt_events()
2658 ret = asprintf(&buf, "%s:%s@%s", ent->pev.group, in print_sdt_events()
2659 ent->pev.event, nd->s); in print_sdt_events()
2668 buf = strchr(nd->s, '@'); in print_sdt_events()
2672 printf("%s ", nd->s); in print_sdt_events()
2677 ptr = strchr(nd2->s, '@'); in print_sdt_events()
2680 if (strcmp(nd->s, nd2->s) == 0) in print_sdt_events()
2685 ret = asprintf(&buf, "%s@%s(%.12s)", nd->s, path, buf); in print_sdt_events()
2687 printf(" %-50s [%s]\n", buf, "SDT event"); in print_sdt_events()
2692 printf(" %-50s [%s]\n", nd->s, "SDT event"); in print_sdt_events()
2694 if (strcmp(nd->s, nd2->s) != 0) in print_sdt_events()
2756 printf(" %-50s [%s]\n", evt_list[evt_i++], in print_hwcache_events()
2784 printf(" %-50s [%s]\n", name, "Tool event"); in print_tool_event()
2809 syms -= max; in print_symbol_events()
2817 if (syms->symbol == NULL) in print_symbol_events()
2820 if (event_glob != NULL && !(strglobmatch(syms->symbol, event_glob) || in print_symbol_events()
2821 (syms->alias && strglobmatch(syms->alias, event_glob)))) in print_symbol_events()
2832 if (!name_only && strlen(syms->alias)) in print_symbol_events()
2833 snprintf(name, MAX_NAME_LEN, "%s OR %s", syms->symbol, syms->alias); in print_symbol_events()
2835 strlcpy(name, syms->symbol, MAX_NAME_LEN); in print_symbol_events()
2854 printf(" %-50s [%s]\n", evt_list[evt_i++], event_type_descriptors[type]); in print_symbol_events()
2894 printf(" %-50s [%s]\n", in print_events()
2897 printf(" %-50s [%s]\n", in print_events()
2901 printf(" (see 'man perf-list' on how to encode it)\n\n"); in print_events()
2903 printf(" %-50s [%s]\n", in print_events()
2919 int parse_events__is_hardcoded_term(struct parse_events_term *term) in parse_events__is_hardcoded_term() argument
2921 return term->type_term != PARSE_EVENTS__TERM_TYPE_USER; in parse_events__is_hardcoded_term()
2928 struct parse_events_term *term; in new_term() local
2930 term = malloc(sizeof(*term)); in new_term()
2931 if (!term) in new_term()
2932 return -ENOMEM; in new_term()
2934 *term = *temp; in new_term()
2935 INIT_LIST_HEAD(&term->list); in new_term()
2936 term->weak = false; in new_term()
2938 switch (term->type_val) { in new_term()
2940 term->val.num = num; in new_term()
2943 term->val.str = str; in new_term()
2946 free(term); in new_term()
2947 return -EINVAL; in new_term()
2950 *_term = term; in new_term()
2954 int parse_events_term__num(struct parse_events_term **term, in parse_events_term__num() argument
2967 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__num()
2968 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__num()
2971 return new_term(term, &temp, NULL, num); in parse_events_term__num()
2974 int parse_events_term__str(struct parse_events_term **term, in parse_events_term__str() argument
2985 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__str()
2986 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__str()
2989 return new_term(term, &temp, str, 0); in parse_events_term__str()
2992 int parse_events_term__sym_hw(struct parse_events_term **term, in parse_events_term__sym_hw() argument
3006 return -ENOMEM; in parse_events_term__sym_hw()
3011 str = strdup(sym->symbol); in parse_events_term__sym_hw()
3013 return -ENOMEM; in parse_events_term__sym_hw()
3014 return new_term(term, &temp, str, 0); in parse_events_term__sym_hw()
3018 struct parse_events_term *term) in parse_events_term__clone() argument
3022 .type_val = term->type_val, in parse_events_term__clone()
3023 .type_term = term->type_term, in parse_events_term__clone()
3025 .err_term = term->err_term, in parse_events_term__clone()
3026 .err_val = term->err_val, in parse_events_term__clone()
3029 if (term->config) { in parse_events_term__clone()
3030 temp.config = strdup(term->config); in parse_events_term__clone()
3032 return -ENOMEM; in parse_events_term__clone()
3034 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__clone()
3035 return new_term(new, &temp, NULL, term->val.num); in parse_events_term__clone()
3037 str = strdup(term->val.str); in parse_events_term__clone()
3039 return -ENOMEM; in parse_events_term__clone()
3043 void parse_events_term__delete(struct parse_events_term *term) in parse_events_term__delete() argument
3045 if (term->array.nr_ranges) in parse_events_term__delete()
3046 zfree(&term->array.ranges); in parse_events_term__delete()
3048 if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__delete()
3049 zfree(&term->val.str); in parse_events_term__delete()
3051 zfree(&term->config); in parse_events_term__delete()
3052 free(term); in parse_events_term__delete()
3058 struct parse_events_term *term, *n; in parse_events_copy_term_list() local
3068 return -ENOMEM; in parse_events_copy_term_list()
3071 list_for_each_entry (term, old, list) { in parse_events_copy_term_list()
3072 ret = parse_events_term__clone(&n, term); in parse_events_copy_term_list()
3075 list_add_tail(&n->list, *new); in parse_events_copy_term_list()
3082 struct parse_events_term *term, *h; in parse_events_terms__purge() local
3084 list_for_each_entry_safe(term, h, terms, list) { in parse_events_terms__purge()
3085 list_del_init(&term->list); in parse_events_terms__purge()
3086 parse_events_term__delete(term); in parse_events_terms__purge()
3100 zfree(&a->ranges); in parse_events__clear_array()
3106 if (!parse_state->error) in parse_events_evlist_error()
3109 parse_events__handle_error(parse_state->error, idx, strdup(str), NULL); in parse_events_evlist_error()
3146 /* "no-overwrite" is the longest name */ in parse_events_formats_error_string()
3148 (sizeof("no-overwrite") - 1)]; in parse_events_formats_error_string()