trace_kprobe.c 37.1 KB
Newer Older
1
/*
2
 * Kprobes-based tracing events
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 * Created by Masami Hiramatsu <mhiramat@redhat.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * 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
 */

#include <linux/module.h>
#include <linux/uaccess.h>

23
#include "trace_probe.h"
24

25
#define KPROBE_EVENT_SYSTEM "kprobes"
26

27
/**
28
 * Kprobe event core functions
29
 */
30
struct trace_kprobe {
31
	struct list_head	list;
32
	struct kretprobe	rp;	/* Use rp.kp for kprobe use */
33
	unsigned long __percpu *nhit;
34
	const char		*symbol;	/* symbol name */
35
	struct trace_probe	tp;
36 37
};

38 39
#define SIZEOF_TRACE_KPROBE(n)				\
	(offsetof(struct trace_kprobe, tp.args) +	\
40
	(sizeof(struct probe_arg) * (n)))
41

42

43
static nokprobe_inline bool trace_kprobe_is_return(struct trace_kprobe *tk)
44
{
45
	return tk->rp.handler != NULL;
46 47
}

48
static nokprobe_inline const char *trace_kprobe_symbol(struct trace_kprobe *tk)
49
{
50
	return tk->symbol ? tk->symbol : "unknown";
51 52
}

53
static nokprobe_inline unsigned long trace_kprobe_offset(struct trace_kprobe *tk)
54
{
55
	return tk->rp.kp.offset;
56 57
}

58
static nokprobe_inline bool trace_kprobe_has_gone(struct trace_kprobe *tk)
59
{
60
	return !!(kprobe_gone(&tk->rp.kp));
61 62
}

63
static nokprobe_inline bool trace_kprobe_within_module(struct trace_kprobe *tk,
64
						 struct module *mod)
65 66
{
	int len = strlen(mod->name);
67
	const char *name = trace_kprobe_symbol(tk);
68 69 70
	return strncmp(mod->name, name, len) == 0 && name[len] == ':';
}

71
static nokprobe_inline bool trace_kprobe_is_on_module(struct trace_kprobe *tk)
72
{
73
	return !!strchr(trace_kprobe_symbol(tk), ':');
74 75
}

76 77 78 79 80 81 82 83 84 85 86
static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk)
{
	unsigned long nhit = 0;
	int cpu;

	for_each_possible_cpu(cpu)
		nhit += *per_cpu_ptr(tk->nhit, cpu);

	return nhit;
}

87 88
static int register_kprobe_event(struct trace_kprobe *tk);
static int unregister_kprobe_event(struct trace_kprobe *tk);
89 90 91 92

static DEFINE_MUTEX(probe_lock);
static LIST_HEAD(probe_list);

93 94 95 96
static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs);
static int kretprobe_dispatcher(struct kretprobe_instance *ri,
				struct pt_regs *regs);

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
/* Memory fetching by symbol */
struct symbol_cache {
	char		*symbol;
	long		offset;
	unsigned long	addr;
};

unsigned long update_symbol_cache(struct symbol_cache *sc)
{
	sc->addr = (unsigned long)kallsyms_lookup_name(sc->symbol);

	if (sc->addr)
		sc->addr += sc->offset;

	return sc->addr;
}

void free_symbol_cache(struct symbol_cache *sc)
{
	kfree(sc->symbol);
	kfree(sc);
}

struct symbol_cache *alloc_symbol_cache(const char *sym, long offset)
{
	struct symbol_cache *sc;

	if (!sym || strlen(sym) == 0)
		return NULL;

	sc = kzalloc(sizeof(struct symbol_cache), GFP_KERNEL);
	if (!sc)
		return NULL;

	sc->symbol = kstrdup(sym, GFP_KERNEL);
	if (!sc->symbol) {
		kfree(sc);
		return NULL;
	}
	sc->offset = offset;
	update_symbol_cache(sc);

	return sc;
}

142 143 144 145
/*
 * Kprobes-specific fetch functions
 */
#define DEFINE_FETCH_stack(type)					\
146
static void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs,		\
147 148 149 150
					  void *offset, void *dest)	\
{									\
	*(type *)dest = (type)regs_get_kernel_stack_nth(regs,		\
				(unsigned int)((unsigned long)offset));	\
151 152 153
}									\
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(stack, type));

154 155 156 157 158
DEFINE_BASIC_FETCH_FUNCS(stack)
/* No string on the stack entry */
#define fetch_stack_string	NULL
#define fetch_stack_string_size	NULL

159
#define DEFINE_FETCH_memory(type)					\
160
static void FETCH_FUNC_NAME(memory, type)(struct pt_regs *regs,		\
161 162 163 164 165 166 167
					  void *addr, void *dest)	\
{									\
	type retval;							\
	if (probe_kernel_address(addr, retval))				\
		*(type *)dest = 0;					\
	else								\
		*(type *)dest = retval;					\
168 169 170
}									\
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, type));

171 172 173 174 175
DEFINE_BASIC_FETCH_FUNCS(memory)
/*
 * Fetch a null-terminated string. Caller MUST set *(u32 *)dest with max
 * length and relative data location.
 */
176 177
static void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
					    void *addr, void *dest)
178 179 180
{
	int maxlen = get_rloc_len(*(u32 *)dest);
	u8 *dst = get_rloc_data(dest);
181
	long ret;
182 183 184 185 186 187 188 189

	if (!maxlen)
		return;

	/*
	 * Try to get string again, since the string can be changed while
	 * probing.
	 */
190
	ret = strncpy_from_unsafe(dst, addr, maxlen);
191 192

	if (ret < 0) {	/* Failed to fetch string */
193
		dst[0] = '\0';
194 195
		*(u32 *)dest = make_data_rloc(0, get_rloc_offs(*(u32 *)dest));
	} else {
196
		*(u32 *)dest = make_data_rloc(ret, get_rloc_offs(*(u32 *)dest));
197 198
	}
}
199
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string));
200 201

/* Return the length of string -- including null terminal byte */
202 203
static void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
						 void *addr, void *dest)
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
{
	mm_segment_t old_fs;
	int ret, len = 0;
	u8 c;

	old_fs = get_fs();
	set_fs(KERNEL_DS);
	pagefault_disable();

	do {
		ret = __copy_from_user_inatomic(&c, (u8 *)addr + len, 1);
		len++;
	} while (c && ret == 0 && len < MAX_STRING_SIZE);

	pagefault_enable();
	set_fs(old_fs);

	if (ret < 0)	/* Failed to check the length */
		*(u32 *)dest = 0;
	else
		*(u32 *)dest = len;
}
226
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string_size));
227

