Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
kprobes.h
Go to the documentation of this file.
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 <
[email protected]
> Kernel
24
* Probes initial implementation ( includes suggestions from
25
* Rusty Russell).
26
* 2004-July Suparna Bhattacharya <
[email protected]
> added jumper probes
27
* interface to access function arguments.
28
* 2005-May Hien Nguyen <
[email protected]
> and Jim Keniston
29
* <
[email protected]
> and Prasanna S Panchamukhi
30
* <
[email protected]
> 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/bug.h
>
37
#include <
linux/percpu.h
>
38
#include <
linux/spinlock.h
>
39
#include <
linux/rcupdate.h
>
40
#include <
linux/mutex.h
>
41
#include <
linux/ftrace.h
>
42
43
#ifdef CONFIG_KPROBES
44
#include <asm/kprobes.h>
45
46
/* kprobe_status settings */
47
#define KPROBE_HIT_ACTIVE 0x00000001
48
#define KPROBE_HIT_SS 0x00000002
49
#define KPROBE_REENTER 0x00000004
50
#define KPROBE_HIT_SSDONE 0x00000008
51
52
/*
53
* If function tracer is enabled and the arch supports full
54
* passing of pt_regs to function tracing, then kprobes can
55
* optimize on top of function tracing.
56
*/
57
#if defined(CONFIG_FUNCTION_TRACER) && defined(ARCH_SUPPORTS_FTRACE_SAVE_REGS) \
58
&& defined(ARCH_SUPPORTS_KPROBES_ON_FTRACE)
59
# define KPROBES_CAN_USE_FTRACE
60
#endif
61
62
/* Attach to insert probes on any functions which should be ignored*/
63
#define __kprobes __attribute__((__section__(".kprobes.text")))
64
65
#else
/* CONFIG_KPROBES */
66
typedef
int
kprobe_opcode_t
;
67
struct
arch_specific_insn
{
68
int
dummy
;
69
};
70
#define __kprobes
71
72
#endif
/* CONFIG_KPROBES */
73
74
struct
kprobe
;
75
struct
pt_regs
;
76
struct
kretprobe
;
77
struct
kretprobe_instance
;
78
typedef
int
(*
kprobe_pre_handler_t
) (
struct
kprobe
*,
struct
pt_regs
*);
79
typedef
int
(*
kprobe_break_handler_t
) (
struct
kprobe
*,
struct
pt_regs
*);
80
typedef
void
(*
kprobe_post_handler_t
) (
struct
kprobe
*,
struct
pt_regs
*,
81
unsigned
long
flags
);
82
typedef
int
(*
kprobe_fault_handler_t
) (
struct
kprobe
*,
struct
pt_regs
*,
83
int
trapnr);
84
typedef
int
(*
kretprobe_handler_t
) (
struct
kretprobe_instance
*,
85
struct
pt_regs
*);
86
87
struct
kprobe
{
88
struct
hlist_node
hlist
;
89
90
/* list of kprobes for multi-handler support */
91
struct
list_head
list
;
92
93
/*count the number of times this probe was temporarily disarmed */
94
unsigned
long
nmissed
;
95
96
/* location of the probe point */
97
kprobe_opcode_t
*
addr
;
98
99
/* Allow user to indicate symbol name of the probe point */
100
const
char
*
symbol_name
;
101
102
/* Offset into the symbol */
103
unsigned
int
offset
;
104
105
/* Called before addr is executed. */
106
kprobe_pre_handler_t
pre_handler
;
107
108
/* Called after addr is executed, unless... */
109
kprobe_post_handler_t
post_handler
;
110
111
/*
112
* ... called if executing addr causes a fault (eg. page fault).
113
* Return 1 if it handled fault, otherwise kernel will see it.
114
*/
115
kprobe_fault_handler_t
fault_handler
;
116
117
/*
118
* ... called if breakpoint trap occurs in probe handler.
119
* Return 1 if it handled break, otherwise kernel will see it.
120
*/
121
kprobe_break_handler_t
break_handler
;
122
123
/* Saved opcode (which has been replaced with breakpoint) */
124
kprobe_opcode_t
opcode
;
125
126
/* copy of the original instruction */
127
struct
arch_specific_insn
ainsn
;
128
129
/*
130
* Indicates various status flags.
131
* Protected by kprobe_mutex after this kprobe is registered.
132
*/
133
u32
flags
;
134
};
135
136
/* Kprobe status flags */
137
#define KPROBE_FLAG_GONE 1
/* breakpoint has already gone */
138
#define KPROBE_FLAG_DISABLED 2
/* probe is temporarily disabled */
139
#define KPROBE_FLAG_OPTIMIZED 4
/*
140
* probe is really optimized.
141
* NOTE:
142
* this flag is only for optimized_kprobe.
143
*/
144
#define KPROBE_FLAG_FTRACE 8
/* probe is using ftrace */
145
146
/* Has this kprobe gone ? */
147
static
inline
int
kprobe_gone(
struct
kprobe
*
p
)
148
{
149
return
p->
flags
&
KPROBE_FLAG_GONE
;
150
}
151
152
/* Is this kprobe disabled ? */
153
static
inline
int
kprobe_disabled(
struct
kprobe
*
p
)
154
{
155
return
p->
flags
& (
KPROBE_FLAG_DISABLED
|
KPROBE_FLAG_GONE
);
156
}
157
158
/* Is this kprobe really running optimized path ? */
159
static
inline
int
kprobe_optimized(
struct
kprobe
*
p
)
160
{
161
return
p->
flags
&
KPROBE_FLAG_OPTIMIZED
;
162
}
163
164
/* Is this kprobe uses ftrace ? */
165
static
inline
int
kprobe_ftrace(
struct
kprobe
*
p
)
166
{
167
return
p->
flags
&
KPROBE_FLAG_FTRACE
;
168
}
169
170
/*
171
* Special probe type that uses setjmp-longjmp type tricks to resume
172
* execution at a specified entry with a matching prototype corresponding
173
* to the probed function - a trick to enable arguments to become
174
* accessible seamlessly by probe handling logic.
175
* Note:
176
* Because of the way compilers allocate stack space for local variables
177
* etc upfront, regardless of sub-scopes within a function, this mirroring
178
* principle currently works only for probes placed on function entry points.
179
*/
180
struct
jprobe
{
181
struct
kprobe
kp;
182
void
*
entry
;
/* probe handling code to jump to */
183
};
184
185
/* For backward compatibility with old code using JPROBE_ENTRY() */
186
#define JPROBE_ENTRY(handler) (handler)
187
188
/*
189
* Function-return probe -
190
* Note:
191
* User needs to provide a handler function, and initialize maxactive.
192
* maxactive - The maximum number of instances of the probed function that
193
* can be active concurrently.
194
* nmissed - tracks the number of times the probed function's return was
195
* ignored, due to maxactive being too low.
196
*
197
*/
198
struct
kretprobe
{
199
struct
kprobe
kp
;
200
kretprobe_handler_t
handler
;
201
kretprobe_handler_t
entry_handler
;
202
int
maxactive
;
203
int
nmissed
;
204
size_t
data_size
;
205
struct
hlist_head
free_instances
;
206
raw_spinlock_t
lock
;
207
};
208
209
struct
kretprobe_instance
{
210
struct
hlist_node
hlist
;
211
struct
kretprobe
*
rp
;
212
kprobe_opcode_t
*
ret_addr
;
213
struct
task_struct
*
task
;
214
char
data
[0];
215
};
216
217
struct
kretprobe_blackpoint
{
218
const
char
*
name
;
219
void
*
addr
;
220
};
221
222
struct
kprobe_blackpoint
{
223
const
char
*
name
;
224
unsigned
long
start_addr
;
225
unsigned
long
range
;
226
};
227
228
#ifdef CONFIG_KPROBES
229
DECLARE_PER_CPU
(
struct
kprobe
*, current_kprobe);
230
DECLARE_PER_CPU
(
struct
kprobe_ctlblk
,
kprobe_ctlblk
);
231
232
/*
233
* For #ifdef avoidance:
234
*/
235
static
inline
int
kprobes_built_in(
void
)
236
{
237
return
1;
238
}
239
240
#ifdef CONFIG_KRETPROBES
241
extern
void
arch_prepare_kretprobe
(
struct
kretprobe_instance
*ri,
242
struct
pt_regs
*
regs
);
243
extern
int
arch_trampoline_kprobe
(
struct
kprobe
*
p
);
244
#else
/* CONFIG_KRETPROBES */
245
static
inline
void
arch_prepare_kretprobe
(
struct
kretprobe
*
rp
,
246
struct
pt_regs
*
regs
)
247
{
248
}
249
static
inline
int
arch_trampoline_kprobe
(
struct
kprobe
*
p
)
250
{
251
return
0;
252
}
253
#endif
/* CONFIG_KRETPROBES */
254
255
extern
struct
kretprobe_blackpoint
kretprobe_blacklist
[];
256
257
static
inline
void
kretprobe_assert(
struct
kretprobe_instance
*ri,
258
unsigned
long
orig_ret_address,
unsigned
long
trampoline_address)
259
{
260
if
(!orig_ret_address || (orig_ret_address == trampoline_address)) {
261
printk
(
"kretprobe BUG!: Processing kretprobe %p @ %p\n"
,
262
ri->
rp
, ri->
rp
->kp.addr);
263
BUG
();
264
}
265
}
266
267
#ifdef CONFIG_KPROBES_SANITY_TEST
268
extern
int
init_test_probes
(
void
);
269
#else
270
static
inline
int
init_test_probes
(
void
)
271
{
272
return
0;
273
}
274
#endif
/* CONFIG_KPROBES_SANITY_TEST */
275
276
extern
int
arch_prepare_kprobe
(
struct
kprobe
*
p
);
277
extern
void
arch_arm_kprobe
(
struct
kprobe
*
p
);
278
extern
void
arch_disarm_kprobe
(
struct
kprobe
*
p
);
279
extern
int
arch_init_kprobes
(
void
);
280
extern
void
show_registers
(
struct
pt_regs
*
regs
);
281
extern
kprobe_opcode_t
*get_insn_slot(
void
);
282
extern
void
free_insn_slot(
kprobe_opcode_t
*
slot
,
int
dirty
);
283
extern
void
kprobes_inc_nmissed_count
(
struct
kprobe
*
p
);
284
285
#ifdef CONFIG_OPTPROBES
286
/*
287
* Internal structure for direct jump optimized probe
288
*/
289
struct
optimized_kprobe {
290
struct
kprobe
kp;
291
struct
list_head
list
;
/* list for optimizing queue */
292
struct
arch_optimized_insn
optinsn;
293
};
294
295
/* Architecture dependent functions for direct jump optimization */
296
extern
int
arch_prepared_optinsn(
struct
arch_optimized_insn
*optinsn);
297
extern
int
arch_check_optimized_kprobe
(
struct
optimized_kprobe *
op
);
298
extern
int
arch_prepare_optimized_kprobe
(
struct
optimized_kprobe *
op
);
299
extern
void
arch_remove_optimized_kprobe
(
struct
optimized_kprobe *
op
);
300
extern
void
arch_optimize_kprobes
(
struct
list_head
*oplist);
301
extern
void
arch_unoptimize_kprobes
(
struct
list_head
*oplist,
302
struct
list_head
*done_list);
303
extern
void
arch_unoptimize_kprobe
(
struct
optimized_kprobe *
op
);
304
extern
kprobe_opcode_t
*get_optinsn_slot(
void
);
305
extern
void
free_optinsn_slot(
kprobe_opcode_t
*
slot
,
int
dirty
);
306
extern
int
arch_within_optimized_kprobe
(
struct
optimized_kprobe *
op
,
307
unsigned
long
addr
);
308
309
extern
void
opt_pre_handler(
struct
kprobe
*
p
,
struct
pt_regs
*
regs
);
310
311
#ifdef CONFIG_SYSCTL
312
extern
int
sysctl_kprobes_optimization;
313
extern
int
proc_kprobes_optimization_handler(
struct
ctl_table
*
table
,
314
int
write
,
void
__user *
buffer
,
315
size_t
*
length
, loff_t *ppos);
316
#endif
317
318
#endif
/* CONFIG_OPTPROBES */
319
#ifdef KPROBES_CAN_USE_FTRACE
320
extern
void
kprobe_ftrace_handler(
unsigned
long
ip
,
unsigned
long
parent_ip,
321
struct
ftrace_ops *ops,
struct
pt_regs
*
regs
);
322
extern
int
arch_prepare_kprobe_ftrace(
struct
kprobe
*
p
);
323
#endif
324
325
326
/* Get the kprobe at this addr (if any) - called with preemption disabled */
327
struct
kprobe
*
get_kprobe
(
void
*
addr
);
328
void
kretprobe_hash_lock
(
struct
task_struct
*tsk,
329
struct
hlist_head
**
head
,
unsigned
long
*
flags
);
330
void
kretprobe_hash_unlock
(
struct
task_struct
*tsk,
unsigned
long
*
flags
);
331
struct
hlist_head
* kretprobe_inst_table_head(
struct
task_struct
*tsk);
332
333
/* kprobe_running() will just return the current_kprobe on this CPU */
334
static
inline
struct
kprobe
*kprobe_running(
void
)
335
{
336
return
(
__this_cpu_read
(current_kprobe));
337
}
338
339
static
inline
void
reset_current_kprobe(
void
)
340
{
341
__this_cpu_write
(current_kprobe,
NULL
);
342
}
343
344
static
inline
struct
kprobe_ctlblk
*get_kprobe_ctlblk(
void
)
345
{
346
return
(&
__get_cpu_var
(
kprobe_ctlblk
));
347
}
348
349
int
register_kprobe
(
struct
kprobe
*
p
);
350
void
unregister_kprobe
(
struct
kprobe
*
p
);
351
int
register_kprobes
(
struct
kprobe
**kps,
int
num);
352
void
unregister_kprobes
(
struct
kprobe
**kps,
int
num);
353
int
setjmp_pre_handler
(
struct
kprobe
*,
struct
pt_regs
*);
354
int
longjmp_break_handler
(
struct
kprobe
*,
struct
pt_regs
*);
355
int
register_jprobe
(
struct
jprobe
*
p
);
356
void
unregister_jprobe
(
struct
jprobe
*
p
);
357
int
register_jprobes
(
struct
jprobe
**jps,
int
num);
358
void
unregister_jprobes
(
struct
jprobe
**jps,
int
num);
359
void
jprobe_return
(
void
);
360
unsigned
long
arch_deref_entry_point
(
void
*);
361
362
int
register_kretprobe
(
struct
kretprobe
*
rp
);
363
void
unregister_kretprobe
(
struct
kretprobe
*
rp
);
364
int
register_kretprobes
(
struct
kretprobe
**rps,
int
num);
365
void
unregister_kretprobes
(
struct
kretprobe
**rps,
int
num);
366
367
void
kprobe_flush_task
(
struct
task_struct
*tk);
368
void
recycle_rp_inst
(
struct
kretprobe_instance
*ri,
struct
hlist_head
*
head
);
369
370
int
disable_kprobe
(
struct
kprobe
*kp);
371
int
enable_kprobe
(
struct
kprobe
*kp);
372
373
void
dump_kprobe
(
struct
kprobe
*kp);
374
375
#else
/* !CONFIG_KPROBES: */
376
377
static
inline
int
kprobes_built_in(
void
)
378
{
379
return
0;
380
}
381
static
inline
int
kprobe_fault_handler
(
struct
pt_regs
*
regs
,
int
trapnr)
382
{
383
return
0;
384
}
385
static
inline
struct
kprobe
*
get_kprobe
(
void
*
addr
)
386
{
387
return
NULL
;
388
}
389
static
inline
struct
kprobe
*kprobe_running(
void
)
390
{
391
return
NULL
;
392
}
393
static
inline
int
register_kprobe
(
struct
kprobe
*
p
)
394
{
395
return
-
ENOSYS
;
396
}
397
static
inline
int
register_kprobes
(
struct
kprobe
**kps,
int
num)
398
{
399
return
-
ENOSYS
;
400
}
401
static
inline
void
unregister_kprobe
(
struct
kprobe
*
p
)
402
{
403
}
404
static
inline
void
unregister_kprobes
(
struct
kprobe
**kps,
int
num)
405
{
406
}
407
static
inline
int
register_jprobe
(
struct
jprobe
*
p
)
408
{
409
return
-
ENOSYS
;
410
}
411
static
inline
int
register_jprobes
(
struct
jprobe
**jps,
int
num)
412
{
413
return
-
ENOSYS
;
414
}
415
static
inline
void
unregister_jprobe
(
struct
jprobe
*
p
)
416
{
417
}
418
static
inline
void
unregister_jprobes
(
struct
jprobe
**jps,
int
num)
419
{
420
}
421
static
inline
void
jprobe_return
(
void
)
422
{
423
}
424
static
inline
int
register_kretprobe
(
struct
kretprobe
*
rp
)
425
{
426
return
-
ENOSYS
;
427
}
428
static
inline
int
register_kretprobes
(
struct
kretprobe
**rps,
int
num)
429
{
430
return
-
ENOSYS
;
431
}
432
static
inline
void
unregister_kretprobe
(
struct
kretprobe
*
rp
)
433
{
434
}
435
static
inline
void
unregister_kretprobes
(
struct
kretprobe
**rps,
int
num)
436
{
437
}
438
static
inline
void
kprobe_flush_task
(
struct
task_struct
*tk)
439
{
440
}
441
static
inline
int
disable_kprobe
(
struct
kprobe
*kp)
442
{
443
return
-
ENOSYS
;
444
}
445
static
inline
int
enable_kprobe
(
struct
kprobe
*kp)
446
{
447
return
-
ENOSYS
;
448
}
449
#endif
/* CONFIG_KPROBES */
450
static
inline
int
disable_kretprobe(
struct
kretprobe
*
rp
)
451
{
452
return
disable_kprobe
(&rp->
kp
);
453
}
454
static
inline
int
enable_kretprobe(
struct
kretprobe
*
rp
)
455
{
456
return
enable_kprobe
(&rp->
kp
);
457
}
458
static
inline
int
disable_jprobe(
struct
jprobe
*
jp
)
459
{
460
return
disable_kprobe
(&jp->
kp
);
461
}
462
static
inline
int
enable_jprobe(
struct
jprobe
*
jp
)
463
{
464
return
enable_kprobe
(&jp->
kp
);
465
}
466
467
#endif
/* _LINUX_KPROBES_H */
Generated on Thu Jan 10 2013 12:55:16 for Linux Kernel by
1.8.2