diff options
Diffstat (limited to 'include/linux/kprobes.h')
| -rw-r--r-- | include/linux/kprobes.h | 44 | 
1 files changed, 44 insertions, 0 deletions
diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 1b672f74a32..e7d1b2e0070 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -122,6 +122,11 @@ struct kprobe {  /* Kprobe status flags */  #define KPROBE_FLAG_GONE	1 /* breakpoint has already gone */  #define KPROBE_FLAG_DISABLED	2 /* probe is temporarily disabled */ +#define KPROBE_FLAG_OPTIMIZED	4 /* +				   * probe is really optimized. +				   * NOTE: +				   * this flag is only for optimized_kprobe. +				   */  /* Has this kprobe gone ? */  static inline int kprobe_gone(struct kprobe *p) @@ -134,6 +139,12 @@ static inline int kprobe_disabled(struct kprobe *p)  {  	return p->flags & (KPROBE_FLAG_DISABLED | KPROBE_FLAG_GONE);  } + +/* Is this kprobe really running optimized path ? */ +static inline int kprobe_optimized(struct kprobe *p) +{ +	return p->flags & KPROBE_FLAG_OPTIMIZED; +}  /*   * Special probe type that uses setjmp-longjmp type tricks to resume   * execution at a specified entry with a matching prototype corresponding @@ -249,6 +260,39 @@ extern kprobe_opcode_t *get_insn_slot(void);  extern void free_insn_slot(kprobe_opcode_t *slot, int dirty);  extern void kprobes_inc_nmissed_count(struct kprobe *p); +#ifdef CONFIG_OPTPROBES +/* + * Internal structure for direct jump optimized probe + */ +struct optimized_kprobe { +	struct kprobe kp; +	struct list_head list;	/* list for optimizing queue */ +	struct arch_optimized_insn optinsn; +}; + +/* Architecture dependent functions for direct jump optimization */ +extern int arch_prepared_optinsn(struct arch_optimized_insn *optinsn); +extern int arch_check_optimized_kprobe(struct optimized_kprobe *op); +extern int arch_prepare_optimized_kprobe(struct optimized_kprobe *op); +extern void arch_remove_optimized_kprobe(struct optimized_kprobe *op); +extern int  arch_optimize_kprobe(struct optimized_kprobe *op); +extern void arch_unoptimize_kprobe(struct optimized_kprobe *op); +extern kprobe_opcode_t *get_optinsn_slot(void); +extern void free_optinsn_slot(kprobe_opcode_t *slot, int dirty); +extern int arch_within_optimized_kprobe(struct optimized_kprobe *op, +					unsigned long addr); + +extern void opt_pre_handler(struct kprobe *p, struct pt_regs *regs); + +#ifdef CONFIG_SYSCTL +extern int sysctl_kprobes_optimization; +extern int proc_kprobes_optimization_handler(struct ctl_table *table, +					     int write, void __user *buffer, +					     size_t *length, loff_t *ppos); +#endif + +#endif /* CONFIG_OPTPROBES */ +  /* Get the kprobe at this addr (if any) - called with preemption disabled */  struct kprobe *get_kprobe(void *addr);  void kretprobe_hash_lock(struct task_struct *tsk,  |