parse-events.h 8.3 KB

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