kprobes.c 37.7 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 28 29
/*
 *  Kernel Probes (KProbes)
 *  kernel/kprobes.c
 *
 * 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-Aug	Updated by Prasanna S Panchamukhi <prasanna@in.ibm.com> with
 *		hlists and exceptions notifier as suggested by Andi Kleen.
 * 2004-July	Suparna Bhattacharya <suparna@in.ibm.com> added jumper probes
 *		interface to access function arguments.
 * 2004-Sep	Prasanna S Panchamukhi <prasanna@in.ibm.com> Changed Kprobes
 *		exceptions notifier to be first on the priority list.
30 31 32
 * 2005-May	Hien Nguyen <hien@us.ibm.com>, Jim Keniston
 *		<jkenisto@us.ibm.com> and Prasanna S Panchamukhi
 *		<prasanna@in.ibm.com> added function-return probes.
L
Linus Torvalds 已提交
33 34 35 36
 */
#include <linux/kprobes.h>
#include <linux/hash.h>
#include <linux/init.h>
T
Tim Schmielau 已提交
37
#include <linux/slab.h>
R
Randy Dunlap 已提交
38
#include <linux/stddef.h>
L
Linus Torvalds 已提交
39
#include <linux/module.h>
40
#include <linux/moduleloader.h>
41
#include <linux/kallsyms.h>
42
#include <linux/freezer.h>
43 44
#include <linux/seq_file.h>
#include <linux/debugfs.h>
45
#include <linux/kdebug.h>
46
#include <linux/memory.h>
47
#include <linux/ftrace.h>
48

49
#include <asm-generic/sections.h>
L
Linus Torvalds 已提交
50 51
#include <asm/cacheflush.h>
#include <asm/errno.h>
52
#include <asm/uaccess.h>
L
Linus Torvalds 已提交
53 54 55 56

#define KPROBE_HASH_BITS 6
#define KPROBE_TABLE_SIZE (1 << KPROBE_HASH_BITS)

57 58 59 60 61 62 63 64 65 66

/*
 * Some oddball architectures like 64bit powerpc have function descriptors
 * so this must be overridable.
 */
#ifndef kprobe_lookup_name
#define kprobe_lookup_name(name, addr) \
	addr = ((kprobe_opcode_t *)(kallsyms_lookup_name(name)))
#endif

67
static int kprobes_initialized;
L
Linus Torvalds 已提交
68
static struct hlist_head kprobe_table[KPROBE_TABLE_SIZE];
69
static struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE];
L
Linus Torvalds 已提交
70

71
/* NOTE: change this value only with kprobe_mutex held */
72
static bool kprobes_all_disarmed;
73

74
static DEFINE_MUTEX(kprobe_mutex);	/* Protects kprobe_table */
75
static DEFINE_PER_CPU(struct kprobe *, kprobe_instance) = NULL;
76
static struct {
77
	spinlock_t lock ____cacheline_aligned_in_smp;
78 79 80 81 82 83
} kretprobe_table_locks[KPROBE_TABLE_SIZE];

static spinlock_t *kretprobe_table_lock_ptr(unsigned long hash)
{
	return &(kretprobe_table_locks[hash].lock);
}
L
Linus Torvalds 已提交
84

85 86 87 88 89 90 91
/*
 * Normally, functions that we'd want to prohibit kprobes in, are marked
 * __kprobes. But, there are cases where such functions already belong to
 * a different section (__sched for preempt_schedule)
 *
 * For such cases, we now have a blacklist
 */
92
static struct kprobe_blackpoint kprobe_blacklist[] = {
93
	{"preempt_schedule",},
94
	{"native_get_debugreg",},
95 96
	{"irq_entries_start",},
	{"common_interrupt",},
97 98 99
	{NULL}    /* Terminator */
};

100
#ifdef __ARCH_WANT_KPROBES_INSN_SLOT
101 102 103 104 105 106 107 108 109
/*
 * kprobe->ainsn.insn points to the copy of the instruction to be
 * single-stepped. x86_64, POWER4 and above have no-exec support and
 * stepping on the instruction on a vmalloced/kmalloced/data page
 * is a recipe for disaster
 */
#define INSNS_PER_PAGE	(PAGE_SIZE/(MAX_INSN_SIZE * sizeof(kprobe_opcode_t)))

struct kprobe_insn_page {
110
	struct list_head list;
111 112 113
	kprobe_opcode_t *insns;		/* Page of instruction slots */
	char slot_used[INSNS_PER_PAGE];
	int nused;
114
	int ngarbage;
115 116
};

117 118 119 120 121 122
enum kprobe_slot_state {
	SLOT_CLEAN = 0,
	SLOT_DIRTY = 1,
	SLOT_USED = 2,
};

123
static DEFINE_MUTEX(kprobe_insn_mutex);	/* Protects kprobe_insn_pages */
124
static LIST_HEAD(kprobe_insn_pages);
125 126 127
static int kprobe_garbage_slots;
static int collect_garbage_slots(void);

128
/**
129
 * __get_insn_slot() - Find a slot on an executable page for an instruction.
130 131
 * We allocate an executable page if there's no room on existing ones.
 */
132
static kprobe_opcode_t __kprobes *__get_insn_slot(void)
133 134 135
{
	struct kprobe_insn_page *kip;

136
 retry:
137
	list_for_each_entry(kip, &kprobe_insn_pages, list) {
138 139 140
		if (kip->nused < INSNS_PER_PAGE) {
			int i;
			for (i = 0; i < INSNS_PER_PAGE; i++) {
141 142
				if (kip->slot_used[i] == SLOT_CLEAN) {
					kip->slot_used[i] = SLOT_USED;
143 144 145 146 147 148 149 150 151
					kip->nused++;
					return kip->insns + (i * MAX_INSN_SIZE);
				}
			}
			/* Surprise!  No unused slots.  Fix kip->nused. */
			kip->nused = INSNS_PER_PAGE;
		}
	}

152 153 154 155 156
	/* If there are any garbage slots, collect it and try again. */
	if (kprobe_garbage_slots && collect_garbage_slots() == 0) {
		goto retry;
	}
	/* All out of space.  Need to allocate a new page. Use slot 0. */
157
	kip = kmalloc(sizeof(struct kprobe_insn_page), GFP_KERNEL);
158
	if (!kip)
159 160 161 162 163 164 165 166 167 168 169 170
		return NULL;

	/*
	 * Use module_alloc so this page is within +/- 2GB of where the
	 * kernel image and loaded module images reside. This is required
	 * so x86_64 can correctly handle the %rip-relative fixups.
	 */
	kip->insns = module_alloc(PAGE_SIZE);
	if (!kip->insns) {
		kfree(kip);
		return NULL;
	}
171 172
	INIT_LIST_HEAD(&kip->list);
	list_add(&kip->list, &kprobe_insn_pages);
173 174
	memset(kip->slot_used, SLOT_CLEAN, INSNS_PER_PAGE);
	kip->slot_used[0] = SLOT_USED;
175
	kip->nused = 1;
176
	kip->ngarbage = 0;
177 178 179
	return kip->insns;
}

