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