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

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

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

56 57 58 59 60 61 62 63 64 65

/*
 * 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

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

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

73
static DEFINE_MUTEX(kprobe_mutex);	/* Protects kprobe_table */
74
static DEFINE_PER_CPU(struct kprobe *, kprobe_instance) = NULL;
75
static struct {
76
	spinlock_t lock ____cacheline_aligned_in_smp;
77 78 79 80 81 82
} 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 已提交
83

84 85 86 87 88 89 90
/*
 * 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
 */
91
static struct kprobe_blackpoint kprobe_blacklist[] = {
92
	{"preempt_schedule",},
93
	{"native_get_debugreg",},
94 95 96
	{NULL}    /* Terminator */
};

97
#ifdef __ARCH_WANT_KPROBES_INSN_SLOT
98 99 100 101 102 103 104 105 106
/*
 * 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 {
107
	struct list_head list;
108 109 110
	kprobe_opcode_t *insns;		/* Page of instruction slots */
	char slot_used[INSNS_PER_PAGE];
	int nused;
111
	int ngarbage;
112 113
};

114 115 116 117 118 119
enum kprobe_slot_state {
	SLOT_CLEAN = 0,
	SLOT_DIRTY = 1,
	SLOT_USED = 2,
};

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

static int __kprobes check_safety(void)
{
	int ret = 0;
128
#if defined(CONFIG_PREEMPT) && defined(CONFIG_FREEZER)
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
	ret = freeze_processes();
	if (ret == 0) {
		struct task_struct *p, *q;
		do_each_thread(p, q) {
			if (p != current && p->state == TASK_RUNNING &&
			    p->pid != 0) {
				printk("Check failed: %s is running\n",p->comm);
				ret = -1;
				goto loop_end;
			}
		} while_each_thread(p, q);
	}
loop_end:
	thaw_processes();
#else
	synchronize_sched();
#endif
	return ret;
}
148 149

/**
150
 * __get_insn_slot() - Find a slot on an executable page for an instruction.
151 152
 * We allocate an executable page if there's no room on existing ones.
 */
153
static kprobe_opcode_t __kprobes *__get_insn_slot(void)
154 155 156
{
	struct kprobe_insn_page *kip;

157
 retry:
158
	list_for_each_entry(kip, &kprobe_insn_pages, list) {
159 160 161
		if (kip->nused < INSNS_PER_PAGE) {
			int i;
			for (i = 0; i < INSNS_PER_PAGE; i++) {
162 163
				if (kip->slot_used[i] == SLOT_CLEAN) {
					kip->slot_used[i] = SLOT_USED;
164 165 166 167 168 169 170 171 172
					kip->nused++;
					return kip->insns + (i * MAX_INSN_SIZE);
				}
			}
			/* Surprise!  No unused slots.  Fix kip->nused. */
			kip->nused = INSNS_PER_PAGE;
		}
	}

173 174 175 176 177
	/* 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. */
178
	kip = kmalloc(sizeof(struct kprobe_insn_page), GFP_KERNEL);
179
	if (!kip)
180 181 182 183 184 185 186 187 188 189 190 191
		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;
	}
192 193
	INIT_LIST_HEAD(&kip->list);
	list_add(&kip->list, &kprobe_insn_pages);
194 195
	memset(kip->slot_used, SLOT_CLEAN, INSNS_PER_PAGE);
	kip->slot_used[0] = SLOT_USED;
196
	kip->nused = 1;
197
	kip->ngarbage = 0;
198 199 200
	return kip->insns;
}

201 202 203 204 205 206 207 208 209
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;
}

210 211 212
/* Return 1 if all garbages are collected, otherwise 0. */
static int __kprobes collect_one_slot(struct kprobe_insn_page *kip, int idx)
{
213
	kip->slot_used[idx] = SLOT_CLEAN;
214 215 216 217 218 219 220 221
	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.
		 */
222 223
		if (!list_is_singular(&kprobe_insn_pages)) {
			list_del(&kip->list);
224 225 226 227 228 229 230 231 232 233
			module_free(NULL, kip->insns);
			kfree(kip);
		}
		return 1;
	}
	return 0;
}