180 181 182 183 184 185 186 187 188
kprobe_opcode_t __kprobes *get_insn_slot(void)
{
	kprobe_opcode_t *ret;
	mutex_lock(&kprobe_insn_mutex);
	ret = __get_insn_slot();
	mutex_unlock(&kprobe_insn_mutex);
	return ret;
}

189 190 191
/* Return 1 if all garbages are collected, otherwise 0. */
static int __kprobes collect_one_slot(struct kprobe_insn_page *kip, int idx)
{
192
	kip->slot_used[idx] = SLOT_CLEAN;
193 194 195 196 197 198 199 200
	kip->nused--;
	if (kip->nused == 0) {
		/*
		 * Page is no longer in use.  Free it unless
		 * it's the last one.  We keep the last one
		 * so as not to have to set it up again the
		 * next time somebody inserts a probe.
		 */
201 202
		if (!list_is_singular(&kprobe_insn_pages)) {
			list_del(&kip->list);
203 204 205 206 207 208 209 210 211 212
			module_free(NULL, kip->insns);
			kfree(kip);
		}
		return 1;
	}
	return 0;
}

static int __kprobes collect_garbage_slots(void)
{
213
	struct kprobe_insn_page *kip, *next;
214

215 216
	/* Ensure no-one is interrupted on the garbages */
	synchronize_sched();
217

218
	list_for_each_entry_safe(kip, next, &kprobe_insn_pages, list) {
219 220 221 222 223
		int i;
		if (kip->ngarbage == 0)
			continue;
		kip->ngarbage = 0;	/* we will collect all garbages */
		for (i = 0; i < INSNS_PER_PAGE; i++) {
224
			if (kip->slot_used[i] == SLOT_DIRTY &&
225 226 227 228 229 230 231 232 233
			    collect_one_slot(kip, i))
				break;
		}
	}
	kprobe_garbage_slots = 0;
	return 0;
}

void __kprobes free_insn_slot(kprobe_opcode_t * slot, int dirty)
234 235 236
{
	struct kprobe_insn_page *kip;

237
	mutex_lock(&kprobe_insn_mutex);
238
	list_for_each_entry(kip, &kprobe_insn_pages, list) {
239 240 241
		if (kip->insns <= slot &&
		    slot < kip->insns + (INSNS_PER_PAGE * MAX_INSN_SIZE)) {
			int i = (slot - kip->insns) / MAX_INSN_SIZE;
242
			if (dirty) {
243
				kip->slot_used[i] = SLOT_DIRTY;
244
				kip->ngarbage++;
245
			} else
246 247
				collect_one_slot(kip, i);
			break;
248 249
		}
	}
250 251

	if (dirty && ++kprobe_garbage_slots > INSNS_PER_PAGE)
252
		collect_garbage_slots();
253 254

	mutex_unlock(&kprobe_insn_mutex);
255
}
256
#endif
257

258 259 260 261 262 263 264 265 266 267 268
/* We have preemption disabled.. so it is safe to use __ versions */
static inline void set_kprobe_instance(struct kprobe *kp)
{
	__get_cpu_var(kprobe_instance) = kp;
}

static inline void reset_kprobe_instance(void)
{
	__get_cpu_var(kprobe_instance) = NULL;
}

269 270
/*
 * This routine is called either:
271
 * 	- under the kprobe_mutex - during kprobe_[un]register()
272
 * 				OR
273
 * 	- with preemption disabled - from arch/xxx/kernel/kprobes.c
274
 */
275
struct kprobe __kprobes *get_kprobe(void *addr)
L
Linus Torvalds 已提交
276 277 278
{
	struct hlist_head *head;
	struct hlist_node *node;
279
	struct kprobe *p;
L
Linus Torvalds 已提交
280 281

	head = &kprobe_table[hash_ptr(addr, KPROBE_HASH_BITS)];
282
	hlist_for_each_entry_rcu(p, node, head, hlist) {
L
Linus Torvalds 已提交
283 284 285 286 287 288
		if (p->addr == addr)
			return p;
	}
	return NULL;
}

289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
/* Arm a kprobe with text_mutex */
static void __kprobes arm_kprobe(struct kprobe *kp)
{
	mutex_lock(&text_mutex);
	arch_arm_kprobe(kp);
	mutex_unlock(&text_mutex);
}

/* Disarm a kprobe with text_mutex */
static void __kprobes disarm_kprobe(struct kprobe *kp)
{
	mutex_lock(&text_mutex);
	arch_disarm_kprobe(kp);
	mutex_unlock(&text_mutex);
}

305 306 307 308
/*
 * Aggregate handlers for multiple kprobes support - these handlers
 * take care of invoking the individual kprobe handlers on p->list
 */
309
static int __kprobes aggr_pre_handler(struct kprobe *p, struct pt_regs *regs)
310 311 312
{
	struct kprobe *kp;

313
	list_for_each_entry_rcu(kp, &p->list, list) {
314
		if (kp->pre_handler && likely(!kprobe_disabled(kp))) {
315
			set_kprobe_instance(kp);
316 317
			if (kp->pre_handler(kp, regs))
				return 1;
318
		}
319
		reset_kprobe_instance();
320 321 322 323
	}
	return 0;
}

324 325
static void __kprobes aggr_post_handler(struct kprobe *p, struct pt_regs *regs,
					unsigned long flags)
326 327 328
{
	struct kprobe *kp;

329
	list_for_each_entry_rcu(kp, &p->list, list) {
330
		if (kp->post_handler && likely(!kprobe_disabled(kp))) {
331
			set_kprobe_instance(kp);
332
			kp->post_handler(kp, regs, flags);
333
			reset_kprobe_instance();
334 335 336 337
		}
	}
}

338 339
static int __kprobes aggr_fault_handler(struct kprobe *p, struct pt_regs *regs,
					int trapnr)
340
{
341 342
	struct kprobe *cur = __get_cpu_var(kprobe_instance);

343 344 345 346
	/*
	 * if we faulted "during" the execution of a user specified
	 * probe handler, invoke just that probe's fault handler
	 */
347 348
	if (cur && cur->fault_handler) {
		if (cur->fault_handler(cur, regs, trapnr))
349 350 351 352 353
			return 1;
	}
	return 0;
}

354
static int __kprobes aggr_break_handler(struct kprobe *p, struct pt_regs *regs)
355
{
356 357 358 359 360 361
	struct kprobe *cur = __get_cpu_var(kprobe_instance);
	int ret = 0;

	if (cur && cur->break_handler) {
		if (cur->break_handler(cur, regs))
			ret = 1;
362
	}
363 364
	reset_kprobe_instance();
	return ret;
365 366
}

367 368 369 370 371 372 373 374 375 376 377 378 379
/* Walks the list and increments nmissed count for multiprobe case */
void __kprobes kprobes_inc_nmissed_count(struct kprobe *p)
{
	struct kprobe *kp;
	if (p->pre_handler != aggr_pre_handler) {
		p->nmissed++;
	} else {
		list_for_each_entry_rcu(kp, &p->list, list)
			kp->nmissed++;
	}
	return;
}

380 381
void __kprobes recycle_rp_inst(struct kretprobe_instance *ri,
				struct hlist_head *head)
