18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Builtin evlist command: Show the list of event selectors present 48c2ecf20Sopenharmony_ci * in a perf.data file. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci#include "builtin.h" 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/list.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include "perf.h" 118c2ecf20Sopenharmony_ci#include "util/evlist.h" 128c2ecf20Sopenharmony_ci#include "util/evsel.h" 138c2ecf20Sopenharmony_ci#include "util/evsel_fprintf.h" 148c2ecf20Sopenharmony_ci#include "util/parse-events.h" 158c2ecf20Sopenharmony_ci#include <subcmd/parse-options.h> 168c2ecf20Sopenharmony_ci#include "util/session.h" 178c2ecf20Sopenharmony_ci#include "util/data.h" 188c2ecf20Sopenharmony_ci#include "util/debug.h" 198c2ecf20Sopenharmony_ci#include <linux/err.h> 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cistatic int __cmd_evlist(const char *file_name, struct perf_attr_details *details) 228c2ecf20Sopenharmony_ci{ 238c2ecf20Sopenharmony_ci struct perf_session *session; 248c2ecf20Sopenharmony_ci struct evsel *pos; 258c2ecf20Sopenharmony_ci struct perf_data data = { 268c2ecf20Sopenharmony_ci .path = file_name, 278c2ecf20Sopenharmony_ci .mode = PERF_DATA_MODE_READ, 288c2ecf20Sopenharmony_ci .force = details->force, 298c2ecf20Sopenharmony_ci }; 308c2ecf20Sopenharmony_ci bool has_tracepoint = false; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci session = perf_session__new(&data, 0, NULL); 338c2ecf20Sopenharmony_ci if (IS_ERR(session)) 348c2ecf20Sopenharmony_ci return PTR_ERR(session); 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci evlist__for_each_entry(session->evlist, pos) { 378c2ecf20Sopenharmony_ci evsel__fprintf(pos, details, stdout); 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci if (pos->core.attr.type == PERF_TYPE_TRACEPOINT) 408c2ecf20Sopenharmony_ci has_tracepoint = true; 418c2ecf20Sopenharmony_ci } 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci if (has_tracepoint && !details->trace_fields) 448c2ecf20Sopenharmony_ci printf("# Tip: use 'perf evlist --trace-fields' to show fields for tracepoint events\n"); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci perf_session__delete(session); 478c2ecf20Sopenharmony_ci return 0; 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ciint cmd_evlist(int argc, const char **argv) 518c2ecf20Sopenharmony_ci{ 528c2ecf20Sopenharmony_ci struct perf_attr_details details = { .verbose = false, }; 538c2ecf20Sopenharmony_ci const struct option options[] = { 548c2ecf20Sopenharmony_ci OPT_STRING('i', "input", &input_name, "file", "Input file name"), 558c2ecf20Sopenharmony_ci OPT_BOOLEAN('F', "freq", &details.freq, "Show the sample frequency"), 568c2ecf20Sopenharmony_ci OPT_BOOLEAN('v', "verbose", &details.verbose, 578c2ecf20Sopenharmony_ci "Show all event attr details"), 588c2ecf20Sopenharmony_ci OPT_BOOLEAN('g', "group", &details.event_group, 598c2ecf20Sopenharmony_ci "Show event group information"), 608c2ecf20Sopenharmony_ci OPT_BOOLEAN('f', "force", &details.force, "don't complain, do it"), 618c2ecf20Sopenharmony_ci OPT_BOOLEAN(0, "trace-fields", &details.trace_fields, "Show tracepoint fields"), 628c2ecf20Sopenharmony_ci OPT_END() 638c2ecf20Sopenharmony_ci }; 648c2ecf20Sopenharmony_ci const char * const evlist_usage[] = { 658c2ecf20Sopenharmony_ci "perf evlist [<options>]", 668c2ecf20Sopenharmony_ci NULL 678c2ecf20Sopenharmony_ci }; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci argc = parse_options(argc, argv, options, evlist_usage, 0); 708c2ecf20Sopenharmony_ci if (argc) 718c2ecf20Sopenharmony_ci usage_with_options(evlist_usage, options); 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci if (details.event_group && (details.verbose || details.freq)) { 748c2ecf20Sopenharmony_ci usage_with_options_msg(evlist_usage, options, 758c2ecf20Sopenharmony_ci "--group option is not compatible with other options\n"); 768c2ecf20Sopenharmony_ci } 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci return __cmd_evlist(input_name, &details); 798c2ecf20Sopenharmony_ci} 80