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/linkage.h>
  33#include <linux/list.h>
  34#include <linux/notifier.h>
  35#include <linux/smp.h>
  36#include <linux/percpu.h>
  37#include <linux/spinlock.h>
  38#include <linux/rcupdate.h>
  39#include <linux/mutex.h>
  40
  41#ifdef CONFIG_KPROBES
  42#include <asm/kprobes.h>
  43
  44/* kprobe_status settings */
  45#define KPROBE_HIT_ACTIVE       0x00000001
  46#define KPROBE_HIT_SS           0x00000002
  47#define KPROBE_REENTER          0x00000004
  48#define KPROBE_HIT_SSDONE       0x00000008
  49
  50/* Attach to insert probes on any functions which should be ignored*/
  51#define __kprobes       __attribute__((__section__(".kprobes.text"))) notrace
  52#else /* CONFIG_KPROBES */
  53typedef int kprobe_opcode_t;
  54struct arch_specific_insn {
  55        int dummy;
  56};
  57#define __kprobes       notrace
  58#endif /* CONFIG_KPROBES */
  59
  60struct kprobe;
  61struct pt_regs;
  62struct kretprobe;
  63struct kretprobe_instance;
  64typedef int (*kprobe_pre_handler_t) (struct kprobe *, struct pt_regs *);
  65typedef int (*kprobe_break_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        /* ... called if executing addr causes a fault (eg. page fault).
  98         * Return 1 if it handled fault, otherwise kernel will see it. */
  99        kprobe_fault_handler_t fault_handler;
 100
 101        /* ... called if breakpoint trap occurs in probe handler.
 102         * Return 1 if it handled break, otherwise kernel will see it. */
 103        kprobe_break_handler_t break_handler;
 104
 105        /* Saved opcode (which has been replaced with breakpoint) */
 106        kprobe_opcode_t opcode;
 107
 108        /* copy of the original instruction */
 109        struct arch_specific_insn ainsn;
 110
 111        /* Indicates various status flags.  Protected by kprobe_mutex. */
 112        u32 flags;
 113};
 114
 115/* Kprobe status flags */
 116#define KPROBE_FLAG_GONE        1 /* breakpoint has already gone */
 117
 118static inline int kprobe_gone(struct kprobe *p)
 119{
 120        return p->flags & KPROBE_FLAG_GONE;
 121}
 122
 123/*
 124 * Special probe type that uses setjmp-longjmp type tricks to resume
 125 * execution at a specified entry with a matching prototype corresponding
 126 * to the probed function - a trick to enable arguments to become
 127 * accessible seamlessly by probe handling logic.
 128 * Note:
 129 * Because of the way compilers allocate stack space for local variables
 130 * etc upfront, regardless of sub-scopes within a function, this mirroring
 131 * principle currently works only for probes placed on function entry points.
 132 */
 133struct jprobe {
 134        struct kprobe kp;
 135        void *entry;    /* probe handling code to jump to */
 136};
 137
 138/* For backward compatibility with old code using JPROBE_ENTRY() */
 139#define JPROBE_ENTRY(handler)   (handler)
 140
 141/*
 142 * Function-return probe -
 143 * Note:
 144 * User needs to provide a handler function, and initialize maxactive.
 145 * maxactive - The maximum number of instances of the probed function that
 146 * can be active concurrently.
 147 * nmissed - tracks the number of times the probed function's return was
 148 * ignored, due to maxactive being too low.
 149 *
 150 */
 151struct kretprobe {
 152        struct kprobe kp;
 153        kretprobe_handler_t handler;
 154        kretprobe_handler_t entry_handler;
 155        int maxactive;
 156        int nmissed;
 157        size_t data_size;
 158        struct hlist_head free_instances;
 159        spinlock_t lock;
 160};
 161
 162struct kretprobe_instance {
 163        struct hlist_node hlist;
 164        struct kretprobe *rp;
 165        kprobe_opcode_t *ret_addr;
 166        struct task_struct *task;
 167        char data[0];
 168};
 169
 170struct kretprobe_blackpoint {
 171        const char *name;
 172        void *addr;
 173};
 174
 175struct kprobe_blackpoint {
 176        const char *name;
 177        unsigned long start_addr;
 178        unsigned long range;
 179};
 180
 181#ifdef CONFIG_KPROBES
 182DECLARE_PER_CPU(struct kprobe *, current_kprobe);
 183DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
 184
 185#ifdef CONFIG_KRETPROBES
 186extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
 187                                   struct pt_regs *regs);
 188extern int arch_trampoline_kprobe(struct kprobe *p);
 189#else /* CONFIG_KRETPROBES */
 190static inline void arch_prepare_kretprobe(struct kretprobe *rp,
 191                                        struct pt_regs *regs)
 192{
 193}
 194static inline int arch_trampoline_kprobe(struct kprobe *p)
 195{
 196        return 0;
 197}
 198#endif /* CONFIG_KRETPROBES */
 199
 200extern struct kretprobe_blackpoint kretprobe_blacklist[];
 201
 202static inline void kretprobe_assert(struct kretprobe_instance *ri,
 203        unsigned long orig_ret_address, unsigned long trampoline_address)
 204{
 205        if (!orig_ret_address || (orig_ret_address == trampoline_address)) {
 206                printk("kretprobe BUG!: Processing kretprobe %p @ %p\n",
 207                                ri->rp, ri->rp->kp.addr);
 208                BUG();
 209        }
 210}
 211
 212#ifdef CONFIG_KPROBES_SANITY_TEST
 213extern int init_test_probes(void);
 214#else
 215static inline int init_test_probes(void)
 216{
 217        return 0;
 218}
 219#endif /* CONFIG_KPROBES_SANITY_TEST */
 220
 221extern int arch_prepare_kprobe(struct kprobe *p);
 222extern void arch_arm_kprobe(struct kprobe *p);
 223extern void arch_disarm_kprobe(struct kprobe *p);
 224extern int arch_init_kprobes(void);
 225extern void show_registers(struct pt_regs *regs);
 226extern kprobe_opcode_t *get_insn_slot(void);
 227extern void free_insn_slot(kprobe_opcode_t *slot, int dirty);
 228extern void kprobes_inc_nmissed_count(struct kprobe *p);
 229
 230/* Get the kprobe at this addr (if any) - called with preemption disabled */
 231struct kprobe *get_kprobe(void *addr);
 232void kretprobe_hash_lock(struct task_struct *tsk,
 233                         struct hlist_head **head, unsigned long *flags);
 234void kretprobe_hash_unlock(struct task_struct *tsk, unsigned long *flags);
 235struct hlist_head * kretprobe_inst_table_head(struct task_struct *tsk);
 236
 237/* kprobe_running() will just return the current_kprobe on this CPU */
 238static inline struct kprobe *kprobe_running(void)
 239{
 240        return (__get_cpu_var(current_kprobe));
 241}
 242
 243static inline void reset_current_kprobe(void)
 244{
 245        __get_cpu_var(current_kprobe) = NULL;
 246}
 247
 248static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void)
 249{
 250        return (&__get_cpu_var(kprobe_ctlblk));
 251}
 252
 253int register_kprobe(struct kprobe *p);
 254void unregister_kprobe(struct kprobe *p);
 255int register_kprobes(struct kprobe **kps, int num);
 256void unregister_kprobes(struct kprobe **kps, int num);
 257int setjmp_pre_handler(struct kprobe *, struct pt_regs *);
 258int longjmp_break_handler(struct kprobe *, struct pt_regs *);
 259int register_jprobe(struct jprobe *p);
 260void unregister_jprobe(struct jprobe *p);
 261int register_jprobes(struct jprobe **jps, int num);
 262void unregister_jprobes(struct jprobe **jps, int num);
 263void jprobe_return(void);
 264unsigned long arch_deref_entry_point(void *);
 265
 266int register_kretprobe(struct kretprobe *rp);
 267void unregister_kretprobe(struct kretprobe *rp);
 268int register_kretprobes(struct kretprobe **rps, int num);
 269void unregister_kretprobes(struct kretprobe **rps, int num);
 270
 271void kprobe_flush_task(struct task_struct *tk);
 272void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
 273
 274#else /* CONFIG_KPROBES */
 275
 276static inline struct kprobe *get_kprobe(void *addr)
 277{
 278        return NULL;
 279}
 280static inline struct kprobe *kprobe_running(void)
 281{
 282        return NULL;
 283}
 284static inline int register_kprobe(struct kprobe *p)
 285{
 286        return -ENOSYS;
 287}
 288static inline int register_kprobes(struct kprobe **kps, int num)
 289{
 290        return -ENOSYS;
 291}
 292static inline void unregister_kprobe(struct kprobe *p)
 293{
 294}
 295static inline void unregister_kprobes(struct kprobe **kps, int num)
 296{
 297}
 298static inline int register_jprobe(struct jprobe *p)
 299{
 300        return -ENOSYS;
 301}
 302static inline int register_jprobes(struct jprobe **jps, int num)
 303{
 304        return -ENOSYS;
 305}
 306static inline void unregister_jprobe(struct jprobe *p)
 307{
 308}
 309static inline void unregister_jprobes(struct jprobe **jps, int num)
 310{
 311}
 312static inline void jprobe_return(void)
 313{
 314}
 315static inline int register_kretprobe(struct kretprobe *rp)
 316{
 317        return -ENOSYS;
 318}
 319static inline int register_kretprobes(struct kretprobe **rps, int num)
 320{
 321        return -ENOSYS;
 322}
 323static inline void unregister_kretprobe(struct kretprobe *rp)
 324{
 325}
 326static inline void unregister_kretprobes(struct kretprobe **rps, int num)
 327{
 328}
 329static inline void kprobe_flush_task(struct task_struct *tk)
 330{
 331}
 332#endif                          /* CONFIG_KPROBES */
 333#endif                          /* _LINUX_KPROBES_H */
 334
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.