static int __kprobes collect_garbage_slots(void)
{
234
	struct kprobe_insn_page *kip, *next;
235 236

	/* Ensure no-one is preepmted on the garbages */
237
	if (check_safety())
238 239
		return -EAGAIN;

240
	list_for_each_entry_safe(kip, next, &kprobe_insn_pages, list) {
241 242 243 244 245
		int i;
		if (kip->ngarbage == 0)
			continue;
		kip->ngarbage = 0;	/* we will collect all garbages */
		for (i = 0; i < INSNS_PER_PAGE; i++) {
246
			if (kip->slot_used[i] == SLOT_DIRTY &&
247 248 249 250 251 252 253 254 255
			    collect_one_slot(kip, i))
				break;
		}
	}
	kprobe_garbage_slots = 0;
	return 0;
}

void __kprobes free_insn_slot(kprobe_opcode_t * slot, int dirty)
256 257 258
{
	struct kprobe_insn_page *kip;

259
	mutex_lock(&kprobe_insn_mutex);
260
	list_for_each_entry(kip, &kprobe_insn_pages, list) {
261 262 263
		if (kip->insns <= slot &&
		    slot < kip->insns + (INSNS_PER_PAGE * MAX_INSN_SIZE)) {
			int i = (slot - kip->insns) / MAX_INSN_SIZE;
264
			if (dirty) {
265
				kip->slot_used[i] = SLOT_DIRTY;
266
				kip->ngarbage++;
267
			} else
268 269
				collect_one_slot(kip, i);
			break;
270 271
		}
	}
272 273

	if (dirty && ++kprobe_garbage_slots > INSNS_PER_PAGE)
274
		collect_garbage_slots();
275 276

	mutex_unlock(&kprobe_insn_mutex);
277
}
278
#endif
279

280 281 282 283 284 285 286 287 288 289 290
/* 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;
}

291 292
/*
 * This routine is called either:
293
 * 	- under the kprobe_mutex - during kprobe_[un]register()
294
 * 				OR
295
 * 	- with preemption disabled - from arch/xxx/kernel/kprobes.c
296
 */
297
struct kprobe __kprobes *get_kprobe(void *addr)
L
Linus Torvalds 已提交
298 299 300
{
	struct hlist_head *head;
	struct hlist_node *node;
301
	struct kprobe *p;
L
Linus Torvalds 已提交
302 303

	head = &kprobe_table[hash_ptr(addr, KPROBE_HASH_BITS)];
304
	hlist_for_each_entry_rcu(p, node, head, hlist) {
L
Linus Torvalds 已提交
305 306 307 308 309 310
		if (p->addr == addr)
			return p;
	}
	return NULL;
}

311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
/* 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);
}

327 328 329 330
/*
 * Aggregate handlers for multiple kprobes support - these handlers
 * take care of invoking the individual kprobe handlers on p->list
 */
331
static int __kprobes aggr_pre_handler(struct kprobe *p, struct pt_regs *regs)
332 333 334
{
	struct kprobe *kp;

335
	list_for_each_entry_rcu(kp, &p->list, list) {
336
		if (kp->pre_handler && likely(!kprobe_disabled(kp))) {
337
			set_kprobe_instance(kp);
338 339
			if (kp->pre_handler(kp, regs))
				return 1;
340
		}
341
		reset_kprobe_instance();
342 343 344 345
	}
	return 0;
}

346 347
static void __kprobes aggr_post_handler(struct kprobe *p, struct pt_regs *regs,
					unsigned long flags)
348 349 350
{
	struct kprobe *kp;

351
	list_for_each_entry_rcu(kp, &p->list, list) {
352
		if (kp->post_handler && likely(!kprobe_disabled(kp))) {
353
			set_kprobe_instance(kp);
354
			kp->post_handler(kp, regs, flags);
355
			reset_kprobe_instance();
356 357 358 359
		}
	}
}