382
{
383 384
	struct kretprobe *rp = ri->rp;

385 386
	/* remove rp inst off the rprobe_inst_table */
	hlist_del(&ri->hlist);
387 388 389 390 391
	INIT_HLIST_NODE(&ri->hlist);
	if (likely(rp)) {
		spin_lock(&rp->lock);
		hlist_add_head(&ri->hlist, &rp->free_instances);
		spin_unlock(&rp->lock);
392 393
	} else
		/* Unregistering */
394
		hlist_add_head(&ri->hlist, head);
395 396
}

397
void __kprobes kretprobe_hash_lock(struct task_struct *tsk,
398 399 400 401 402 403 404 405 406 407
			 struct hlist_head **head, unsigned long *flags)
{
	unsigned long hash = hash_ptr(tsk, KPROBE_HASH_BITS);
	spinlock_t *hlist_lock;

	*head = &kretprobe_inst_table[hash];
	hlist_lock = kretprobe_table_lock_ptr(hash);
	spin_lock_irqsave(hlist_lock, *flags);
}

408 409
static void __kprobes kretprobe_table_lock(unsigned long hash,
	unsigned long *flags)
410
{
411 412 413 414
	spinlock_t *hlist_lock = kretprobe_table_lock_ptr(hash);
	spin_lock_irqsave(hlist_lock, *flags);
}

415 416
void __kprobes kretprobe_hash_unlock(struct task_struct *tsk,
	unsigned long *flags)
417 418 419 420 421 422 423 424
{
	unsigned long hash = hash_ptr(tsk, KPROBE_HASH_BITS);
	spinlock_t *hlist_lock;

	hlist_lock = kretprobe_table_lock_ptr(hash);
	spin_unlock_irqrestore(hlist_lock, *flags);
}

425
void __kprobes kretprobe_table_unlock(unsigned long hash, unsigned long *flags)
426 427 428
{
	spinlock_t *hlist_lock = kretprobe_table_lock_ptr(hash);
	spin_unlock_irqrestore(hlist_lock, *flags);
429 430 431
}

/*
432 433 434 435
 * This function is called from finish_task_switch when task tk becomes dead,
 * so that we can recycle any function-return probe instances associated
 * with this task. These left over instances represent probed functions
 * that have been called but will never return.
436
 */
437
void __kprobes kprobe_flush_task(struct task_struct *tk)
438
{
B
bibo,mao 已提交
439
	struct kretprobe_instance *ri;
440
	struct hlist_head *head, empty_rp;
441
	struct hlist_node *node, *tmp;
442
	unsigned long hash, flags = 0;
443

444 445 446 447 448 449 450
	if (unlikely(!kprobes_initialized))
		/* Early boot.  kretprobe_table_locks not yet initialized. */
		return;

	hash = hash_ptr(tk, KPROBE_HASH_BITS);
	head = &kretprobe_inst_table[hash];
	kretprobe_table_lock(hash, &flags);
B
bibo,mao 已提交
451 452
	hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
		if (ri->task == tk)
453
			recycle_rp_inst(ri, &empty_rp);
B
bibo,mao 已提交
454
	}
455 456
	kretprobe_table_unlock(hash, &flags);
	INIT_HLIST_HEAD(&empty_rp);
457 458 459 460
	hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) {
		hlist_del(&ri->hlist);
		kfree(ri);
	}
461 462 463 464 465
}

static inline void free_rp_inst(struct kretprobe *rp)
{
	struct kretprobe_instance *ri;
466 467
	struct hlist_node *pos, *next;

468 469
	hlist_for_each_entry_safe(ri, pos, next, &rp->free_instances, hlist) {
		hlist_del(&ri->hlist);
470 471 472 473
		kfree(ri);
	}
}

474 475
static void __kprobes cleanup_rp_inst(struct kretprobe *rp)
{
476
	unsigned long flags, hash;
477 478
	struct kretprobe_instance *ri;
	struct hlist_node *pos, *next;
479 480
	struct hlist_head *head;

481
	/* No race here */
482 483 484 485 486 487 488 489
	for (hash = 0; hash < KPROBE_TABLE_SIZE; hash++) {
		kretprobe_table_lock(hash, &flags);
		head = &kretprobe_inst_table[hash];
		hlist_for_each_entry_safe(ri, pos, next, head, hlist) {
			if (ri->rp == rp)
				ri->rp = NULL;
		}
		kretprobe_table_unlock(hash, &flags);
490 491 492 493
	}
	free_rp_inst(rp);
}

494 495 496 497 498 499 500 501 502 503
/*
 * Keep all fields in the kprobe consistent
 */
static inline void copy_kprobe(struct kprobe *old_p, struct kprobe *p)
{
	memcpy(&p->opcode, &old_p->opcode, sizeof(kprobe_opcode_t));
	memcpy(&p->ainsn, &old_p->ainsn, sizeof(struct arch_specific_insn));
}

/*
504
* Add the new probe to ap->list. Fail if this is the
505 506
* second jprobe at the address - two jprobes can't coexist
*/
507
static int __kprobes add_new_kprobe(struct kprobe *ap, struct kprobe *p)
508
{
509
	BUG_ON(kprobe_gone(ap) || kprobe_gone(p));
510
	if (p->break_handler) {
511
		if (ap->break_handler)
512
			return -EEXIST;
513 514
		list_add_tail_rcu(&p->list, &ap->list);
		ap->break_handler = aggr_break_handler;
515
	} else
516 517 518
		list_add_rcu(&p->list, &ap->list);
	if (p->post_handler && !ap->post_handler)
		ap->post_handler = aggr_post_handler;
519 520 521 522 523

	if (kprobe_disabled(ap) && !kprobe_disabled(p)) {
		ap->flags &= ~KPROBE_FLAG_DISABLED;
		if (!kprobes_all_disarmed)
			/* Arm the breakpoint again. */
524
			arm_kprobe(ap);
525
	}
526 527 528
	return 0;
}

529 530 531 532 533 534
/*
 * Fill in the required fields of the "manager kprobe". Replace the
 * earlier kprobe in the hlist with the manager kprobe
 */
static inline void add_aggr_kprobe(struct kprobe *ap, struct kprobe *p)
{
535
	copy_kprobe(p, ap);
536
	flush_insn_slot(ap);
537
	ap->addr = p->addr;
538
	ap->flags = p->flags;
539 540
	ap->pre_handler = aggr_pre_handler;
	ap->fault_handler = aggr_fault_handler;
541 542
	/* We don't care the kprobe which has gone. */
	if (p->post_handler && !kprobe_gone(p))
543
		ap->post_handler = aggr_post_handler;
544
	if (p->break_handler && !kprobe_gone(p))
545
		ap->break_handler = aggr_break_handler;
546 547

	INIT_LIST_HEAD(&ap->list);
548
	list_add_rcu(&p->list, &ap->list);
549

550
	hlist_replace_rcu(&p->hlist, &ap->hlist);
551 552 553 554 555 556
}

/*
 * This is the second or subsequent kprobe at the address - handle
 * the intricacies
 */
