diff options
author | David Woodhouse <dwmw2@shinybook.infradead.org> | 2005-07-02 08:39:09 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@shinybook.infradead.org> | 2005-07-02 08:39:09 -0400 |
commit | d2f6409584e2c62ffad81690562330ff3bf4a458 (patch) | |
tree | 3bdfb97d0b51be2f7f414f2107e97603c1206abb /include/linux/kprobes.h | |
parent | e1b09eba2686eca94a3a188042b518df6044a3c1 (diff) | |
parent | 4a89a04f1ee21a7c1f4413f1ad7dcfac50ff9b63 (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.h | 80 |
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 | |||
35 | struct kprobe; | 45 | struct kprobe; |
36 | struct pt_regs; | 46 | struct pt_regs; |
47 | struct kretprobe; | ||
48 | struct kretprobe_instance; | ||
37 | typedef int (*kprobe_pre_handler_t) (struct kprobe *, struct pt_regs *); | 49 | typedef int (*kprobe_pre_handler_t) (struct kprobe *, struct pt_regs *); |
38 | typedef int (*kprobe_break_handler_t) (struct kprobe *, struct pt_regs *); | 50 | typedef int (*kprobe_break_handler_t) (struct kprobe *, struct pt_regs *); |
39 | typedef void (*kprobe_post_handler_t) (struct kprobe *, struct pt_regs *, | 51 | typedef void (*kprobe_post_handler_t) (struct kprobe *, struct pt_regs *, |
40 | unsigned long flags); | 52 | unsigned long flags); |
41 | typedef int (*kprobe_fault_handler_t) (struct kprobe *, struct pt_regs *, | 53 | typedef int (*kprobe_fault_handler_t) (struct kprobe *, struct pt_regs *, |
42 | int trapnr); | 54 | int trapnr); |
55 | typedef int (*kretprobe_handler_t) (struct kretprobe_instance *, | ||
56 | struct pt_regs *); | ||
57 | |||
43 | struct kprobe { | 58 | struct 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 | ||
107 | extern void arch_prepare_kretprobe(struct kretprobe *rp, struct pt_regs *regs); | ||
108 | #else /* ARCH_SUPPORTS_KRETPROBES */ | ||
109 | static 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 | */ | ||
124 | struct 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 | |||
133 | struct 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 */ |
90 | void lock_kprobes(void); | 143 | void lock_kprobes(void); |
@@ -99,11 +152,17 @@ static inline int kprobe_running(void) | |||
99 | 152 | ||
100 | extern int arch_prepare_kprobe(struct kprobe *p); | 153 | extern int arch_prepare_kprobe(struct kprobe *p); |
101 | extern void arch_copy_kprobe(struct kprobe *p); | 154 | extern void arch_copy_kprobe(struct kprobe *p); |
155 | extern void arch_arm_kprobe(struct kprobe *p); | ||
156 | extern void arch_disarm_kprobe(struct kprobe *p); | ||
102 | extern void arch_remove_kprobe(struct kprobe *p); | 157 | extern void arch_remove_kprobe(struct kprobe *p); |
158 | extern int arch_init(void); | ||
103 | extern void show_registers(struct pt_regs *regs); | 159 | extern void show_registers(struct pt_regs *regs); |
160 | extern kprobe_opcode_t *get_insn_slot(void); | ||
161 | extern 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 */ |
106 | struct kprobe *get_kprobe(void *addr); | 164 | struct kprobe *get_kprobe(void *addr); |
165 | struct hlist_head * kretprobe_inst_table_head(struct task_struct *tsk); | ||
107 | 166 | ||
108 | int register_kprobe(struct kprobe *p); | 167 | int register_kprobe(struct kprobe *p); |
109 | void unregister_kprobe(struct kprobe *p); | 168 | void unregister_kprobe(struct kprobe *p); |
@@ -113,7 +172,14 @@ int register_jprobe(struct jprobe *p); | |||
113 | void unregister_jprobe(struct jprobe *p); | 172 | void unregister_jprobe(struct jprobe *p); |
114 | void jprobe_return(void); | 173 | void jprobe_return(void); |
115 | 174 | ||
116 | #else | 175 | int register_kretprobe(struct kretprobe *rp); |
176 | void unregister_kretprobe(struct kretprobe *rp); | ||
177 | |||
178 | struct kretprobe_instance *get_free_rp_inst(struct kretprobe *rp); | ||
179 | void add_rp_inst(struct kretprobe_instance *ri); | ||
180 | void kprobe_flush_task(struct task_struct *tk); | ||
181 | void recycle_rp_inst(struct kretprobe_instance *ri); | ||
182 | #else /* CONFIG_KPROBES */ | ||
117 | static inline int kprobe_running(void) | 183 | static 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) | |||
135 | static inline void jprobe_return(void) | 201 | static inline void jprobe_return(void) |
136 | { | 202 | { |
137 | } | 203 | } |
138 | #endif | 204 | static inline int register_kretprobe(struct kretprobe *rp) |
205 | { | ||
206 | return -ENOSYS; | ||
207 | } | ||
208 | static inline void unregister_kretprobe(struct kretprobe *rp) | ||
209 | { | ||
210 | } | ||
211 | static 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 */ |