Messages in this thread Patch in this message | | | Date | Wed, 25 Apr 2012 22:29:28 -0400 | From | Steven Rostedt <> | Subject | [PATCH 6/6][RFC] kprobes: Allow probe on ftrace reserved text (but move it) |
| |
From: Steven Rostedt <srostedt@redhat.com>
If a probe is placed on a ftrace nop (or ftrace_caller), simply move the probe to the next instruction instead of rejecting it. This will allow kprobes not to be affected by ftrace using the -mfentry gcc option which will put the ftrace nop at the beginning of the function. As a very common case for kprobes is to add a probe to the very beginning of a function we need a way to handle the case when ftrace takes the first instruction.
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org> --- kernel/kprobes.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index c62b854..560d80e 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -1319,10 +1319,20 @@ int __kprobes register_kprobe(struct kprobe *p) struct kprobe *old_p; struct module *probed_mod; kprobe_opcode_t *addr; + unsigned long ftrace_addr; addr = kprobe_addr(p); if (IS_ERR(addr)) return PTR_ERR(addr); + + /* + * If the address is located on a ftrace nop, set the + * breakpoint to the following instruction. + */ + ftrace_addr = ftrace_location((unsigned long)addr); + if (unlikely(ftrace_addr)) + addr = (kprobe_opcode_t *)(ftrace_addr + MCOUNT_INSN_SIZE); + p->addr = addr; ret = check_kprobe_rereg(p); @@ -1333,7 +1343,6 @@ int __kprobes register_kprobe(struct kprobe *p) preempt_disable(); if (!kernel_text_address((unsigned long) p->addr) || in_kprobes_functions((unsigned long) p->addr) || - ftrace_text_reserved(p->addr, p->addr) || jump_label_text_reserved(p->addr, p->addr)) { ret = -EINVAL; goto cannot_probe; -- 1.7.9.5
[unhandled content-type:application/pgp-signature] | |