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