diff options
Diffstat (limited to 'include/linux/kprobes.h')
| -rw-r--r-- | include/linux/kprobes.h | 27 | 
1 files changed, 27 insertions, 0 deletions
diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index b6e1f8c0057..23755ba42ab 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -38,6 +38,7 @@  #include <linux/spinlock.h>  #include <linux/rcupdate.h>  #include <linux/mutex.h> +#include <linux/ftrace.h>  #ifdef CONFIG_KPROBES  #include <asm/kprobes.h> @@ -48,14 +49,26 @@  #define KPROBE_REENTER		0x00000004  #define KPROBE_HIT_SSDONE	0x00000008 +/* + * If function tracer is enabled and the arch supports full + * passing of pt_regs to function tracing, then kprobes can + * optimize on top of function tracing. + */ +#if defined(CONFIG_FUNCTION_TRACER) && defined(ARCH_SUPPORTS_FTRACE_SAVE_REGS) \ +	&& defined(ARCH_SUPPORTS_KPROBES_ON_FTRACE) +# define KPROBES_CAN_USE_FTRACE +#endif +  /* Attach to insert probes on any functions which should be ignored*/  #define __kprobes	__attribute__((__section__(".kprobes.text"))) +  #else /* CONFIG_KPROBES */  typedef int kprobe_opcode_t;  struct arch_specific_insn {  	int dummy;  };  #define __kprobes +  #endif /* CONFIG_KPROBES */  struct kprobe; @@ -128,6 +141,7 @@ struct kprobe {  				   * NOTE:  				   * this flag is only for optimized_kprobe.  				   */ +#define KPROBE_FLAG_FTRACE	8 /* probe is using ftrace */  /* Has this kprobe gone ? */  static inline int kprobe_gone(struct kprobe *p) @@ -146,6 +160,13 @@ static inline int kprobe_optimized(struct kprobe *p)  {  	return p->flags & KPROBE_FLAG_OPTIMIZED;  } + +/* Is this kprobe uses ftrace ? */ +static inline int kprobe_ftrace(struct kprobe *p) +{ +	return p->flags & KPROBE_FLAG_FTRACE; +} +  /*   * Special probe type that uses setjmp-longjmp type tricks to resume   * execution at a specified entry with a matching prototype corresponding @@ -295,6 +316,12 @@ extern int proc_kprobes_optimization_handler(struct ctl_table *table,  #endif  #endif /* CONFIG_OPTPROBES */ +#ifdef KPROBES_CAN_USE_FTRACE +extern void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, +				  struct ftrace_ops *ops, struct pt_regs *regs); +extern int arch_prepare_kprobe_ftrace(struct kprobe *p); +#endif +  /* Get the kprobe at this addr (if any) - called with preemption disabled */  struct kprobe *get_kprobe(void *addr);  |