360 361
static int __kprobes aggr_fault_handler(struct kprobe *p, struct pt_regs *regs,
					int trapnr)
362
{
363 364
	struct kprobe *cur = __get_cpu_var(kprobe_instance);

365 366 367 368
	/*
	 * if we faulted "during" the execution of a user specified
	 * probe handler, invoke just that probe's fault handler
	 */
369 370
	if (cur && cur->fault_handler) {
		if (cur->fault_handler(cur, regs, trapnr))
371 372 373 374 375
			return 1;
	}
	return 0;
}

376
static int __kprobes aggr_break_handler(struct kprobe *p, struct pt_regs *regs)
377
{
378 379 380 381 382 383
	struct kprobe *cur = __get_cpu_var(kprobe_instance);
	int ret = 0;

	if (cur && cur->break_handler) {
		if (cur->break_handler(cur, regs))
			ret = 1;
384
	}
385 386
	reset_kprobe_instance();
	return ret;
387 388
}

389 390 391 392 393 394 395 396 397 398 399 400 401
/* 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;
}

402 403
void __kprobes recycle_rp_inst(struct kretprobe_instance *ri,
				struct hlist_head *head)
404
{
405 406
	struct kretprobe *rp = ri->rp;

407 408
	/* remove rp inst off the rprobe_inst_table */
	hlist_del(&ri->hlist);
409 410 411 412 413
	INIT_HLIST_NODE(&ri->hlist);
	if (likely(rp)) {
		spin_lock(&rp->lock);
		hlist_add_head(&ri->hlist, &rp->free_instances);
		spin_unlock(&rp->lock);
414 415
	} else
		/* Unregistering */
416
		hlist_add_head(&ri->hlist, head);
417 418
}

419
void __kprobes kretprobe_hash_lock(struct task_struct *tsk,
420 421 422 423 424 425 426 427 428 429
			 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);
}

430 431
static void __kprobes kretprobe_table_lock(unsigned long hash,
	unsigned long *flags)
432
{
433 434 435 436
	spinlock_t *hlist_lock = kretprobe_table_lock_ptr(hash);
	spin_lock_irqsave(hlist_lock, *flags);
}

437 438
void __kprobes kretprobe_hash_unlock(struct task_struct *tsk,
	unsigned long *flags)
439 440 441 442 443 444 445 446
{
	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);
}

447
void __kprobes kretprobe_table_unlock(unsigned long hash, unsigned long *flags)
448 449 450
{
	spinlock_t *hlist_lock = kretprobe_table_lock_ptr(hash);
	spin_unlock_irqrestore(hlist_lock, *flags);
451 452 453
}

/*
454 455 456 457
 * 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.
458
 */
459
void __kprobes kprobe_flush_task(struct task_struct *tk)
460
{
B
bibo,mao 已提交
461
	struct kretprobe_instance *ri;
462
	struct hlist_head *head, empty_rp;
463
	struct hlist_node *node, *tmp;
464
	unsigned long hash, flags = 0;
465

466 467 468 469 470 471 472
	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 已提交
473 474
	hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
		if (ri->task == tk)
475
			recycle_rp_inst(ri, &empty_rp);
B
bibo,mao 已提交
476
	}
477 478
	kretprobe_table_unlock(hash, &flags);
	INIT_HLIST_HEAD(&empty_rp);
479 480 481 482
	hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) {
		hlist_del(&ri->hlist);
		kfree(ri);
	}
483 484 485 486 487
}

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

490 491
	hlist_for_each_entry_safe(ri, pos, next, &rp->free_instances, hlist) {
		hlist_del(&ri->hlist);
492 493 494 495
		kfree(ri);
	}
}

