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 perf_evsel;
  16struct perf_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 perf_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_NR,
  79};
  80
  81struct parse_events_array {
  82        size_t nr_ranges;
  83        struct {
  84                unsigned int start;
  85                size_t length;
  86        } *ranges;
  87};
  88
  89struct parse_events_term {
  90        char *config;
  91        struct parse_events_array array;
  92        union {
  93                char *str;
  94                u64  num;
  95        } val;
  96        int type_val;
  97        int type_term;
  98        struct list_head list;
  99        bool used;
 100        bool no_value;
 101
 102        /* error string indexes for within parsed string */
 103        int err_term;
 104        int err_val;
 105
 106        /* Coming from implicit alias */
 107        bool weak;
 108};
 109
 110struct parse_events_error {
 111        int   idx;      /* index in the parsed string */
 112        char *str;      /* string to display at the index */
 113        char *help;     /* optional help string */
 114};
 115
 116struct parse_events_state {
 117        struct list_head           list;
 118        int                        idx;
 119        int                        nr_groups;
 120        struct parse_events_error *error;
 121        struct perf_evlist        *evlist;
 122        struct list_head          *terms;
 123};
 124
 125void parse_events__shrink_config_terms(void);
 126int parse_events__is_hardcoded_term(struct parse_events_term *term);
 127int parse_events_term__num(struct parse_events_term **term,
 128                           int type_term, char *config, u64 num,
 129                           bool novalue,
 130                           void *loc_term, void *loc_val);
 131int parse_events_term__str(struct parse_events_term **term,
 132                           int type_term, char *config, char *str,
 133                           void *loc_term, void *loc_val);
 134int parse_events_term__sym_hw(struct parse_events_term **term,
 135                              char *config, unsigned idx);
 136int parse_events_term__clone(struct parse_events_term **new,
 137                             struct parse_events_term *term);
 138void parse_events_terms__delete(struct list_head *terms);
 139void parse_events_terms__purge(struct list_head *terms);
 140void parse_events__clear_array(struct parse_events_array *a);
 141int parse_events__modifier_event(struct list_head *list, char *str, bool add);
 142int parse_events__modifier_group(struct list_head *list, char *event_mod);
 143int parse_events_name(struct list_head *list, char *name);
 144int parse_events_add_tracepoint(struct list_head *list, int *idx,
 145                                const char *sys, const char *event,
 146                                struct parse_events_error *error,
 147                                struct list_head *head_config);
 148int parse_events_load_bpf(struct parse_events_state *parse_state,
 149                          struct list_head *list,
 150                          char *bpf_file_name,
 151                          bool source,
 152                          struct list_head *head_config);
 153/* Provide this function for perf test */
 154struct bpf_object;
 155int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
 156                              struct list_head *list,
 157                              struct bpf_object *obj,
 158                              struct list_head *head_config);
 159int parse_events_add_numeric(struct parse_events_state *parse_state,
 160                             struct list_head *list,
 161                             u32 type, u64 config,
 162                             struct list_head *head_config);
 163int parse_events_add_cache(struct list_head *list, int *idx,
 164                           char *type, char *op_result1, char *op_result2,
 165                           struct parse_events_error *error,
 166                           struct list_head *head_config);
 167int parse_events_add_breakpoint(struct list_head *list, int *idx,
 168                                void *ptr, char *type, u64 len);
 169int parse_events_add_pmu(struct parse_events_state *parse_state,
 170                         struct list_head *list, char *name,
 171                         struct list_head *head_config,
 172                         bool auto_merge_stats,
 173                         bool use_alias);
 174
 175int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 176                               char *str,
 177                               struct list_head **listp);
 178
 179int parse_events_copy_term_list(struct list_head *old,
 180                                 struct list_head **new);
 181
 182enum perf_pmu_event_symbol_type
 183perf_pmu__parse_check(const char *name);
 184void parse_events__set_leader(char *name, struct list_head *list,
 185                              struct parse_events_state *parse_state);
 186void parse_events_update_lists(struct list_head *list_event,
 187                               struct list_head *list_all);
 188void parse_events_evlist_error(struct parse_events_state *parse_state,
 189                               int idx, const char *str);
 190
 191void print_events(const char *event_glob, bool name_only, bool quiet,
 192                  bool long_desc, bool details_flag);
 193
 194struct event_symbol {
 195        const char      *symbol;
 196        const char      *alias;
 197};
 198extern struct event_symbol event_symbols_hw[];
 199extern struct event_symbol event_symbols_sw[];
 200void print_symbol_events(const char *event_glob, unsigned type,
 201                                struct event_symbol *syms, unsigned max,
 202                                bool name_only);
 203void print_tracepoint_events(const char *subsys_glob, const char *event_glob,
 204                             bool name_only);
 205int print_hwcache_events(const char *event_glob, bool name_only);
 206void print_sdt_events(const char *subsys_glob, const char *event_glob,
 207                      bool name_only);
 208int is_valid_tracepoint(const char *event_string);
 209
 210int valid_event_mount(const char *eventfs);
 211char *parse_events_formats_error_string(char *additional_terms);
 212
 213void parse_events_print_error(struct parse_events_error *err,
 214                              const char *event);
 215
 216#ifdef HAVE_LIBELF_SUPPORT
 217/*
 218 * If the probe point starts with '%',
 219 * or starts with "sdt_" and has a ':' but no '=',
 220 * then it should be a SDT/cached probe point.
 221 */
 222static inline bool is_sdt_event(char *str)
 223{
 224        return (str[0] == '%' ||
 225                (!strncmp(str, "sdt_", 4) &&
 226                 !!strchr(str, ':') && !strchr(str, '=')));
 227}
 228#else
 229static inline bool is_sdt_event(char *str __maybe_unused)
 230{
 231        return false;
 232}
 233#endif /* HAVE_LIBELF_SUPPORT */
 234
 235#endif /* __PERF_PARSE_EVENTS_H */
 236