228
#define DEFINE_FETCH_symbol(type)					\
229
void FETCH_FUNC_NAME(symbol, type)(struct pt_regs *regs, void *data, void *dest)\
230 231 232 233 234 235
{									\
	struct symbol_cache *sc = data;					\
	if (sc->addr)							\
		fetch_memory_##type(regs, (void *)sc->addr, dest);	\
	else								\
		*(type *)dest = 0;					\
236 237 238
}									\
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(symbol, type));

239 240 241 242
DEFINE_BASIC_FETCH_FUNCS(symbol)
DEFINE_FETCH_symbol(string)
DEFINE_FETCH_symbol(string_size)

243 244 245 246 247 248 249 250
/* kprobes don't support file_offset fetch methods */
#define fetch_file_offset_u8		NULL
#define fetch_file_offset_u16		NULL
#define fetch_file_offset_u32		NULL
#define fetch_file_offset_u64		NULL
#define fetch_file_offset_string	NULL
#define fetch_file_offset_string_size	NULL

251
/* Fetch type information table */
252
static const struct fetch_type kprobes_fetch_type_table[] = {
253 254 255 256 257 258 259 260 261 262 263 264 265 266
	/* Special types */
	[FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
					sizeof(u32), 1, "__data_loc char[]"),
	[FETCH_TYPE_STRSIZE] = __ASSIGN_FETCH_TYPE("string_size", u32,
					string_size, sizeof(u32), 0, "u32"),
	/* Basic types */
	ASSIGN_FETCH_TYPE(u8,  u8,  0),
	ASSIGN_FETCH_TYPE(u16, u16, 0),
	ASSIGN_FETCH_TYPE(u32, u32, 0),
	ASSIGN_FETCH_TYPE(u64, u64, 0),
	ASSIGN_FETCH_TYPE(s8,  u8,  1),
	ASSIGN_FETCH_TYPE(s16, u16, 1),
	ASSIGN_FETCH_TYPE(s32, u32, 1),
	ASSIGN_FETCH_TYPE(s64, u64, 1),
267 268 269 270
	ASSIGN_FETCH_TYPE_ALIAS(x8,  u8,  u8,  0),
	ASSIGN_FETCH_TYPE_ALIAS(x16, u16, u16, 0),
	ASSIGN_FETCH_TYPE_ALIAS(x32, u32, u32, 0),
	ASSIGN_FETCH_TYPE_ALIAS(x64, u64, u64, 0),
271 272 273 274

	ASSIGN_FETCH_TYPE_END
};

275 276 277
/*
 * Allocate new trace_probe and initialize it (including kprobes).
 */
278
static struct trace_kprobe *alloc_trace_kprobe(const char *group,
279
					     const char *event,
280 281 282
					     void *addr,
					     const char *symbol,
					     unsigned long offs,
283
					     int nargs, bool is_return)
284
{
285
	struct trace_kprobe *tk;
286
	int ret = -ENOMEM;
287

288 289
	tk = kzalloc(SIZEOF_TRACE_KPROBE(nargs), GFP_KERNEL);
	if (!tk)
290
		return ERR_PTR(ret);
291

292 293 294 295
	tk->nhit = alloc_percpu(unsigned long);
	if (!tk->nhit)
		goto error;

296
	if (symbol) {
297 298
		tk->symbol = kstrdup(symbol, GFP_KERNEL);
		if (!tk->symbol)
299
			goto error;
300 301
		tk->rp.kp.symbol_name = tk->symbol;
		tk->rp.kp.offset = offs;
302
	} else
303
		tk->rp.kp.addr = addr;
304 305

	if (is_return)
306
		tk->rp.handler = kretprobe_dispatcher;
307
	else
308
		tk->rp.kp.pre_handler = kprobe_dispatcher;
309

310
	if (!event || !is_good_name(event)) {
311
		ret = -EINVAL;
312
		goto error;
313 314
	}

315 316 317
	tk->tp.call.class = &tk->tp.class;
	tk->tp.call.name = kstrdup(event, GFP_KERNEL);
	if (!tk->tp.call.name)
318
		goto error;
319

320
	if (!group || !is_good_name(group)) {
321
		ret = -EINVAL;
322
		goto error;
323 324
	}

325 326
	tk->tp.class.system = kstrdup(group, GFP_KERNEL);
	if (!tk->tp.class.system)
327 328
		goto error;

329 330 331
	INIT_LIST_HEAD(&tk->list);
	INIT_LIST_HEAD(&tk->tp.files);
	return tk;
332
error:
333 334
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
335
	free_percpu(tk->nhit);
336
	kfree(tk);
337
	return ERR_PTR(ret);
338 339
}

340
static void free_trace_kprobe(struct trace_kprobe *tk)
341 342 343
{
	int i;

344 345
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_free_probe_arg(&tk->tp.args[i]);
346

347 348 349
	kfree(tk->tp.call.class->system);
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
350
	free_percpu(tk->nhit);
351
	kfree(tk);
352 353
}

354 355
static struct trace_kprobe *find_trace_kprobe(const char *event,
					      const char *group)
356
{
357
	struct trace_kprobe *tk;
358

359
	list_for_each_entry(tk, &probe_list, list)
360
		if (strcmp(trace_event_name(&tk->tp.call), event) == 0 &&
361 362
		    strcmp(tk->tp.call.class->system, group) == 0)
			return tk;
363 364 365
	return NULL;
}

366 367 368 369 370
/*
 * Enable trace_probe
 * if the file is NULL, enable "perf" handler, or enable "trace" handler.
 */
static int
371
enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
372 373 374
{
	int ret = 0;

375
	if (file) {
376 377 378 379
		struct event_file_link *link;

		link = kmalloc(sizeof(*link), GFP_KERNEL);
		if (!link) {
380
			ret = -ENOMEM;
381
			goto out;
382 383
		}

384
		link->file = file;
385
		list_add_tail_rcu(&link->list, &tk->tp.files);
386

387
		tk->tp.flags |= TP_FLAG_TRACE;
388
	} else
389
		tk->tp.flags |= TP_FLAG_PROFILE;
390

391 392 393
	if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
		if (trace_kprobe_is_return(tk))
			ret = enable_kretprobe(&tk->rp);
394
		else
395
			ret = enable_kprobe(&tk->rp.kp);
396
	}
397
 out:
398 399 400
	return ret;
}