496 497
static void __kprobes cleanup_rp_inst(struct kretprobe *rp)
{
498
	unsigned long flags, hash;
499 500
	struct kretprobe_instance *ri;
	struct hlist_node *pos, *next;
501 502
	struct hlist_head *head;

503
	/* No race here */
504 505 506 507 508 509 510 511
	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);
512 513 514 515
	}
	free_rp_inst(rp);
}

516 517 518 519 520 521 522 523 524 525
/*
 * 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));
}

/*
526
* Add the new probe to ap->list. Fail if this is the
527 528
* second jprobe at the address - two jprobes can't coexist
*/
529
static int __kprobes add_new_kprobe(struct kprobe *ap, struct kprobe *p)
530
{
531
	BUG_ON(kprobe_gone(ap) || kprobe_gone(p));
532
	if (p->break_handler) {
533
		if (ap->break_handler)
534
			return -EEXIST;
535 536
		list_add_tail_rcu(&p->list, &ap->list);
		ap->break_handler = aggr_break_handler;
537
	} else
538 539 540
		list_add_rcu(&p->list, &ap->list);
	if (p->post_handler && !ap->post_handler)
		ap->post_handler = aggr_post_handler;
541 542 543 544 545

	if (kprobe_disabled(ap) && !kprobe_disabled(p)) {
		ap->flags &= ~KPROBE_FLAG_DISABLED;
		if (!kprobes_all_disarmed)
			/* Arm the breakpoint again. */
546
			arm_kprobe(ap);
547
	}
548 549 550
	return 0;
}

551 552 553 554 555 556
/*
 * 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)
{
557
	copy_kprobe(p, ap);
558
	flush_insn_slot(ap);
559
	ap->addr = p->addr;
560
	ap->flags = p->flags;
561 562
	ap->pre_handler = aggr_pre_handler;
	ap->fault_handler = aggr_fault_handler;
563 564
	/* We don't care the kprobe which has gone. */
	if (p->post_handler && !kprobe_gone(p))
565
		ap->post_handler = aggr_post_handler;
566
	if (p->break_handler && !kprobe_gone(p))
567
		ap->break_handler = aggr_break_handler;
568 569

	INIT_LIST_HEAD(&ap->list);
570
	list_add_rcu(&p->list, &ap->list);
571

572
	hlist_replace_rcu(&p->hlist, &ap->hlist);
573 574 575 576 577 578
}

/*
 * This is the second or subsequent kprobe at the address - handle
 * the intricacies
 */
579 580
static int __kprobes register_aggr_kprobe(struct kprobe *old_p,
					  struct kprobe *p)
581 582
{
	int ret = 0;
583
	struct kprobe *ap = old_p;
584

585 586 587 588 589 590 591 592 593
	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)) {
594 595 596 597 598 599
		/*
		 * 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.
		 */
600
		ret = arch_prepare_kprobe(ap);
601
		if (ret)
602 603 604 605 606
			/*
			 * 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.
			 */
607
			return ret;
608

609
		/*
610 611
		 * Clear gone flag to prevent allocating new slot again, and
		 * set disabled flag because it is not armed yet.
612
		 */
613 614
		ap->flags = (ap->flags & ~KPROBE_FLAG_GONE)
			    | KPROBE_FLAG_DISABLED;
615
	}
616 617 618

	copy_kprobe(ap, p);
	return add_new_kprobe(ap, p);
619 620
}

621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637
/* 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;
}

638 639
static int __kprobes in_kprobes_functions(unsigned long addr)
{
640 641
	struct kprobe_blackpoint *kb;

642 643
	if (addr >= (unsigned long)__kprobes_text_start &&
	    addr < (unsigned long)__kprobes_text_end)
644
		return -EINVAL;
645 646 647 648 649 650 651 652 653 654 655
	/*
	 * 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;
		}
	}
656 657 658
	return 0;
}

659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
/*
 * 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);
}

677
int __kprobes register_kprobe(struct kprobe *p)
L
Linus Torvalds 已提交
678 679
{
	int ret = 0;
680
	struct kprobe *old_p;
681
	struct module *probed_mod;
682
	kprobe_opcode_t *addr;
683

684 685
	addr = kprobe_addr(p);
	if (!addr)
686
		return -EINVAL;
687
	p->addr = addr;
688

689
	preempt_disable();
690
	if (!kernel_text_address((unsigned long) p->addr) ||
691 692
	    in_kprobes_functions((unsigned long) p->addr)) {
		preempt_enable();
693
		return -EINVAL;
694
	}
695

696 697 698
	/* User can pass only KPROBE_FLAG_DISABLED to register_kprobe */
	p->flags &= KPROBE_FLAG_DISABLED;

