1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Builtin evlist command: Show the list of event selectors present 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * in a perf.data file. 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "builtin.h" 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/util.h" 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/list.h> 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "perf.h" 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/evlist.h" 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/evsel.h" 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/parse-events.h" 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/parse-options.h" 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/session.h" 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int __cmd_evlist(const char *file_name, struct perf_attr_details *details) 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_session *session; 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_evsel *pos; 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng session = perf_session__new(file_name, O_RDONLY, 0, false, NULL); 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (session == NULL) 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -ENOMEM; 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng list_for_each_entry(pos, &session->evlist->entries, node) 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evsel__fprintf(pos, details, stdout); 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_session__delete(session); 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused) 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_attr_details details = { .verbose = false, }; 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const struct option options[] = { 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_STRING('i', "input", &input_name, "file", "Input file name"), 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_BOOLEAN('F', "freq", &details.freq, "Show the sample frequency"), 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_BOOLEAN('v', "verbose", &details.verbose, 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng "Show all event attr details"), 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_BOOLEAN('g', "group", &details.event_group, 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng "Show event group information"), 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_END() 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }; 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char * const evlist_usage[] = { 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng "perf evlist [<options>]", 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng NULL 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }; 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng argc = parse_options(argc, argv, options, evlist_usage, 0); 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (argc) 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng usage_with_options(evlist_usage, options); 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (details.event_group && (details.verbose || details.freq)) { 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_err("--group option is not compatible with other options\n"); 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng usage_with_options(evlist_usage, options); 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return __cmd_evlist(input_name, &details); 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 62