linux/tools/perf/util/parse-events.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __PERF_PARSE_EVENTS_H
   3#define __PERF_PARSE_EVENTS_H
   4/*
   5 * Parse symbolic events/counts passed in as options:
   6 */
   7
   8#include <linux/list.h>
   9#include <stdbool.h>
  10#include <linux/types.h>
  11#include <linux/perf_event.h>
  12#include <string.h>
  13
  14struct list_head;
  15struct evsel;
  16struct evlist;
  17struct parse_events_error;
  18
  19struct option;
  20struct perf_pmu;
  21
  22struct tracepoint_path {
  23        char *system;
  24        char *name;
  25        struct tracepoint_path *next;
  26};
  27
  28struct tracepoint_path *tracepoint_id_to_path(u64 config);
  29struct tracepoint_path *tracepoint_name_to_path(const char *name);
  30bool have_tracepoints(struct list_head *evlist);
  31
  32const char *event_type(int type);
  33
  34int parse_events_option(const struct option *opt, const char *str, int unset);
  35int parse_events_option_new_evlist(const struct option *opt, const char *str, int unset);
  36int __parse_events(struct evlist *evlist, const char *str, struct parse_events_error *error,
  37                   struct perf_pmu *fake_pmu);
  38
  39static inline int parse_events(struct evlist *evlist, const char *str,
  40                               struct parse_events_error *err)
  41{
  42        return __parse_events(evlist, str, err, NULL);
  43}
  44
  45int parse_events_terms(struct list_head *terms, const char *str);
  46int parse_filter(const struct option *opt, const char *str, int unset);
  47int exclude_perf(const struct option *opt, const char *arg, int unset);
  48
  49#define EVENTS_HELP_MAX (128*1024)
  50
  51enum perf_pmu_event_symbol_type {
  52        PMU_EVENT_SYMBOL_ERR,           /* not a PMU EVENT */
  53        PMU_EVENT_SYMBOL,               /* normal style PMU event */
  54        PMU_EVENT_SYMBOL_PREFIX,        /* prefix of pre-suf style event */
  55        PMU_EVENT_SYMBOL_SUFFIX,        /* suffix of pre-suf style event */
  56};
  57
  58struct perf_pmu_event_symbol {
  59        char    *symbol;
  60        enum perf_pmu_event_symbol_type type;
  61};
  62
  63enum {
  64        PARSE_EVENTS__TERM_TYPE_NUM,
  65        PARSE_EVENTS__TERM_TYPE_STR,
  66};
  67
  68enum {
  69        PARSE_EVENTS__TERM_TYPE_USER,
  70        PARSE_EVENTS__TERM_TYPE_CONFIG,
  71        PARSE_EVENTS__TERM_TYPE_CONFIG1,
  72        PARSE_EVENTS__TERM_TYPE_CONFIG2,
  73        PARSE_EVENTS__TERM_TYPE_NAME,
  74        PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
  75        PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ,
  76        PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
  77        PARSE_EVENTS__TERM_TYPE_TIME,
  78        PARSE_EVENTS__TERM_TYPE_CALLGRAPH,
  79        PARSE_EVENTS__TERM_TYPE_STACKSIZE,
  80        PARSE_EVENTS__TERM_TYPE_NOINHERIT,
  81        PARSE_EVENTS__TERM_TYPE_INHERIT,
  82        PARSE_EVENTS__TERM_TYPE_MAX_STACK,
  83        PARSE_EVENTS__TERM_TYPE_MAX_EVENTS,
  84        PARSE_EVENTS__TERM_TYPE_NOOVERWRITE,
  85        PARSE_EVENTS__TERM_TYPE_OVERWRITE,
  86        PARSE_EVENTS__TERM_TYPE_DRV_CFG,
  87        PARSE_EVENTS__TERM_TYPE_PERCORE,
  88        PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT,
  89        PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE,
  90        __PARSE_EVENTS__TERM_TYPE_NR,
  91};
  92
  93struct parse_events_array {
  94        size_t nr_ranges;
  95        struct {
  96                unsigned int start;
  97                size_t length;
  98        } *ranges;
  99};
 100
 101struct parse_events_term {
 102        char *config;
 103        struct parse_events_array array;
 104        union {
 105                char *str;
 106                u64  num;
 107        } val;
 108        int type_val;
 109        int type_term;
 110        struct list_head list;
 111        bool used;
 112        bool no_value;
 113
 114        /* error string indexes for within parsed string */
 115        int err_term;
 116        int err_val;
 117
 118        /* Coming from implicit alias */
 119        bool weak;
 120};
 121
 122struct parse_events_error {
 123        int   num_errors;       /* number of errors encountered */
 124        int   idx;      /* index in the parsed string */
 125        char *str;      /* string to display at the index */
 126        char *help;     /* optional help string */
 127        int   first_idx;/* as above, but for the first encountered error */
 128        char *first_str;
 129        char *first_help;
 130};
 131
 132struct parse_events_state {
 133        struct list_head           list;
 134        int                        idx;
 135        int                        nr_groups;
 136        struct parse_events_error *error;
 137        struct evlist             *evlist;
 138        struct list_head          *terms;
 139        int                        stoken;
 140        struct perf_pmu           *fake_pmu;
 141};
 142
 143void parse_events__handle_error(struct parse_events_error *err, int idx,
 144                                char *str, char *help);
 145void parse_events__shrink_config_terms(void);
 146int parse_events__is_hardcoded_term(struct parse_events_term *term);
 147int parse_events_term__num(struct parse_events_term **term,
 148                           int type_term, char *config, u64 num,
 149                           bool novalue,
 150                           void *loc_term, void *loc_val);
 151int parse_events_term__str(struct parse_events_term **term,
 152                           int type_term, char *config, char *str,
 153                           void *loc_term, void *loc_val);
 154int parse_events_term__sym_hw(struct parse_events_term **term,
 155                              char *config, unsigned idx);
 156int parse_events_term__clone(struct parse_events_term **new,
 157                             struct parse_events_term *term);
 158void parse_events_term__delete(struct parse_events_term *term);
 159void parse_events_terms__delete(struct list_head *terms);
 160void parse_events_terms__purge(struct list_head *terms);
 161void parse_events__clear_array(struct parse_events_array *a);
 162int parse_events__modifier_event(struct list_head *list, char *str, bool add);
 163int parse_events__modifier_group(struct list_head *list, char *event_mod);
 164int parse_events_name(struct list_head *list, char *name);
 165int parse_events_add_tracepoint(struct list_head *list, int *idx,
 166                                const char *sys, const char *event,
 167                                struct parse_events_error *error,
 168                                struct list_head *head_config);
 169int parse_events_load_bpf(struct parse_events_state *parse_state,
 170                          struct list_head *list,
 171                          char *bpf_file_name,
 172                          bool source,
 173                          struct list_head *head_config);
 174/* Provide this function for perf test */
 175struct bpf_object;
 176int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
 177                              struct list_head *list,
 178                              struct bpf_object *obj,
 179                              struct list_head *head_config);
 180int parse_events_add_numeric(struct parse_events_state *parse_state,
 181                             struct list_head *list,
 182                             u32 type, u64 config,
 183                             struct list_head *head_config);
 184enum perf_tool_event;
 185int parse_events_add_tool(struct parse_events_state *parse_state,
 186                          struct list_head *list,
 187                          enum perf_tool_event tool_event);
 188int parse_events_add_cache(struct list_head *list, int *idx,
 189                           char *type, char *op_result1, char *op_result2,
 190                           struct parse_events_error *error,
 191                           struct list_head *head_config);
 192int parse_events_add_breakpoint(struct list_head *list, int *idx,
 193                                u64 addr, char *type, u64 len);
 194int parse_events_add_pmu(struct parse_events_state *parse_state,
 195                         struct list_head *list, char *name,
 196                         struct list_head *head_config,
 197                         bool auto_merge_stats,
 198                         bool use_alias);
 199
 200struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,
 201                                        char *name, struct perf_pmu *pmu);
 202
 203int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 204                               char *str,
 205                               struct list_head **listp);
 206
 207int parse_events_copy_term_list(struct list_head *old,
 208                                 struct list_head **new);
 209
 210enum perf_pmu_event_symbol_type
 211perf_pmu__parse_check(const char *name);
 212void parse_events__set_leader(char *name, struct list_head *list,
 213                              struct parse_events_state *parse_state);
 214void parse_events_update_lists(struct list_head *list_event,
 215                               struct list_head *list_all);
 216void parse_events_evlist_error(struct parse_events_state *parse_state,
 217                               int idx, const char *str);
 218
 219void print_events(const char *event_glob, bool name_only, bool quiet,
 220                  bool long_desc, bool details_flag, bool deprecated);
 221
 222struct event_symbol {
 223        const char      *symbol;
 224        const char      *alias;
 225};
 226extern struct event_symbol event_symbols_hw[];
 227extern struct event_symbol event_symbols_sw[];
 228void print_symbol_events(const char *event_glob, unsigned type,
 229                                struct event_symbol *syms, unsigned max,
 230                                bool name_only);
 231void print_tool_events(const char *event_glob, bool name_only);
 232void print_tracepoint_events(const char *subsys_glob, const char *event_glob,
 233                             bool name_only);
 234int print_hwcache_events(const char *event_glob, bool name_only);
 235void print_sdt_events(const char *subsys_glob, const char *event_glob,
 236                      bool name_only);
 237int is_valid_tracepoint(const char *event_string);
 238
 239int valid_event_mount(const char *eventfs);
 240char *parse_events_formats_error_string(char *additional_terms);
 241
 242void parse_events_print_error(struct parse_events_error *err,
 243                              const char *event);
 244
 245#ifdef HAVE_LIBELF_SUPPORT
 246/*
 247 * If the probe point starts with '%',
 248 * or starts with "sdt_" and has a ':' but no '=',
 249 * then it should be a SDT/cached probe point.
 250 */
 251static inline bool is_sdt_event(char *str)
 252{
 253        return (str[0] == '%' ||
 254                (!strncmp(str, "sdt_", 4) &&
 255                 !!strchr(str, ':') && !strchr(str, '=')));
 256}
 257#else
 258static inline bool is_sdt_event(char *str __maybe_unused)
 259{
 260        return false;
 261}
 262#endif /* HAVE_LIBELF_SUPPORT */
 263
 264int perf_pmu__test_parse_init(void);
 265
 266#endif /* __PERF_PARSE_EVENTS_H */
 267