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/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
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
54#include <asm-generic/kprobes.h>
55typedef int kprobe_opcode_t;
56struct arch_specific_insn {
57 int dummy;
58};
59#endif
60
61struct kprobe;
62struct pt_regs;
63struct kretprobe;
64struct kretprobe_instance;
65typedef int (*kprobe_pre_handler_t) (struct kprobe *, struct pt_regs *);
66typedef int (*kprobe_break_handler_t) (struct kprobe *, struct pt_regs *);
67typedef void (*kprobe_post_handler_t) (struct kprobe *, struct pt_regs *,
68 unsigned long flags);
69typedef int (*kprobe_fault_handler_t) (struct kprobe *, struct pt_regs *,
70 int trapnr);
71typedef int (*kretprobe_handler_t) (struct kretprobe_instance *,
72 struct pt_regs *);
73
74struct kprobe {
75 struct hlist_node hlist;
76
77
78 struct list_head list;
79
80
81 unsigned long nmissed;
82
83
84 kprobe_opcode_t *addr;
85
86
87 const char *symbol_name;
88
89
90 unsigned int offset;
91
92
93 kprobe_pre_handler_t pre_handler;
94
95
96 kprobe_post_handler_t post_handler;
97
98
99
100
101
102 kprobe_fault_handler_t fault_handler;
103
104
105
106
107
108 kprobe_break_handler_t break_handler;
109
110
111 kprobe_opcode_t opcode;
112
113
114 struct arch_specific_insn ainsn;
115
116
117
118
119
120 u32 flags;
121};
122
123
124#define KPROBE_FLAG_GONE 1
125#define KPROBE_FLAG_DISABLED 2
126#define KPROBE_FLAG_OPTIMIZED 4
127
128
129
130
131#define KPROBE_FLAG_FTRACE 8
132
133
134static inline int kprobe_gone(struct kprobe *p)
135{
136 return p->flags & KPROBE_FLAG_GONE;
137}
138
139
140static inline int kprobe_disabled(struct kprobe *p)
141{
142 return p->flags & (KPROBE_FLAG_DISABLED | KPROBE_FLAG_GONE);
143}
144
145
146static inline int kprobe_optimized(struct kprobe *p)
147{
148 return p->flags & KPROBE_FLAG_OPTIMIZED;
149}
150
151
152static inline int kprobe_ftrace(struct kprobe *p)
153{
154 return p->flags & KPROBE_FLAG_FTRACE;
155}
156
157
158
159
160
161
162
163
164
165
166
167struct jprobe {
168 struct kprobe kp;
169 void *entry;
170};
171
172
173#define JPROBE_ENTRY(handler) (handler)
174
175
176
177
178
179
180
181
182
183
184
185struct kretprobe {
186 struct kprobe kp;
187 kretprobe_handler_t handler;
188 kretprobe_handler_t entry_handler;
189 int maxactive;
190 int nmissed;
191 size_t data_size;
192 struct hlist_head free_instances;
193 raw_spinlock_t lock;
194};
195
196struct kretprobe_instance {
197 struct hlist_node hlist;
198 struct kretprobe *rp;
199 kprobe_opcode_t *ret_addr;
200 struct task_struct *task;
201 char data[0];
202};
203
204struct kretprobe_blackpoint {
205 const char *name;
206 void *addr;
207};
208
209struct kprobe_blacklist_entry {
210 struct list_head list;
211 unsigned long start_addr;
212 unsigned long end_addr;
213};
214
215#ifdef CONFIG_KPROBES
216DECLARE_PER_CPU(struct kprobe *, current_kprobe);
217DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
218
219
220
221
222static inline int kprobes_built_in(void)
223{
224 return 1;
225}
226
227#ifdef CONFIG_KRETPROBES
228extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
229 struct pt_regs *regs);
230extern int arch_trampoline_kprobe(struct kprobe *p);
231#else
232static inline void arch_prepare_kretprobe(struct kretprobe *rp,
233 struct pt_regs *regs)
234{
235}
236static inline int arch_trampoline_kprobe(struct kprobe *p)
237{
238 return 0;
239}
240#endif
241
242extern struct kretprobe_blackpoint kretprobe_blacklist[];
243
244static inline void kretprobe_assert(struct kretprobe_instance *ri,
245 unsigned long orig_ret_address, unsigned long trampoline_address)
246{
247 if (!orig_ret_address || (orig_ret_address == trampoline_address)) {
248 printk("kretprobe BUG!: Processing kretprobe %p @ %p\n",
249 ri->rp, ri->rp->kp.addr);
250 BUG();
251 }
252}
253
254#ifdef CONFIG_KPROBES_SANITY_TEST
255extern int init_test_probes(void);
256#else
257static inline int init_test_probes(void)
258{
259 return 0;
260}
261#endif
262
263extern int arch_prepare_kprobe(struct kprobe *p);
264extern void arch_arm_kprobe(struct kprobe *p);
265extern void arch_disarm_kprobe(struct kprobe *p);
266extern int arch_init_kprobes(void);
267extern void show_registers(struct pt_regs *regs);
268extern void kprobes_inc_nmissed_count(struct kprobe *p);
269extern bool arch_within_kprobe_blacklist(unsigned long addr);
270
271extern bool within_kprobe_blacklist(unsigned long addr);
272
273struct kprobe_insn_cache {
274 struct mutex mutex;
275 void *(*alloc)(void);
276 void (*free)(void *);
277 struct list_head pages;
278 size_t insn_size;
279 int nr_garbage;
280};
281
282#ifdef __ARCH_WANT_KPROBES_INSN_SLOT
283extern kprobe_opcode_t *__get_insn_slot(struct kprobe_insn_cache *c);
284extern void __free_insn_slot(struct kprobe_insn_cache *c,
285 kprobe_opcode_t *slot, int dirty);
286
287extern bool __is_insn_slot_addr(struct kprobe_insn_cache *c,
288 unsigned long addr);
289
290#define DEFINE_INSN_CACHE_OPS(__name) \
291extern struct kprobe_insn_cache kprobe_##__name##_slots; \
292 \
293static inline kprobe_opcode_t *get_##__name##_slot(void) \
294{ \
295 return __get_insn_slot(&kprobe_##__name##_slots); \
296} \
297 \
298static inline void free_##__name##_slot(kprobe_opcode_t *slot, int dirty)\
299{ \
300 __free_insn_slot(&kprobe_##__name##_slots, slot, dirty); \
301} \
302 \
303static inline bool is_kprobe_##__name##_slot(unsigned long addr) \
304{ \
305 return __is_insn_slot_addr(&kprobe_##__name##_slots, addr); \
306}
307#else
308#define DEFINE_INSN_CACHE_OPS(__name) \
309static inline bool is_kprobe_##__name##_slot(unsigned long addr) \
310{ \
311 return 0; \
312}
313#endif
314
315DEFINE_INSN_CACHE_OPS(insn);
316
317#ifdef CONFIG_OPTPROBES
318
319
320
321struct optimized_kprobe {
322 struct kprobe kp;
323 struct list_head list;
324 struct arch_optimized_insn optinsn;
325};
326
327
328extern int arch_prepared_optinsn(struct arch_optimized_insn *optinsn);
329extern int arch_check_optimized_kprobe(struct optimized_kprobe *op);
330extern int arch_prepare_optimized_kprobe(struct optimized_kprobe *op,
331 struct kprobe *orig);
332extern void arch_remove_optimized_kprobe(struct optimized_kprobe *op);
333extern void arch_optimize_kprobes(struct list_head *oplist);
334extern void arch_unoptimize_kprobes(struct list_head *oplist,
335 struct list_head *done_list);
336extern void arch_unoptimize_kprobe(struct optimized_kprobe *op);
337extern int arch_within_optimized_kprobe(struct optimized_kprobe *op,
338 unsigned long addr);
339
340extern void opt_pre_handler(struct kprobe *p, struct pt_regs *regs);
341
342DEFINE_INSN_CACHE_OPS(optinsn);
343
344#ifdef CONFIG_SYSCTL
345extern int sysctl_kprobes_optimization;
346extern int proc_kprobes_optimization_handler(struct ctl_table *table,
347 int write, void __user *buffer,
348 size_t *length, loff_t *ppos);
349#endif
350#endif
351#ifdef CONFIG_KPROBES_ON_FTRACE
352extern void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
353 struct ftrace_ops *ops, struct pt_regs *regs);
354extern int arch_prepare_kprobe_ftrace(struct kprobe *p);
355#endif
356
357int arch_check_ftrace_location(struct kprobe *p);
358
359
360struct kprobe *get_kprobe(void *addr);
361void kretprobe_hash_lock(struct task_struct *tsk,
362 struct hlist_head **head, unsigned long *flags);
363void kretprobe_hash_unlock(struct task_struct *tsk, unsigned long *flags);
364struct hlist_head * kretprobe_inst_table_head(struct task_struct *tsk);
365
366
367static inline struct kprobe *kprobe_running(void)
368{
369 return (__this_cpu_read(current_kprobe));
370}
371
372static inline void reset_current_kprobe(void)
373{
374 __this_cpu_write(current_kprobe, NULL);
375}
376
377static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void)
378{
379 return this_cpu_ptr(&kprobe_ctlblk);
380}
381
382int register_kprobe(struct kprobe *p);
383void unregister_kprobe(struct kprobe *p);
384int register_kprobes(struct kprobe **kps, int num);
385void unregister_kprobes(struct kprobe **kps, int num);
386int setjmp_pre_handler(struct kprobe *, struct pt_regs *);
387int longjmp_break_handler(struct kprobe *, struct pt_regs *);
388int register_jprobe(struct jprobe *p);
389void unregister_jprobe(struct jprobe *p);
390int register_jprobes(struct jprobe **jps, int num);
391void unregister_jprobes(struct jprobe **jps, int num);
392void jprobe_return(void);
393unsigned long arch_deref_entry_point(void *);
394
395int register_kretprobe(struct kretprobe *rp);
396void unregister_kretprobe(struct kretprobe *rp);
397int register_kretprobes(struct kretprobe **rps, int num);
398void unregister_kretprobes(struct kretprobe **rps, int num);
399
400void kprobe_flush_task(struct task_struct *tk);
401void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
402
403int disable_kprobe(struct kprobe *kp);
404int enable_kprobe(struct kprobe *kp);
405
406void dump_kprobe(struct kprobe *kp);
407
408#else
409
410static inline int kprobes_built_in(void)
411{
412 return 0;
413}
414static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
415{
416 return 0;
417}
418static inline struct kprobe *get_kprobe(void *addr)
419{
420 return NULL;
421}
422static inline struct kprobe *kprobe_running(void)
423{
424 return NULL;
425}
426static inline int register_kprobe(struct kprobe *p)
427{
428 return -ENOSYS;
429}
430static inline int register_kprobes(struct kprobe **kps, int num)
431{
432 return -ENOSYS;
433}
434static inline void unregister_kprobe(struct kprobe *p)
435{
436}
437static inline void unregister_kprobes(struct kprobe **kps, int num)
438{
439}
440static inline int register_jprobe(struct jprobe *p)
441{
442 return -ENOSYS;
443}
444static inline int register_jprobes(struct jprobe **jps, int num)
445{
446 return -ENOSYS;
447}
448static inline void unregister_jprobe(struct jprobe *p)
449{
450}
451static inline void unregister_jprobes(struct jprobe **jps, int num)
452{
453}
454static inline void jprobe_return(void)
455{
456}
457static inline int register_kretprobe(struct kretprobe *rp)
458{
459 return -ENOSYS;
460}
461static inline int register_kretprobes(struct kretprobe **rps, int num)
462{
463 return -ENOSYS;
464}
465static inline void unregister_kretprobe(struct kretprobe *rp)
466{
467}
468static inline void unregister_kretprobes(struct kretprobe **rps, int num)
469{
470}
471static inline void kprobe_flush_task(struct task_struct *tk)
472{
473}
474static inline int disable_kprobe(struct kprobe *kp)
475{
476 return -ENOSYS;
477}
478static inline int enable_kprobe(struct kprobe *kp)
479{
480 return -ENOSYS;
481}
482#endif
483static inline int disable_kretprobe(struct kretprobe *rp)
484{
485 return disable_kprobe(&rp->kp);
486}
487static inline int enable_kretprobe(struct kretprobe *rp)
488{
489 return enable_kprobe(&rp->kp);
490}
491static inline int disable_jprobe(struct jprobe *jp)
492{
493 return disable_kprobe(&jp->kp);
494}
495static inline int enable_jprobe(struct jprobe *jp)
496{
497 return enable_kprobe(&jp->kp);
498}
499
500#ifndef CONFIG_KPROBES
501static inline bool is_kprobe_insn_slot(unsigned long addr)
502{
503 return false;
504}
505#endif
506#ifndef CONFIG_OPTPROBES
507static inline bool is_kprobe_optinsn_slot(unsigned long addr)
508{
509 return false;
510}
511#endif
512
513#endif
514