699 700 701
	/*
	 * Check if are we probing a module.
	 */
702
	probed_mod = __module_text_address((unsigned long) p->addr);
703 704
	if (probed_mod) {
		/*
705 706
		 * We must hold a refcount of the probed module while updating
		 * its code to prohibit unexpected unloading.
707
		 */
708 709 710 711
		if (unlikely(!try_module_get(probed_mod))) {
			preempt_enable();
			return -EINVAL;
		}
712 713 714 715 716 717 718 719 720 721
		/*
		 * 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;
		}
722
	}
723
	preempt_enable();
L
Linus Torvalds 已提交
724

725
	p->nmissed = 0;
726
	INIT_LIST_HEAD(&p->list);
I
Ingo Molnar 已提交
727
	mutex_lock(&kprobe_mutex);
728 729 730
	old_p = get_kprobe(p->addr);
	if (old_p) {
		ret = register_aggr_kprobe(old_p, p);
L
Linus Torvalds 已提交
731 732 733
		goto out;
	}

734
	mutex_lock(&text_mutex);
735 736
	ret = arch_prepare_kprobe(p);
	if (ret)
737
		goto out_unlock_text;
738

739
	INIT_HLIST_NODE(&p->hlist);
740
	hlist_add_head_rcu(&p->hlist,
L
Linus Torvalds 已提交
741 742
		       &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]);

743
	if (!kprobes_all_disarmed && !kprobe_disabled(p))
744
		arch_arm_kprobe(p);
745

746 747
out_unlock_text:
	mutex_unlock(&text_mutex);
L
Linus Torvalds 已提交
748
out:
I
Ingo Molnar 已提交
749
	mutex_unlock(&kprobe_mutex);
750

751
	if (probed_mod)
752
		module_put(probed_mod);
753

L
Linus Torvalds 已提交
754 755
	return ret;
}
756
EXPORT_SYMBOL_GPL(register_kprobe);
L
Linus Torvalds 已提交
757

758 759
/* Check passed kprobe is valid and return kprobe in kprobe_table. */
static struct kprobe * __kprobes __get_valid_kprobe(struct kprobe *p)
L
Linus Torvalds 已提交
760
{
761
	struct kprobe *old_p, *list_p;
762 763

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

767 768 769 770
	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 */
771 772
				goto valid;
		return NULL;
773
	}
774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
valid:
	return old_p;
}

/*
 * 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;

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

821 822 823
static void __kprobes __unregister_kprobe_bottom(struct kprobe *p)
{
	struct kprobe *old_p;
824

825
	if (list_empty(&p->list))
826
		arch_remove_kprobe(p);
827 828 829 830 831 832
	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);
833 834 835
	}
}

836
int __kprobes register_kprobes(struct kprobe **kps, int num)
837 838 839 840 841 842
{
	int i, ret = 0;

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

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

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 已提交
876
}
877
EXPORT_SYMBOL_GPL(unregister_kprobes);
L
Linus Torvalds 已提交
878 879

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

884 885 886 887
unsigned long __weak arch_deref_entry_point(void *entry)
{
	return (unsigned long)entry;
}
L
Linus Torvalds 已提交
888

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

894
	if (num <= 0)
895
		return -EINVAL;
896 897 898 899 900 901 902 903 904 905 906
	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;
907
			ret = register_kprobe(&jp->kp);
908
		}
909 910 911
		if (ret < 0) {
			if (i > 0)
				unregister_jprobes(jps, i);
912 913 914 915 916
			break;
		}
	}
	return ret;
}
917
EXPORT_SYMBOL_GPL(register_jprobes);
918

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

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

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 已提交
948
}
949
EXPORT_SYMBOL_GPL(unregister_jprobes);
L
Linus Torvalds 已提交
950

951
#ifdef CONFIG_KRETPROBES
952 953 954 955 956 957 958 959
/*
 * 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);
960 961
	unsigned long hash, flags = 0;
	struct kretprobe_instance *ri;
962 963

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

972 973
		ri->rp = rp;
		ri->task = current;
974

975
		if (rp->entry_handler && rp->entry_handler(ri, regs))
976 977
			return 0;

978 979 980
		arch_prepare_kretprobe(ri, regs);

		/* XXX(hch): why is there no hlist_move_head? */
