1#ifndef _LINUX_KPROBES_H
2#define _LINUX_KPROBES_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
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
51#define __kprobes __attribute__((__section__(".kprobes.text")))
52#else
53typedef int kprobe_opcode_t;
54struct arch_specific_insn {
55 int dummy;
56};
57#define __kprobes
58#endif
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
77 struct list_head list;
78
79
80 unsigned long nmissed;
81
82
83 kprobe_opcode_t *addr;
84
85
86 const char *symbol_name;
87
88
89 unsigned int offset;
90
91
92 kprobe_pre_handler_t pre_handler;
93
94
95 kprobe_post_handler_t post_handler;
96
97
98
99
100
101 kprobe_fault_handler_t fault_handler;
102
103
104
105
106
107 kprobe_break_handler_t break_handler;
108
109
110 kprobe_opcode_t opcode;
111
112
113 struct arch_specific_insn ainsn;
114
115
116
117
118
119 u32 flags;
120};
121
122
123#define KPROBE_FLAG_GONE 1
124#define KPROBE_FLAG_DISABLED 2
125
126
127static inline int kprobe_gone(struct kprobe *p)
128{
129 return p->flags & KPROBE_FLAG_GONE;
130}
131
132
133static inline int kprobe_disabled(struct kprobe *p)
134{
135 return p->flags & (KPROBE_FLAG_DISABLED | KPROBE_FLAG_GONE);
136}
137
138
139
140
141
142
143
144
145
146
147struct jprobe {
148 struct kprobe kp;
149 void *entry;
150};
151
152
153#define JPROBE_ENTRY(handler) (handler)
154
155
156
157
158
159
160
161
162
163
164
165struct kretprobe {
166 struct kprobe kp;
167 kretprobe_handler_t handler;
168 kretprobe_handler_t entry_handler;
169 int maxactive;
170 int nmissed;
171 size_t data_size;
172 struct hlist_head free_instances;
173 spinlock_t lock;
174};
175
176struct kretprobe_instance {
177 struct hlist_node hlist;
178 struct kretprobe *rp;
179 kprobe_opcode_t *ret_addr;
180 struct task_struct *task;
181 char data[0];
182};
183
184struct kretprobe_blackpoint {
185 const char *name;
186 void *addr;
187};
188
189struct kprobe_blackpoint {
190 const char *name;
191 unsigned long start_addr;
192 unsigned long range;
193};
194
195#ifdef CONFIG_KPROBES
196DECLARE_PER_CPU(struct kprobe *, current_kprobe);
197DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
198
199
200
201
202static inline int kprobes_built_in(void)
203{
204 return 1;
205}
206
207#ifdef CONFIG_KRETPROBES
208extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
209 struct pt_regs *regs);
210extern int arch_trampoline_kprobe(struct kprobe *p);
211#else
212static inline void arch_prepare_kretprobe(struct kretprobe *rp,
213 struct pt_regs *regs)
214{
215}
216static inline int arch_trampoline_kprobe(struct kprobe *p)
217{
218 return 0;
219}
220#endif
221
222extern struct kretprobe_blackpoint kretprobe_blacklist[];
223
224static inline void kretprobe_assert(struct kretprobe_instance *ri,
225 unsigned long orig_ret_address, unsigned long trampoline_address)
226{
227 if (!orig_ret_address || (orig_ret_address == trampoline_address)) {
228 printk("kretprobe BUG!: Processing kretprobe %p @ %p\n",
229 ri->rp, ri->rp->kp.addr);
230 BUG();
231 }
232}
233
234#ifdef CONFIG_KPROBES_SANITY_TEST
235extern int init_test_probes(void);
236#else
237static inline int init_test_probes(void)
238{
239 return 0;
240}
241#endif
242
243extern int arch_prepare_kprobe(struct kprobe *p);
244extern void arch_arm_kprobe(struct kprobe *p);
245extern void arch_disarm_kprobe(struct kprobe *p);
246extern int arch_init_kprobes(void);
247extern void show_registers(struct pt_regs *regs);
248extern kprobe_opcode_t *get_insn_slot(void);
249extern void free_insn_slot(kprobe_opcode_t *slot, int dirty);
250extern void kprobes_inc_nmissed_count(struct kprobe *p);
251
252
253struct kprobe *get_kprobe(void *addr);
254void kretprobe_hash_lock(struct task_struct *tsk,
255 struct hlist_head **head, unsigned long *flags);
256void kretprobe_hash_unlock(struct task_struct *tsk, unsigned long *flags);
257struct hlist_head * kretprobe_inst_table_head(struct task_struct *tsk);
258
259
260static inline struct kprobe *kprobe_running(void)
261{
262 return (__get_cpu_var(current_kprobe));
263}
264
265static inline void reset_current_kprobe(void)
266{
267 __get_cpu_var(current_kprobe) = NULL;
268}
269
270static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void)
271{
272 return (&__get_cpu_var(kprobe_ctlblk));
273}
274
275int register_kprobe(struct kprobe *p);
276void unregister_kprobe(struct kprobe *p);
277int register_kprobes(struct kprobe **kps, int num);
278void unregister_kprobes(struct kprobe **kps, int num);
279int setjmp_pre_handler(struct kprobe *, struct pt_regs *);
280int longjmp_break_handler(struct kprobe *, struct pt_regs *);
281int register_jprobe(struct jprobe *p);
282void unregister_jprobe(struct jprobe *p);
283int register_jprobes(struct jprobe **jps, int num);
284void unregister_jprobes(struct jprobe **jps, int num);
285void jprobe_return(void);
286unsigned long arch_deref_entry_point(void *);
287
288int register_kretprobe(struct kretprobe *rp);
289void unregister_kretprobe(struct kretprobe *rp);
290int register_kretprobes(struct kretprobe **rps, int num);
291void unregister_kretprobes(struct kretprobe **rps, int num);
292
293void kprobe_flush_task(struct task_struct *tk);
294void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
295
296int disable_kprobe(struct kprobe *kp);
297int enable_kprobe(struct kprobe *kp);
298
299#else
300
301static inline int kprobes_built_in(void)
302{
303 return 0;
304}
305static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
306{
307 return 0;
308}
309static inline struct kprobe *get_kprobe(void *addr)
310{
311 return NULL;
312}
313static inline struct kprobe *kprobe_running(void)
314{
315 return NULL;
316}
317static inline int register_kprobe(struct kprobe *p)
318{
319 return -ENOSYS;
320}
321static inline int register_kprobes(struct kprobe **kps, int num)
322{
323 return -ENOSYS;
324}
325static inline void unregister_kprobe(struct kprobe *p)
326{
327}
328static inline void unregister_kprobes(struct kprobe **kps, int num)
329{
330}
331static inline int register_jprobe(struct jprobe *p)
332{
333 return -ENOSYS;
334}
335static inline int register_jprobes(struct jprobe **jps, int num)
336{
337 return -ENOSYS;
338}
339static inline void unregister_jprobe(struct jprobe *p)
340{
341}
342static inline void unregister_jprobes(struct jprobe **jps, int num)
343{
344}
345static inline void jprobe_return(void)
346{
347}
348static inline int register_kretprobe(struct kretprobe *rp)
349{
350 return -ENOSYS;
351}
352static inline int register_kretprobes(struct kretprobe **rps, int num)
353{
354 return -ENOSYS;
355}
356static inline void unregister_kretprobe(struct kretprobe *rp)
357{
358}
359static inline void unregister_kretprobes(struct kretprobe **rps, int num)
360{
361}
362static inline void kprobe_flush_task(struct task_struct *tk)
363{
364}
365static inline int disable_kprobe(struct kprobe *kp)
366{
367 return -ENOSYS;
368}
369static inline int enable_kprobe(struct kprobe *kp)
370{
371 return -ENOSYS;
372}
373#endif
374static inline int disable_kretprobe(struct kretprobe *rp)
375{
376 return disable_kprobe(&rp->kp);
377}
378static inline int enable_kretprobe(struct kretprobe *rp)
379{
380 return enable_kprobe(&rp->kp);
381}
382static inline int disable_jprobe(struct jprobe *jp)
383{
384 return disable_kprobe(&jp->kp);
385}
386static inline int enable_jprobe(struct jprobe *jp)
387{
388 return enable_kprobe(&jp->kp);
389}
390
391#endif
392