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 int arch_populate_kprobe_blacklist(void);
 246extern bool arch_kprobe_on_func_entry(unsigned long offset);
 247extern bool kprobe_on_func_entry(kprobe_opcode_t *addr, const char *sym, unsigned long offset);
 248
 249extern bool within_kprobe_blacklist(unsigned long addr);
 250extern int kprobe_add_ksym_blacklist(unsigned long entry);
 251extern int kprobe_add_area_blacklist(unsigned long start, unsigned long end);
 252
 253struct kprobe_insn_cache {
 254        struct mutex mutex;
 255        void *(*alloc)(void);   /* allocate insn page */
 256        void (*free)(void *);   /* free insn page */
 257        struct list_head pages; /* list of kprobe_insn_page */
 258        size_t insn_size;       /* size of instruction slot */
 259        int nr_garbage;
 260};
 261
 262#ifdef __ARCH_WANT_KPROBES_INSN_SLOT
 263extern kprobe_opcode_t *__get_insn_slot(struct kprobe_insn_cache *c);
 264extern void __free_insn_slot(struct kprobe_insn_cache *c,
 265                             kprobe_opcode_t *slot, int dirty);
 266/* sleep-less address checking routine  */
 267extern bool __is_insn_slot_addr(struct kprobe_insn_cache *c,
 268                                unsigned long addr);
 269
 270#define DEFINE_INSN_CACHE_OPS(__name)                                   \
 271extern struct kprobe_insn_cache kprobe_##__name##_slots;                \
 272                                                                        \
 273static inline kprobe_opcode_t *get_##__name##_slot(void)                \
 274{                                                                       \
 275        return __get_insn_slot(&kprobe_##__name##_slots);               \
 276}                                                                       \
 277                                                                        \
 278static inline void free_##__name##_slot(kprobe_opcode_t *slot, int dirty)\
 279{                                                                       \
 280        __free_insn_slot(&kprobe_##__name##_slots, slot, dirty);        \
 281}                                                                       \
 282                                                                        \
 283static inline bool is_kprobe_##__name##_slot(unsigned long addr)        \
 284{                                                                       \
 285        return __is_insn_slot_addr(&kprobe_##__name##_slots, addr);     \
 286}
 287#else /* __ARCH_WANT_KPROBES_INSN_SLOT */
 288#define DEFINE_INSN_CACHE_OPS(__name)                                   \
 289static inline bool is_kprobe_##__name##_slot(unsigned long addr)        \
 290{                                                                       \
 291        return 0;                                                       \
 292}
 293#endif
 294
 295DEFINE_INSN_CACHE_OPS(insn);
 296
 297#ifdef CONFIG_OPTPROBES
 298/*
 299 * Internal structure for direct jump optimized probe
 300 */
 301struct optimized_kprobe {
 302        struct kprobe kp;
 303        struct list_head list;  /* list for optimizing queue */
 304        struct arch_optimized_insn optinsn;
 305};
 306
 307/* Architecture dependent functions for direct jump optimization */
 308extern int arch_prepared_optinsn(struct arch_optimized_insn *optinsn);
 309extern int arch_check_optimized_kprobe(struct optimized_kprobe *op);
 310extern int arch_prepare_optimized_kprobe(struct optimized_kprobe *op,
 311                                         struct kprobe *orig);
 312extern void arch_remove_optimized_kprobe(struct optimized_kprobe *op);
 313extern void arch_optimize_kprobes(struct list_head *oplist);
 314extern void arch_unoptimize_kprobes(struct list_head *oplist,
 315                                    struct list_head *done_list);
 316extern void arch_unoptimize_kprobe(struct optimized_kprobe *op);
 317extern int arch_within_optimized_kprobe(struct optimized_kprobe *op,
 318                                        unsigned long addr);
 319
 320extern void opt_pre_handler(struct kprobe *p, struct pt_regs *regs);
 321
 322DEFINE_INSN_CACHE_OPS(optinsn);
 323
 324#ifdef CONFIG_SYSCTL
 325extern int sysctl_kprobes_optimization;
 326extern int proc_kprobes_optimization_handler(struct ctl_table *table,
 327                                             int write, void __user *buffer,
 328                                             size_t *length, loff_t *ppos);
 329#endif
 330extern void wait_for_kprobe_optimizer(void);
 331#else
 332static inline void wait_for_kprobe_optimizer(void) { }
 333#endif /* CONFIG_OPTPROBES */
 334#ifdef CONFIG_KPROBES_ON_FTRACE
 335extern void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
 336                                  struct ftrace_ops *ops, struct pt_regs *regs);
 337extern int arch_prepare_kprobe_ftrace(struct kprobe *p);
 338#endif
 339
 340int arch_check_ftrace_location(struct kprobe *p);
 341
 342/* Get the kprobe at this addr (if any) - called with preemption disabled */
 343struct kprobe *get_kprobe(void *addr);
 344void kretprobe_hash_lock(struct task_struct *tsk,
 345                         struct hlist_head **head, unsigned long *flags);
 346void kretprobe_hash_unlock(struct task_struct *tsk, unsigned long *flags);
 347struct hlist_head * kretprobe_inst_table_head(struct task_struct *tsk);
 348
 349/* kprobe_running() will just return the current_kprobe on this CPU */
 350static inline struct kprobe *kprobe_running(void)
 351{
 352        return (__this_cpu_read(current_kprobe));
 353}
 354
 355static inline void reset_current_kprobe(void)
 356{
 357        __this_cpu_write(current_kprobe, NULL);
 358}
 359
 360static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void)
 361{
 362        return this_cpu_ptr(&kprobe_ctlblk);
 363}
 364
 365kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset);
 366int register_kprobe(struct kprobe *p);
 367void unregister_kprobe(struct kprobe *p);
 368int register_kprobes(struct kprobe **kps, int num);
 369void unregister_kprobes(struct kprobe **kps, int num);
 370unsigned long arch_deref_entry_point(void *);
 371
 372int register_kretprobe(struct kretprobe *rp);
 373void unregister_kretprobe(struct kretprobe *rp);
 374int register_kretprobes(struct kretprobe **rps, int num);
 375void unregister_kretprobes(struct kretprobe **rps, int num);
 376
 377void kprobe_flush_task(struct task_struct *tk);
 378void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
 379
 380int disable_kprobe(struct kprobe *kp);
 381int enable_kprobe(struct kprobe *kp);
 382
 383void dump_kprobe(struct kprobe *kp);
 384
 385void *alloc_insn_page(void);
 386void free_insn_page(void *page);
 387
 388#else /* !CONFIG_KPROBES: */
 389
 390static inline int kprobes_built_in(void)
 391{
 392        return 0;
 393}
 394static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
 395{
 396        return 0;
 397}
 398static inline struct kprobe *get_kprobe(void *addr)
 399{
 400        return NULL;
 401}
 402static inline struct kprobe *kprobe_running(void)
 403{
 404        return NULL;
 405}
 406static inline int register_kprobe(struct kprobe *p)
 407{
 408        return -ENOSYS;
 409}
 410static inline int register_kprobes(struct kprobe **kps, int num)
 411{
 412        return -ENOSYS;
 413}
 414static inline void unregister_kprobe(struct kprobe *p)
 415{
 416}
 417static inline void unregister_kprobes(struct kprobe **kps, int num)
 418{
 419}
 420static inline int register_kretprobe(struct kretprobe *rp)
 421{
 422        return -ENOSYS;
 423}
 424static inline int register_kretprobes(struct kretprobe **rps, int num)
 425{
 426        return -ENOSYS;
 427}
 428static inline void unregister_kretprobe(struct kretprobe *rp)
 429{
 430}
 431static inline void unregister_kretprobes(struct kretprobe **rps, int num)
 432{
 433}
 434static inline void kprobe_flush_task(struct task_struct *tk)
 435{
 436}
 437static inline int disable_kprobe(struct kprobe *kp)
 438{
 439        return -ENOSYS;
 440}
 441static inline int enable_kprobe(struct kprobe *kp)
 442{
 443        return -ENOSYS;
 444}
 445#endif /* CONFIG_KPROBES */
 446static inline int disable_kretprobe(struct kretprobe *rp)
 447{
 448        return disable_kprobe(&rp->kp);
 449}
 450static inline int enable_kretprobe(struct kretprobe *rp)
 451{
 452        return enable_kprobe(&rp->kp);
 453}
 454
 455#ifndef CONFIG_KPROBES
 456static inline bool is_kprobe_insn_slot(unsigned long addr)
 457{
 458        return false;
 459}
 460#endif
 461#ifndef CONFIG_OPTPROBES
 462static inline bool is_kprobe_optinsn_slot(unsigned long addr)
 463{
 464        return false;
 465}
 466#endif
 467
 468#endif /* _LINUX_KPROBES_H */
 469