981 982 983 984 985
		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 {
986
		rp->nmissed++;
987 988
		spin_unlock_irqrestore(&rp->lock, flags);
	}
989 990 991
	return 0;
}

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

	if (kretprobe_blacklist_size) {
1000 1001 1002
		addr = kprobe_addr(&rp->kp);
		if (!addr)
			return -EINVAL;
1003 1004 1005 1006 1007 1008

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

	rp->kp.pre_handler = pre_handler_kretprobe;
1011 1012 1013
	rp->kp.post_handler = NULL;
	rp->kp.fault_handler = NULL;
	rp->kp.break_handler = NULL;
1014 1015 1016 1017 1018 1019 1020 1021 1022

	/* Pre-allocate memory for max kretprobe instances */
	if (rp->maxactive <= 0) {
#ifdef CONFIG_PREEMPT
		rp->maxactive = max(10, 2 * NR_CPUS);
#else
		rp->maxactive = NR_CPUS;
#endif
	}
1023
	spin_lock_init(&rp->lock);
1024 1025
	INIT_HLIST_HEAD(&rp->free_instances);
	for (i = 0; i < rp->maxactive; i++) {
1026 1027
		inst = kmalloc(sizeof(struct kretprobe_instance) +
			       rp->data_size, GFP_KERNEL);
1028 1029 1030 1031
		if (inst == NULL) {
			free_rp_inst(rp);
			return -ENOMEM;
		}
1032 1033
		INIT_HLIST_NODE(&inst->hlist);
		hlist_add_head(&inst->hlist, &rp->free_instances);
1034 1035 1036 1037
	}

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

1045
int __kprobes register_kretprobes(struct kretprobe **rps, int num)
1046 1047 1048 1049 1050 1051
{
	int ret = 0, i;

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

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

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]);
		}
	}
}
1089
EXPORT_SYMBOL_GPL(unregister_kretprobes);
1090

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

1098
int __kprobes register_kretprobes(struct kretprobe **rps, int num)
1099
{
1100
	return -ENOSYS;
1101
}
1102 1103
EXPORT_SYMBOL_GPL(register_kretprobes);

1104
void __kprobes unregister_kretprobe(struct kretprobe *rp)
1105
{
1106
}
1107
EXPORT_SYMBOL_GPL(unregister_kretprobe);
1108

1109 1110 1111
void __kprobes unregister_kretprobes(struct kretprobe **rps, int num)
{
}
1112
EXPORT_SYMBOL_GPL(unregister_kretprobes);
1113

1114 1115 1116 1117
static int __kprobes pre_handler_kretprobe(struct kprobe *p,
					   struct pt_regs *regs)
{
	return 0;
1118 1119
}

1120 1121
#endif /* CONFIG_KRETPROBES */

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

1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144
	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);
}

1145 1146 1147 1148 1149 1150 1151
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);
}

