1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef __PERF_PARSE_EVENTS_H
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __PERF_PARSE_EVENTS_H
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Parse symbolic events/counts passed in as options:
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/list.h>
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdbool.h>
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "types.h"
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/perf_event.h>
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "types.h"
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct list_head;
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_evsel;
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_evlist;
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct option;
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct tracepoint_path {
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *system;
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *name;
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct tracepoint_path *next;
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern struct tracepoint_path *tracepoint_id_to_path(u64 config);
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern struct tracepoint_path *tracepoint_name_to_path(const char *name);
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern bool have_tracepoints(struct list_head *evlist);
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconst char *event_type(int type);
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int parse_events_option(const struct option *opt, const char *str,
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			       int unset);
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int parse_events(struct perf_evlist *evlist, const char *str);
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int parse_events_terms(struct list_head *terms, const char *str);
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int parse_filter(const struct option *opt, const char *str, int unset);
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define EVENTS_HELP_MAX (128*1024)
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum {
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PARSE_EVENTS__TERM_TYPE_NUM,
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PARSE_EVENTS__TERM_TYPE_STR,
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum {
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PARSE_EVENTS__TERM_TYPE_USER,
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PARSE_EVENTS__TERM_TYPE_CONFIG,
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PARSE_EVENTS__TERM_TYPE_CONFIG1,
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PARSE_EVENTS__TERM_TYPE_CONFIG2,
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PARSE_EVENTS__TERM_TYPE_NAME,
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct parse_events_term {
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *config;
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	union {
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		char *str;
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		u64  num;
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	} val;
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int type_val;
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int type_term;
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct list_head list;
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct parse_events_evlist {
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct list_head list;
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int idx;
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int nr_groups;
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct parse_events_terms {
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct list_head *terms;
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events__is_hardcoded_term(struct parse_events_term *term);
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_term__num(struct parse_events_term **_term,
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			   int type_term, char *config, u64 num);
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_term__str(struct parse_events_term **_term,
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			   int type_term, char *config, char *str);
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_term__sym_hw(struct parse_events_term **term,
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			      char *config, unsigned idx);
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_term__clone(struct parse_events_term **new,
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     struct parse_events_term *term);
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid parse_events__free_terms(struct list_head *terms);
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events__modifier_event(struct list_head *list, char *str, bool add);
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events__modifier_group(struct list_head *list, char *event_mod);
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_name(struct list_head *list, char *name);
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_add_tracepoint(struct list_head *list, int *idx,
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				char *sys, char *event);
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_add_numeric(struct list_head *list, int *idx,
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     u32 type, u64 config,
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     struct list_head *head_config);
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_add_cache(struct list_head *list, int *idx,
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			   char *type, char *op_result1, char *op_result2);
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_add_breakpoint(struct list_head *list, int *idx,
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				void *ptr, char *type);
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_add_pmu(struct list_head *list, int *idx,
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 char *pmu , struct list_head *head_config);
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid parse_events__set_leader(char *name, struct list_head *list);
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid parse_events_update_lists(struct list_head *list_event,
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			       struct list_head *list_all);
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid parse_events_error(void *data, void *scanner, char const *msg);
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid print_events(const char *event_glob, bool name_only);
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid print_events_type(u8 type);
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid print_tracepoint_events(const char *subsys_glob, const char *event_glob,
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     bool name_only);
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint print_hwcache_events(const char *event_glob, bool name_only);
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int is_valid_tracepoint(const char *event_string);
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int valid_debugfs_mount(const char *debugfs);
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* __PERF_PARSE_EVENTS_H */
114