1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _PERF_UTIL_TRACE_EVENT_H 3 #define _PERF_UTIL_TRACE_EVENT_H 4 5 #include <stdbool.h> 6 #include <stdio.h> 7 #include <sys/types.h> 8 #include <linux/types.h> 9 10 struct evlist; 11 struct machine; 12 struct perf_sample; 13 union perf_event; 14 struct perf_tool; 15 struct thread; 16 struct tep_plugin_list; 17 struct evsel; 18 struct tep_format_field; 19 20 struct trace_event { 21 struct tep_handle *pevent; 22 struct tep_plugin_list *plugin_list; 23 }; 24 25 /* Computes a version number comparable with LIBTRACEEVENT_VERSION from Makefile.config. */ 26 #define MAKE_LIBTRACEEVENT_VERSION(a, b, c) ((a)*255*255+(b)*255+(c)) 27 28 typedef char *(tep_func_resolver_t)(void *priv, 29 unsigned long long *addrp, char **modp); 30 31 bool have_tracepoints(struct list_head *evlist); 32 33 int trace_event__init(struct trace_event *t); 34 void trace_event__cleanup(struct trace_event *t); 35 int trace_event__register_resolver(struct machine *machine, 36 tep_func_resolver_t *func); 37 struct tep_event* 38 trace_event__tp_format(const char *sys, const char *name); 39 40 struct tep_event *trace_event__tp_format_id(int id); 41 42 void event_format__fprintf(struct tep_event *event, 43 int cpu, void *data, int size, FILE *fp); 44 45 void event_format__print(struct tep_event *event, 46 int cpu, void *data, int size); 47 48 int parse_ftrace_file(struct tep_handle *pevent, char *buf, unsigned long size); 49 int parse_event_file(struct tep_handle *pevent, 50 char *buf, unsigned long size, char *sys); 51 52 unsigned long long 53 raw_field_value(struct tep_event *event, const char *name, void *data); 54 55 const char *parse_task_states(struct tep_format_field *state_field); 56 57 void parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size); 58 void parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size); 59 void parse_saved_cmdline(struct tep_handle *pevent, char *file, unsigned int size); 60 61 ssize_t trace_report(int fd, struct trace_event *tevent, bool repipe); 62 63 unsigned long long read_size(struct tep_event *event, void *ptr, int size); 64 unsigned long long eval_flag(const char *flag); 65 66 int read_tracing_data(int fd, struct list_head *pattrs); 67 68 /* 69 * Return the tracepoint name in the format "subsystem:event_name", 70 * callers should free the returned string. 71 */ 72 char *tracepoint_id_to_name(u64 config); 73 74 struct tracing_data { 75 /* size is only valid if temp is 'true' */ 76 ssize_t size; 77 bool temp; 78 char temp_file[50]; 79 }; 80 81 struct tracing_data *tracing_data_get(struct list_head *pattrs, 82 int fd, bool temp); 83 int tracing_data_put(struct tracing_data *tdata); 84 85 86 struct addr_location; 87 88 struct perf_session; 89 struct perf_stat_config; 90 91 struct scripting_ops { 92 const char *name; 93 const char *dirname; /* For script path .../scripts/<dirname>/... */ 94 int (*start_script)(const char *script, int argc, const char **argv, 95 struct perf_session *session); 96 int (*flush_script) (void); 97 int (*stop_script) (void); 98 void (*process_event) (union perf_event *event, 99 struct perf_sample *sample, 100 struct evsel *evsel, 101 struct addr_location *al, 102 struct addr_location *addr_al); 103 void (*process_switch)(union perf_event *event, 104 struct perf_sample *sample, 105 struct machine *machine); 106 void (*process_auxtrace_error)(struct perf_session *session, 107 union perf_event *event); 108 void (*process_stat)(struct perf_stat_config *config, 109 struct evsel *evsel, u64 tstamp); 110 void (*process_stat_interval)(u64 tstamp); 111 void (*process_throttle)(union perf_event *event, 112 struct perf_sample *sample, 113 struct machine *machine); 114 int (*generate_script) (struct tep_handle *pevent, const char *outfile); 115 }; 116 117 extern unsigned int scripting_max_stack; 118 119 int script_spec_register(const char *spec, struct scripting_ops *ops); 120 121 void script_fetch_insn(struct perf_sample *sample, struct thread *thread, 122 struct machine *machine); 123 124 void setup_perl_scripting(void); 125 void setup_python_scripting(void); 126 127 struct scripting_context { 128 struct tep_handle *pevent; 129 void *event_data; 130 union perf_event *event; 131 struct perf_sample *sample; 132 struct evsel *evsel; 133 struct addr_location *al; 134 struct addr_location *addr_al; 135 struct perf_session *session; 136 }; 137 138 void scripting_context__update(struct scripting_context *scripting_context, 139 union perf_event *event, 140 struct perf_sample *sample, 141 struct evsel *evsel, 142 struct addr_location *al, 143 struct addr_location *addr_al); 144 145 int common_pc(struct scripting_context *context); 146 int common_flags(struct scripting_context *context); 147 int common_lock_depth(struct scripting_context *context); 148 149 #define SAMPLE_FLAGS_BUF_SIZE 64 150 int perf_sample__sprintf_flags(u32 flags, char *str, size_t sz); 151 152 #if defined(LIBTRACEEVENT_VERSION) && LIBTRACEEVENT_VERSION >= MAKE_LIBTRACEEVENT_VERSION(1, 5, 0) 153 #include <traceevent/event-parse.h> 154 155 static inline bool tep_field_is_relative(unsigned long flags) 156 { 157 return (flags & TEP_FIELD_IS_RELATIVE) != 0; 158 } 159 #else 160 #include <linux/compiler.h> 161 162 static inline bool tep_field_is_relative(unsigned long flags __maybe_unused) 163 { 164 return false; 165 } 166 #endif 167 168 #endif /* _PERF_UTIL_TRACE_EVENT_H */ 169