401 402 403 404 405
/*
 * Disable trace_probe
 * if the file is NULL, disable "perf" handler, or disable "trace" handler.
 */
static int
406
disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
407
{
408 409
	struct event_file_link *link = NULL;
	int wait = 0;
410 411 412
	int ret = 0;

	if (file) {
413
		link = find_event_file_link(&tk->tp, file);
414
		if (!link) {
415
			ret = -EINVAL;
416
			goto out;
417 418
		}

419
		list_del_rcu(&link->list);
420
		wait = 1;
421
		if (!list_empty(&tk->tp.files))
422
			goto out;
423

424
		tk->tp.flags &= ~TP_FLAG_TRACE;
425
	} else
426
		tk->tp.flags &= ~TP_FLAG_PROFILE;
427

428 429 430
	if (!trace_probe_is_enabled(&tk->tp) && trace_probe_is_registered(&tk->tp)) {
		if (trace_kprobe_is_return(tk))
			disable_kretprobe(&tk->rp);
431
		else
432
			disable_kprobe(&tk->rp.kp);
433
		wait = 1;
434
	}
435
 out:
436 437 438 439 440 441 442 443 444 445 446 447 448
	if (wait) {
		/*
		 * Synchronize with kprobe_trace_func/kretprobe_trace_func
		 * to ensure disabled (all running handlers are finished).
		 * This is not only for kfree(), but also the caller,
		 * trace_remove_event_call() supposes it for releasing
		 * event_call related objects, which will be accessed in
		 * the kprobe_trace_func/kretprobe_trace_func.
		 */
		synchronize_sched();
		kfree(link);	/* Ignored if link == NULL */
	}

449
	return ret;
450 451
}

452
/* Internal register function - just handle k*probes and flags */
453
static int __register_trace_kprobe(struct trace_kprobe *tk)
454
{
455
	int i, ret;
456

457
	if (trace_probe_is_registered(&tk->tp))
458 459
		return -EINVAL;

460 461
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_update_arg(&tk->tp.args[i]);
462

463
	/* Set/clear disabled flag according to tp->flag */
464 465
	if (trace_probe_is_enabled(&tk->tp))
		tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
466
	else
467
		tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
468

469 470
	if (trace_kprobe_is_return(tk))
		ret = register_kretprobe(&tk->rp);
471
	else
472
		ret = register_kprobe(&tk->rp.kp);
473 474

	if (ret == 0)
475
		tk->tp.flags |= TP_FLAG_REGISTERED;
476
	else {
477 478
		pr_warn("Could not insert probe at %s+%lu: %d\n",
			trace_kprobe_symbol(tk), trace_kprobe_offset(tk), ret);
479
		if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) {
480
			pr_warn("This probe might be able to register after target module is loaded. Continue.\n");
481 482
			ret = 0;
		} else if (ret == -EILSEQ) {
483 484
			pr_warn("Probing address(0x%p) is not an instruction boundary.\n",
				tk->rp.kp.addr);
485 486 487 488 489 490 491 492
			ret = -EINVAL;
		}
	}

	return ret;
}

/* Internal unregister function - just handle k*probes and flags */
493
static void __unregister_trace_kprobe(struct trace_kprobe *tk)
494
{
495 496 497
	if (trace_probe_is_registered(&tk->tp)) {
		if (trace_kprobe_is_return(tk))
			unregister_kretprobe(&tk->rp);
498
		else
499 500
			unregister_kprobe(&tk->rp.kp);
		tk->tp.flags &= ~TP_FLAG_REGISTERED;
501
		/* Cleanup kprobe for reuse */
502 503
		if (tk->rp.kp.symbol_name)
			tk->rp.kp.addr = NULL;
504 505 506 507
	}
}

/* Unregister a trace_probe and probe_event: call with locking probe_lock */
508
static int unregister_trace_kprobe(struct trace_kprobe *tk)
509
{
510
	/* Enabled event can not be unregistered */
511
	if (trace_probe_is_enabled(&tk->tp))
512 513
		return -EBUSY;

514
	/* Will fail if probe is being used by ftrace or perf */
515
	if (unregister_kprobe_event(tk))
516 517
		return -EBUSY;

518 519
	__unregister_trace_kprobe(tk);
	list_del(&tk->list);
520 521

	return 0;
522 523 524
}

/* Register a trace_probe and probe_event */
525
static int register_trace_kprobe(struct trace_kprobe *tk)
526
{
527
	struct trace_kprobe *old_tk;
528 529 530 531
	int ret;

	mutex_lock(&probe_lock);

532
	/* Delete old (same name) event if exist */
533
	old_tk = find_trace_kprobe(trace_event_name(&tk->tp.call),
534
			tk->tp.call.class->system);
535 536
	if (old_tk) {
		ret = unregister_trace_kprobe(old_tk);
537 538
		if (ret < 0)
			goto end;
539
		free_trace_kprobe(old_tk);
540
	}
541 542

	/* Register new event */
543
	ret = register_kprobe_event(tk);
544
	if (ret) {
545
		pr_warn("Failed to register probe event(%d)\n", ret);
546 547 548
		goto end;
	}

549
	/* Register k*probe */
550
	ret = __register_trace_kprobe(tk);
551
	if (ret < 0)
552
		unregister_kprobe_event(tk);
553
	else
554
		list_add_tail(&tk->list, &probe_list);
555

556 557 558 559 560
end:
	mutex_unlock(&probe_lock);
	return ret;
}

561
/* Module notifier call back, checking event on the module */
562
static int trace_kprobe_module_callback(struct notifier_block *nb,
563 564 565
				       unsigned long val, void *data)
{
	struct module *mod = data;
566
	struct trace_kprobe *tk;
567 568 569 570 571 572 573
	int ret;

	if (val != MODULE_STATE_COMING)
		return NOTIFY_DONE;

	/* Update probes on coming module */
	mutex_lock(&probe_lock);
574 575
	list_for_each_entry(tk, &probe_list, list) {
		if (trace_kprobe_within_module(tk, mod)) {
576
			/* Don't need to check busy - this should have gone. */
577 578
			__unregister_trace_kprobe(tk);
			ret = __register_trace_kprobe(tk);
579
			if (ret)
580 581 582
				pr_warn("Failed to re-register probe %s on %s: %d\n",
					trace_event_name(&tk->tp.call),
					mod->name, ret);
583 584 585 586 587 588 589
		}
	}
	mutex_unlock(&probe_lock);

	return NOTIFY_DONE;
}

