1 /* 2 * Builtin evlist command: Show the list of event selectors present 3 * in a perf.data file. 4 */ 5 #include "builtin.h" 6 7 #include "util/util.h" 8 9 #include <linux/list.h> 10 11 #include "perf.h" 12 #include "util/evlist.h" 13 #include "util/evsel.h" 14 #include "util/parse-events.h" 15 #include "util/parse-options.h" 16 #include "util/session.h" 17 18 struct perf_attr_details { 19 bool freq; 20 bool verbose; 21 }; 22 23 static int comma_printf(bool *first, const char *fmt, ...) 24 { 25 va_list args; 26 int ret = 0; 27 28 if (!*first) { 29 ret += printf(","); 30 } else { 31 ret += printf(":"); 32 *first = false; 33 } 34 35 va_start(args, fmt); 36 ret += vprintf(fmt, args); 37 va_end(args); 38 return ret; 39 } 40 41 static int __if_print(bool *first, const char *field, u64 value) 42 { 43 if (value == 0) 44 return 0; 45 46 return comma_printf(first, " %s: %" PRIu64, field, value); 47 } 48 49 #define if_print(field) __if_print(&first, #field, pos->attr.field) 50 51 static int __cmd_evlist(const char *file_name, struct perf_attr_details *details) 52 { 53 struct perf_session *session; 54 struct perf_evsel *pos; 55 56 session = perf_session__new(file_name, O_RDONLY, 0, false, NULL); 57 if (session == NULL) 58 return -ENOMEM; 59 60 list_for_each_entry(pos, &session->evlist->entries, node) { 61 bool first = true; 62 63 printf("%s", perf_evsel__name(pos)); 64 65 if (details->verbose || details->freq) { 66 comma_printf(&first, " sample_freq=%" PRIu64, 67 (u64)pos->attr.sample_freq); 68 } 69 70 if (details->verbose) { 71 if_print(type); 72 if_print(config); 73 if_print(config1); 74 if_print(config2); 75 if_print(size); 76 if_print(sample_type); 77 if_print(read_format); 78 if_print(disabled); 79 if_print(inherit); 80 if_print(pinned); 81 if_print(exclusive); 82 if_print(exclude_user); 83 if_print(exclude_kernel); 84 if_print(exclude_hv); 85 if_print(exclude_idle); 86 if_print(mmap); 87 if_print(comm); 88 if_print(freq); 89 if_print(inherit_stat); 90 if_print(enable_on_exec); 91 if_print(task); 92 if_print(watermark); 93 if_print(precise_ip); 94 if_print(mmap_data); 95 if_print(sample_id_all); 96 if_print(exclude_host); 97 if_print(exclude_guest); 98 if_print(__reserved_1); 99 if_print(wakeup_events); 100 if_print(bp_type); 101 if_print(branch_sample_type); 102 } 103 104 putchar('\n'); 105 } 106 107 perf_session__delete(session); 108 return 0; 109 } 110 111 int cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused) 112 { 113 struct perf_attr_details details = { .verbose = false, }; 114 const struct option options[] = { 115 OPT_STRING('i', "input", &input_name, "file", "Input file name"), 116 OPT_BOOLEAN('F', "freq", &details.freq, "Show the sample frequency"), 117 OPT_BOOLEAN('v', "verbose", &details.verbose, 118 "Show all event attr details"), 119 OPT_END() 120 }; 121 const char * const evlist_usage[] = { 122 "perf evlist [<options>]", 123 NULL 124 }; 125 126 argc = parse_options(argc, argv, options, evlist_usage, 0); 127 if (argc) 128 usage_with_options(evlist_usage, options); 129 130 return __cmd_evlist(input_name, &details); 131 } 132