557 558
static int __kprobes register_aggr_kprobe(struct kprobe *old_p,
					  struct kprobe *p)
559 560
{
	int ret = 0;
561
	struct kprobe *ap = old_p;
562

563 564 565 566 567 568 569 570 571
	if (old_p->pre_handler != aggr_pre_handler) {
		/* If old_p is not an aggr_probe, create new aggr_kprobe. */
		ap = kzalloc(sizeof(struct kprobe), GFP_KERNEL);
		if (!ap)
			return -ENOMEM;
		add_aggr_kprobe(ap, old_p);
	}

	if (kprobe_gone(ap)) {
572 573 574 575 576 577
		/*
		 * Attempting to insert new probe at the same location that
		 * had a probe in the module vaddr area which already
		 * freed. So, the instruction slot has already been
		 * released. We need a new slot for the new probe.
		 */
578
		ret = arch_prepare_kprobe(ap);
579
		if (ret)
580 581 582 583 584
			/*
			 * Even if fail to allocate new slot, don't need to
			 * free aggr_probe. It will be used next time, or
			 * freed by unregister_kprobe.
			 */
585
			return ret;
586

587
		/*
588 589
		 * Clear gone flag to prevent allocating new slot again, and
		 * set disabled flag because it is not armed yet.
590
		 */
591 592
		ap->flags = (ap->flags & ~KPROBE_FLAG_GONE)
			    | KPROBE_FLAG_DISABLED;
593
	}
594 595 596

	copy_kprobe(ap, p);
	return add_new_kprobe(ap, p);
597 598
}

599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
/* Try to disable aggr_kprobe, and return 1 if succeeded.*/
static int __kprobes try_to_disable_aggr_kprobe(struct kprobe *p)
{
	struct kprobe *kp;

	list_for_each_entry_rcu(kp, &p->list, list) {
		if (!kprobe_disabled(kp))
			/*
			 * There is an active probe on the list.
			 * We can't disable aggr_kprobe.
			 */
			return 0;
	}
	p->flags |= KPROBE_FLAG_DISABLED;
	return 1;
}

616 617
static int __kprobes in_kprobes_functions(unsigned long addr)
{
618 619
	struct kprobe_blackpoint *kb;

620 621
	if (addr >= (unsigned long)__kprobes_text_start &&
	    addr < (unsigned long)__kprobes_text_end)
622
		return -EINVAL;
623 624 625 626 627 628 629 630 631 632 633
	/*
	 * If there exists a kprobe_blacklist, verify and
	 * fail any probe registration in the prohibited area
	 */
	for (kb = kprobe_blacklist; kb->name != NULL; kb++) {
		if (kb->start_addr) {
			if (addr >= kb->start_addr &&
			    addr < (kb->start_addr + kb->range))
				return -EINVAL;
		}
	}
634 635 636
	return 0;
}

637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654
/*
 * If we have a symbol_name argument, look it up and add the offset field
 * to it. This way, we can specify a relative address to a symbol.
 */
static kprobe_opcode_t __kprobes *kprobe_addr(struct kprobe *p)
{
	kprobe_opcode_t *addr = p->addr;
	if (p->symbol_name) {
		if (addr)
			return NULL;
		kprobe_lookup_name(p->symbol_name, addr);
	}

	if (!addr)
		return NULL;
	return (kprobe_opcode_t *)(((char *)addr) + p->offset);
}

655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
/* Check passed kprobe is valid and return kprobe in kprobe_table. */
static struct kprobe * __kprobes __get_valid_kprobe(struct kprobe *p)
{
	struct kprobe *old_p, *list_p;

	old_p = get_kprobe(p->addr);
	if (unlikely(!old_p))
		return NULL;

	if (p != old_p) {
		list_for_each_entry_rcu(list_p, &old_p->list, list)
			if (list_p == p)
			/* kprobe p is a valid probe */
				goto valid;
		return NULL;
	}
valid:
	return old_p;
}

/* Return error if the kprobe is being re-registered */
static inline int check_kprobe_rereg(struct kprobe *p)
{
	int ret = 0;
	struct kprobe *old_p;

	mutex_lock(&kprobe_mutex);
	old_p = __get_valid_kprobe(p);
	if (old_p)
		ret = -EINVAL;
	mutex_unlock(&kprobe_mutex);
	return ret;
}

689
int __kprobes register_kprobe(struct kprobe *p)
L
Linus Torvalds 已提交
690 691
{
	int ret = 0;
692
	struct kprobe *old_p;
693
	struct module *probed_mod;
694
	kprobe_opcode_t *addr;
695

696 697
	addr = kprobe_addr(p);
	if (!addr)
698
		return -EINVAL;
699
	p->addr = addr;
700

701 702 703 704
	ret = check_kprobe_rereg(p);
	if (ret)
		return ret;

705
	preempt_disable();
706
	if (!kernel_text_address((unsigned long) p->addr) ||
707 708
	    in_kprobes_functions((unsigned long) p->addr) ||
	    ftrace_text_reserved(p->addr, p->addr)) {
709
		preempt_enable();
710
		return -EINVAL;
711
	}
712

713 714 715
	/* User can pass only KPROBE_FLAG_DISABLED to register_kprobe */
	p->flags &= KPROBE_FLAG_DISABLED;

716 717 718
	/*
	 * Check if are we probing a module.
	 */
719
	probed_mod = __module_text_address((unsigned long) p->addr);
720 721
	if (probed_mod) {
		/*
722 723
		 * We must hold a refcount of the probed module while updating
		 * its code to prohibit unexpected unloading.
724
		 */
725 726 727 728
		if (unlikely(!try_module_get(probed_mod))) {
			preempt_enable();
			return -EINVAL;
		}
729 730 731 732 733 734 735 736 737 738
		/*
		 * If the module freed .init.text, we couldn't insert
		 * kprobes in there.
		 */
		if (within_module_init((unsigned long)p->addr, probed_mod) &&
		    probed_mod->state != MODULE_STATE_COMING) {
			module_put(probed_mod);
			preempt_enable();
			return -EINVAL;
		}
739
	}
740
	preempt_enable();
L
Linus Torvalds 已提交
741

742
	p->nmissed = 0;
743
	INIT_LIST_HEAD(&p->list);
I
Ingo Molnar 已提交
744
	mutex_lock(&kprobe_mutex);
745 746 747
	old_p = get_kprobe(p->addr);
	if (old_p) {
		ret = register_aggr_kprobe(old_p, p);
L
Linus Torvalds 已提交
748 749 750
		goto out;
	}

751
	mutex_lock(&text_mutex);
752 753
	ret = arch_prepare_kprobe(p);
	if (ret)
754
		goto out_unlock_text;
755

756
	INIT_HLIST_NODE(&p->hlist);
757
	hlist_add_head_rcu(&p->hlist,
L
Linus Torvalds 已提交
758 759
		       &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]);

760
	if (!kprobes_all_disarmed && !kprobe_disabled(p))
761
		arch_arm_kprobe(p);
762

763 764
out_unlock_text:
	mutex_unlock(&text_mutex);
L
Linus Torvalds 已提交
765
out:
I
Ingo Molnar 已提交
766
	mutex_unlock(&kprobe_mutex);