590 591
static struct notifier_block trace_kprobe_module_nb = {
	.notifier_call = trace_kprobe_module_callback,
592 593 594
	.priority = 1	/* Invoked after kprobe module callback */
};

595
static int create_trace_kprobe(int argc, char **argv)
596 597 598
{
	/*
	 * Argument syntax:
599 600
	 *  - Add kprobe: p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
	 *  - Add kretprobe: r[:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
601
	 * Fetch args:
602 603 604
	 *  $retval	: fetch return value
	 *  $stack	: fetch stack address
	 *  $stackN	: fetch Nth of stack (N:0-)
605
	 *  $comm       : fetch current task comm
606 607 608
	 *  @ADDR	: fetch memory at ADDR (ADDR should be in kernel)
	 *  @SYM[+|-offs] : fetch memory at SYM +|- offs (SYM is a data symbol)
	 *  %REG	: fetch register REG
609
	 * Dereferencing memory fetch:
610
	 *  +|-offs(ARG) : fetch memory at ARG +|- offs address.
611 612
	 * Alias name of args:
	 *  NAME=FETCHARG : set NAME as alias of FETCHARG.
613 614
	 * Type of args:
	 *  FETCHARG:TYPE : use TYPE instead of unsigned long.
615
	 */
616
	struct trace_kprobe *tk;
617
	int i, ret = 0;
618
	bool is_return = false, is_delete = false;
619
	char *symbol = NULL, *event = NULL, *group = NULL;
620
	char *arg;
621
	unsigned long offset = 0;
622
	void *addr = NULL;
623
	char buf[MAX_EVENT_NAME_LEN];
624

625
	/* argc must be >= 1 */
626
	if (argv[0][0] == 'p')
627
		is_return = false;
628
	else if (argv[0][0] == 'r')
629
		is_return = true;
630
	else if (argv[0][0] == '-')
631
		is_delete = true;
632
	else {
633 634
		pr_info("Probe definition must be started with 'p', 'r' or"
			" '-'.\n");
635
		return -EINVAL;
636
	}
637 638 639

	if (argv[0][1] == ':') {
		event = &argv[0][2];
640 641 642 643 644
		if (strchr(event, '/')) {
			group = event;
			event = strchr(group, '/') + 1;
			event[-1] = '\0';
			if (strlen(group) == 0) {
645
				pr_info("Group name is not specified\n");
646 647 648
				return -EINVAL;
			}
		}
649
		if (strlen(event) == 0) {
650
			pr_info("Event name is not specified\n");
651 652 653
			return -EINVAL;
		}
	}
654 655
	if (!group)
		group = KPROBE_EVENT_SYSTEM;
656

657 658 659 660 661
	if (is_delete) {
		if (!event) {
			pr_info("Delete command needs an event name.\n");
			return -EINVAL;
		}
662
		mutex_lock(&probe_lock);
663 664
		tk = find_trace_kprobe(event, group);
		if (!tk) {
665
			mutex_unlock(&probe_lock);
666 667 668 669
			pr_info("Event %s/%s doesn't exist.\n", group, event);
			return -ENOENT;
		}
		/* delete an event */
670
		ret = unregister_trace_kprobe(tk);
671
		if (ret == 0)
672
			free_trace_kprobe(tk);
673
		mutex_unlock(&probe_lock);
674
		return ret;
675 676 677 678 679 680
	}

	if (argc < 2) {
		pr_info("Probe point is not specified.\n");
		return -EINVAL;
	}
681
	if (isdigit(argv[1][0])) {
682 683
		if (is_return) {
			pr_info("Return probe point must be a symbol.\n");
684
			return -EINVAL;
685
		}
686
		/* an address specified */
687
		ret = kstrtoul(&argv[1][0], 0, (unsigned long *)&addr);
688 689
		if (ret) {
			pr_info("Failed to parse address.\n");
690
			return ret;
691
		}
692 693 694 695
	} else {
		/* a symbol specified */
		symbol = argv[1];
		/* TODO: support .init module functions */
696
		ret = traceprobe_split_symbol_offset(symbol, &offset);
697 698
		if (ret) {
			pr_info("Failed to parse symbol.\n");
699
			return ret;
700 701 702
		}
		if (offset && is_return) {
			pr_info("Return probe must be used without offset.\n");
703
			return -EINVAL;
704
		}
705
	}
706
	argc -= 2; argv += 2;
707 708

	/* setup a probe */
709 710 711
	if (!event) {
		/* Make a new event name */
		if (symbol)
712
			snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_%ld",
713 714
				 is_return ? 'r' : 'p', symbol, offset);
		else
715
			snprintf(buf, MAX_EVENT_NAME_LEN, "%c_0x%p",
716
				 is_return ? 'r' : 'p', addr);
717 718
		event = buf;
	}
719
	tk = alloc_trace_kprobe(group, event, addr, symbol, offset, argc,
720
			       is_return);
721
	if (IS_ERR(tk)) {
722
		pr_info("Failed to allocate trace_probe.(%d)\n",
723 724
			(int)PTR_ERR(tk));
		return PTR_ERR(tk);
725
	}
726 727

	/* parse arguments */
728 729
	ret = 0;
	for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
730 731
		struct probe_arg *parg = &tk->tp.args[i];

732
		/* Increment count for freeing args in error case */
733
		tk->tp.nr_args++;
734

735 736
		/* Parse argument name */
		arg = strchr(argv[i], '=');
737
		if (arg) {
738
			*arg++ = '\0';
739
			parg->name = kstrdup(argv[i], GFP_KERNEL);
740
		} else {
741
			arg = argv[i];
742 743
			/* If argument name is omitted, set "argN" */
			snprintf(buf, MAX_EVENT_NAME_LEN, "arg%d", i + 1);
744
			parg->name = kstrdup(buf, GFP_KERNEL);
745
		}
746

747
		if (!parg->name) {
748
			pr_info("Failed to allocate argument[%d] name.\n", i);
749
			ret = -ENOMEM;
750 751
			goto error;
		}
752

753
		if (!is_good_name(parg->name)) {
754
			pr_info("Invalid argument[%d] name: %s\n",
755
				i, parg->name);
756 757 758
			ret = -EINVAL;
			goto error;
		}
759

760 761
		if (traceprobe_conflict_field_name(parg->name,
							tk->tp.args, i)) {
762
			pr_info("Argument[%d] name '%s' conflicts with "
763 764 765 766
				"another field.\n", i, argv[i]);
			ret = -EINVAL;
			goto error;
		}
767 768

		/* Parse fetch argument */
769
		ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
770 771
						is_return, true,
						kprobes_fetch_type_table);