1152 1153 1154 1155 1156 1157 1158 1159 1160
/* 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;
1161
	int checkcore = (val == MODULE_STATE_GOING);
1162

1163
	if (val != MODULE_STATE_GOING && val != MODULE_STATE_LIVE)
1164 1165 1166
		return NOTIFY_DONE;

	/*
1167 1168 1169 1170
	 * 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.
1171 1172 1173 1174 1175
	 */
	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)
1176 1177 1178
			if (within_module_init((unsigned long)p->addr, mod) ||
			    (checkcore &&
			     within_module_core((unsigned long)p->addr, mod))) {
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195
				/*
				 * 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 已提交
1196 1197 1198
static int __init init_kprobes(void)
{
	int i, err = 0;
1199 1200 1201 1202 1203
	unsigned long offset = 0, size = 0;
	char *modname, namebuf[128];
	const char *symbol_name;
	void *addr;
	struct kprobe_blackpoint *kb;
L
Linus Torvalds 已提交
1204 1205 1206

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

1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234
	/*
	 * 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;
	}

1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245
	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);
		}
	}

1246 1247
	/* By default, kprobes are armed */
	kprobes_all_disarmed = false;
1248

1249
	err = arch_init_kprobes();
1250 1251
	if (!err)
		err = register_die_notifier(&kprobe_exceptions_nb);
1252 1253 1254
	if (!err)
		err = register_module_notifier(&kprobe_module_nb);

1255
	kprobes_initialized = (err == 0);
1256

1257 1258
	if (!err)
		init_test_probes();
L
Linus Torvalds 已提交
1259 1260 1261
	return err;
}

1262 1263
#ifdef CONFIG_DEBUG_FS
static void __kprobes report_probe(struct seq_file *pi, struct kprobe *p,
1264
		const char *sym, int offset,char *modname)
1265 1266 1267 1268 1269 1270 1271 1272 1273 1274
{
	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)
1275 1276 1277 1278 1279 1280
		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]" : ""));
1281
	else
1282 1283 1284 1285 1286
		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]" : ""));
1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313
}

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 已提交
1314
	unsigned long offset = 0;
1315 1316 1317 1318 1319
	char *modname, namebuf[128];

	head = &kprobe_table[i];
	preempt_disable();
	hlist_for_each_entry_rcu(p, node, head, hlist) {
A
Alexey Dobriyan 已提交
1320
		sym = kallsyms_lookup((unsigned long)p->addr, NULL,
1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350
					&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;
}

static struct seq_operations kprobes_seq_ops = {
	.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);
}

static struct file_operations debugfs_kprobes_operations = {
	.open           = kprobes_open,
	.read           = seq_read,
	.llseek         = seq_lseek,
	.release        = seq_release,
};

1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375
/* 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))
1376
		disarm_kprobe(p);
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 1402 1403 1404
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))
1405
		arm_kprobe(p);
1406 1407 1408 1409 1410 1411 1412 1413 1414 1415

	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);

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

	mutex_lock(&kprobe_mutex);

1425 1426
	/* If kprobes are armed, just return */
	if (!kprobes_all_disarmed)
1427 1428
		goto already_enabled;

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

1438
	kprobes_all_disarmed = false;
1439 1440 1441 1442 1443 1444 1445
	printk(KERN_INFO "Kprobes globally enabled\n");

already_enabled:
	mutex_unlock(&kprobe_mutex);
	return;
}

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

	mutex_lock(&kprobe_mutex);

1455 1456
	/* If kprobes are already disarmed, just return */
	if (kprobes_all_disarmed)
1457 1458
		goto already_disabled;

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

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

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];

1491
	if (!kprobes_all_disarmed)
1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513
		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':
1514
		arm_all_kprobes();
1515 1516 1517 1518
		break;
	case 'n':
	case 'N':
	case '0':
1519
		disarm_all_kprobes();
1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530
		break;
	}

	return count;
}

static struct file_operations fops_kp = {
	.read =         read_enabled_file_bool,
	.write =        write_enabled_file_bool,
};

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

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

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

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

1554 1555 1556 1557 1558 1559 1560
	return 0;
}

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

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

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