767

768
	if (probed_mod)
769
		module_put(probed_mod);
770

L
Linus Torvalds 已提交
771 772
	return ret;
}
773
EXPORT_SYMBOL_GPL(register_kprobe);
L
Linus Torvalds 已提交
774

775 776 777 778 779 780 781 782 783 784 785
/*
 * Unregister a kprobe without a scheduler synchronization.
 */
static int __kprobes __unregister_kprobe_top(struct kprobe *p)
{
	struct kprobe *old_p, *list_p;

	old_p = __get_valid_kprobe(p);
	if (old_p == NULL)
		return -EINVAL;

786 787
	if (old_p == p ||
	    (old_p->pre_handler == aggr_pre_handler &&
788
	     list_is_singular(&old_p->list))) {
789 790
		/*
		 * Only probe on the hash list. Disarm only if kprobes are
791 792
		 * enabled and not gone - otherwise, the breakpoint would
		 * already have been removed. We save on flushing icache.
793
		 */
794 795
		if (!kprobes_all_disarmed && !kprobe_disabled(old_p))
			disarm_kprobe(p);
796 797
		hlist_del_rcu(&old_p->hlist);
	} else {
798
		if (p->break_handler && !kprobe_gone(p))
799
			old_p->break_handler = NULL;
800
		if (p->post_handler && !kprobe_gone(p)) {
801 802 803 804 805 806 807
			list_for_each_entry_rcu(list_p, &old_p->list, list) {
				if ((list_p != p) && (list_p->post_handler))
					goto noclean;
			}
			old_p->post_handler = NULL;
		}
noclean:
808
		list_del_rcu(&p->list);
809 810 811
		if (!kprobe_disabled(old_p)) {
			try_to_disable_aggr_kprobe(old_p);
			if (!kprobes_all_disarmed && kprobe_disabled(old_p))
812
				disarm_kprobe(old_p);
813
		}
814
	}
815 816
	return 0;
}
817

818 819 820
static void __kprobes __unregister_kprobe_bottom(struct kprobe *p)
{
	struct kprobe *old_p;
821

822
	if (list_empty(&p->list))
823
		arch_remove_kprobe(p);
824 825 826 827 828 829
	else if (list_is_singular(&p->list)) {
		/* "p" is the last child of an aggr_kprobe */
		old_p = list_entry(p->list.next, struct kprobe, list);
		list_del(&p->list);
		arch_remove_kprobe(old_p);
		kfree(old_p);
830 831 832
	}
}

833
int __kprobes register_kprobes(struct kprobe **kps, int num)
834 835 836 837 838 839
{
	int i, ret = 0;

	if (num <= 0)
		return -EINVAL;
	for (i = 0; i < num; i++) {
840
		ret = register_kprobe(kps[i]);
841 842 843
		if (ret < 0) {
			if (i > 0)
				unregister_kprobes(kps, i);
844
			break;
845
		}
846
	}
847 848
	return ret;
}
849
EXPORT_SYMBOL_GPL(register_kprobes);
850 851 852 853 854

void __kprobes unregister_kprobe(struct kprobe *p)
{
	unregister_kprobes(&p, 1);
}
855
EXPORT_SYMBOL_GPL(unregister_kprobe);
856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872

void __kprobes unregister_kprobes(struct kprobe **kps, int num)
{
	int i;

	if (num <= 0)
		return;
	mutex_lock(&kprobe_mutex);
	for (i = 0; i < num; i++)
		if (__unregister_kprobe_top(kps[i]) < 0)
			kps[i]->addr = NULL;
	mutex_unlock(&kprobe_mutex);

	synchronize_sched();
	for (i = 0; i < num; i++)
		if (kps[i]->addr)
			__unregister_kprobe_bottom(kps[i]);
L
Linus Torvalds 已提交
873
}
874
EXPORT_SYMBOL_GPL(unregister_kprobes);
L
Linus Torvalds 已提交
875 876

static struct notifier_block kprobe_exceptions_nb = {
877 878 879 880
	.notifier_call = kprobe_exceptions_notify,
	.priority = 0x7fffffff /* we need to be notified first */
};

881 882 883 884
unsigned long __weak arch_deref_entry_point(void *entry)
{
	return (unsigned long)entry;
}
L
Linus Torvalds 已提交
885

886
int __kprobes register_jprobes(struct jprobe **jps, int num)
L
Linus Torvalds 已提交
887
{
888 889
	struct jprobe *jp;
	int ret = 0, i;
890

891
	if (num <= 0)
892
		return -EINVAL;
893 894 895 896 897 898 899 900 901 902 903
	for (i = 0; i < num; i++) {
		unsigned long addr;
		jp = jps[i];
		addr = arch_deref_entry_point(jp->entry);

		if (!kernel_text_address(addr))
			ret = -EINVAL;
		else {
			/* Todo: Verify probepoint is a function entry point */
			jp->kp.pre_handler = setjmp_pre_handler;
			jp->kp.break_handler = longjmp_break_handler;
904
			ret = register_kprobe(&jp->kp);
905
		}
906 907 908
		if (ret < 0) {
			if (i > 0)
				unregister_jprobes(jps, i);
909 910 911 912 913
			break;
		}
	}
	return ret;
}
914
EXPORT_SYMBOL_GPL(register_jprobes);
915

916 917
int __kprobes register_jprobe(struct jprobe *jp)
{
918
	return register_jprobes(&jp, 1);
L
Linus Torvalds 已提交
919
}
920
EXPORT_SYMBOL_GPL(register_jprobe);
L
Linus Torvalds 已提交
921

922
void __kprobes unregister_jprobe(struct jprobe *jp)
L
Linus Torvalds 已提交
923
{
924 925
	unregister_jprobes(&jp, 1);
}
926
EXPORT_SYMBOL_GPL(unregister_jprobe);
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944

void __kprobes unregister_jprobes(struct jprobe **jps, int num)
{
	int i;

	if (num <= 0)
		return;
	mutex_lock(&kprobe_mutex);
	for (i = 0; i < num; i++)
		if (__unregister_kprobe_top(&jps[i]->kp) < 0)
			jps[i]->kp.addr = NULL;
	mutex_unlock(&kprobe_mutex);

	synchronize_sched();
	for (i = 0; i < num; i++) {
		if (jps[i]->kp.addr)
			__unregister_kprobe_bottom(&jps[i]->kp);
	}
L
Linus Torvalds 已提交
945
}
946
EXPORT_SYMBOL_GPL(unregister_jprobes);
L
Linus Torvalds 已提交
947

948
#ifdef CONFIG_KRETPROBES
949 950 951 952 953 954 955 956
/*
 * This kprobe pre_handler is registered with every kretprobe. When probe
 * hits it will set up the return probe.
 */
static int __kprobes pre_handler_kretprobe(struct kprobe *p,
					   struct pt_regs *regs)
{
	struct kretprobe *rp = container_of(p, struct kretprobe, kp);
957 958
	unsigned long hash, flags = 0;
	struct kretprobe_instance *ri;
959 960