772
		if (ret) {
773
			pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
774
			goto error;
775
		}
776 777
	}

778
	ret = register_trace_kprobe(tk);
779 780 781 782 783
	if (ret)
		goto error;
	return 0;

error:
784
	free_trace_kprobe(tk);
785 786 787
	return ret;
}

788
static int release_all_trace_kprobes(void)
789
{
790
	struct trace_kprobe *tk;
791
	int ret = 0;
792 793

	mutex_lock(&probe_lock);
794
	/* Ensure no probe is in use. */
795 796
	list_for_each_entry(tk, &probe_list, list)
		if (trace_probe_is_enabled(&tk->tp)) {
797 798 799
			ret = -EBUSY;
			goto end;
		}
800 801
	/* TODO: Use batch unregistration */
	while (!list_empty(&probe_list)) {
802 803
		tk = list_entry(probe_list.next, struct trace_kprobe, list);
		ret = unregister_trace_kprobe(tk);
804 805
		if (ret)
			goto end;
806
		free_trace_kprobe(tk);
807
	}
808 809

end:
810
	mutex_unlock(&probe_lock);
811 812

	return ret;
813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833
}

/* Probes listing interfaces */
static void *probes_seq_start(struct seq_file *m, loff_t *pos)
{
	mutex_lock(&probe_lock);
	return seq_list_start(&probe_list, *pos);
}

static void *probes_seq_next(struct seq_file *m, void *v, loff_t *pos)
{
	return seq_list_next(v, &probe_list, pos);
}

static void probes_seq_stop(struct seq_file *m, void *v)
{
	mutex_unlock(&probe_lock);
}

static int probes_seq_show(struct seq_file *m, void *v)
{
834
	struct trace_kprobe *tk = v;
835
	int i;
836

837
	seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
838
	seq_printf(m, ":%s/%s", tk->tp.call.class->system,
839
			trace_event_name(&tk->tp.call));
840

841 842 843 844 845
	if (!tk->symbol)
		seq_printf(m, " 0x%p", tk->rp.kp.addr);
	else if (tk->rp.kp.offset)
		seq_printf(m, " %s+%u", trace_kprobe_symbol(tk),
			   tk->rp.kp.offset);
846
	else
847
		seq_printf(m, " %s", trace_kprobe_symbol(tk));
848

849 850
	for (i = 0; i < tk->tp.nr_args; i++)
		seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
851
	seq_putc(m, '\n');
852

853 854 855 856 857 858 859 860 861 862 863 864
	return 0;
}

static const struct seq_operations probes_seq_op = {
	.start  = probes_seq_start,
	.next   = probes_seq_next,
	.stop   = probes_seq_stop,
	.show   = probes_seq_show
};

static int probes_open(struct inode *inode, struct file *file)
{
865 866 867
	int ret;

	if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
868
		ret = release_all_trace_kprobes();
869 870 871
		if (ret < 0)
			return ret;
	}
872 873 874 875 876 877 878

	return seq_open(file, &probes_seq_op);
}

static ssize_t probes_write(struct file *file, const char __user *buffer,
			    size_t count, loff_t *ppos)
{
879
	return traceprobe_probes_write(file, buffer, count, ppos,
880
			create_trace_kprobe);
881 882 883 884 885 886 887 888 889 890 891
}

static const struct file_operations kprobe_events_ops = {
	.owner          = THIS_MODULE,
	.open           = probes_open,
	.read           = seq_read,
	.llseek         = seq_lseek,
	.release        = seq_release,
	.write		= probes_write,
};

892 893 894
/* Probes profiling interfaces */
static int probes_profile_seq_show(struct seq_file *m, void *v)
{
895
	struct trace_kprobe *tk = v;
896

897
	seq_printf(m, "  %-44s %15lu %15lu\n",
898 899
		   trace_event_name(&tk->tp.call),
		   trace_kprobe_nhit(tk),
900
		   tk->rp.kp.nmissed);
901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924

	return 0;
}

static const struct seq_operations profile_seq_op = {
	.start  = probes_seq_start,
	.next   = probes_seq_next,
	.stop   = probes_seq_stop,
	.show   = probes_profile_seq_show
};

static int profile_open(struct inode *inode, struct file *file)
{
	return seq_open(file, &profile_seq_op);
}

static const struct file_operations kprobe_profile_ops = {
	.owner          = THIS_MODULE,
	.open           = profile_open,
	.read           = seq_read,
	.llseek         = seq_lseek,
	.release        = seq_release,
};

925
/* Kprobe handler */
926
static nokprobe_inline void
927
__kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
928
		    struct trace_event_file *trace_file)
929
{
930
	struct kprobe_trace_entry_head *entry;
931
	struct ring_buffer_event *event;
932
	struct ring_buffer *buffer;
933
	int size, dsize, pc;
934
	unsigned long irq_flags;
935
	struct trace_event_call *call = &tk->tp.call;
936

937
	WARN_ON(call != trace_file->event_call);
938

939
	if (trace_trigger_soft_disabled(trace_file))
940
		return;
941

942 943 944
	local_save_flags(irq_flags);
	pc = preempt_count();

945 946
	dsize = __get_data_size(&tk->tp, regs);
	size = sizeof(*entry) + tk->tp.size + dsize;
947

948
	event = trace_event_buffer_lock_reserve(&buffer, trace_file,
949 950
						call->event.type,
						size, irq_flags, pc);
951
	if (!event)
952
		return;
953 954

	entry = ring_buffer_event_data(event);
955 956
	entry->ip = (unsigned long)tk->rp.kp.addr;
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
957

958
	event_trigger_unlock_commit_regs(trace_file, buffer, event,
959
					 entry, irq_flags, pc, regs);
960 961
}

962
static void
963
kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs)
964
{
965
	struct event_file_link *link;
966

967 968
	list_for_each_entry_rcu(link, &tk->tp.files, list)
		__kprobe_trace_func(tk, regs, link->file);
969
}
970
NOKPROBE_SYMBOL(kprobe_trace_func);
971

972
/* Kretprobe handler */
973
static nokprobe_inline void
974
__kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
975
		       struct pt_regs *regs,
976
		       struct trace_event_file *trace_file)
