169 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _PERF_UTIL_TRACE_EVENT_H3#define _PERF_UTIL_TRACE_EVENT_H4 5#include <stdbool.h>6#include <stdio.h>7#include <sys/types.h>8#include <linux/types.h>9 10struct evlist;11struct machine;12struct perf_sample;13union perf_event;14struct perf_tool;15struct thread;16struct tep_plugin_list;17struct evsel;18struct tep_format_field;19 20struct 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 28typedef char *(tep_func_resolver_t)(void *priv,29 unsigned long long *addrp, char **modp);30 31bool have_tracepoints(struct list_head *evlist);32 33int trace_event__init(struct trace_event *t);34void trace_event__cleanup(struct trace_event *t);35int trace_event__register_resolver(struct machine *machine,36 tep_func_resolver_t *func);37struct tep_event*38trace_event__tp_format(const char *sys, const char *name);39 40struct tep_event *trace_event__tp_format_id(int id);41 42void event_format__fprintf(struct tep_event *event,43 int cpu, void *data, int size, FILE *fp);44 45void event_format__print(struct tep_event *event,46 int cpu, void *data, int size);47 48int parse_ftrace_file(struct tep_handle *pevent, char *buf, unsigned long size);49int parse_event_file(struct tep_handle *pevent,50 char *buf, unsigned long size, char *sys);51 52unsigned long long53raw_field_value(struct tep_event *event, const char *name, void *data);54 55const char *parse_task_states(struct tep_format_field *state_field);56 57void parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size);58void parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size);59void parse_saved_cmdline(struct tep_handle *pevent, char *file, unsigned int size);60 61ssize_t trace_report(int fd, struct trace_event *tevent, bool repipe);62 63unsigned long long read_size(struct tep_event *event, void *ptr, int size);64unsigned long long eval_flag(const char *flag);65 66int 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 */72char *tracepoint_id_to_name(u64 config);73 74struct 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 81struct tracing_data *tracing_data_get(struct list_head *pattrs,82 int fd, bool temp);83int tracing_data_put(struct tracing_data *tdata);84 85 86struct addr_location;87 88struct perf_session;89struct perf_stat_config;90 91struct 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 117extern unsigned int scripting_max_stack;118 119int script_spec_register(const char *spec, struct scripting_ops *ops);120 121void script_fetch_insn(struct perf_sample *sample, struct thread *thread,122 struct machine *machine);123 124void setup_perl_scripting(void);125void setup_python_scripting(void);126 127struct 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 138void 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 145int common_pc(struct scripting_context *context);146int common_flags(struct scripting_context *context);147int common_lock_depth(struct scripting_context *context);148 149#define SAMPLE_FLAGS_BUF_SIZE 64150int 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 155static inline bool tep_field_is_relative(unsigned long flags)156{157 return (flags & TEP_FIELD_IS_RELATIVE) != 0;158}159#else160#include <linux/compiler.h>161 162static inline bool tep_field_is_relative(unsigned long flags __maybe_unused)163{164 return false;165}166#endif167 168#endif /* _PERF_UTIL_TRACE_EVENT_H */169