	/*TODO: consider to only swap the RA after the last pre_handler fired */
961 962
	hash = hash_ptr(current, KPROBE_HASH_BITS);
	spin_lock_irqsave(&rp->lock, flags);
963 964
	if (!hlist_empty(&rp->free_instances)) {
		ri = hlist_entry(rp->free_instances.first,
965 966 967 968
				struct kretprobe_instance, hlist);
		hlist_del(&ri->hlist);
		spin_unlock_irqrestore(&rp->lock, flags);

969 970
		ri->rp = rp;
		ri->task = current;
971

972
		if (rp->entry_handler && rp->entry_handler(ri, regs))
973 974
			return 0;

975 976 977
		arch_prepare_kretprobe(ri, regs);

		/* XXX(hch): why is there no hlist_move_head? */
978 979 980 981 982
		INIT_HLIST_NODE(&ri->hlist);
		kretprobe_table_lock(hash, &flags);
		hlist_add_head(&ri->hlist, &kretprobe_inst_table[hash]);
		kretprobe_table_unlock(hash, &flags);
	} else {
983
		rp->nmissed++;
984 985
		spin_unlock_irqrestore(&rp->lock, flags);
	}
986 987 988
	return 0;
}

989
int __kprobes register_kretprobe(struct kretprobe *rp)
990 991 992 993
{
	int ret = 0;
	struct kretprobe_instance *inst;
	int i;
994
	void *addr;
995 996

	if (kretprobe_blacklist_size) {
997 998 999
		addr = kprobe_addr(&rp->kp);
		if (!addr)
			return -EINVAL;
1000 1001 1002 1003 1004 1005

		for (i = 0; kretprobe_blacklist[i].name != NULL; i++) {
			if (kretprobe_blacklist[i].addr == addr)
				return -EINVAL;
		}
	}
1006 1007

	rp->kp.pre_handler = pre_handler_kretprobe;
1008 1009 1010
	rp->kp.post_handler = NULL;
	rp->kp.fault_handler = NULL;
	rp->kp.break_handler = NULL;
1011 1012 1013 1014

	/* Pre-allocate memory for max kretprobe instances */
	if (rp->maxactive <= 0) {
#ifdef CONFIG_PREEMPT
1015
		rp->maxactive = max_t(unsigned int, 10, 2*num_possible_cpus());
1016
#else
1017
		rp->maxactive = num_possible_cpus();
1018 1019
#endif
	}
1020
	spin_lock_init(&rp->lock);
1021 1022
	INIT_HLIST_HEAD(&rp->free_instances);
	for (i = 0; i < rp->maxactive; i++) {
1023 1024
		inst = kmalloc(sizeof(struct kretprobe_instance) +
			       rp->data_size, GFP_KERNEL);
1025 1026 1027 1028
		if (inst == NULL) {
			free_rp_inst(rp);
			return -ENOMEM;
		}
1029 1030
		INIT_HLIST_NODE(&inst->hlist);
		hlist_add_head(&inst->hlist, &rp->free_instances);
1031 1032 1033 1034
	}

	rp->nmissed = 0;
	/* Establish function entry probe point */
1035
	ret = register_kprobe(&rp->kp);
1036
	if (ret != 0)
1037 1038 1039
		free_rp_inst(rp);
	return ret;
}
1040
EXPORT_SYMBOL_GPL(register_kretprobe);
1041

1042
int __kprobes register_kretprobes(struct kretprobe **rps, int num)
1043 1044 1045 1046 1047 1048
{
	int ret = 0, i;

	if (num <= 0)
		return -EINVAL;
	for (i = 0; i < num; i++) {
1049
		ret = register_kretprobe(rps[i]);
1050 1051 1052
		if (ret < 0) {
			if (i > 0)
				unregister_kretprobes(rps, i);
1053 1054 1055 1056 1057
			break;
		}
	}
	return ret;
}
1058
EXPORT_SYMBOL_GPL(register_kretprobes);
1059 1060 1061 1062 1063

void __kprobes unregister_kretprobe(struct kretprobe *rp)
{
	unregister_kretprobes(&rp, 1);
}
1064
EXPORT_SYMBOL_GPL(unregister_kretprobe);
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085

void __kprobes unregister_kretprobes(struct kretprobe **rps, int num)
{
	int i;

	if (num <= 0)
		return;
	mutex_lock(&kprobe_mutex);
	for (i = 0; i < num; i++)
		if (__unregister_kprobe_top(&rps[i]->kp) < 0)
			rps[i]->kp.addr = NULL;
	mutex_unlock(&kprobe_mutex);

	synchronize_sched();
	for (i = 0; i < num; i++) {
		if (rps[i]->kp.addr) {
			__unregister_kprobe_bottom(&rps[i]->kp);
			cleanup_rp_inst(rps[i]);
		}
	}
}
1086
EXPORT_SYMBOL_GPL(unregister_kretprobes);
1087

1088
#else /* CONFIG_KRETPROBES */
1089
int __kprobes register_kretprobe(struct kretprobe *rp)
1090 1091 1092
{
	return -ENOSYS;
}
1093
EXPORT_SYMBOL_GPL(register_kretprobe);
1094

1095
int __kprobes register_kretprobes(struct kretprobe **rps, int num)
1096
{
1097
	return -ENOSYS;
1098
}
1099 1100
EXPORT_SYMBOL_GPL(register_kretprobes);

1101
void __kprobes unregister_kretprobe(struct kretprobe *rp)
1102
{
1103
}
1104
EXPORT_SYMBOL_GPL(unregister_kretprobe);
1105

1106 1107 1108
void __kprobes unregister_kretprobes(struct kretprobe **rps, int num)
{
}
1109
EXPORT_SYMBOL_GPL(unregister_kretprobes);
1110

1111 1112 1113 1114
static int __kprobes pre_handler_kretprobe(struct kprobe *p,
					   struct pt_regs *regs)
{
	return 0;
1115 1116
}

1117 1118
#endif /* CONFIG_KRETPROBES */

1119 1120 1121 1122
/* Set the kprobe gone and remove its instruction buffer. */
static void __kprobes kill_kprobe(struct kprobe *p)
{
	struct kprobe *kp;
1123

1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141
	p->flags |= KPROBE_FLAG_GONE;
	if (p->pre_handler == aggr_pre_handler) {
		/*
		 * If this is an aggr_kprobe, we have to list all the
		 * chained probes and mark them GONE.
		 */
		list_for_each_entry_rcu(kp, &p->list, list)
			kp->flags |= KPROBE_FLAG_GONE;
		p->post_handler = NULL;
		p->break_handler = NULL;
	}
	/*
	 * Here, we can remove insn_slot safely, because no thread calls
	 * the original probed function (which will be freed soon) any more.
	 */
	arch_remove_kprobe(p);
}

1142 1143 1144 1145 1146 1147 1148
void __kprobes dump_kprobe(struct kprobe *kp)
{
	printk(KERN_WARNING "Dumping kprobe:\n");
	printk(KERN_WARNING "Name: %s\nAddress: %p\nOffset: %x\n",
	       kp->symbol_name, kp->addr, kp->offset);
}

