kprobes.h 13.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 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
#ifndef _LINUX_KPROBES_H
#define _LINUX_KPROBES_H
/*
 *  Kernel Probes (KProbes)
 *  include/linux/kprobes.h
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 * Copyright (C) IBM Corporation, 2002, 2004
 *
 * 2002-Oct	Created by Vamsi Krishna S <vamsi_krishna@in.ibm.com> Kernel
 *		Probes initial implementation ( includes suggestions from
 *		Rusty Russell).
 * 2004-July	Suparna Bhattacharya <suparna@in.ibm.com> added jumper probes
 *		interface to access function arguments.
28 29 30
 * 2005-May	Hien Nguyen <hien@us.ibm.com> and Jim Keniston
 *		<jkenisto@us.ibm.com>  and Prasanna S Panchamukhi
 *		<prasanna@in.ibm.com> added function-return probes.
L
Linus Torvalds 已提交
31
 */
32
#include <linux/compiler.h>	/* for __kprobes */
33
#include <linux/linkage.h>
L
Linus Torvalds 已提交
34 35 36
#include <linux/list.h>
#include <linux/notifier.h>
#include <linux/smp.h>
37
#include <linux/bug.h>
38
#include <linux/percpu.h>
39 40
#include <linux/spinlock.h>
#include <linux/rcupdate.h>
I
Ingo Molnar 已提交
41
#include <linux/mutex.h>
42
#include <linux/ftrace.h>
43

44
#ifdef CONFIG_KPROBES
L
Linus Torvalds 已提交
45 46
#include <asm/kprobes.h>

47 48 49 50 51 52
/* kprobe_status settings */
#define KPROBE_HIT_ACTIVE	0x00000001
#define KPROBE_HIT_SS		0x00000002
#define KPROBE_REENTER		0x00000004
#define KPROBE_HIT_SSDONE	0x00000008

53 54 55 56 57 58
#else /* CONFIG_KPROBES */
typedef int kprobe_opcode_t;
struct arch_specific_insn {
	int dummy;
};
#endif /* CONFIG_KPROBES */
59

L
Linus Torvalds 已提交
60 61
struct kprobe;
struct pt_regs;
62 63
struct kretprobe;
struct kretprobe_instance;
L
Linus Torvalds 已提交
64 65 66 67 68 69
typedef int (*kprobe_pre_handler_t) (struct kprobe *, struct pt_regs *);
typedef int (*kprobe_break_handler_t) (struct kprobe *, struct pt_regs *);
typedef void (*kprobe_post_handler_t) (struct kprobe *, struct pt_regs *,
				       unsigned long flags);
typedef int (*kprobe_fault_handler_t) (struct kprobe *, struct pt_regs *,
				       int trapnr);
70 71 72
typedef int (*kretprobe_handler_t) (struct kretprobe_instance *,
				    struct pt_regs *);

L
Linus Torvalds 已提交
73 74 75
struct kprobe {
	struct hlist_node hlist;

76 77 78
	/* list of kprobes for multi-handler support */
	struct list_head list;

79 80 81
	/*count the number of times this probe was temporarily disarmed */
	unsigned long nmissed;

L
Linus Torvalds 已提交
82 83 84
	/* location of the probe point */
	kprobe_opcode_t *addr;

85
	/* Allow user to indicate symbol name of the probe point */
86
	const char *symbol_name;
87 88 89 90

	/* Offset into the symbol */
	unsigned int offset;

L
Linus Torvalds 已提交
91 92 93 94 95 96
	/* Called before addr is executed. */
	kprobe_pre_handler_t pre_handler;

	/* Called after addr is executed, unless... */
	kprobe_post_handler_t post_handler;

97 98 99 100
	/*
	 * ... called if executing addr causes a fault (eg. page fault).
	 * Return 1 if it handled fault, otherwise kernel will see it.
	 */
L
Linus Torvalds 已提交
101 102
	kprobe_fault_handler_t fault_handler;

103 104 105 106
	/*
	 * ... called if breakpoint trap occurs in probe handler.
	 * Return 1 if it handled break, otherwise kernel will see it.
	 */
L
Linus Torvalds 已提交
107 108 109 110 111 112 113
	kprobe_break_handler_t break_handler;

	/* Saved opcode (which has been replaced with breakpoint) */
	kprobe_opcode_t opcode;

	/* copy of the original instruction */
	struct arch_specific_insn ainsn;
114

115 116 117 118
	/*
	 * Indicates various status flags.
	 * Protected by kprobe_mutex after this kprobe is registered.
	 */
119
	u32 flags;
L
Linus Torvalds 已提交
120 121
};

