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);
 
        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
                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();