1149 1150 1151 1152 1153 1154 1155 1156 1157
/* Module notifier call back, checking kprobes on the module */
static int __kprobes kprobes_module_callback(struct notifier_block *nb,
					     unsigned long val, void *data)
{
	struct module *mod = data;
	struct hlist_head *head;
	struct hlist_node *node;
	struct kprobe *p;
	unsigned int i;
1158
	int checkcore = (val == MODULE_STATE_GOING);
1159

1160
	if (val != MODULE_STATE_GOING && val != MODULE_STATE_LIVE)
1161 1162 1163
		return NOTIFY_DONE;

	/*
1164 1165 1166 1167
	 * When MODULE_STATE_GOING was notified, both of module .text and
	 * .init.text sections would be freed. When MODULE_STATE_LIVE was
	 * notified, only .init.text section would be freed. We need to
	 * disable kprobes which have been inserted in the sections.
1168 1169 1170 1171 1172
	 */
	mutex_lock(&kprobe_mutex);
	for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
		head = &kprobe_table[i];
		hlist_for_each_entry_rcu(p, node, head, hlist)
1173 1174 1175
			if (within_module_init((unsigned long)p->addr, mod) ||
			    (checkcore &&
			     within_module_core((unsigned long)p->addr, mod))) {
1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192
				/*
				 * The vaddr this probe is installed will soon
				 * be vfreed buy not synced to disk. Hence,
				 * disarming the breakpoint isn't needed.
				 */
				kill_kprobe(p);
			}
	}
	mutex_unlock(&kprobe_mutex);
	return NOTIFY_DONE;
}

static struct notifier_block kprobe_module_nb = {
	.notifier_call = kprobes_module_callback,
	.priority = 0
};

L
Linus Torvalds 已提交
1193 1194 1195
static int __init init_kprobes(void)
{
	int i, err = 0;
1196 1197 1198 1199 1200
	unsigned long offset = 0, size = 0;
	char *modname, namebuf[128];
	const char *symbol_name;
	void *addr;
	struct kprobe_blackpoint *kb;
L
Linus Torvalds 已提交
1201 1202 1203

	/* FIXME allocate the probe table, currently defined statically */
	/* initialize all list heads */
1204
	for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
L
Linus Torvalds 已提交
1205
		INIT_HLIST_HEAD(&kprobe_table[i]);
1206
		INIT_HLIST_HEAD(&kretprobe_inst_table[i]);
1207
		spin_lock_init(&(kretprobe_table_locks[i].lock));
1208
	}
L
Linus Torvalds 已提交
1209

1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231
	/*
	 * Lookup and populate the kprobe_blacklist.
	 *
	 * Unlike the kretprobe blacklist, we'll need to determine
	 * the range of addresses that belong to the said functions,
	 * since a kprobe need not necessarily be at the beginning
	 * of a function.
	 */
	for (kb = kprobe_blacklist; kb->name != NULL; kb++) {
		kprobe_lookup_name(kb->name, addr);
		if (!addr)
			continue;

		kb->start_addr = (unsigned long)addr;
		symbol_name = kallsyms_lookup(kb->start_addr,
				&size, &offset, &modname, namebuf);
		if (!symbol_name)
			kb->range = 0;
		else
			kb->range = size;
	}

1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242
	if (kretprobe_blacklist_size) {
		/* lookup the function address from its name */
		for (i = 0; kretprobe_blacklist[i].name != NULL; i++) {
			kprobe_lookup_name(kretprobe_blacklist[i].name,
					   kretprobe_blacklist[i].addr);
			if (!kretprobe_blacklist[i].addr)
				printk("kretprobe: lookup failed: %s\n",
				       kretprobe_blacklist[i].name);
		}
	}

1243 1244
	/* By default, kprobes are armed */
	kprobes_all_disarmed = false;
1245

1246
	err = arch_init_kprobes();
1247 1248
	if (!err)
		err = register_die_notifier(&kprobe_exceptions_nb);
1249 1250 1251
	if (!err)
		err = register_module_notifier(&kprobe_module_nb);

1252
	kprobes_initialized = (err == 0);
1253

1254 1255
	if (!err)
		init_test_probes();
L
Linus Torvalds 已提交
1256 1257 1258
	return err;
}

1259 1260
#ifdef CONFIG_DEBUG_FS
static void __kprobes report_probe(struct seq_file *pi, struct kprobe *p,
1261
		const char *sym, int offset,char *modname)
1262 1263 1264 1265 1266 1267 1268 1269 1270 1271
{
	char *kprobe_type;

	if (p->pre_handler == pre_handler_kretprobe)
		kprobe_type = "r";
	else if (p->pre_handler == setjmp_pre_handler)
		kprobe_type = "j";
	else
		kprobe_type = "k";
	if (sym)
1272 1273 1274 1275 1276 1277
		seq_printf(pi, "%p  %s  %s+0x%x  %s %s%s\n",
			p->addr, kprobe_type, sym, offset,
			(modname ? modname : " "),
			(kprobe_gone(p) ? "[GONE]" : ""),
			((kprobe_disabled(p) && !kprobe_gone(p)) ?
			 "[DISABLED]" : ""));
1278
	else
1279 1280 1281 1282 1283
		seq_printf(pi, "%p  %s  %p %s%s\n",
			p->addr, kprobe_type, p->addr,
			(kprobe_gone(p) ? "[GONE]" : ""),
			((kprobe_disabled(p) && !kprobe_gone(p)) ?
			 "[DISABLED]" : ""));
1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310
}

static void __kprobes *kprobe_seq_start(struct seq_file *f, loff_t *pos)
{
	return (*pos < KPROBE_TABLE_SIZE) ? pos : NULL;
}

static void __kprobes *kprobe_seq_next(struct seq_file *f, void *v, loff_t *pos)
{
	(*pos)++;
	if (*pos >= KPROBE_TABLE_SIZE)
		return NULL;
	return pos;
}

static void __kprobes kprobe_seq_stop(struct seq_file *f, void *v)
{
	/* Nothing to do */
}

static int __kprobes show_kprobe_addr(struct seq_file *pi, void *v)
{
	struct hlist_head *head;
	struct hlist_node *node;
	struct kprobe *p, *kp;
	const char *sym = NULL;
	unsigned int i = *(loff_t *) v;
A
Alexey Dobriyan 已提交
1311
	unsigned long offset = 0;
1312 1313 1314 1315 1316
	char *modname, namebuf[128];

	head = &kprobe_table[i];
	preempt_disable();
	hlist_for_each_entry_rcu(p, node, head, hlist) {
A
Alexey Dobriyan 已提交
1317
		sym = kallsyms_lookup((unsigned long)p->addr, NULL,
1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328
					&offset, &modname, namebuf);
		if (p->pre_handler == aggr_pre_handler) {
			list_for_each_entry_rcu(kp, &p->list, list)
				report_probe(pi, kp, sym, offset, modname);
		} else
			report_probe(pi, p, sym, offset, modname);
	}
	preempt_enable();
	return 0;
}

J
James Morris 已提交
1329
static const struct seq_operations kprobes_seq_ops = {
1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340
	.start = kprobe_seq_start,
	.next  = kprobe_seq_next,
	.stop  = kprobe_seq_stop,
	.show  = show_kprobe_addr
};