122 123
/* Kprobe status flags */
#define KPROBE_FLAG_GONE	1 /* breakpoint has already gone */
124
#define KPROBE_FLAG_DISABLED	2 /* probe is temporarily disabled */
125 126 127 128 129
#define KPROBE_FLAG_OPTIMIZED	4 /*
				   * probe is really optimized.
				   * NOTE:
				   * this flag is only for optimized_kprobe.
				   */
130
#define KPROBE_FLAG_FTRACE	8 /* probe is using ftrace */
131

132
/* Has this kprobe gone ? */
133 134 135 136 137
static inline int kprobe_gone(struct kprobe *p)
{
	return p->flags & KPROBE_FLAG_GONE;
}

138 139 140 141 142
/* Is this kprobe disabled ? */
static inline int kprobe_disabled(struct kprobe *p)
{
	return p->flags & (KPROBE_FLAG_DISABLED | KPROBE_FLAG_GONE);
}
143 144 145 146 147 148

/* Is this kprobe really running optimized path ? */
static inline int kprobe_optimized(struct kprobe *p)
{
	return p->flags & KPROBE_FLAG_OPTIMIZED;
}
149 150 151 152 153 154 155

/* Is this kprobe uses ftrace ? */
static inline int kprobe_ftrace(struct kprobe *p)
{
	return p->flags & KPROBE_FLAG_FTRACE;
}

L
Linus Torvalds 已提交
156 157 158 159 160 161 162 163 164 165 166 167
/*
 * Special probe type that uses setjmp-longjmp type tricks to resume
 * execution at a specified entry with a matching prototype corresponding
 * to the probed function - a trick to enable arguments to become
 * accessible seamlessly by probe handling logic.
 * Note:
 * Because of the way compilers allocate stack space for local variables
 * etc upfront, regardless of sub-scopes within a function, this mirroring
 * principle currently works only for probes placed on function entry points.
 */
struct jprobe {
	struct kprobe kp;
168
	void *entry;	/* probe handling code to jump to */
L
Linus Torvalds 已提交
169 170
};

171 172 173
/* For backward compatibility with old code using JPROBE_ENTRY() */
#define JPROBE_ENTRY(handler)	(handler)

174 175 176 177 178 179 180 181 182 183 184 185 186
/*
 * Function-return probe -
 * Note:
 * User needs to provide a handler function, and initialize maxactive.
 * maxactive - The maximum number of instances of the probed function that
 * can be active concurrently.
 * nmissed - tracks the number of times the probed function's return was
 * ignored, due to maxactive being too low.
 *
 */
struct kretprobe {
	struct kprobe kp;
	kretprobe_handler_t handler;
187
	kretprobe_handler_t entry_handler;
188 189
	int maxactive;
	int nmissed;
190
	size_t data_size;
191
	struct hlist_head free_instances;
192
	raw_spinlock_t lock;
193 194 195 196 197
};

struct kretprobe_instance {
	struct hlist_node hlist;
	struct kretprobe *rp;
198 199
	kprobe_opcode_t *ret_addr;
	struct task_struct *task;
200
	char data[0];
201 202
};

203 204 205 206
struct kretprobe_blackpoint {
	const char *name;
	void *addr;
};
207 208 209 210 211 212 213

struct kprobe_blackpoint {
	const char *name;
	unsigned long start_addr;
	unsigned long range;
};

214 215 216 217
#ifdef CONFIG_KPROBES
DECLARE_PER_CPU(struct kprobe *, current_kprobe);
DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);

218 219 220 221 222 223 224 225
/*
 * For #ifdef avoidance:
 */
static inline int kprobes_built_in(void)
{
	return 1;
}

226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
#ifdef CONFIG_KRETPROBES
extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
				   struct pt_regs *regs);
extern int arch_trampoline_kprobe(struct kprobe *p);
#else /* CONFIG_KRETPROBES */
static inline void arch_prepare_kretprobe(struct kretprobe *rp,
					struct pt_regs *regs)
{
}
static inline int arch_trampoline_kprobe(struct kprobe *p)
{
	return 0;
}
#endif /* CONFIG_KRETPROBES */

241 242
extern struct kretprobe_blackpoint kretprobe_blacklist[];

243 244 245 246 247 248 249 250 251 252
static inline void kretprobe_assert(struct kretprobe_instance *ri,
	unsigned long orig_ret_address, unsigned long trampoline_address)
{
	if (!orig_ret_address || (orig_ret_address == trampoline_address)) {
		printk("kretprobe BUG!: Processing kretprobe %p @ %p\n",
				ri->rp, ri->rp->kp.addr);
		BUG();
	}
}

