linux/tools/perf/util/probe-event.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _PROBE_EVENT_H
   3#define _PROBE_EVENT_H
   4
   5#include <linux/compiler.h>
   6#include <stdbool.h>
   7
   8struct intlist;
   9struct nsinfo;
  10
  11/* Probe related configurations */
  12struct probe_conf {
  13        bool    show_ext_vars;
  14        bool    show_location_range;
  15        bool    force_add;
  16        bool    no_inlines;
  17        bool    cache;
  18        int     max_probes;
  19        unsigned long   magic_num;
  20};
  21extern struct probe_conf probe_conf;
  22extern bool probe_event_dry_run;
  23
  24#define DEFAULT_PROBE_MAGIC_NUM 0xdeade12d      /* u32: 3735937325 */
  25
  26struct symbol;
  27
  28/* kprobe-tracer and uprobe-tracer tracing point */
  29struct probe_trace_point {
  30        char            *realname;      /* function real name (if needed) */
  31        char            *symbol;        /* Base symbol */
  32        char            *module;        /* Module name */
  33        unsigned long   offset;         /* Offset from symbol */
  34        unsigned long   ref_ctr_offset; /* SDT reference counter offset */
  35        unsigned long   address;        /* Actual address of the trace point */
  36        bool            retprobe;       /* Return probe flag */
  37};
  38
  39/* probe-tracer tracing argument referencing offset */
  40struct probe_trace_arg_ref {
  41        struct probe_trace_arg_ref      *next;  /* Next reference */
  42        long                            offset; /* Offset value */
  43        bool                            user_access;    /* User-memory access */
  44};
  45
  46/* kprobe-tracer and uprobe-tracer tracing argument */
  47struct probe_trace_arg {
  48        char                            *name;  /* Argument name */
  49        char                            *value; /* Base value */
  50        char                            *type;  /* Type name */
  51        struct probe_trace_arg_ref      *ref;   /* Referencing offset */
  52};
  53
  54/* kprobe-tracer and uprobe-tracer tracing event (point + arg) */
  55struct probe_trace_event {
  56        char                            *event; /* Event name */
  57        char                            *group; /* Group name */
  58        struct probe_trace_point        point;  /* Trace point */
  59        int                             nargs;  /* Number of args */
  60        bool                            uprobes;        /* uprobes only */
  61        struct probe_trace_arg          *args;  /* Arguments */
  62};
  63
  64/* Perf probe probing point */
  65struct perf_probe_point {
  66        char            *file;          /* File path */
  67        char            *function;      /* Function name */
  68        int             line;           /* Line number */
  69        bool            retprobe;       /* Return probe flag */
  70        char            *lazy_line;     /* Lazy matching pattern */
  71        unsigned long   offset;         /* Offset from function entry */
  72        unsigned long   abs_address;    /* Absolute address of the point */
  73};
  74
  75/* Perf probe probing argument field chain */
  76struct perf_probe_arg_field {
  77        struct perf_probe_arg_field     *next;  /* Next field */
  78        char                            *name;  /* Name of the field */
  79        long                            index;  /* Array index number */
  80        bool                            ref;    /* Referencing flag */
  81};
  82
  83/* Perf probe probing argument */
  84struct perf_probe_arg {
  85        char                            *name;  /* Argument name */
  86        char                            *var;   /* Variable name */
  87        char                            *type;  /* Type name */
  88        struct perf_probe_arg_field     *field; /* Structure fields */
  89        bool                            user_access;    /* User-memory access */
  90};
  91
  92/* Perf probe probing event (point + arg) */
  93struct perf_probe_event {
  94        char                    *event; /* Event name */
  95        char                    *group; /* Group name */
  96        struct perf_probe_point point;  /* Probe point */
  97        int                     nargs;  /* Number of arguments */
  98        bool                    sdt;    /* SDT/cached event flag */
  99        bool                    uprobes;        /* Uprobe event flag */
 100        char                    *target;        /* Target binary */
 101        struct perf_probe_arg   *args;  /* Arguments */
 102        struct probe_trace_event *tevs;
 103        int                     ntevs;
 104        struct nsinfo           *nsi;   /* Target namespace */
 105};
 106
 107/* Line range */
 108struct line_range {
 109        char                    *file;          /* File name */
 110        char                    *function;      /* Function name */
 111        int                     start;          /* Start line number */
 112        int                     end;            /* End line number */
 113        int                     offset;         /* Start line offset */
 114        char                    *path;          /* Real path name */
 115        char                    *comp_dir;      /* Compile directory */
 116        struct intlist          *line_list;     /* Visible lines */
 117};
 118
 119struct strlist;
 120
 121/* List of variables */
 122struct variable_list {
 123        struct probe_trace_point        point;  /* Actual probepoint */
 124        struct strlist                  *vars;  /* Available variables */
 125};
 126
 127struct map;
 128int init_probe_symbol_maps(bool user_only);
 129void exit_probe_symbol_maps(void);
 130
 131/* Command string to events */
 132int parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev);
 133int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev);
 134
 135/* Events to command string */
 136char *synthesize_perf_probe_command(struct perf_probe_event *pev);
 137char *synthesize_probe_trace_command(struct probe_trace_event *tev);
 138char *synthesize_perf_probe_arg(struct perf_probe_arg *pa);
 139char *synthesize_perf_probe_point(struct perf_probe_point *pp);
 140
 141int perf_probe_event__copy(struct perf_probe_event *dst,
 142                           struct perf_probe_event *src);
 143
 144bool perf_probe_with_var(struct perf_probe_event *pev);
 145
 146/* Check the perf_probe_event needs debuginfo */
 147bool perf_probe_event_need_dwarf(struct perf_probe_event *pev);
 148
 149/* Release event contents */
 150void clear_perf_probe_event(struct perf_probe_event *pev);
 151void clear_probe_trace_event(struct probe_trace_event *tev);
 152
 153/* Command string to line-range */
 154int parse_line_range_desc(const char *cmd, struct line_range *lr);
 155
 156/* Release line range members */
 157void line_range__clear(struct line_range *lr);
 158
 159/* Initialize line range */
 160int line_range__init(struct line_range *lr);
 161
 162int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 163int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 164int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 165int show_probe_trace_events(struct perf_probe_event *pevs, int npevs);
 166void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 167
 168struct strfilter;
 169
 170int del_perf_probe_events(struct strfilter *filter);
 171
 172int show_perf_probe_event(const char *group, const char *event,
 173                          struct perf_probe_event *pev,
 174                          const char *module, bool use_stdout);
 175int show_perf_probe_events(struct strfilter *filter);
 176int show_line_range(struct line_range *lr, const char *module,
 177                    struct nsinfo *nsi, bool user);
 178int show_available_vars(struct perf_probe_event *pevs, int npevs,
 179                        struct strfilter *filter);
 180int show_available_funcs(const char *module, struct nsinfo *nsi,
 181                         struct strfilter *filter, bool user);
 182void arch__fix_tev_from_maps(struct perf_probe_event *pev,
 183                             struct probe_trace_event *tev, struct map *map,
 184                             struct symbol *sym);
 185
 186/* If there is no space to write, returns -E2BIG. */
 187int e_snprintf(char *str, size_t size, const char *format, ...) __printf(3, 4);
 188
 189/* Maximum index number of event-name postfix */
 190#define MAX_EVENT_INDEX 1024
 191
 192int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
 193                            struct perf_probe_arg *pvar);
 194
 195struct map *get_target_map(const char *target, struct nsinfo *nsi, bool user);
 196
 197void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
 198                                           int ntevs);
 199
 200#endif /*_PROBE_EVENT_H */
 201