static int __kprobes kprobes_open(struct inode *inode, struct file *filp)
{
	return seq_open(filp, &kprobes_seq_ops);
}

1341
static const struct file_operations debugfs_kprobes_operations = {
1342 1343 1344 1345 1346 1347
	.open           = kprobes_open,
	.read           = seq_read,
	.llseek         = seq_lseek,
	.release        = seq_release,
};

1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372
/* Disable one kprobe */
int __kprobes disable_kprobe(struct kprobe *kp)
{
	int ret = 0;
	struct kprobe *p;

	mutex_lock(&kprobe_mutex);

	/* Check whether specified probe is valid. */
	p = __get_valid_kprobe(kp);
	if (unlikely(p == NULL)) {
		ret = -EINVAL;
		goto out;
	}

	/* If the probe is already disabled (or gone), just return */
	if (kprobe_disabled(kp))
		goto out;

	kp->flags |= KPROBE_FLAG_DISABLED;
	if (p != kp)
		/* When kp != p, p is always enabled. */
		try_to_disable_aggr_kprobe(p);

	if (!kprobes_all_disarmed && kprobe_disabled(p))
1373
		disarm_kprobe(p);
1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401
out:
	mutex_unlock(&kprobe_mutex);
	return ret;
}
EXPORT_SYMBOL_GPL(disable_kprobe);

/* Enable one kprobe */
int __kprobes enable_kprobe(struct kprobe *kp)
{
	int ret = 0;
	struct kprobe *p;

	mutex_lock(&kprobe_mutex);

	/* Check whether specified probe is valid. */
	p = __get_valid_kprobe(kp);
	if (unlikely(p == NULL)) {
		ret = -EINVAL;
		goto out;
	}

	if (kprobe_gone(kp)) {
		/* This kprobe has gone, we couldn't enable it. */
		ret = -EINVAL;
		goto out;
	}

	if (!kprobes_all_disarmed && kprobe_disabled(p))
1402
		arm_kprobe(p);
1403 1404 1405 1406 1407 1408 1409 1410 1411 1412

	p->flags &= ~KPROBE_FLAG_DISABLED;
	if (p != kp)
		kp->flags &= ~KPROBE_FLAG_DISABLED;
out:
	mutex_unlock(&kprobe_mutex);
	return ret;
}
EXPORT_SYMBOL_GPL(enable_kprobe);

1413
static void __kprobes arm_all_kprobes(void)
1414 1415 1416 1417 1418 1419 1420 1421
{
	struct hlist_head *head;
	struct hlist_node *node;
	struct kprobe *p;
	unsigned int i;

	mutex_lock(&kprobe_mutex);

1422 1423
	/* If kprobes are armed, just return */
	if (!kprobes_all_disarmed)
1424 1425
		goto already_enabled;

1426
	mutex_lock(&text_mutex);
1427 1428 1429
	for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
		head = &kprobe_table[i];
		hlist_for_each_entry_rcu(p, node, head, hlist)
1430
			if (!kprobe_disabled(p))
1431
				arch_arm_kprobe(p);
1432
	}
1433
	mutex_unlock(&text_mutex);
1434

1435
	kprobes_all_disarmed = false;
1436 1437 1438 1439 1440 1441 1442
	printk(KERN_INFO "Kprobes globally enabled\n");

already_enabled:
	mutex_unlock(&kprobe_mutex);
	return;
}

1443
static void __kprobes disarm_all_kprobes(void)
1444 1445 1446 1447 1448 1449 1450 1451
{
	struct hlist_head *head;
	struct hlist_node *node;
	struct kprobe *p;
	unsigned int i;

	mutex_lock(&kprobe_mutex);

1452 1453
	/* If kprobes are already disarmed, just return */
	if (kprobes_all_disarmed)
1454 1455
		goto already_disabled;

1456
	kprobes_all_disarmed = true;
1457
	printk(KERN_INFO "Kprobes globally disabled\n");
1458
	mutex_lock(&text_mutex);
1459 1460 1461
	for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
		head = &kprobe_table[i];
		hlist_for_each_entry_rcu(p, node, head, hlist) {
1462
			if (!arch_trampoline_kprobe(p) && !kprobe_disabled(p))
1463 1464 1465 1466
				arch_disarm_kprobe(p);
		}
	}

1467
	mutex_unlock(&text_mutex);
1468 1469 1470
	mutex_unlock(&kprobe_mutex);
	/* Allow all currently running kprobes to complete */
	synchronize_sched();
1471
	return;
1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487

already_disabled:
	mutex_unlock(&kprobe_mutex);
	return;
}

/*
 * XXX: The debugfs bool file interface doesn't allow for callbacks
 * when the bool state is switched. We can reuse that facility when
 * available
 */
static ssize_t read_enabled_file_bool(struct file *file,
	       char __user *user_buf, size_t count, loff_t *ppos)
{
	char buf[3];

1488
	if (!kprobes_all_disarmed)
1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510
		buf[0] = '1';
	else
		buf[0] = '0';
	buf[1] = '\n';
	buf[2] = 0x00;
	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
}

static ssize_t write_enabled_file_bool(struct file *file,
	       const char __user *user_buf, size_t count, loff_t *ppos)
{
	char buf[32];
	int buf_size;

	buf_size = min(count, (sizeof(buf)-1));
	if (copy_from_user(buf, user_buf, buf_size))
		return -EFAULT;

	switch (buf[0]) {
	case 'y':
	case 'Y':
	case '1':
1511
		arm_all_kprobes();
1512 1513 1514 1515
		break;
	case 'n':
	case 'N':
	case '0':
1516
		disarm_all_kprobes();
1517 1518 1519 1520 1521 1522
		break;
	}

	return count;
}

1523
static const struct file_operations fops_kp = {
1524 1525 1526 1527
	.read =         read_enabled_file_bool,
	.write =        write_enabled_file_bool,
};

1528 1529 1530
static int __kprobes debugfs_kprobe_init(void)
{
	struct dentry *dir, *file;
1531
	unsigned int value = 1;
1532 1533 1534 1535 1536

	dir = debugfs_create_dir("kprobes", NULL);
	if (!dir)
		return -ENOMEM;

R
Randy Dunlap 已提交
1537
	file = debugfs_create_file("list", 0444, dir, NULL,
1538 1539 1540 1541 1542 1543
				&debugfs_kprobes_operations);
	if (!file) {
		debugfs_remove(dir);
		return -ENOMEM;
	}

1544 1545 1546 1547 1548 1549 1550
	file = debugfs_create_file("enabled", 0600, dir,
					&value, &fops_kp);
	if (!file) {
		debugfs_remove(dir);
		return -ENOMEM;
	}

1551 1552 1553 1554 1555 1556 1557
	return 0;
}

late_initcall(debugfs_kprobe_init);
#endif /* CONFIG_DEBUG_FS */

module_init(init_kprobes);
L
Linus Torvalds 已提交
1558

1559
/* defined in arch/.../kernel/kprobes.c */
L
Linus Torvalds 已提交
1560
EXPORT_SYMBOL_GPL(jprobe_return);