tracing/probes: Move fetch function helpers to trace_probe.h
Move fetch function helper macros/functions to the header file and make them external. This is preparation of supporting uprobe fetch table in next patch. Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Acked-by: Oleg Nesterov <oleg@redhat.com> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: zhangwei(Jovi) <jovi.zhangwei@huawei.com> Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
parent
5bf652aaf4
commit
b26c74e116
|
@ -35,19 +35,15 @@ const char *reserved_field_names[] = {
|
||||||
FIELD_STRING_FUNC,
|
FIELD_STRING_FUNC,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Printing function type */
|
|
||||||
#define PRINT_TYPE_FUNC_NAME(type) print_type_##type
|
|
||||||
#define PRINT_TYPE_FMT_NAME(type) print_type_format_##type
|
|
||||||
|
|
||||||
/* Printing in basic type function template */
|
/* Printing in basic type function template */
|
||||||
#define DEFINE_BASIC_PRINT_TYPE_FUNC(type, fmt) \
|
#define DEFINE_BASIC_PRINT_TYPE_FUNC(type, fmt) \
|
||||||
static __kprobes int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s, \
|
__kprobes int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s, \
|
||||||
const char *name, \
|
const char *name, \
|
||||||
void *data, void *ent) \
|
void *data, void *ent) \
|
||||||
{ \
|
{ \
|
||||||
return trace_seq_printf(s, " %s=" fmt, name, *(type *)data); \
|
return trace_seq_printf(s, " %s=" fmt, name, *(type *)data); \
|
||||||
} \
|
} \
|
||||||
static const char PRINT_TYPE_FMT_NAME(type)[] = fmt;
|
const char PRINT_TYPE_FMT_NAME(type)[] = fmt;
|
||||||
|
|
||||||
DEFINE_BASIC_PRINT_TYPE_FUNC(u8 , "0x%x")
|
DEFINE_BASIC_PRINT_TYPE_FUNC(u8 , "0x%x")
|
||||||
DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "0x%x")
|
DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "0x%x")
|
||||||
|
@ -58,23 +54,12 @@ DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d")
|
||||||
DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%d")
|
DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%d")
|
||||||
DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%Ld")
|
DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%Ld")
|
||||||
|
|
||||||
static inline void *get_rloc_data(u32 *dl)
|
|
||||||
{
|
|
||||||
return (u8 *)dl + get_rloc_offs(*dl);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For data_loc conversion */
|
|
||||||
static inline void *get_loc_data(u32 *dl, void *ent)
|
|
||||||
{
|
|
||||||
return (u8 *)ent + get_rloc_offs(*dl);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For defining macros, define string/string_size types */
|
/* For defining macros, define string/string_size types */
|
||||||
typedef u32 string;
|
typedef u32 string;
|
||||||
typedef u32 string_size;
|
typedef u32 string_size;
|
||||||
|
|
||||||
/* Print type function for string type */
|
/* Print type function for string type */
|
||||||
static __kprobes int PRINT_TYPE_FUNC_NAME(string)(struct trace_seq *s,
|
__kprobes int PRINT_TYPE_FUNC_NAME(string)(struct trace_seq *s,
|
||||||
const char *name,
|
const char *name,
|
||||||
void *data, void *ent)
|
void *data, void *ent)
|
||||||
{
|
{
|
||||||
|
@ -87,7 +72,7 @@ static __kprobes int PRINT_TYPE_FUNC_NAME(string)(struct trace_seq *s,
|
||||||
(const char *)get_loc_data(data, ent));
|
(const char *)get_loc_data(data, ent));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char PRINT_TYPE_FMT_NAME(string)[] = "\\\"%s\\\"";
|
const char PRINT_TYPE_FMT_NAME(string)[] = "\\\"%s\\\"";
|
||||||
|
|
||||||
#define FETCH_FUNC_NAME(method, type) fetch_##method##_##type
|
#define FETCH_FUNC_NAME(method, type) fetch_##method##_##type
|
||||||
/*
|
/*
|
||||||
|
@ -111,7 +96,7 @@ DEFINE_FETCH_##method(u64)
|
||||||
|
|
||||||
/* Data fetch function templates */
|
/* Data fetch function templates */
|
||||||
#define DEFINE_FETCH_reg(type) \
|
#define DEFINE_FETCH_reg(type) \
|
||||||
static __kprobes void FETCH_FUNC_NAME(reg, type)(struct pt_regs *regs, \
|
__kprobes void FETCH_FUNC_NAME(reg, type)(struct pt_regs *regs, \
|
||||||
void *offset, void *dest) \
|
void *offset, void *dest) \
|
||||||
{ \
|
{ \
|
||||||
*(type *)dest = (type)regs_get_register(regs, \
|
*(type *)dest = (type)regs_get_register(regs, \
|
||||||
|
@ -123,7 +108,7 @@ DEFINE_BASIC_FETCH_FUNCS(reg)
|
||||||
#define fetch_reg_string_size NULL
|
#define fetch_reg_string_size NULL
|
||||||
|
|
||||||
#define DEFINE_FETCH_stack(type) \
|
#define DEFINE_FETCH_stack(type) \
|
||||||
static __kprobes void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs,\
|
__kprobes void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs, \
|
||||||
void *offset, void *dest) \
|
void *offset, void *dest) \
|
||||||
{ \
|
{ \
|
||||||
*(type *)dest = (type)regs_get_kernel_stack_nth(regs, \
|
*(type *)dest = (type)regs_get_kernel_stack_nth(regs, \
|
||||||
|
@ -135,7 +120,7 @@ DEFINE_BASIC_FETCH_FUNCS(stack)
|
||||||
#define fetch_stack_string_size NULL
|
#define fetch_stack_string_size NULL
|
||||||
|
|
||||||
#define DEFINE_FETCH_retval(type) \
|
#define DEFINE_FETCH_retval(type) \
|
||||||
static __kprobes void FETCH_FUNC_NAME(retval, type)(struct pt_regs *regs,\
|
__kprobes void FETCH_FUNC_NAME(retval, type)(struct pt_regs *regs, \
|
||||||
void *dummy, void *dest) \
|
void *dummy, void *dest) \
|
||||||
{ \
|
{ \
|
||||||
*(type *)dest = (type)regs_return_value(regs); \
|
*(type *)dest = (type)regs_return_value(regs); \
|
||||||
|
@ -146,7 +131,7 @@ DEFINE_BASIC_FETCH_FUNCS(retval)
|
||||||
#define fetch_retval_string_size NULL
|
#define fetch_retval_string_size NULL
|
||||||
|
|
||||||
#define DEFINE_FETCH_memory(type) \
|
#define DEFINE_FETCH_memory(type) \
|
||||||
static __kprobes void FETCH_FUNC_NAME(memory, type)(struct pt_regs *regs,\
|
__kprobes void FETCH_FUNC_NAME(memory, type)(struct pt_regs *regs, \
|
||||||
void *addr, void *dest) \
|
void *addr, void *dest) \
|
||||||
{ \
|
{ \
|
||||||
type retval; \
|
type retval; \
|
||||||
|
@ -160,7 +145,7 @@ DEFINE_BASIC_FETCH_FUNCS(memory)
|
||||||
* Fetch a null-terminated string. Caller MUST set *(u32 *)dest with max
|
* Fetch a null-terminated string. Caller MUST set *(u32 *)dest with max
|
||||||
* length and relative data location.
|
* length and relative data location.
|
||||||
*/
|
*/
|
||||||
static __kprobes void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
|
__kprobes void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
|
||||||
void *addr, void *dest)
|
void *addr, void *dest)
|
||||||
{
|
{
|
||||||
long ret;
|
long ret;
|
||||||
|
@ -197,7 +182,7 @@ static __kprobes void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the length of string -- including null terminal byte */
|
/* Return the length of string -- including null terminal byte */
|
||||||
static __kprobes void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
|
__kprobes void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
|
||||||
void *addr, void *dest)
|
void *addr, void *dest)
|
||||||
{
|
{
|
||||||
mm_segment_t old_fs;
|
mm_segment_t old_fs;
|
||||||
|
@ -268,7 +253,7 @@ static struct symbol_cache *alloc_symbol_cache(const char *sym, long offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEFINE_FETCH_symbol(type) \
|
#define DEFINE_FETCH_symbol(type) \
|
||||||
static __kprobes void FETCH_FUNC_NAME(symbol, type)(struct pt_regs *regs,\
|
__kprobes void FETCH_FUNC_NAME(symbol, type)(struct pt_regs *regs, \
|
||||||
void *data, void *dest) \
|
void *data, void *dest) \
|
||||||
{ \
|
{ \
|
||||||
struct symbol_cache *sc = data; \
|
struct symbol_cache *sc = data; \
|
||||||
|
@ -288,7 +273,7 @@ struct deref_fetch_param {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFINE_FETCH_deref(type) \
|
#define DEFINE_FETCH_deref(type) \
|
||||||
static __kprobes void FETCH_FUNC_NAME(deref, type)(struct pt_regs *regs,\
|
__kprobes void FETCH_FUNC_NAME(deref, type)(struct pt_regs *regs, \
|
||||||
void *data, void *dest) \
|
void *data, void *dest) \
|
||||||
{ \
|
{ \
|
||||||
struct deref_fetch_param *dprm = data; \
|
struct deref_fetch_param *dprm = data; \
|
||||||
|
@ -329,7 +314,7 @@ struct bitfield_fetch_param {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFINE_FETCH_bitfield(type) \
|
#define DEFINE_FETCH_bitfield(type) \
|
||||||
static __kprobes void FETCH_FUNC_NAME(bitfield, type)(struct pt_regs *regs,\
|
__kprobes void FETCH_FUNC_NAME(bitfield, type)(struct pt_regs *regs, \
|
||||||
void *data, void *dest) \
|
void *data, void *dest) \
|
||||||
{ \
|
{ \
|
||||||
struct bitfield_fetch_param *bprm = data; \
|
struct bitfield_fetch_param *bprm = data; \
|
||||||
|
@ -374,39 +359,6 @@ free_bitfield_fetch_param(struct bitfield_fetch_param *data)
|
||||||
kfree(data);
|
kfree(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Default (unsigned long) fetch type */
|
|
||||||
#define __DEFAULT_FETCH_TYPE(t) u##t
|
|
||||||
#define _DEFAULT_FETCH_TYPE(t) __DEFAULT_FETCH_TYPE(t)
|
|
||||||
#define DEFAULT_FETCH_TYPE _DEFAULT_FETCH_TYPE(BITS_PER_LONG)
|
|
||||||
#define DEFAULT_FETCH_TYPE_STR __stringify(DEFAULT_FETCH_TYPE)
|
|
||||||
|
|
||||||
#define ASSIGN_FETCH_FUNC(method, type) \
|
|
||||||
[FETCH_MTD_##method] = FETCH_FUNC_NAME(method, type)
|
|
||||||
|
|
||||||
#define __ASSIGN_FETCH_TYPE(_name, ptype, ftype, _size, sign, _fmttype) \
|
|
||||||
{.name = _name, \
|
|
||||||
.size = _size, \
|
|
||||||
.is_signed = sign, \
|
|
||||||
.print = PRINT_TYPE_FUNC_NAME(ptype), \
|
|
||||||
.fmt = PRINT_TYPE_FMT_NAME(ptype), \
|
|
||||||
.fmttype = _fmttype, \
|
|
||||||
.fetch = { \
|
|
||||||
ASSIGN_FETCH_FUNC(reg, ftype), \
|
|
||||||
ASSIGN_FETCH_FUNC(stack, ftype), \
|
|
||||||
ASSIGN_FETCH_FUNC(retval, ftype), \
|
|
||||||
ASSIGN_FETCH_FUNC(memory, ftype), \
|
|
||||||
ASSIGN_FETCH_FUNC(symbol, ftype), \
|
|
||||||
ASSIGN_FETCH_FUNC(deref, ftype), \
|
|
||||||
ASSIGN_FETCH_FUNC(bitfield, ftype), \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ASSIGN_FETCH_TYPE(ptype, ftype, sign) \
|
|
||||||
__ASSIGN_FETCH_TYPE(#ptype, ptype, ftype, sizeof(ftype), sign, #ptype)
|
|
||||||
|
|
||||||
#define FETCH_TYPE_STRING 0
|
|
||||||
#define FETCH_TYPE_STRSIZE 1
|
|
||||||
|
|
||||||
/* Fetch type information table */
|
/* Fetch type information table */
|
||||||
static const struct fetch_type fetch_type_table[] = {
|
static const struct fetch_type fetch_type_table[] = {
|
||||||
/* Special types */
|
/* Special types */
|
||||||
|
|
|
@ -81,6 +81,17 @@
|
||||||
*/
|
*/
|
||||||
#define convert_rloc_to_loc(dl, offs) ((u32)(dl) + (offs))
|
#define convert_rloc_to_loc(dl, offs) ((u32)(dl) + (offs))
|
||||||
|
|
||||||
|
static inline void *get_rloc_data(u32 *dl)
|
||||||
|
{
|
||||||
|
return (u8 *)dl + get_rloc_offs(*dl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For data_loc conversion */
|
||||||
|
static inline void *get_loc_data(u32 *dl, void *ent)
|
||||||
|
{
|
||||||
|
return (u8 *)ent + get_rloc_offs(*dl);
|
||||||
|
}
|
||||||
|
|
||||||
/* Data fetch function type */
|
/* Data fetch function type */
|
||||||
typedef void (*fetch_func_t)(struct pt_regs *, void *, void *);
|
typedef void (*fetch_func_t)(struct pt_regs *, void *, void *);
|
||||||
/* Printing function type */
|
/* Printing function type */
|
||||||
|
@ -115,6 +126,60 @@ struct fetch_param {
|
||||||
void *data;
|
void *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define PRINT_TYPE_FUNC_NAME(type) print_type_##type
|
||||||
|
#define PRINT_TYPE_FMT_NAME(type) print_type_format_##type
|
||||||
|
|
||||||
|
/* Printing in basic type function template */
|
||||||
|
#define DECLARE_BASIC_PRINT_TYPE_FUNC(type) \
|
||||||
|
__kprobes int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s, \
|
||||||
|
const char *name, \
|
||||||
|
void *data, void *ent); \
|
||||||
|
extern const char PRINT_TYPE_FMT_NAME(type)[]
|
||||||
|
|
||||||
|
DECLARE_BASIC_PRINT_TYPE_FUNC(u8);
|
||||||
|
DECLARE_BASIC_PRINT_TYPE_FUNC(u16);
|
||||||
|
DECLARE_BASIC_PRINT_TYPE_FUNC(u32);
|
||||||
|
DECLARE_BASIC_PRINT_TYPE_FUNC(u64);
|
||||||
|
DECLARE_BASIC_PRINT_TYPE_FUNC(s8);
|
||||||
|
DECLARE_BASIC_PRINT_TYPE_FUNC(s16);
|
||||||
|
DECLARE_BASIC_PRINT_TYPE_FUNC(s32);
|
||||||
|
DECLARE_BASIC_PRINT_TYPE_FUNC(s64);
|
||||||
|
DECLARE_BASIC_PRINT_TYPE_FUNC(string);
|
||||||
|
|
||||||
|
/* Default (unsigned long) fetch type */
|
||||||
|
#define __DEFAULT_FETCH_TYPE(t) u##t
|
||||||
|
#define _DEFAULT_FETCH_TYPE(t) __DEFAULT_FETCH_TYPE(t)
|
||||||
|
#define DEFAULT_FETCH_TYPE _DEFAULT_FETCH_TYPE(BITS_PER_LONG)
|
||||||
|
#define DEFAULT_FETCH_TYPE_STR __stringify(DEFAULT_FETCH_TYPE)
|
||||||
|
|
||||||
|
#define ASSIGN_FETCH_FUNC(method, type) \
|
||||||
|
[FETCH_MTD_##method] = FETCH_FUNC_NAME(method, type)
|
||||||
|
|
||||||
|
#define __ASSIGN_FETCH_TYPE(_name, ptype, ftype, _size, sign, _fmttype) \
|
||||||
|
{.name = _name, \
|
||||||
|
.size = _size, \
|
||||||
|
.is_signed = sign, \
|
||||||
|
.print = PRINT_TYPE_FUNC_NAME(ptype), \
|
||||||
|
.fmt = PRINT_TYPE_FMT_NAME(ptype), \
|
||||||
|
.fmttype = _fmttype, \
|
||||||
|
.fetch = { \
|
||||||
|
ASSIGN_FETCH_FUNC(reg, ftype), \
|
||||||
|
ASSIGN_FETCH_FUNC(stack, ftype), \
|
||||||
|
ASSIGN_FETCH_FUNC(retval, ftype), \
|
||||||
|
ASSIGN_FETCH_FUNC(memory, ftype), \
|
||||||
|
ASSIGN_FETCH_FUNC(symbol, ftype), \
|
||||||
|
ASSIGN_FETCH_FUNC(deref, ftype), \
|
||||||
|
ASSIGN_FETCH_FUNC(bitfield, ftype), \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ASSIGN_FETCH_TYPE(ptype, ftype, sign) \
|
||||||
|
__ASSIGN_FETCH_TYPE(#ptype, ptype, ftype, sizeof(ftype), sign, #ptype)
|
||||||
|
|
||||||
|
#define FETCH_TYPE_STRING 0
|
||||||
|
#define FETCH_TYPE_STRSIZE 1
|
||||||
|
|
||||||
|
|
||||||
struct probe_arg {
|
struct probe_arg {
|
||||||
struct fetch_param fetch;
|
struct fetch_param fetch;
|
||||||
struct fetch_param fetch_size;
|
struct fetch_param fetch_size;
|
||||||
|
|
Loading…
Reference in New Issue