1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef _PROBE_EVENT_H 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define _PROBE_EVENT_H 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdbool.h> 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "strlist.h" 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "strfilter.h" 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern bool probe_event_dry_run; 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* kprobe-tracer and uprobe-tracer tracing point */ 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct probe_trace_point { 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *symbol; /* Base symbol */ 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *module; /* Module name */ 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned long offset; /* Offset from symbol */ 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool retprobe; /* Return probe flag */ 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* probe-tracer tracing argument referencing offset */ 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct probe_trace_arg_ref { 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct probe_trace_arg_ref *next; /* Next reference */ 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng long offset; /* Offset value */ 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* kprobe-tracer and uprobe-tracer tracing argument */ 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct probe_trace_arg { 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *name; /* Argument name */ 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *value; /* Base value */ 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *type; /* Type name */ 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct probe_trace_arg_ref *ref; /* Referencing offset */ 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* kprobe-tracer and uprobe-tracer tracing event (point + arg) */ 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct probe_trace_event { 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *event; /* Event name */ 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *group; /* Group name */ 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct probe_trace_point point; /* Trace point */ 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int nargs; /* Number of args */ 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool uprobes; /* uprobes only */ 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct probe_trace_arg *args; /* Arguments */ 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Perf probe probing point */ 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_probe_point { 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *file; /* File path */ 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *function; /* Function name */ 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int line; /* Line number */ 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool retprobe; /* Return probe flag */ 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *lazy_line; /* Lazy matching pattern */ 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned long offset; /* Offset from function entry */ 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Perf probe probing argument field chain */ 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_probe_arg_field { 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_probe_arg_field *next; /* Next field */ 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *name; /* Name of the field */ 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng long index; /* Array index number */ 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool ref; /* Referencing flag */ 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Perf probe probing argument */ 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_probe_arg { 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *name; /* Argument name */ 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *var; /* Variable name */ 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *type; /* Type name */ 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_probe_arg_field *field; /* Structure fields */ 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Perf probe probing event (point + arg) */ 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_probe_event { 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *event; /* Event name */ 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *group; /* Group name */ 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_probe_point point; /* Probe point */ 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int nargs; /* Number of arguments */ 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool uprobes; 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_probe_arg *args; /* Arguments */ 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Line number container */ 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct line_node { 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct list_head list; 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int line; 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Line range */ 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct line_range { 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *file; /* File name */ 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *function; /* Function name */ 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int start; /* Start line number */ 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int end; /* End line number */ 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int offset; /* Start line offset */ 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *path; /* Real path name */ 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *comp_dir; /* Compile directory */ 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct list_head line_list; /* Visible lines */ 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* List of variables */ 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct variable_list { 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct probe_trace_point point; /* Actual probepoint */ 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct strlist *vars; /* Available variables */ 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Command string to events */ 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int parse_perf_probe_command(const char *cmd, 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_probe_event *pev); 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Events to command string */ 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern char *synthesize_perf_probe_command(struct perf_probe_event *pev); 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern char *synthesize_probe_trace_command(struct probe_trace_event *tev); 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int synthesize_perf_probe_arg(struct perf_probe_arg *pa, char *buf, 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size_t len); 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Check the perf_probe_event needs debuginfo */ 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern bool perf_probe_event_need_dwarf(struct perf_probe_event *pev); 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Release event contents */ 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern void clear_perf_probe_event(struct perf_probe_event *pev); 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Command string to line-range */ 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int parse_line_range_desc(const char *cmd, struct line_range *lr); 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Internal use: Return kernel/module path */ 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern const char *kernel_get_module_path(const char *module); 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int max_probe_points, const char *module, 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool force_add); 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int del_perf_probe_events(struct strlist *dellist); 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int show_perf_probe_events(void); 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int show_line_range(struct line_range *lr, const char *module); 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int show_available_vars(struct perf_probe_event *pevs, int npevs, 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int max_probe_points, const char *module, 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct strfilter *filter, bool externs); 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int show_available_funcs(const char *module, struct strfilter *filter, 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool user); 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Maximum index number of event-name postfix */ 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define MAX_EVENT_INDEX 1024 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /*_PROBE_EVENT_H */ 141