linux/include/linux/kprobes.h
<<
>>
Prefs
   1#ifndef _LINUX_KPROBES_H
   2#define _LINUX_KPROBES_H
   3/*
   4 *  Kernel Probes (KProbes)
   5 *  include/linux/kprobes.h
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 2 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  20 *
  21 * Copyright (C) IBM Corporation, 2002, 2004
  22 *
  23 * 2002-Oct     Created by Vamsi Krishna S <vamsi_krishna@in.ibm.com> Kernel
  24 *              Probes initial implementation ( includes suggestions from
  25 *              Rusty Russell).
  26 * 2004-July    Suparna Bhattacharya <suparna@in.ibm.com> added jumper probes
  27 *              interface to access function arguments.
  28 * 2005-May     Hien Nguyen <hien@us.ibm.com> and Jim Keniston
  29 *              <jkenisto@us.ibm.com>  and Prasanna S Panchamukhi
  30 *              <prasanna@in.ibm.com> added function-return probes.
  31 */
  32#include <linux/compiler.h>
  33#include <linux/linkage.h>
  34#include <linux/list.h>
  35#include <linux/notifier.h>
  36#include <linux/smp.h>
  37#include <linux/bug.h>
  38#include <linux/percpu.h>
  39#include <linux/spinlock.h>
  40#include <linux/rcupdate.h>
  41#include <linux/mutex.h>
  42#include <linux/ftrace.h>
  43#include <asm/kprobes.h>
  44
  45#ifdef CONFIG_KPROBES
  46
  47/* kprobe_status settings */
  48#define KPROBE_HIT_ACTIVE       0x00000001
  49#define KPROBE_HIT_SS           0x00000002
  50#define KPROBE_REENTER          0x00000004
  51#define KPROBE_HIT_SSDONE       0x00000008
  52
  53#else /* CONFIG_KPROBES */
  54#include <asm-generic/kprobes.h>
  55typedef int kprobe_opcode_t;
  56struct arch_specific_insn {
  57        int dummy;
  58};
  59#endif /* CONFIG_KPROBES */
  60
  61struct kprobe;
  62struct pt_regs;
  63struct kretprobe;
  64struct kretprobe_instance;
  65typedef int (*kprobe_pre_handler_t) (struct kprobe *, struct pt_regs *);
  66typedef void (*kprobe_post_handler_t) (struct kprobe *, struct pt_regs *,
  67                                       unsigned long flags);
  68typedef int (*kprobe_fault_handler_t) (struct kprobe *, struct pt_regs *,
  69                                       int trapnr);
  70typedef int (*kretprobe_handler_t) (struct kretprobe_instance *,
  71                                    struct pt_regs *);
  72
  73struct kprobe {
  74        struct hlist_node hlist;
  75
  76        /* list of kprobes for multi-handler support */
  77        struct list_head list;
  78
  79        /*count the number of times this probe was temporarily disarmed */
  80        unsigned long nmissed;
  81
  82        /* location of the probe point */
  83        kprobe_opcode_t *addr;
  84
  85        /* Allow user to indicate symbol name of the probe point */
  86        const char *symbol_name;
  87
  88        /* Offset into the symbol */
  89        unsigned int offset;
  90
  91        /* Called before addr is executed. */
  92        kprobe_pre_handler_t pre_handler;
  93
  94        /* Called after addr is executed, unless... */
  95        kprobe_post_handler_t post_handler;
  96
  97        /*
  98         * ... called if executing addr causes a fault (eg. page fault).
  99         * Return 1 if it handled fault, otherwise kernel will see it.
 100         */
 101        kprobe_fault_handler_t fault_handler;
 102
 103        /* Saved opcode (which has been replaced with breakpoint) */
 104        kprobe_opcode_t opcode;
 105
 106        /* copy of the original instruction */
 107        struct arch_specific_insn ainsn;
 108
 109        /*
 110         * Indicates various status flags.
 111         * Protected by kprobe_mutex after this kprobe is registered.
 112         */
 113        u32 flags;
 114};
 115
 116/* Kprobe status flags */
 117#define KPROBE_FLAG_GONE        1 /* breakpoint has already gone */
 118#define KPROBE_FLAG_DISABLED    2 /* probe is temporarily disabled */
 119#define KPROBE_FLAG_OPTIMIZED   4 /*
 120                                   * probe is really optimized.
 121                                   * NOTE:
 122                                   * this flag is only for optimized_kprobe.
 123                                   */
 124#define KPROBE_FLAG_FTRACE      8 /* probe is using ftrace */
 125
 126/* Has this kprobe gone ? */
 127static inline int kprobe_gone(struct kprobe *p)
 128{
 129        return p->flags & KPROBE_FLAG_GONE;
 130}
 131
 132/* Is this kprobe disabled ? */
 133static inline int kprobe_disabled(struct kprobe *p)
 134{
 135        return p->flags & (KPROBE_FLAG_DISABLED | KPROBE_FLAG_GONE);
 136}
 137
 138/* Is this kprobe really running optimized path ? */
 139static inline int kprobe_optimized(struct kprobe *p)
 140{
 141        return p->flags & KPROBE_FLAG_OPTIMIZED;
 142}
 143
 144/* Is this kprobe uses ftrace ? */
 145static inline int kprobe_ftrace(struct kprobe *p)
 146{
 147        return p->flags & KPROBE_FLAG_FTRACE;
 148}
 149
 150/*
 151 * Function-return probe -
 152 * Note:
 153 * User needs to provide a handler function, and initialize maxactive.
 154 * maxactive - The maximum number of instances of the probed function that
 155 * can be active concurrently.
 156 * nmissed - tracks the number of times the probed function's return was
 157 * ignored, due to maxactive being too low.
 158 *
 159 */
 160struct kretprobe {
 161        struct kprobe kp;
 162        kretprobe_handler_t handler;
 163        kretprobe_handler_t entry_handler;
 164        int maxactive;
 165        int nmissed;
 166        size_t data_size;
 167        struct hlist_head free_instances;
 168        raw_spinlock_t lock;
 169};
 170
 171struct kretprobe_instance {
 172        struct hlist_node hlist;
 173        struct kretprobe *rp;
 174        kprobe_opcode_t *ret_addr;
 175        struct task_struct *task;
 176        char data[0];
 177};
 178
 179struct kretprobe_blackpoint {
 180        const char *name;
 181        void *addr;
 182};
 183
 184struct kprobe_blacklist_entry {
 185        struct list_head list;
 186        unsigned long start_addr;
 187        unsigned long end_addr;
 188};
 189
 190#ifdef CONFIG_KPROBES
 191DECLARE_PER_CPU(struct kprobe *, current_kprobe);
 192DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
 193
 194/*
 195 * For #ifdef avoidance:
 196 */
 197static inline int kprobes_built_in(void)
 198{
 199        return 1;
 200}
 201
 202#ifdef CONFIG_KRETPROBES
 203extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
 204                                   struct pt_regs *regs);
 205extern int arch_trampoline_kprobe(struct kprobe *p);
 206#else /* CONFIG_KRETPROBES */
 207static inline void arch_prepare_kretprobe(struct kretprobe *rp,
 208                                        struct pt_regs *regs)
 209{
 210}
 211static inline int arch_trampoline_kprobe(struct kprobe *p)
 212{
 213        return 0;
 214}
 215#endif /* CONFIG_KRETPROBES */
 216
 217extern struct kretprobe_blackpoint kretprobe_blacklist[];
 218
 219static inline void kretprobe_assert(struct kretprobe_instance *ri,
 220        unsigned long orig_ret_address, unsigned long trampoline_address)
 221{
 222        if (!orig_ret_address || (orig_ret_address == trampoline_address)) {
 223                printk("kretprobe BUG!: Processing kretprobe %p @ %p\n",
 224                                ri->rp, ri->rp->kp.addr);
 225                BUG();
 226        }
 227}
 228
 229#ifdef CONFIG_KPROBES_SANITY_TEST
 230extern int init_test_probes(void);
 231#else
 232static inline int init_test_probes(void)
 233{
 234        return 0;
 235}
 236#endif /* CONFIG_KPROBES_SANITY_TEST */
 237
 238extern int arch_prepare_kprobe(struct kprobe *p);
 239extern void arch_arm_kprobe(struct kprobe *p);
 240extern void arch_disarm_kprobe(struct kprobe *p);
 241extern int arch_init_kprobes(void);
 242extern void show_registers(struct pt_regs *regs);
 243extern void kprobes_inc_nmissed_count(struct kprobe *p);
 244extern bool arch_within_kprobe_blacklist(unsigned long addr);
 245extern bool arch_kprobe_on_func_entry(unsigned long offset);
 246extern bool kprobe_on_func_entry(kprobe_opcode_t *addr, const char *sym, unsigned long offset);
 247
 248extern bool within_kprobe_blacklist(unsigned long addr);
 249
 250struct kprobe_insn_cache {
 251        struct mutex mutex;
 252        void *(*alloc)(void);   /* allocate insn page */
 253        void (*free)(void *);   /* free insn page */
 254        struct list_head pages; /* list of kprobe_insn_page */
 255        size_t insn_size;       /* size of instruction slot */
 256        int nr_garbage;
 257};
 258
 259#ifdef __ARCH_WANT_KPROBES_INSN_SLOT
 260extern kprobe_opcode_t *__get_insn_slot(struct kprobe_insn_cache *c);
 261extern void __free_insn_slot(struct kprobe_insn_cache *c,
 262                             kprobe_opcode_t *slot, int dirty);
 263/* sleep-less address checking routine  */
 264extern bool __is_insn_slot_addr(struct kprobe_insn_cache *c,
 265                                unsigned long addr);
 266
 267#define DEFINE_INSN_CACHE_OPS(__name)                                   \
 268extern struct kprobe_insn_cache kprobe_##__name##_slots;                \
 269                                                                        \
 270static inline kprobe_opcode_t *get_##__name##_slot(void)                \
 271{                                                                       \
 272        return __get_insn_slot(&kprobe_##__name##_slots);               \
 273}                                                                       \
 274                                                                        \
 275static inline void free_##__name##_slot(kprobe_opcode_t *slot, int dirty)\
 276{                                                                       \
 277        __free_insn_slot(&kprobe_##__name##_slots, slot, dirty);        \
 278}                                                                       \
 279                                                                        \
 280static inline bool is_kprobe_##__name##_slot(unsigned long addr)        \
 281{                                                                       \
 282        return __is_insn_slot_addr(&kprobe_##__name##_slots, addr);     \
 283}
 284#else /* __ARCH_WANT_KPROBES_INSN_SLOT */
 285#define DEFINE_INSN_CACHE_OPS(__name)                                   \
 286static inline bool is_kprobe_##__name##_slot(unsigned long addr)        \
 287{                                                                       \
 288        return 0;                                                       \
 289}
 290#endif
 291
 292DEFINE_INSN_CACHE_OPS(insn);
 293
 294#ifdef CONFIG_OPTPROBES
 295/*
 296 * Internal structure for direct jump optimized probe
 297 */
 298struct optimized_kprobe {
 299        struct kprobe kp;
 300        struct list_head list;  /* list for optimizing queue */
 301        struct arch_optimized_insn optinsn;
 302};
 303
 304/* Architecture dependent functions for direct jump optimization */
 305extern int arch_prepared_optinsn(struct arch_optimized_insn *optinsn);
 306extern int arch_check_optimized_kprobe(struct optimized_kprobe *op);
 307extern int arch_prepare_optimized_kprobe(struct optimized_kprobe *op,
 308                                         struct kprobe *orig);
 309extern void arch_remove_optimized_kprobe(struct optimized_kprobe *op);
 310extern void arch_optimize_kprobes(struct list_head *oplist);
 311extern void arch_unoptimize_kprobes(struct list_head *oplist,
 312                                    struct list_head *done_list);
 313extern void arch_unoptimize_kprobe(struct optimized_kprobe *op);
 314extern int arch_within_optimized_kprobe(struct optimized_kprobe *op,
 315                                        unsigned long addr);
 316
 317extern void opt_pre_handler(struct kprobe *p, struct pt_regs *regs);
 318
 319DEFINE_INSN_CACHE_OPS(optinsn);
 320
 321#ifdef CONFIG_SYSCTL
 322extern int sysctl_kprobes_optimization;
 323extern int proc_kprobes_optimization_handler(struct ctl_table *table,
 324                                             int write, void __user *buffer,
 325                                             size_t *length, loff_t *ppos);
 326#endif
 327extern void wait_for_kprobe_optimizer(void);
 328#else
 329static inline void wait_for_kprobe_optimizer(void) { }
 330#endif /* CONFIG_OPTPROBES */
 331#ifdef CONFIG_KPROBES_ON_FTRACE
 332extern void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
 333                                  struct ftrace_ops *ops, struct pt_regs *regs);
 334extern int arch_prepare_kprobe_ftrace(struct kprobe *p);
 335#endif
 336
 337int arch_check_ftrace_location(struct kprobe *p);
 338
 339/* Get the kprobe at this addr (if any) - called with preemption disabled */
 340struct kprobe *get_kprobe(void *addr);
 341void kretprobe_hash_lock(struct task_struct *tsk,
 342                         struct hlist_head **head, unsigned long *flags);
 343void kretprobe_hash_unlock(struct task_struct *tsk, unsigned long *flags);
 344struct hlist_head * kretprobe_inst_table_head(struct task_struct *tsk);
 345
 346/* kprobe_running() will just return the current_kprobe on this CPU */
 347static inline struct kprobe *kprobe_running(void)
 348{
 349        return (__this_cpu_read(current_kprobe));
 350}
 351
 352static inline void reset_current_kprobe(void)
 353{
 354        __this_cpu_write(current_kprobe, NULL);
 355}
 356
 357static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void)
 358{
 359        return this_cpu_ptr(&kprobe_ctlblk);
 360}
 361
 362kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset);
 363int register_kprobe(struct kprobe *p);
 364void unregister_kprobe(struct kprobe *p);
 365int register_kprobes(struct kprobe **kps, int num);
 366void unregister_kprobes(struct kprobe **kps, int num);
 367unsigned long arch_deref_entry_point(void *);
 368
 369int register_kretprobe(struct kretprobe *rp);
 370void unregister_kretprobe(struct kretprobe *rp);
 371int register_kretprobes(struct kretprobe **rps, int num);
 372void unregister_kretprobes(struct kretprobe **rps, int num);
 373
 374void kprobe_flush_task(struct task_struct *tk);
 375void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
 376
 377int disable_kprobe(struct kprobe *kp);
 378int enable_kprobe(struct kprobe *kp);
 379
 380void dump_kprobe(struct kprobe *kp);
 381
 382#else /* !CONFIG_KPROBES: */
 383
 384static inline int kprobes_built_in(void)
 385{
 386        return 0;
 387}
 388static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
 389{
 390        return 0;
 391}
 392static inline struct kprobe *get_kprobe(void *addr)
 393{
 394        return NULL;
 395}
 396static inline struct kprobe *kprobe_running(void)
 397{
 398        return NULL;
 399}
 400static inline int register_kprobe(struct kprobe *p)
 401{
 402        return -ENOSYS;
 403}
 404static inline int register_kprobes(struct kprobe **kps, int num)
 405{
 406        return -ENOSYS;
 407}
 408static inline void unregister_kprobe(struct kprobe *p)
 409{
 410}
 411static inline void unregister_kprobes(struct kprobe **kps, int num)
 412{
 413}
 414static inline int register_kretprobe(struct kretprobe *rp)
 415{
 416        return -ENOSYS;
 417}
 418static inline int register_kretprobes(struct kretprobe **rps, int num)
 419{
 420        return -ENOSYS;
 421}
 422static inline void unregister_kretprobe(struct kretprobe *rp)
 423{
 424}
 425static inline void unregister_kretprobes(struct kretprobe **rps, int num)
 426{
 427}
 428static inline void kprobe_flush_task(struct task_struct *tk)
 429{
 430}
 431static inline int disable_kprobe(struct kprobe *kp)
 432{
 433        return -ENOSYS;
 434}
 435static inline int enable_kprobe(struct kprobe *kp)
 436{
 437        return -ENOSYS;
 438}
 439#endif /* CONFIG_KPROBES */
 440static inline int disable_kretprobe(struct kretprobe *rp)
 441{
 442        return disable_kprobe(&rp->kp);
 443}
 444static inline int enable_kretprobe(struct kretprobe *rp)
 445{
 446        return enable_kprobe(&rp->kp);
 447}
 448
 449#ifndef CONFIG_KPROBES
 450static inline bool is_kprobe_insn_slot(unsigned long addr)
 451{
 452        return false;
 453}
 454#endif
 455#ifndef CONFIG_OPTPROBES
 456static inline bool is_kprobe_optinsn_slot(unsigned long addr)
 457{
 458        return false;
 459}
 460#endif
 461
 462#endif /* _LINUX_KPROBES_H */
 463