kprobes, ftrace: Allow probing on some functions

There is no need to prohibit probing on the functions
used for preparation and uprobe only fetch functions.
Those are safely probed because those are not invoked
from kprobe's breakpoint/fault/debug handlers. So there
is no chance to cause recursive exceptions.

Following functions are now removed from the kprobes blacklist:

	update_bitfield_fetch_param
	free_bitfield_fetch_param
	kprobe_register
	FETCH_FUNC_NAME(stack, type) in trace_uprobe.c
	FETCH_FUNC_NAME(memory, type) in trace_uprobe.c
	FETCH_FUNC_NAME(memory, string) in trace_uprobe.c
	FETCH_FUNC_NAME(memory, string_size) in trace_uprobe.c
	FETCH_FUNC_NAME(file_offset, type) in trace_uprobe.c

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/20140417081800.26341.56504.stgit@ltc230.yrl.intra.hitachi.co.jp
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Masami Hiramatsu 2014-04-17 17:18:00 +09:00 коммит произвёл Ingo Molnar
Родитель 55479f6475
Коммит fbc1963d2c
3 изменённых файлов: 14 добавлений и 15 удалений

Просмотреть файл

@ -1196,9 +1196,8 @@ kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
* kprobe_trace_self_tests_init() does enable_trace_probe/disable_trace_probe * kprobe_trace_self_tests_init() does enable_trace_probe/disable_trace_probe
* lockless, but we can't race with this __init function. * lockless, but we can't race with this __init function.
*/ */
static __kprobes static int kprobe_register(struct ftrace_event_call *event,
int kprobe_register(struct ftrace_event_call *event, enum trace_reg type, void *data)
enum trace_reg type, void *data)
{ {
struct trace_kprobe *tk = (struct trace_kprobe *)event->data; struct trace_kprobe *tk = (struct trace_kprobe *)event->data;
struct ftrace_event_file *file = data; struct ftrace_event_file *file = data;

Просмотреть файл

@ -183,7 +183,7 @@ DEFINE_BASIC_FETCH_FUNCS(bitfield)
#define fetch_bitfield_string NULL #define fetch_bitfield_string NULL
#define fetch_bitfield_string_size NULL #define fetch_bitfield_string_size NULL
static __kprobes void static void
update_bitfield_fetch_param(struct bitfield_fetch_param *data) update_bitfield_fetch_param(struct bitfield_fetch_param *data)
{ {
/* /*
@ -196,7 +196,7 @@ update_bitfield_fetch_param(struct bitfield_fetch_param *data)
update_symbol_cache(data->orig.data); update_symbol_cache(data->orig.data);
} }
static __kprobes void static void
free_bitfield_fetch_param(struct bitfield_fetch_param *data) free_bitfield_fetch_param(struct bitfield_fetch_param *data)
{ {
/* /*

Просмотреть файл

@ -108,8 +108,8 @@ static unsigned long get_user_stack_nth(struct pt_regs *regs, unsigned int n)
* Uprobes-specific fetch functions * Uprobes-specific fetch functions
*/ */
#define DEFINE_FETCH_stack(type) \ #define DEFINE_FETCH_stack(type) \
static __kprobes void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs,\ static void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs, \
void *offset, void *dest) \ void *offset, void *dest) \
{ \ { \
*(type *)dest = (type)get_user_stack_nth(regs, \ *(type *)dest = (type)get_user_stack_nth(regs, \
((unsigned long)offset)); \ ((unsigned long)offset)); \
@ -120,8 +120,8 @@ DEFINE_BASIC_FETCH_FUNCS(stack)
#define fetch_stack_string_size NULL #define fetch_stack_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,\ static void FETCH_FUNC_NAME(memory, type)(struct pt_regs *regs, \
void *addr, void *dest) \ void *addr, void *dest) \
{ \ { \
type retval; \ type retval; \
void __user *vaddr = (void __force __user *) addr; \ void __user *vaddr = (void __force __user *) addr; \
@ -136,8 +136,8 @@ 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, static void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
void *addr, void *dest) void *addr, void *dest)
{ {
long ret; long ret;
u32 rloc = *(u32 *)dest; u32 rloc = *(u32 *)dest;
@ -158,8 +158,8 @@ static __kprobes void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
} }
} }
static __kprobes void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs, static void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
void *addr, void *dest) void *addr, void *dest)
{ {
int len; int len;
void __user *vaddr = (void __force __user *) addr; void __user *vaddr = (void __force __user *) addr;
@ -184,8 +184,8 @@ static unsigned long translate_user_vaddr(void *file_offset)
} }
#define DEFINE_FETCH_file_offset(type) \ #define DEFINE_FETCH_file_offset(type) \
static __kprobes void FETCH_FUNC_NAME(file_offset, type)(struct pt_regs *regs,\ static void FETCH_FUNC_NAME(file_offset, type)(struct pt_regs *regs, \
void *offset, void *dest) \ void *offset, void *dest)\
{ \ { \
void *vaddr = (void *)translate_user_vaddr(offset); \ void *vaddr = (void *)translate_user_vaddr(offset); \
\ \