/* * Builtin evlist command: Show the list of event selectors present * in a perf.data file. */ #include "builtin.h" #include "util/util.h" #include #include "perf.h" #include "util/evlist.h" #include "util/evsel.h" #include "util/parse-events.h" #include "util/parse-options.h" #include "util/session.h" struct perf_attr_details { bool freq; bool verbose; }; static int comma_printf(bool *first, const char *fmt, ...) { va_list args; int ret = 0; if (!*first) { ret += printf(","); } else { ret += printf(":"); *first = false; } va_start(args, fmt); ret += vprintf(fmt, args); va_end(args); return ret; } static int __if_print(bool *first, const char *field, u64 value) { if (value == 0) return 0; return comma_printf(first, " %s: %" PRIu64, field, value); } #define if_print(field) __if_print(&first, #field, pos->attr.field) static int __cmd_evlist(const char *file_name, struct perf_attr_details *details) { struct perf_session *session; struct perf_evsel *pos; session = perf_session__new(file_name, O_RDONLY, 0, false, NULL); if (session == NULL) return -ENOMEM; list_for_each_entry(pos, &session->evlist->entries, node) { bool first = true; printf("%s", perf_evsel__name(pos)); if (details->verbose || details->freq) { comma_printf(&first, " sample_freq=%" PRIu64, (u64)pos->attr.sample_freq); } if (details->verbose) { if_print(type); if_print(config); if_print(config1); if_print(config2); if_print(size); if_print(sample_type); if_print(read_format); if_print(disabled); if_print(inherit); if_print(pinned); if_print(exclusive); if_print(exclude_user); if_print(exclude_kernel); if_print(exclude_hv); if_print(exclude_idle); if_print(mmap); if_print(comm); if_print(freq); if_print(inherit_stat); if_print(enable_on_exec); if_print(task); if_print(watermark); if_print(precise_ip); if_print(mmap_data); if_print(sample_id_all); if_print(exclude_host); if_print(exclude_guest); if_print(__reserved_1); if_print(wakeup_events); if_print(bp_type); if_print(branch_sample_type); } putchar('\n'); } perf_session__delete(session); return 0; } int cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused) { struct perf_attr_details details = { .verbose = false, }; const struct option options[] = { OPT_STRING('i', "input", &input_name, "file", "Input file name"), OPT_BOOLEAN('F', "freq", &details.freq, "Show the sample frequency"), OPT_BOOLEAN('v', "verbose", &details.verbose, "Show all event attr details"), OPT_END() }; const char * const evlist_usage[] = { "perf evlist []", NULL }; argc = parse_options(argc, argv, options, evlist_usage, 0); if (argc) usage_with_options(evlist_usage, options); return __cmd_evlist(input_name, &details); }