parse-events.h 7.1 KB

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