253 254 255 256 257 258 259 260 261
#ifdef CONFIG_KPROBES_SANITY_TEST
extern int init_test_probes(void);
#else
static inline int init_test_probes(void)
{
	return 0;
}
#endif /* CONFIG_KPROBES_SANITY_TEST */

L
Linus Torvalds 已提交
262
extern int arch_prepare_kprobe(struct kprobe *p);
263 264
extern void arch_arm_kprobe(struct kprobe *p);
extern void arch_disarm_kprobe(struct kprobe *p);
265
extern int arch_init_kprobes(void);
L
Linus Torvalds 已提交
266
extern void show_registers(struct pt_regs *regs);
267
extern void kprobes_inc_nmissed_count(struct kprobe *p);
L
Linus Torvalds 已提交
268

H
Heiko Carstens 已提交
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
struct kprobe_insn_cache {
	struct mutex mutex;
	struct list_head pages; /* list of kprobe_insn_page */
	size_t insn_size;	/* size of instruction slot */
	int nr_garbage;
};

extern kprobe_opcode_t *__get_insn_slot(struct kprobe_insn_cache *c);
extern void __free_insn_slot(struct kprobe_insn_cache *c,
			     kprobe_opcode_t *slot, int dirty);

#define DEFINE_INSN_CACHE_OPS(__name)					\
extern struct kprobe_insn_cache kprobe_##__name##_slots;		\
									\
static inline kprobe_opcode_t *get_##__name##_slot(void)		\
{									\
	return __get_insn_slot(&kprobe_##__name##_slots);		\
}									\
									\
static inline void free_##__name##_slot(kprobe_opcode_t *slot, int dirty)\
{									\
	__free_insn_slot(&kprobe_##__name##_slots, slot, dirty);	\
}									\

DEFINE_INSN_CACHE_OPS(insn);

295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
#ifdef CONFIG_OPTPROBES
/*
 * Internal structure for direct jump optimized probe
 */
struct optimized_kprobe {
	struct kprobe kp;
	struct list_head list;	/* list for optimizing queue */
	struct arch_optimized_insn optinsn;
};

/* Architecture dependent functions for direct jump optimization */
extern int arch_prepared_optinsn(struct arch_optimized_insn *optinsn);
extern int arch_check_optimized_kprobe(struct optimized_kprobe *op);
extern int arch_prepare_optimized_kprobe(struct optimized_kprobe *op);
extern void arch_remove_optimized_kprobe(struct optimized_kprobe *op);
310
extern void arch_optimize_kprobes(struct list_head *oplist);
311 312
extern void arch_unoptimize_kprobes(struct list_head *oplist,
				    struct list_head *done_list);
313 314 315 316 317
extern void arch_unoptimize_kprobe(struct optimized_kprobe *op);
extern int arch_within_optimized_kprobe(struct optimized_kprobe *op,
					unsigned long addr);

extern void opt_pre_handler(struct kprobe *p, struct pt_regs *regs);
318

H
Heiko Carstens 已提交
319 320
DEFINE_INSN_CACHE_OPS(optinsn);

321 322 323 324 325 326 327
#ifdef CONFIG_SYSCTL
extern int sysctl_kprobes_optimization;
extern int proc_kprobes_optimization_handler(struct ctl_table *table,
					     int write, void __user *buffer,
					     size_t *length, loff_t *ppos);
#endif

328
#endif /* CONFIG_OPTPROBES */
329
#ifdef CONFIG_KPROBES_ON_FTRACE
330
extern void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
331
				  struct ftrace_ops *ops, struct pt_regs *regs);
332 333 334
extern int arch_prepare_kprobe_ftrace(struct kprobe *p);
#endif

335

336
/* Get the kprobe at this addr (if any) - called with preemption disabled */
L
Linus Torvalds 已提交
337
struct kprobe *get_kprobe(void *addr);
338 339 340
void kretprobe_hash_lock(struct task_struct *tsk,
			 struct hlist_head **head, unsigned long *flags);
void kretprobe_hash_unlock(struct task_struct *tsk, unsigned long *flags);
341
struct hlist_head * kretprobe_inst_table_head(struct task_struct *tsk);
L
Linus Torvalds 已提交
342

343 344 345
/* kprobe_running() will just return the current_kprobe on this CPU */
static inline struct kprobe *kprobe_running(void)
{
C
Christoph Lameter 已提交
346
	return (__this_cpu_read(current_kprobe));
347 348 349 350
}

static inline void reset_current_kprobe(void)
{
C
Christoph Lameter 已提交
351
	__this_cpu_write(current_kprobe, NULL);
352 353 354 355 356 357 358
}

static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void)
{
	return (&__get_cpu_var(kprobe_ctlblk));
}