977
{
978
	struct kretprobe_trace_entry_head *entry;
979
	struct ring_buffer_event *event;
980
	struct ring_buffer *buffer;
981
	int size, pc, dsize;
982
	unsigned long irq_flags;
983
	struct trace_event_call *call = &tk->tp.call;
984

985
	WARN_ON(call != trace_file->event_call);
986

987
	if (trace_trigger_soft_disabled(trace_file))
988
		return;
989

990 991 992
	local_save_flags(irq_flags);
	pc = preempt_count();

993 994
	dsize = __get_data_size(&tk->tp, regs);
	size = sizeof(*entry) + tk->tp.size + dsize;
995

996
	event = trace_event_buffer_lock_reserve(&buffer, trace_file,
997 998
						call->event.type,
						size, irq_flags, pc);
999
	if (!event)
1000
		return;
1001 1002

	entry = ring_buffer_event_data(event);
1003
	entry->func = (unsigned long)tk->rp.kp.addr;
1004
	entry->ret_ip = (unsigned long)ri->ret_addr;
1005
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1006

1007
	event_trigger_unlock_commit_regs(trace_file, buffer, event,
1008
					 entry, irq_flags, pc, regs);
1009 1010
}

1011
static void
1012
kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1013 1014
		     struct pt_regs *regs)
{
1015
	struct event_file_link *link;
1016

1017 1018
	list_for_each_entry_rcu(link, &tk->tp.files, list)
		__kretprobe_trace_func(tk, ri, regs, link->file);
1019
}
1020
NOKPROBE_SYMBOL(kretprobe_trace_func);
1021

1022
/* Event entry printers */
1023
static enum print_line_t
1024 1025
print_kprobe_event(struct trace_iterator *iter, int flags,
		   struct trace_event *event)
1026
{
1027
	struct kprobe_trace_entry_head *field;
1028
	struct trace_seq *s = &iter->seq;
1029
	struct trace_probe *tp;
1030
	u8 *data;
1031 1032
	int i;

1033
	field = (struct kprobe_trace_entry_head *)iter->ent;
1034
	tp = container_of(event, struct trace_probe, call.event);
1035

1036
	trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1037

1038
	if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET))
1039
		goto out;
1040

1041
	trace_seq_putc(s, ')');
1042

1043 1044 1045
	data = (u8 *)&field[1];
	for (i = 0; i < tp->nr_args; i++)
		if (!tp->args[i].type->print(s, tp->args[i].name,
1046
					     data + tp->args[i].offset, field))
1047
			goto out;
1048

1049 1050 1051
	trace_seq_putc(s, '\n');
 out:
	return trace_handle_return(s);
1052 1053
}

1054
static enum print_line_t
1055 1056
print_kretprobe_event(struct trace_iterator *iter, int flags,
		      struct trace_event *event)
1057
{
1058
	struct kretprobe_trace_entry_head *field;
1059
	struct trace_seq *s = &iter->seq;
1060
	struct trace_probe *tp;
1061
	u8 *data;
1062 1063
	int i;

1064
	field = (struct kretprobe_trace_entry_head *)iter->ent;
1065
	tp = container_of(event, struct trace_probe, call.event);
1066

1067
	trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1068

1069
	if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
1070
		goto out;
1071

1072
	trace_seq_puts(s, " <- ");
1073 1074

	if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER_SYM_OFFSET))
1075
		goto out;
1076

1077
	trace_seq_putc(s, ')');
1078

1079 1080 1081
	data = (u8 *)&field[1];
	for (i = 0; i < tp->nr_args; i++)
		if (!tp->args[i].type->print(s, tp->args[i].name,
1082
					     data + tp->args[i].offset, field))
1083
			goto out;
1084

1085
	trace_seq_putc(s, '\n');
1086

1087 1088
 out:
	return trace_handle_return(s);
1089 1090 1091
}


1092
static int kprobe_event_define_fields(struct trace_event_call *event_call)
1093 1094
{
	int ret, i;
1095
	struct kprobe_trace_entry_head field;
1096
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1097

1098
	DEFINE_FIELD(unsigned long, ip, FIELD_STRING_IP, 0);
1099
	/* Set argument names as fields */
1100 1101 1102 1103 1104 1105 1106 1107
	for (i = 0; i < tk->tp.nr_args; i++) {
		struct probe_arg *parg = &tk->tp.args[i];

		ret = trace_define_field(event_call, parg->type->fmttype,
					 parg->name,
					 sizeof(field) + parg->offset,
					 parg->type->size,
					 parg->type->is_signed,
1108 1109 1110 1111
					 FILTER_OTHER);
		if (ret)
			return ret;
	}
1112 1113 1114
	return 0;
}

1115
static int kretprobe_event_define_fields(struct trace_event_call *event_call)
1116 1117
{
	int ret, i;
1118
	struct kretprobe_trace_entry_head field;
1119
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1120

1121 1122
	DEFINE_FIELD(unsigned long, func, FIELD_STRING_FUNC, 0);
	DEFINE_FIELD(unsigned long, ret_ip, FIELD_STRING_RETIP, 0);
1123
	/* Set argument names as fields */
1124 1125 1126 1127 1128 1129 1130 1131
	for (i = 0; i < tk->tp.nr_args; i++) {
		struct probe_arg *parg = &tk->tp.args[i];

		ret = trace_define_field(event_call, parg->type->fmttype,
					 parg->name,
					 sizeof(field) + parg->offset,
					 parg->type->size,
					 parg->type->is_signed,
1132 1133 1134 1135
					 FILTER_OTHER);
		if (ret)
			return ret;
	}
1136 1137 1138
	return 0;
}

1139
#ifdef CONFIG_PERF_EVENTS
1140 1141

/* Kprobe profile handler */
1142
static void
1143
kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs)
1144
{
1145
	struct trace_event_call *call = &tk->tp.call;
1146
	struct bpf_prog *prog = call->prog;
1147
	struct kprobe_trace_entry_head *entry;
1148
	struct hlist_head *head;
1149
	int size, __size, dsize;
1150
	int rctx;
1151

1152 1153 1154
	if (prog && !trace_call_bpf(prog, regs))
		return;

1155 1156 1157 1158
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

1159 1160
	dsize = __get_data_size(&tk->tp, regs);
	__size = sizeof(*entry) + tk->tp.size + dsize;
1161 1162
	size = ALIGN(__size + sizeof(u32), sizeof(u64));
	size -= sizeof(u32);
1163

1164
	entry = perf_trace_buf_alloc(size, NULL, &rctx);
1165
	if (!entry)
1166
		return;
1167

1168
	entry->ip = (unsigned long)tk->rp.kp.addr;
1169
	memset(&entry[1], 0, dsize);
1170
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1171 1172
	perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
			      head, NULL);
1173
}
1174
NOKPROBE_SYMBOL(kprobe_perf_func);
1175 1176

