cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

parse-events.h (9092B)


      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	PMU_EVENT_SYMBOL_SUFFIX2,	/* suffix of pre-suf2 style event */
     57};
     58
     59struct perf_pmu_event_symbol {
     60	char	*symbol;
     61	enum perf_pmu_event_symbol_type	type;
     62};
     63
     64enum {
     65	PARSE_EVENTS__TERM_TYPE_NUM,
     66	PARSE_EVENTS__TERM_TYPE_STR,
     67};
     68
     69enum {
     70	PARSE_EVENTS__TERM_TYPE_USER,
     71	PARSE_EVENTS__TERM_TYPE_CONFIG,
     72	PARSE_EVENTS__TERM_TYPE_CONFIG1,
     73	PARSE_EVENTS__TERM_TYPE_CONFIG2,
     74	PARSE_EVENTS__TERM_TYPE_NAME,
     75	PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
     76	PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ,
     77	PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
     78	PARSE_EVENTS__TERM_TYPE_TIME,
     79	PARSE_EVENTS__TERM_TYPE_CALLGRAPH,
     80	PARSE_EVENTS__TERM_TYPE_STACKSIZE,
     81	PARSE_EVENTS__TERM_TYPE_NOINHERIT,
     82	PARSE_EVENTS__TERM_TYPE_INHERIT,
     83	PARSE_EVENTS__TERM_TYPE_MAX_STACK,
     84	PARSE_EVENTS__TERM_TYPE_MAX_EVENTS,
     85	PARSE_EVENTS__TERM_TYPE_NOOVERWRITE,
     86	PARSE_EVENTS__TERM_TYPE_OVERWRITE,
     87	PARSE_EVENTS__TERM_TYPE_DRV_CFG,
     88	PARSE_EVENTS__TERM_TYPE_PERCORE,
     89	PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT,
     90	PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE,
     91	PARSE_EVENTS__TERM_TYPE_METRIC_ID,
     92	__PARSE_EVENTS__TERM_TYPE_NR,
     93};
     94
     95struct parse_events_array {
     96	size_t nr_ranges;
     97	struct {
     98		unsigned int start;
     99		size_t length;
    100	} *ranges;
    101};
    102
    103struct parse_events_term {
    104	char *config;
    105	struct parse_events_array array;
    106	union {
    107		char *str;
    108		u64  num;
    109	} val;
    110	int type_val;
    111	int type_term;
    112	struct list_head list;
    113	bool used;
    114	bool no_value;
    115
    116	/* error string indexes for within parsed string */
    117	int err_term;
    118	int err_val;
    119
    120	/* Coming from implicit alias */
    121	bool weak;
    122};
    123
    124struct parse_events_error {
    125	int   num_errors;       /* number of errors encountered */
    126	int   idx;	/* index in the parsed string */
    127	char *str;      /* string to display at the index */
    128	char *help;	/* optional help string */
    129	int   first_idx;/* as above, but for the first encountered error */
    130	char *first_str;
    131	char *first_help;
    132};
    133
    134struct parse_events_state {
    135	struct list_head	   list;
    136	int			   idx;
    137	int			   nr_groups;
    138	struct parse_events_error *error;
    139	struct evlist		  *evlist;
    140	struct list_head	  *terms;
    141	int			   stoken;
    142	struct perf_pmu		  *fake_pmu;
    143	char			  *hybrid_pmu_name;
    144};
    145
    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, const 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);
    185int parse_events_add_tool(struct parse_events_state *parse_state,
    186			  struct list_head *list,
    187			  int tool_event);
    188int parse_events_add_cache(struct list_head *list, int *idx,
    189			   char *type, char *op_result1, char *op_result2,
    190			   struct parse_events_error *error,
    191			   struct list_head *head_config,
    192			   struct parse_events_state *parse_state);
    193int parse_events_add_breakpoint(struct list_head *list, int *idx,
    194				u64 addr, char *type, u64 len);
    195int parse_events_add_pmu(struct parse_events_state *parse_state,
    196			 struct list_head *list, char *name,
    197			 struct list_head *head_config,
    198			 bool auto_merge_stats,
    199			 bool use_alias);
    200
    201struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,
    202				      const char *name, const char *metric_id,
    203				      struct perf_pmu *pmu);
    204
    205int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
    206			       char *str,
    207			       struct list_head *head_config,
    208			       struct list_head **listp);
    209
    210int parse_events_copy_term_list(struct list_head *old,
    211				 struct list_head **new);
    212
    213enum perf_pmu_event_symbol_type
    214perf_pmu__parse_check(const char *name);
    215void parse_events__set_leader(char *name, struct list_head *list,
    216			      struct parse_events_state *parse_state);
    217void parse_events_update_lists(struct list_head *list_event,
    218			       struct list_head *list_all);
    219void parse_events_evlist_error(struct parse_events_state *parse_state,
    220			       int idx, const char *str);
    221
    222void print_events(const char *event_glob, bool name_only, bool quiet,
    223		  bool long_desc, bool details_flag, bool deprecated,
    224		  const char *pmu_name);
    225
    226struct event_symbol {
    227	const char	*symbol;
    228	const char	*alias;
    229};
    230extern struct event_symbol event_symbols_hw[];
    231extern struct event_symbol event_symbols_sw[];
    232void print_symbol_events(const char *event_glob, unsigned type,
    233				struct event_symbol *syms, unsigned max,
    234				bool name_only);
    235void print_tool_events(const char *event_glob, bool name_only);
    236void print_tracepoint_events(const char *subsys_glob, const char *event_glob,
    237			     bool name_only);
    238int print_hwcache_events(const char *event_glob, bool name_only);
    239void print_sdt_events(const char *subsys_glob, const char *event_glob,
    240		      bool name_only);
    241int is_valid_tracepoint(const char *event_string);
    242
    243int valid_event_mount(const char *eventfs);
    244char *parse_events_formats_error_string(char *additional_terms);
    245
    246void parse_events_error__init(struct parse_events_error *err);
    247void parse_events_error__exit(struct parse_events_error *err);
    248void parse_events_error__handle(struct parse_events_error *err, int idx,
    249				char *str, char *help);
    250void parse_events_error__print(struct parse_events_error *err,
    251			       const char *event);
    252
    253#ifdef HAVE_LIBELF_SUPPORT
    254/*
    255 * If the probe point starts with '%',
    256 * or starts with "sdt_" and has a ':' but no '=',
    257 * then it should be a SDT/cached probe point.
    258 */
    259static inline bool is_sdt_event(char *str)
    260{
    261	return (str[0] == '%' ||
    262		(!strncmp(str, "sdt_", 4) &&
    263		 !!strchr(str, ':') && !strchr(str, '=')));
    264}
    265#else
    266static inline bool is_sdt_event(char *str __maybe_unused)
    267{
    268	return false;
    269}
    270#endif /* HAVE_LIBELF_SUPPORT */
    271
    272int perf_pmu__test_parse_init(void);
    273
    274struct evsel *parse_events__add_event_hybrid(struct list_head *list, int *idx,
    275					     struct perf_event_attr *attr,
    276					     const char *name,
    277					     const char *metric_id,
    278					     struct perf_pmu *pmu,
    279					     struct list_head *config_terms);
    280
    281#endif /* __PERF_PARSE_EVENTS_H */