L
Linus Torvalds 已提交
359 360
int register_kprobe(struct kprobe *p);
void unregister_kprobe(struct kprobe *p);
361 362
int register_kprobes(struct kprobe **kps, int num);
void unregister_kprobes(struct kprobe **kps, int num);
L
Linus Torvalds 已提交
363 364 365 366
int setjmp_pre_handler(struct kprobe *, struct pt_regs *);
int longjmp_break_handler(struct kprobe *, struct pt_regs *);
int register_jprobe(struct jprobe *p);
void unregister_jprobe(struct jprobe *p);
367 368
int register_jprobes(struct jprobe **jps, int num);
void unregister_jprobes(struct jprobe **jps, int num);
L
Linus Torvalds 已提交
369
void jprobe_return(void);
370
unsigned long arch_deref_entry_point(void *);
L
Linus Torvalds 已提交
371

372 373
int register_kretprobe(struct kretprobe *rp);
void unregister_kretprobe(struct kretprobe *rp);
374 375
int register_kretprobes(struct kretprobe **rps, int num);
void unregister_kretprobes(struct kretprobe **rps, int num);
376 377

void kprobe_flush_task(struct task_struct *tk);
378
void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
379

380 381 382
int disable_kprobe(struct kprobe *kp);
int enable_kprobe(struct kprobe *kp);

383 384
void dump_kprobe(struct kprobe *kp);

385
#else /* !CONFIG_KPROBES: */
386

387 388 389 390 391 392 393 394
static inline int kprobes_built_in(void)
{
	return 0;
}
static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
{
	return 0;
}
395 396 397 398
static inline struct kprobe *get_kprobe(void *addr)
{
	return NULL;
}
399
static inline struct kprobe *kprobe_running(void)
L
Linus Torvalds 已提交
400
{
401
	return NULL;
L
Linus Torvalds 已提交
402 403 404 405 406
}
static inline int register_kprobe(struct kprobe *p)
{
	return -ENOSYS;
}
407 408 409 410
static inline int register_kprobes(struct kprobe **kps, int num)
{
	return -ENOSYS;
}
L
Linus Torvalds 已提交
411 412 413
static inline void unregister_kprobe(struct kprobe *p)
{
}
414 415 416
static inline void unregister_kprobes(struct kprobe **kps, int num)
{
}
L
Linus Torvalds 已提交
417 418 419 420
static inline int register_jprobe(struct jprobe *p)
{
	return -ENOSYS;
}
421 422 423 424
static inline int register_jprobes(struct jprobe **jps, int num)
{
	return -ENOSYS;
}
L
Linus Torvalds 已提交
425 426 427
static inline void unregister_jprobe(struct jprobe *p)
{
}
428 429 430
static inline void unregister_jprobes(struct jprobe **jps, int num)
{
}
L
Linus Torvalds 已提交
431 432 433
static inline void jprobe_return(void)
{
}
434 435 436 437
static inline int register_kretprobe(struct kretprobe *rp)
{
	return -ENOSYS;
}
438 439 440 441
static inline int register_kretprobes(struct kretprobe **rps, int num)
{
	return -ENOSYS;
}
442 443 444
static inline void unregister_kretprobe(struct kretprobe *rp)
{
}
445 446 447
static inline void unregister_kretprobes(struct kretprobe **rps, int num)
{
}
448 449 450
static inline void kprobe_flush_task(struct task_struct *tk)
{
}
451 452 453 454 455 456 457 458
static inline int disable_kprobe(struct kprobe *kp)
{
	return -ENOSYS;
}
static inline int enable_kprobe(struct kprobe *kp)
{
	return -ENOSYS;
}
459
#endif /* CONFIG_KPROBES */
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
static inline int disable_kretprobe(struct kretprobe *rp)
{
	return disable_kprobe(&rp->kp);
}
static inline int enable_kretprobe(struct kretprobe *rp)
{
	return enable_kprobe(&rp->kp);
}
static inline int disable_jprobe(struct jprobe *jp)
{
	return disable_kprobe(&jp->kp);
}
static inline int enable_jprobe(struct jprobe *jp)
{
	return enable_kprobe(&jp->kp);
}

477
#endif /* _LINUX_KPROBES_H */