/* Kretprobe profile handler */
1177
static void
1178
kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1179
		    struct pt_regs *regs)
1180
{
1181
	struct trace_event_call *call = &tk->tp.call;
1182
	struct bpf_prog *prog = call->prog;
1183
	struct kretprobe_trace_entry_head *entry;
1184
	struct hlist_head *head;
1185
	int size, __size, dsize;
1186
	int rctx;
1187

1188 1189 1190
	if (prog && !trace_call_bpf(prog, regs))
		return;

1191 1192 1193 1194
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

1195 1196
	dsize = __get_data_size(&tk->tp, regs);
	__size = sizeof(*entry) + tk->tp.size + dsize;
1197 1198
	size = ALIGN(__size + sizeof(u32), sizeof(u64));
	size -= sizeof(u32);
1199

1200
	entry = perf_trace_buf_alloc(size, NULL, &rctx);
1201
	if (!entry)
1202
		return;
1203

1204
	entry->func = (unsigned long)tk->rp.kp.addr;
1205
	entry->ret_ip = (unsigned long)ri->ret_addr;
1206
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1207 1208
	perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
			      head, NULL);
1209
}
1210
NOKPROBE_SYMBOL(kretprobe_perf_func);
1211
#endif	/* CONFIG_PERF_EVENTS */
1212

1213 1214 1215 1216 1217 1218
/*
 * called by perf_trace_init() or __ftrace_set_clr_event() under event_mutex.
 *
 * kprobe_trace_self_tests_init() does enable_trace_probe/disable_trace_probe
 * lockless, but we can't race with this __init function.
 */
1219
static int kprobe_register(struct trace_event_call *event,
1220
			   enum trace_reg type, void *data)
1221
{
1222
	struct trace_kprobe *tk = (struct trace_kprobe *)event->data;
1223
	struct trace_event_file *file = data;
1224

1225 1226
	switch (type) {
	case TRACE_REG_REGISTER:
1227
		return enable_trace_kprobe(tk, file);
1228
	case TRACE_REG_UNREGISTER:
1229
		return disable_trace_kprobe(tk, file);
1230 1231 1232

#ifdef CONFIG_PERF_EVENTS
	case TRACE_REG_PERF_REGISTER:
1233
		return enable_trace_kprobe(tk, NULL);
1234
	case TRACE_REG_PERF_UNREGISTER:
1235
		return disable_trace_kprobe(tk, NULL);
1236 1237
	case TRACE_REG_PERF_OPEN:
	case TRACE_REG_PERF_CLOSE:
1238 1239
	case TRACE_REG_PERF_ADD:
	case TRACE_REG_PERF_DEL:
1240
		return 0;
1241 1242 1243 1244
#endif
	}
	return 0;
}
1245

1246
static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs)
1247
{
1248
	struct trace_kprobe *tk = container_of(kp, struct trace_kprobe, rp.kp);
1249

1250
	raw_cpu_inc(*tk->nhit);
1251

1252 1253
	if (tk->tp.flags & TP_FLAG_TRACE)
		kprobe_trace_func(tk, regs);
1254
#ifdef CONFIG_PERF_EVENTS
1255 1256
	if (tk->tp.flags & TP_FLAG_PROFILE)
		kprobe_perf_func(tk, regs);
1257
#endif
1258 1259
	return 0;	/* We don't tweek kernel, so just return 0 */
}
1260
NOKPROBE_SYMBOL(kprobe_dispatcher);
1261

1262 1263
static int
kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
1264
{
1265
	struct trace_kprobe *tk = container_of(ri->rp, struct trace_kprobe, rp);
1266

1267
	raw_cpu_inc(*tk->nhit);
1268

1269 1270
	if (tk->tp.flags & TP_FLAG_TRACE)
		kretprobe_trace_func(tk, ri, regs);
1271
#ifdef CONFIG_PERF_EVENTS
1272 1273
	if (tk->tp.flags & TP_FLAG_PROFILE)
		kretprobe_perf_func(tk, ri, regs);
1274
#endif
1275 1276
	return 0;	/* We don't tweek kernel, so just return 0 */
}
1277
NOKPROBE_SYMBOL(kretprobe_dispatcher);
1278

1279 1280 1281 1282 1283 1284 1285 1286
static struct trace_event_functions kretprobe_funcs = {
	.trace		= print_kretprobe_event
};

static struct trace_event_functions kprobe_funcs = {
	.trace		= print_kprobe_event
};

1287
static int register_kprobe_event(struct trace_kprobe *tk)
1288
{
1289
	struct trace_event_call *call = &tk->tp.call;
1290 1291
	int ret;

1292
	/* Initialize trace_event_call */
1293
	INIT_LIST_HEAD(&call->class->fields);
1294
	if (trace_kprobe_is_return(tk)) {
1295
		call->event.funcs = &kretprobe_funcs;
1296
		call->class->define_fields = kretprobe_event_define_fields;
1297
	} else {
1298
		call->event.funcs = &kprobe_funcs;
1299
		call->class->define_fields = kprobe_event_define_fields;
1300
	}
1301
	if (set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0)
1302
		return -ENOMEM;
1303
	ret = register_trace_event(&call->event);
1304
	if (!ret) {
1305
		kfree(call->print_fmt);
1306
		return -ENODEV;
1307
	}
A
Alexei Starovoitov 已提交
1308
	call->flags = TRACE_EVENT_FL_KPROBE;
1309
	call->class->reg = kprobe_register;
1310
	call->data = tk;
1311
	ret = trace_add_event_call(call);
1312
	if (ret) {
1313
		pr_info("Failed to register kprobe event: %s\n",
1314
			trace_event_name(call));
1315
		kfree(call->print_fmt);
1316
		unregister_trace_event(&call->event);
1317
	}
1318 1319 1320
	return ret;
}

1321
static int unregister_kprobe_event(struct trace_kprobe *tk)
1322
{
1323 1324
	int ret;

1325
	/* tp->event is unregistered in trace_remove_event_call() */
1326
	ret = trace_remove_event_call(&tk->tp.call);
1327
	if (!ret)
1328
		kfree(tk->tp.call.print_fmt);
1329
	return ret;
1330 1331
}

