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