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