kprobes: introduce weak arch_check_ftrace_location() helper function
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Wed, 15 Oct 2014 10:17:34 +0000 (12:17 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 27 Oct 2014 12:27:27 +0000 (13:27 +0100)
Introduce weak arch_check_ftrace_location() helper function which
architectures can override in order to implement handling of kprobes
on function tracer call sites on their own, without depending on
common code or implementing the KPROBES_ON_FTRACE feature.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
include/linux/kprobes.h
kernel/kprobes.c

index f7296e57d614f4f75f31e67754f0edc5ea36b563..5297f9fa0ef26f51e608a3b004bc4efe98f338d9 100644 (file)
@@ -335,6 +335,7 @@ extern void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
 extern int arch_prepare_kprobe_ftrace(struct kprobe *p);
 #endif
 
+int arch_check_ftrace_location(struct kprobe *p);
 
 /* Get the kprobe at this addr (if any) - called with preemption disabled */
 struct kprobe *get_kprobe(void *addr);
index 3995f546d0f3f9c7bc845e7053f7a099088108a2..317eb8ad28ddd784ea86ca8740cceaf3801d57ef 100644 (file)
@@ -1410,16 +1410,10 @@ static inline int check_kprobe_rereg(struct kprobe *p)
        return ret;
 }
 
-static int check_kprobe_address_safe(struct kprobe *p,
-                                    struct module **probed_mod)
+int __weak arch_check_ftrace_location(struct kprobe *p)
 {
-       int ret = 0;
        unsigned long ftrace_addr;
 
-       /*
-        * If the address is located on a ftrace nop, set the
-        * breakpoint to the following instruction.
-        */
        ftrace_addr = ftrace_location((unsigned long)p->addr);
        if (ftrace_addr) {
 #ifdef CONFIG_KPROBES_ON_FTRACE
@@ -1431,7 +1425,17 @@ static int check_kprobe_address_safe(struct kprobe *p,
                return -EINVAL;
 #endif
        }
+       return 0;
+}
 
+static int check_kprobe_address_safe(struct kprobe *p,
+                                    struct module **probed_mod)
+{
+       int ret;
+
+       ret = arch_check_ftrace_location(p);
+       if (ret)
+               return ret;
        jump_label_lock();
        preempt_disable();