kprobes: introduce weak arch_check_ftrace_location() helper function
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>
This commit is contained in:
parent
3ac8e38015
commit
f7f242ff00
@ -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);
|
extern int arch_prepare_kprobe_ftrace(struct kprobe *p);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int arch_check_ftrace_location(struct kprobe *p);
|
||||||
|
|
||||||
/* Get the kprobe at this addr (if any) - called with preemption disabled */
|
/* Get the kprobe at this addr (if any) - called with preemption disabled */
|
||||||
struct kprobe *get_kprobe(void *addr);
|
struct kprobe *get_kprobe(void *addr);
|
||||||
|
@ -1410,16 +1410,10 @@ static inline int check_kprobe_rereg(struct kprobe *p)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int check_kprobe_address_safe(struct kprobe *p,
|
int __weak arch_check_ftrace_location(struct kprobe *p)
|
||||||
struct module **probed_mod)
|
|
||||||
{
|
{
|
||||||
int ret = 0;
|
|
||||||
unsigned long ftrace_addr;
|
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);
|
ftrace_addr = ftrace_location((unsigned long)p->addr);
|
||||||
if (ftrace_addr) {
|
if (ftrace_addr) {
|
||||||
#ifdef CONFIG_KPROBES_ON_FTRACE
|
#ifdef CONFIG_KPROBES_ON_FTRACE
|
||||||
@ -1431,7 +1425,17 @@ static int check_kprobe_address_safe(struct kprobe *p,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
#endif
|
#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();
|
jump_label_lock();
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user