1332
/* Make a tracefs interface for controlling probe points */
1333 1334 1335 1336 1337
static __init int init_kprobe_trace(void)
{
	struct dentry *d_tracer;
	struct dentry *entry;

1338
	if (register_module_notifier(&trace_kprobe_module_nb))
1339 1340
		return -EINVAL;

1341
	d_tracer = tracing_init_dentry();
1342
	if (IS_ERR(d_tracer))
1343 1344
		return 0;

1345
	entry = tracefs_create_file("kprobe_events", 0644, d_tracer,
1346 1347
				    NULL, &kprobe_events_ops);

1348
	/* Event list interface */
1349
	if (!entry)
1350
		pr_warn("Could not create tracefs 'kprobe_events' entry\n");
1351 1352

	/* Profile interface */
1353
	entry = tracefs_create_file("kprobe_profile", 0444, d_tracer,
1354 1355 1356
				    NULL, &kprobe_profile_ops);

	if (!entry)
1357
		pr_warn("Could not create tracefs 'kprobe_profile' entry\n");
1358 1359 1360 1361 1362 1363
	return 0;
}
fs_initcall(init_kprobe_trace);


#ifdef CONFIG_FTRACE_STARTUP_TEST
1364 1365
/*
 * The "__used" keeps gcc from removing the function symbol
1366 1367
 * from the kallsyms table. 'noinline' makes sure that there
 * isn't an inlined version used by the test method below
1368
 */
1369 1370
static __used __init noinline int
kprobe_trace_selftest_target(int a1, int a2, int a3, int a4, int a5, int a6)
1371 1372 1373 1374
{
	return a1 + a2 + a3 + a4 + a5 + a6;
}

1375
static struct __init trace_event_file *
1376
find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
1377
{
1378
	struct trace_event_file *file;
1379 1380

	list_for_each_entry(file, &tr->events, list)
1381
		if (file->event_call == &tk->tp.call)
1382 1383 1384 1385 1386
			return file;

	return NULL;
}

1387
/*
1388
 * Nobody but us can call enable_trace_kprobe/disable_trace_kprobe at this
1389 1390
 * stage, we can do this lockless.
 */
1391 1392
static __init int kprobe_trace_self_tests_init(void)
{
1393
	int ret, warn = 0;
1394
	int (*target)(int, int, int, int, int, int);
1395
	struct trace_kprobe *tk;
1396
	struct trace_event_file *file;
1397

1398 1399 1400
	if (tracing_is_disabled())
		return -ENODEV;

1401 1402 1403 1404
	target = kprobe_trace_selftest_target;

	pr_info("Testing kprobe tracing: ");

1405 1406
	ret = traceprobe_command("p:testprobe kprobe_trace_selftest_target "
				  "$stack $stack0 +0($stack)",
1407
				  create_trace_kprobe);
1408
	if (WARN_ON_ONCE(ret)) {
1409
		pr_warn("error on probing function entry.\n");
1410 1411 1412
		warn++;
	} else {
		/* Enable trace point */
1413 1414
		tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
		if (WARN_ON_ONCE(tk == NULL)) {
1415
			pr_warn("error on getting new probe.\n");
1416
			warn++;
1417
		} else {
1418
			file = find_trace_probe_file(tk, top_trace_array());
1419 1420 1421 1422
			if (WARN_ON_ONCE(file == NULL)) {
				pr_warn("error on getting probe file.\n");
				warn++;
			} else
1423
				enable_trace_kprobe(tk, file);
1424
		}
1425
	}
1426

1427
	ret = traceprobe_command("r:testprobe2 kprobe_trace_selftest_target "
1428
				  "$retval", create_trace_kprobe);
1429
	if (WARN_ON_ONCE(ret)) {
1430
		pr_warn("error on probing function return.\n");
1431 1432 1433
		warn++;
	} else {
		/* Enable trace point */
1434 1435
		tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
		if (WARN_ON_ONCE(tk == NULL)) {
1436
			pr_warn("error on getting 2nd new probe.\n");
1437
			warn++;
1438
		} else {
1439
			file = find_trace_probe_file(tk, top_trace_array());
1440 1441 1442 1443
			if (WARN_ON_ONCE(file == NULL)) {
				pr_warn("error on getting probe file.\n");
				warn++;
			} else
1444
				enable_trace_kprobe(tk, file);
1445
		}
1446 1447 1448 1449
	}

	if (warn)
		goto end;
1450 1451 1452

	ret = target(1, 2, 3, 4, 5, 6);

1453 1454 1455 1456 1457 1458 1459 1460
	/*
	 * Not expecting an error here, the check is only to prevent the
	 * optimizer from removing the call to target() as otherwise there
	 * are no side-effects and the call is never performed.
	 */
	if (ret != 21)
		warn++;

1461
	/* Disable trace points before removing it */
1462 1463
	tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1464
		pr_warn("error on getting test probe.\n");
1465
		warn++;
1466
	} else {
1467 1468 1469 1470 1471
		if (trace_kprobe_nhit(tk) != 1) {
			pr_warn("incorrect number of testprobe hits\n");
			warn++;
		}

1472
		file = find_trace_probe_file(tk, top_trace_array());
1473 1474 1475 1476
		if (WARN_ON_ONCE(file == NULL)) {
			pr_warn("error on getting probe file.\n");
			warn++;
		} else
1477
			disable_trace_kprobe(tk, file);
1478
	}
1479

1480 1481
	tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1482
		pr_warn("error on getting 2nd test probe.\n");
1483
		warn++;
1484
	} else {
1485 1486 1487 1488 1489
		if (trace_kprobe_nhit(tk) != 1) {
			pr_warn("incorrect number of testprobe2 hits\n");
			warn++;
		}

1490
		file = find_trace_probe_file(tk, top_trace_array());
1491 1492 1493 1494
		if (WARN_ON_ONCE(file == NULL)) {
			pr_warn("error on getting probe file.\n");
			warn++;
		} else
1495
			disable_trace_kprobe(tk, file);
1496
	}
1497

1498
	ret = traceprobe_command("-:testprobe", create_trace_kprobe);
1499
	if (WARN_ON_ONCE(ret)) {
1500
		pr_warn("error on deleting a probe.\n");
1501 1502 1503
		warn++;
	}

1504
	ret = traceprobe_command("-:testprobe2", create_trace_kprobe);
1505
	if (WARN_ON_ONCE(ret)) {
1506
		pr_warn("error on deleting a probe.\n");
1507 1508
		warn++;
	}
1509

1510
end:
1511
	release_all_trace_kprobes();
1512 1513 1514 1515
	if (warn)
		pr_cont("NG: Some tests are failed. Please check them.\n");
	else
		pr_cont("OK\n");
1516 1517 1518 1519 1520 1521
	return 0;
}

late_initcall(kprobe_trace_self_tests_init);

#endif