aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/kprobes.h
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@shinybook.infradead.org>2005-07-02 08:39:09 -0400
committerDavid Woodhouse <dwmw2@shinybook.infradead.org>2005-07-02 08:39:09 -0400
commitd2f6409584e2c62ffad81690562330ff3bf4a458 (patch)
tree3bdfb97d0b51be2f7f414f2107e97603c1206abb /include/linux/kprobes.h
parente1b09eba2686eca94a3a188042b518df6044a3c1 (diff)
parent4a89a04f1ee21a7c1f4413f1ad7dcfac50ff9b63 (diff)
Merge with master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Diffstat (limited to 'include/linux/kprobes.h')
-rw-r--r--include/linux/kprobes.h80
1 files changed, 78 insertions, 2 deletions
diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h
index 99ddba5a4e00..b7a194c4362a 100644
--- a/include/linux/kprobes.h
+++ b/include/linux/kprobes.h
@@ -25,27 +25,45 @@
25 * Rusty Russell). 25 * Rusty Russell).
26 * 2004-July Suparna Bhattacharya <suparna@in.ibm.com> added jumper probes 26 * 2004-July Suparna Bhattacharya <suparna@in.ibm.com> added jumper probes
27 * interface to access function arguments. 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.
28 */ 31 */
29#include <linux/config.h> 32#include <linux/config.h>
30#include <linux/list.h> 33#include <linux/list.h>
31#include <linux/notifier.h> 34#include <linux/notifier.h>
32#include <linux/smp.h> 35#include <linux/smp.h>
36
33#include <asm/kprobes.h> 37#include <asm/kprobes.h>
34 38
39/* kprobe_status settings */
40#define KPROBE_HIT_ACTIVE 0x00000001
41#define KPROBE_HIT_SS 0x00000002
42#define KPROBE_REENTER 0x00000004
43#define KPROBE_HIT_SSDONE 0x00000008
44
35struct kprobe; 45struct kprobe;
36struct pt_regs; 46struct pt_regs;
47struct kretprobe;
48struct kretprobe_instance;
37typedef int (*kprobe_pre_handler_t) (struct kprobe *, struct pt_regs *); 49typedef int (*kprobe_pre_handler_t) (struct kprobe *, struct pt_regs *);
38typedef int (*kprobe_break_handler_t) (struct kprobe *, struct pt_regs *); 50typedef int (*kprobe_break_handler_t) (struct kprobe *, struct pt_regs *);
39typedef void (*kprobe_post_handler_t) (struct kprobe *, struct pt_regs *, 51typedef void (*kprobe_post_handler_t) (struct kprobe *, struct pt_regs *,
40 unsigned long flags); 52 unsigned long flags);
41typedef int (*kprobe_fault_handler_t) (struct kprobe *, struct pt_regs *, 53typedef int (*kprobe_fault_handler_t) (struct kprobe *, struct pt_regs *,
42 int trapnr); 54 int trapnr);
55typedef int (*kretprobe_handler_t) (struct kretprobe_instance *,
56 struct pt_regs *);
57
43struct kprobe { 58struct kprobe {
44 struct hlist_node hlist; 59 struct hlist_node hlist;
45 60
46 /* list of kprobes for multi-handler support */ 61 /* list of kprobes for multi-handler support */
47 struct list_head list; 62 struct list_head list;
48 63
64 /*count the number of times this probe was temporarily disarmed */
65 unsigned long nmissed;
66
49 /* location of the probe point */ 67 /* location of the probe point */
50 kprobe_opcode_t *addr; 68 kprobe_opcode_t *addr;
51 69
@@ -85,6 +103,41 @@ struct jprobe {
85 kprobe_opcode_t *entry; /* probe handling code to jump to */ 103 kprobe_opcode_t *entry; /* probe handling code to jump to */
86}; 104};
87 105
106#ifdef ARCH_SUPPORTS_KRETPROBES
107extern void arch_prepare_kretprobe(struct kretprobe *rp, struct pt_regs *regs);
108#else /* ARCH_SUPPORTS_KRETPROBES */
109static inline void arch_prepare_kretprobe(struct kretprobe *rp,
110 struct pt_regs *regs)
111{
112}
113#endif /* ARCH_SUPPORTS_KRETPROBES */
114/*
115 * Function-return probe -
116 * Note:
117 * User needs to provide a handler function, and initialize maxactive.
118 * maxactive - The maximum number of instances of the probed function that
119 * can be active concurrently.
120 * nmissed - tracks the number of times the probed function's return was
121 * ignored, due to maxactive being too low.
122 *
123 */
124struct kretprobe {
125 struct kprobe kp;
126 kretprobe_handler_t handler;
127 int maxactive;
128 int nmissed;
129 struct hlist_head free_instances;
130 struct hlist_head used_instances;
131};
132
133struct kretprobe_instance {
134 struct hlist_node uflist; /* either on free list or used list */
135 struct hlist_node hlist;
136 struct kretprobe *rp;
137 kprobe_opcode_t *ret_addr;
138 struct task_struct *task;
139};
140
88#ifdef CONFIG_KPROBES 141#ifdef CONFIG_KPROBES
89/* Locks kprobe: irq must be disabled */ 142/* Locks kprobe: irq must be disabled */
90void lock_kprobes(void); 143void lock_kprobes(void);
@@ -99,11 +152,17 @@ static inline int kprobe_running(void)
99 152
100extern int arch_prepare_kprobe(struct kprobe *p); 153extern int arch_prepare_kprobe(struct kprobe *p);
101extern void arch_copy_kprobe(struct kprobe *p); 154extern void arch_copy_kprobe(struct kprobe *p);
155extern void arch_arm_kprobe(struct kprobe *p);
156extern void arch_disarm_kprobe(struct kprobe *p);
102extern void arch_remove_kprobe(struct kprobe *p); 157extern void arch_remove_kprobe(struct kprobe *p);
158extern int arch_init(void);
103extern void show_registers(struct pt_regs *regs); 159extern void show_registers(struct pt_regs *regs);
160extern kprobe_opcode_t *get_insn_slot(void);
161extern void free_insn_slot(kprobe_opcode_t *slot);
104 162
105/* Get the kprobe at this addr (if any). Must have called lock_kprobes */ 163/* Get the kprobe at this addr (if any). Must have called lock_kprobes */
106struct kprobe *get_kprobe(void *addr); 164struct kprobe *get_kprobe(void *addr);
165struct hlist_head * kretprobe_inst_table_head(struct task_struct *tsk);
107 166
108int register_kprobe(struct kprobe *p); 167int register_kprobe(struct kprobe *p);
109void unregister_kprobe(struct kprobe *p); 168void unregister_kprobe(struct kprobe *p);
@@ -113,7 +172,14 @@ int register_jprobe(struct jprobe *p);
113void unregister_jprobe(struct jprobe *p); 172void unregister_jprobe(struct jprobe *p);
114void jprobe_return(void); 173void jprobe_return(void);
115 174
116#else 175int register_kretprobe(struct kretprobe *rp);
176void unregister_kretprobe(struct kretprobe *rp);
177
178struct kretprobe_instance *get_free_rp_inst(struct kretprobe *rp);
179void add_rp_inst(struct kretprobe_instance *ri);
180void kprobe_flush_task(struct task_struct *tk);
181void recycle_rp_inst(struct kretprobe_instance *ri);
182#else /* CONFIG_KPROBES */
117static inline int kprobe_running(void) 183static inline int kprobe_running(void)
118{ 184{
119 return 0; 185 return 0;
@@ -135,5 +201,15 @@ static inline void unregister_jprobe(struct jprobe *p)
135static inline void jprobe_return(void) 201static inline void jprobe_return(void)
136{ 202{
137} 203}
138#endif 204static inline int register_kretprobe(struct kretprobe *rp)
205{
206 return -ENOSYS;
207}
208static inline void unregister_kretprobe(struct kretprobe *rp)
209{
210}
211static inline void kprobe_flush_task(struct task_struct *tk)
212{
213}
214#endif /* CONFIG_KPROBES */
139#endif /* _LINUX_KPROBES_H */ 215#endif /* _LINUX_KPROBES_H */