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        char                      *hybrid_pmu_name;
 142};
 143
 144void parse_events__handle_error(struct parse_events_error *err, int idx,
 145                                char *str, char *help);
 146void parse_events__shrink_config_terms(void);
 147int parse_events__is_hardcoded_term(struct parse_events_term *term);
 148int parse_events_term__num(struct parse_events_term **term,
 149                           int type_term, char *config, u64 num,
 150                           bool novalue,
 151                           void *loc_term, void *loc_val);
 152int parse_events_term__str(struct parse_events_term **term,
 153                           int type_term, char *config, char *str,
 154                           void *loc_term, void *loc_val);
 155int parse_events_term__sym_hw(struct parse_events_term **term,
 156                              char *config, unsigned idx);
 157int parse_events_term__clone(struct parse_events_term **new,
 158                             struct parse_events_term *term);
 159void parse_events_term__delete(struct parse_events_term *term);
 160void parse_events_terms__delete(struct list_head *terms);
 161void parse_events_terms__purge(struct list_head *terms);
 162void parse_events__clear_array(struct parse_events_array *a);
 163int parse_events__modifier_event(struct list_head *list, char *str, bool add);
 164int parse_events__modifier_group(struct list_head *list, char *event_mod);
 165int parse_events_name(struct list_head *list, char *name);
 166int parse_events_add_tracepoint(struct list_head *list, int *idx,
 167                                const char *sys, const char *event,
 168                                struct parse_events_error *error,
 169                                struct list_head *head_config);
 170int parse_events_load_bpf(struct parse_events_state *parse_state,
 171                          struct list_head *list,
 172                          char *bpf_file_name,
 173                          bool source,
 174                          struct list_head *head_config);
 175/* Provide this function for perf test */
 176struct bpf_object;
 177int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
 178                              struct list_head *list,
 179                              struct bpf_object *obj,
 180                              struct list_head *head_config);
 181int parse_events_add_numeric(struct parse_events_state *parse_state,
 182                             struct list_head *list,
 183                             u32 type, u64 config,
 184                             struct list_head *head_config);
 185enum perf_tool_event;
 186int parse_events_add_tool(struct parse_events_state *parse_state,
 187                          struct list_head *list,
 188                          enum perf_tool_event tool_event);
 189int parse_events_add_cache(struct list_head *list, int *idx,
 190                           char *type, char *op_result1, char *op_result2,
 191                           struct parse_events_error *error,
 192                           struct list_head *head_config,
 193                           struct parse_events_state *parse_state);
 194int parse_events_add_breakpoint(struct list_head *list, int *idx,
 195                                u64 addr, char *type, u64 len);
 196int parse_events_add_pmu(struct parse_events_state *parse_state,
 197                         struct list_head *list, char *name,
 198                         struct list_head *head_config,
 199                         bool auto_merge_stats,
 200                         bool use_alias);
 201
 202struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,
 203                                        char *name, struct perf_pmu *pmu);
 204
 205int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 206                               char *str,
 207                               struct list_head **listp);
 208
 209int parse_events_copy_term_list(struct list_head *old,
 210                                 struct list_head **new);
 211
 212enum perf_pmu_event_symbol_type
 213perf_pmu__parse_check(const char *name);
 214void parse_events__set_leader(char *name, struct list_head *list,
 215                              struct parse_events_state *parse_state);
 216void parse_events_update_lists(struct list_head *list_event,
 217                               struct list_head *list_all);
 218void parse_events_evlist_error(struct parse_events_state *parse_state,
 219                               int idx, const char *str);
 220
 221void print_events(const char *event_glob, bool name_only, bool quiet,
 222                  bool long_desc, bool details_flag, bool deprecated);
 223
 224struct event_symbol {
 225        const char      *symbol;
 226        const char      *alias;
 227};
 228extern struct event_symbol event_symbols_hw[];
 229extern struct event_symbol event_symbols_sw[];
 230void print_symbol_events(const char *event_glob, unsigned type,
 231                                struct event_symbol *syms, unsigned max,
 232                                bool name_only);
 233void print_tool_events(const char *event_glob, bool name_only);
 234void print_tracepoint_events(const char *subsys_glob, const char *event_glob,
 235                             bool name_only);
 236int print_hwcache_events(const char *event_glob, bool name_only);
 237void print_sdt_events(const char *subsys_glob, const char *event_glob,
 238                      bool name_only);
 239int is_valid_tracepoint(const char *event_string);
 240
 241int valid_event_mount(const char *eventfs);
 242char *parse_events_formats_error_string(char *additional_terms);
 243
 244void parse_events_print_error(struct parse_events_error *err,
 245                              const char *event);
 246
 247#ifdef HAVE_LIBELF_SUPPORT
 248/*
 249 * If the probe point starts with '%',
 250 * or starts with "sdt_" and has a ':' but no '=',
 251 * then it should be a SDT/cached probe point.
 252 */
 253static inline bool is_sdt_event(char *str)
 254{
 255        return (str[0] == '%' ||
 256                (!strncmp(str, "sdt_", 4) &&
 257                 !!strchr(str, ':') && !strchr(str, '=')));
 258}
 259#else
 260static inline bool is_sdt_event(char *str __maybe_unused)
 261{
 262        return false;
 263}
 264#endif /* HAVE_LIBELF_SUPPORT */
 265
 266int perf_pmu__test_parse_init(void);
 267
 268struct evsel *parse_events__add_event_hybrid(struct list_head *list, int *idx,
 269                                             struct perf_event_attr *attr,
 270                                             char *name, struct perf_pmu *pmu,
 271                                             struct list_head *config_terms);
 272
 273#endif /* __PERF_PARSE_EVENTS_H */
 274