tracing: probeevent: Add array type support
Add array type support for probe events. This allows user to get arraied types from memory address. The array type syntax is TYPE[N] Where TYPE is one of types (u8/16/32/64,s8/16/32/64, x8/16/32/64, symbol, string) and N is a fixed value less than 64. The string array type is a bit different from other types. For other base types, <base-type>[1] is equal to <base-type> (e.g. +0(%di):x32[1] is same as +0(%di):x32.) But string[1] is not equal to string. The string type itself represents "char array", but string array type represents "char * array". So, for example, +0(%di):string[1] is equal to +0(+0(%di)):string. Link: http://lkml.kernel.org/r/152465891533.26224.6150658225601339931.stgit@devbox Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:

committed by
Steven Rostedt (VMware)

parent
60c2e0cebf
commit
40b53b7718
@@ -30,6 +30,7 @@
|
||||
|
||||
#define MAX_TRACE_ARGS 128
|
||||
#define MAX_ARGSTR_LEN 63
|
||||
#define MAX_ARRAY_LEN 64
|
||||
#define MAX_STRING_SIZE PATH_MAX
|
||||
|
||||
/* Reserved field names */
|
||||
@@ -65,6 +66,14 @@ static nokprobe_inline void *get_loc_data(u32 *dl, void *ent)
|
||||
return (u8 *)ent + get_loc_offs(*dl);
|
||||
}
|
||||
|
||||
static nokprobe_inline u32 update_data_loc(u32 loc, int consumed)
|
||||
{
|
||||
u32 maxlen = get_loc_len(loc);
|
||||
u32 offset = get_loc_offs(loc);
|
||||
|
||||
return make_data_loc(maxlen - consumed, offset + consumed);
|
||||
}
|
||||
|
||||
/* Printing function type */
|
||||
typedef int (*print_type_func_t)(struct trace_seq *, void *, void *);
|
||||
|
||||
@@ -86,6 +95,8 @@ enum fetch_op {
|
||||
FETCH_OP_ST_STRING, /* String: .offset, .size */
|
||||
// Stage 4 (modify) op
|
||||
FETCH_OP_MOD_BF, /* Bitfield: .basesize, .lshift, .rshift */
|
||||
// Stage 5 (loop) op
|
||||
FETCH_OP_LP_ARRAY, /* Array: .param = loop count */
|
||||
FETCH_OP_END,
|
||||
};
|
||||
|
||||
@@ -175,6 +186,7 @@ DECLARE_BASIC_PRINT_TYPE_FUNC(symbol);
|
||||
_ASSIGN_FETCH_TYPE(#ptype, ptype, ftype, sizeof(ftype), sign, atype)
|
||||
|
||||
#define ASSIGN_FETCH_TYPE_END {}
|
||||
#define MAX_ARRAY_LEN 64
|
||||
|
||||
#ifdef CONFIG_KPROBE_EVENTS
|
||||
bool trace_kprobe_on_func_entry(struct trace_event_call *call);
|
||||
@@ -195,8 +207,10 @@ struct probe_arg {
|
||||
struct fetch_insn *code;
|
||||
bool dynamic;/* Dynamic array (string) is used */
|
||||
unsigned int offset; /* Offset from argument entry */
|
||||
unsigned int count; /* Array count */
|
||||
const char *name; /* Name of this argument */
|
||||
const char *comm; /* Command of this argument */
|
||||
char *fmt; /* Format string if needed */
|
||||
const struct fetch_type *type; /* Type of this argument */
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user