trace_kprobe.c 36.3 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
static int register_kprobe_event(struct trace_kprobe *tk);
static int unregister_kprobe_event(struct trace_kprobe *tk);
78 79 80 81

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

82 83 84 85
static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs);
static int kretprobe_dispatcher(struct kretprobe_instance *ri,
				struct pt_regs *regs);

86 87 88 89 90 91 92 93 94 95 96 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
/* 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;
}

131 132 133 134
/*
 * Kprobes-specific fetch functions
 */
#define DEFINE_FETCH_stack(type)					\
135
static void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs,		\
136 137 138 139
					  void *offset, void *dest)	\
{									\
	*(type *)dest = (type)regs_get_kernel_stack_nth(regs,		\
				(unsigned int)((unsigned long)offset));	\
140 141 142
}									\
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(stack, type));

143 144 145 146 147
DEFINE_BASIC_FETCH_FUNCS(stack)
/* No string on the stack entry */
#define fetch_stack_string	NULL
#define fetch_stack_string_size	NULL

148
#define DEFINE_FETCH_memory(type)					\
149
static void FETCH_FUNC_NAME(memory, type)(struct pt_regs *regs,		\
150 151 152 153 154 155 156
					  void *addr, void *dest)	\
{									\
	type retval;							\
	if (probe_kernel_address(addr, retval))				\
		*(type *)dest = 0;					\
	else								\
		*(type *)dest = retval;					\
157 158 159
}									\
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, type));

160 161 162 163 164
DEFINE_BASIC_FETCH_FUNCS(memory)
/*
 * Fetch a null-terminated string. Caller MUST set *(u32 *)dest with max
 * length and relative data location.
 */
165 166
static void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
					    void *addr, void *dest)
167 168 169
{
	int maxlen = get_rloc_len(*(u32 *)dest);
	u8 *dst = get_rloc_data(dest);
170
	long ret;
171 172 173 174 175 176 177 178

	if (!maxlen)
		return;

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

	if (ret < 0) {	/* Failed to fetch string */
182
		dst[0] = '\0';
183 184
		*(u32 *)dest = make_data_rloc(0, get_rloc_offs(*(u32 *)dest));
	} else {
185
		*(u32 *)dest = make_data_rloc(ret, get_rloc_offs(*(u32 *)dest));
186 187
	}
}
188
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string));
189 190

/* Return the length of string -- including null terminal byte */
191 192
static void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
						 void *addr, void *dest)
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
{
	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;
}
215
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string_size));
216

217
#define DEFINE_FETCH_symbol(type)					\
218
void FETCH_FUNC_NAME(symbol, type)(struct pt_regs *regs, void *data, void *dest)\
219 220 221 222 223 224
{									\
	struct symbol_cache *sc = data;					\
	if (sc->addr)							\
		fetch_memory_##type(regs, (void *)sc->addr, dest);	\
	else								\
		*(type *)dest = 0;					\
225 226 227
}									\
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(symbol, type));

228 229 230 231
DEFINE_BASIC_FETCH_FUNCS(symbol)
DEFINE_FETCH_symbol(string)
DEFINE_FETCH_symbol(string_size)

232 233 234 235 236 237 238 239
/* 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

240
/* Fetch type information table */
241
static const struct fetch_type kprobes_fetch_type_table[] = {
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
	/* 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),

	ASSIGN_FETCH_TYPE_END
};

260 261 262
/*
 * Allocate new trace_probe and initialize it (including kprobes).
 */
263
static struct trace_kprobe *alloc_trace_kprobe(const char *group,
264
					     const char *event,
265 266 267
					     void *addr,
					     const char *symbol,
					     unsigned long offs,
268
					     int nargs, bool is_return)
269
{
270
	struct trace_kprobe *tk;
271
	int ret = -ENOMEM;
272

273 274
	tk = kzalloc(SIZEOF_TRACE_KPROBE(nargs), GFP_KERNEL);
	if (!tk)
275
		return ERR_PTR(ret);
276

277 278 279 280
	tk->nhit = alloc_percpu(unsigned long);
	if (!tk->nhit)
		goto error;

281
	if (symbol) {
282 283
		tk->symbol = kstrdup(symbol, GFP_KERNEL);
		if (!tk->symbol)
284
			goto error;
285 286
		tk->rp.kp.symbol_name = tk->symbol;
		tk->rp.kp.offset = offs;
287
	} else
288
		tk->rp.kp.addr = addr;
289 290

	if (is_return)
291
		tk->rp.handler = kretprobe_dispatcher;
292
	else
293
		tk->rp.kp.pre_handler = kprobe_dispatcher;
294

295
	if (!event || !is_good_name(event)) {
296
		ret = -EINVAL;
297
		goto error;
298 299
	}

300 301 302
	tk->tp.call.class = &tk->tp.class;
	tk->tp.call.name = kstrdup(event, GFP_KERNEL);
	if (!tk->tp.call.name)
303
		goto error;
304

305
	if (!group || !is_good_name(group)) {
306
		ret = -EINVAL;
307
		goto error;
308 309
	}

310 311
	tk->tp.class.system = kstrdup(group, GFP_KERNEL);
	if (!tk->tp.class.system)
312 313
		goto error;

314 315 316
	INIT_LIST_HEAD(&tk->list);
	INIT_LIST_HEAD(&tk->tp.files);
	return tk;
317
error:
318 319
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
320
	free_percpu(tk->nhit);
321
	kfree(tk);
322
	return ERR_PTR(ret);
323 324
}

325
static void free_trace_kprobe(struct trace_kprobe *tk)
326 327 328
{
	int i;

329 330
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_free_probe_arg(&tk->tp.args[i]);
331

332 333 334
	kfree(tk->tp.call.class->system);
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
335
	free_percpu(tk->nhit);
336
	kfree(tk);
337 338
}

339 340
static struct trace_kprobe *find_trace_kprobe(const char *event,
					      const char *group)
341
{
342
	struct trace_kprobe *tk;
343

344
	list_for_each_entry(tk, &probe_list, list)
345
		if (strcmp(trace_event_name(&tk->tp.call), event) == 0 &&
346 347
		    strcmp(tk->tp.call.class->system, group) == 0)
			return tk;
348 349 350
	return NULL;
}

351 352 353 354 355
/*
 * Enable trace_probe
 * if the file is NULL, enable "perf" handler, or enable "trace" handler.
 */
static int
356
enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
357 358 359
{
	int ret = 0;

360
	if (file) {
361 362 363 364
		struct event_file_link *link;

		link = kmalloc(sizeof(*link), GFP_KERNEL);
		if (!link) {
365
			ret = -ENOMEM;
366
			goto out;
367 368
		}

369
		link->file = file;
370
		list_add_tail_rcu(&link->list, &tk->tp.files);
371

372
		tk->tp.flags |= TP_FLAG_TRACE;
373
	} else
374
		tk->tp.flags |= TP_FLAG_PROFILE;
375

376 377 378
	if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
		if (trace_kprobe_is_return(tk))
			ret = enable_kretprobe(&tk->rp);
379
		else
380
			ret = enable_kprobe(&tk->rp.kp);
381
	}
382
 out:
383 384 385
	return ret;
}

386 387 388 389 390
/*
 * Disable trace_probe
 * if the file is NULL, disable "perf" handler, or disable "trace" handler.
 */
static int
391
disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
392
{
393 394
	struct event_file_link *link = NULL;
	int wait = 0;
395 396 397
	int ret = 0;

	if (file) {
398
		link = find_event_file_link(&tk->tp, file);
399
		if (!link) {
400
			ret = -EINVAL;
401
			goto out;
402 403
		}

404
		list_del_rcu(&link->list);
405
		wait = 1;
406
		if (!list_empty(&tk->tp.files))
407
			goto out;
408

409
		tk->tp.flags &= ~TP_FLAG_TRACE;
410
	} else
411
		tk->tp.flags &= ~TP_FLAG_PROFILE;
412

413 414 415
	if (!trace_probe_is_enabled(&tk->tp) && trace_probe_is_registered(&tk->tp)) {
		if (trace_kprobe_is_return(tk))
			disable_kretprobe(&tk->rp);
416
		else
417
			disable_kprobe(&tk->rp.kp);
418
		wait = 1;
419
	}
420
 out:
421 422 423 424 425 426 427 428 429 430 431 432 433
	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 */
	}

434
	return ret;
435 436
}

437
/* Internal register function - just handle k*probes and flags */
438
static int __register_trace_kprobe(struct trace_kprobe *tk)
439
{
440
	int i, ret;
441

442
	if (trace_probe_is_registered(&tk->tp))
443 444
		return -EINVAL;

445 446
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_update_arg(&tk->tp.args[i]);
447

448
	/* Set/clear disabled flag according to tp->flag */
449 450
	if (trace_probe_is_enabled(&tk->tp))
		tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
451
	else
452
		tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
453

454 455
	if (trace_kprobe_is_return(tk))
		ret = register_kretprobe(&tk->rp);
456
	else
457
		ret = register_kprobe(&tk->rp.kp);
458 459

	if (ret == 0)
460
		tk->tp.flags |= TP_FLAG_REGISTERED;
461 462
	else {
		pr_warning("Could not insert probe at %s+%lu: %d\n",
463 464
			   trace_kprobe_symbol(tk), trace_kprobe_offset(tk), ret);
		if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) {
465 466 467 468 469 470
			pr_warning("This probe might be able to register after"
				   "target module is loaded. Continue.\n");
			ret = 0;
		} else if (ret == -EILSEQ) {
			pr_warning("Probing address(0x%p) is not an "
				   "instruction boundary.\n",
471
				   tk->rp.kp.addr);
472 473 474 475 476 477 478 479
			ret = -EINVAL;
		}
	}

	return ret;
}

/* Internal unregister function - just handle k*probes and flags */
480
static void __unregister_trace_kprobe(struct trace_kprobe *tk)
481
{
482 483 484
	if (trace_probe_is_registered(&tk->tp)) {
		if (trace_kprobe_is_return(tk))
			unregister_kretprobe(&tk->rp);
485
		else
486 487
			unregister_kprobe(&tk->rp.kp);
		tk->tp.flags &= ~TP_FLAG_REGISTERED;
488
		/* Cleanup kprobe for reuse */
489 490
		if (tk->rp.kp.symbol_name)
			tk->rp.kp.addr = NULL;
491 492 493 494
	}
}

/* Unregister a trace_probe and probe_event: call with locking probe_lock */
495
static int unregister_trace_kprobe(struct trace_kprobe *tk)
496
{
497
	/* Enabled event can not be unregistered */
498
	if (trace_probe_is_enabled(&tk->tp))
499 500
		return -EBUSY;

501
	/* Will fail if probe is being used by ftrace or perf */
502
	if (unregister_kprobe_event(tk))
503 504
		return -EBUSY;

505 506
	__unregister_trace_kprobe(tk);
	list_del(&tk->list);
507 508

	return 0;
509 510 511
}

/* Register a trace_probe and probe_event */
512
static int register_trace_kprobe(struct trace_kprobe *tk)
513
{
514
	struct trace_kprobe *old_tk;
515 516 517 518
	int ret;

	mutex_lock(&probe_lock);

519
	/* Delete old (same name) event if exist */
520
	old_tk = find_trace_kprobe(trace_event_name(&tk->tp.call),
521
			tk->tp.call.class->system);
522 523
	if (old_tk) {
		ret = unregister_trace_kprobe(old_tk);
524 525
		if (ret < 0)
			goto end;
526
		free_trace_kprobe(old_tk);
527
	}
528 529

	/* Register new event */
530
	ret = register_kprobe_event(tk);
531
	if (ret) {
P
Paul Bolle 已提交
532
		pr_warning("Failed to register probe event(%d)\n", ret);
533 534 535
		goto end;
	}

536
	/* Register k*probe */
537
	ret = __register_trace_kprobe(tk);
538
	if (ret < 0)
539
		unregister_kprobe_event(tk);
540
	else
541
		list_add_tail(&tk->list, &probe_list);
542

543 544 545 546 547
end:
	mutex_unlock(&probe_lock);
	return ret;
}

548
/* Module notifier call back, checking event on the module */
549
static int trace_kprobe_module_callback(struct notifier_block *nb,
550 551 552
				       unsigned long val, void *data)
{
	struct module *mod = data;
553
	struct trace_kprobe *tk;
554 555 556 557 558 559 560
	int ret;

	if (val != MODULE_STATE_COMING)
		return NOTIFY_DONE;

	/* Update probes on coming module */
	mutex_lock(&probe_lock);
561 562
	list_for_each_entry(tk, &probe_list, list) {
		if (trace_kprobe_within_module(tk, mod)) {
563
			/* Don't need to check busy - this should have gone. */
564 565
			__unregister_trace_kprobe(tk);
			ret = __register_trace_kprobe(tk);
566 567 568
			if (ret)
				pr_warning("Failed to re-register probe %s on"
					   "%s: %d\n",
569
					   trace_event_name(&tk->tp.call),
570
					   mod->name, ret);
571 572 573 574 575 576 577
		}
	}
	mutex_unlock(&probe_lock);

	return NOTIFY_DONE;
}

578 579
static struct notifier_block trace_kprobe_module_nb = {
	.notifier_call = trace_kprobe_module_callback,
580 581 582
	.priority = 1	/* Invoked after kprobe module callback */
};

583
static int create_trace_kprobe(int argc, char **argv)
584 585 586
{
	/*
	 * Argument syntax:
587 588
	 *  - Add kprobe: p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
	 *  - Add kretprobe: r[:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
589
	 * Fetch args:
590 591 592
	 *  $retval	: fetch return value
	 *  $stack	: fetch stack address
	 *  $stackN	: fetch Nth of stack (N:0-)
593 594 595
	 *  @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
596
	 * Dereferencing memory fetch:
597
	 *  +|-offs(ARG) : fetch memory at ARG +|- offs address.
598 599
	 * Alias name of args:
	 *  NAME=FETCHARG : set NAME as alias of FETCHARG.
600 601
	 * Type of args:
	 *  FETCHARG:TYPE : use TYPE instead of unsigned long.
602
	 */
603
	struct trace_kprobe *tk;
604
	int i, ret = 0;
605
	bool is_return = false, is_delete = false;
606
	char *symbol = NULL, *event = NULL, *group = NULL;
607
	char *arg;
608
	unsigned long offset = 0;
609
	void *addr = NULL;
610
	char buf[MAX_EVENT_NAME_LEN];
611

612
	/* argc must be >= 1 */
613
	if (argv[0][0] == 'p')
614
		is_return = false;
615
	else if (argv[0][0] == 'r')
616
		is_return = true;
617
	else if (argv[0][0] == '-')
618
		is_delete = true;
619
	else {
620 621
		pr_info("Probe definition must be started with 'p', 'r' or"
			" '-'.\n");
622
		return -EINVAL;
623
	}
624 625 626

	if (argv[0][1] == ':') {
		event = &argv[0][2];
627 628 629 630 631
		if (strchr(event, '/')) {
			group = event;
			event = strchr(group, '/') + 1;
			event[-1] = '\0';
			if (strlen(group) == 0) {
632
				pr_info("Group name is not specified\n");
633 634 635
				return -EINVAL;
			}
		}
636
		if (strlen(event) == 0) {
637
			pr_info("Event name is not specified\n");
638 639 640
			return -EINVAL;
		}
	}
641 642
	if (!group)
		group = KPROBE_EVENT_SYSTEM;
643

644 645 646 647 648
	if (is_delete) {
		if (!event) {
			pr_info("Delete command needs an event name.\n");
			return -EINVAL;
		}
649
		mutex_lock(&probe_lock);
650 651
		tk = find_trace_kprobe(event, group);
		if (!tk) {
652
			mutex_unlock(&probe_lock);
653 654 655 656
			pr_info("Event %s/%s doesn't exist.\n", group, event);
			return -ENOENT;
		}
		/* delete an event */
657
		ret = unregister_trace_kprobe(tk);
658
		if (ret == 0)
659
			free_trace_kprobe(tk);
660
		mutex_unlock(&probe_lock);
661
		return ret;
662 663 664 665 666 667
	}

	if (argc < 2) {
		pr_info("Probe point is not specified.\n");
		return -EINVAL;
	}
668
	if (isdigit(argv[1][0])) {
669 670
		if (is_return) {
			pr_info("Return probe point must be a symbol.\n");
671
			return -EINVAL;
672
		}
673
		/* an address specified */
674
		ret = kstrtoul(&argv[1][0], 0, (unsigned long *)&addr);
675 676
		if (ret) {
			pr_info("Failed to parse address.\n");
677
			return ret;
678
		}
679 680 681 682
	} else {
		/* a symbol specified */
		symbol = argv[1];
		/* TODO: support .init module functions */
683
		ret = traceprobe_split_symbol_offset(symbol, &offset);
684 685
		if (ret) {
			pr_info("Failed to parse symbol.\n");
686
			return ret;
687 688 689
		}
		if (offset && is_return) {
			pr_info("Return probe must be used without offset.\n");
690
			return -EINVAL;
691
		}
692
	}
693
	argc -= 2; argv += 2;
694 695

	/* setup a probe */
696 697 698
	if (!event) {
		/* Make a new event name */
		if (symbol)
699
			snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_%ld",
700 701
				 is_return ? 'r' : 'p', symbol, offset);
		else
702
			snprintf(buf, MAX_EVENT_NAME_LEN, "%c_0x%p",
703
				 is_return ? 'r' : 'p', addr);
704 705
		event = buf;
	}
706
	tk = alloc_trace_kprobe(group, event, addr, symbol, offset, argc,
707
			       is_return);
708
	if (IS_ERR(tk)) {
709
		pr_info("Failed to allocate trace_probe.(%d)\n",
710 711
			(int)PTR_ERR(tk));
		return PTR_ERR(tk);
712
	}
713 714

	/* parse arguments */
715 716
	ret = 0;
	for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
717 718
		struct probe_arg *parg = &tk->tp.args[i];

719
		/* Increment count for freeing args in error case */
720
		tk->tp.nr_args++;
721

722 723
		/* Parse argument name */
		arg = strchr(argv[i], '=');
724
		if (arg) {
725
			*arg++ = '\0';
726
			parg->name = kstrdup(argv[i], GFP_KERNEL);
727
		} else {
728
			arg = argv[i];
729 730
			/* If argument name is omitted, set "argN" */
			snprintf(buf, MAX_EVENT_NAME_LEN, "arg%d", i + 1);
731
			parg->name = kstrdup(buf, GFP_KERNEL);
732
		}
733

734
		if (!parg->name) {
735
			pr_info("Failed to allocate argument[%d] name.\n", i);
736
			ret = -ENOMEM;
737 738
			goto error;
		}
739

740
		if (!is_good_name(parg->name)) {
741
			pr_info("Invalid argument[%d] name: %s\n",
742
				i, parg->name);
743 744 745
			ret = -EINVAL;
			goto error;
		}
746

747 748
		if (traceprobe_conflict_field_name(parg->name,
							tk->tp.args, i)) {
749
			pr_info("Argument[%d] name '%s' conflicts with "
750 751 752 753
				"another field.\n", i, argv[i]);
			ret = -EINVAL;
			goto error;
		}
754 755

		/* Parse fetch argument */
756
		ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
757 758
						is_return, true,
						kprobes_fetch_type_table);
759
		if (ret) {
760
			pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
761
			goto error;
762
		}
763 764
	}

765
	ret = register_trace_kprobe(tk);
766 767 768 769 770
	if (ret)
		goto error;
	return 0;

error:
771
	free_trace_kprobe(tk);
772 773 774
	return ret;
}

775
static int release_all_trace_kprobes(void)
776
{
777
	struct trace_kprobe *tk;
778
	int ret = 0;
779 780

	mutex_lock(&probe_lock);
781
	/* Ensure no probe is in use. */
782 783
	list_for_each_entry(tk, &probe_list, list)
		if (trace_probe_is_enabled(&tk->tp)) {
784 785 786
			ret = -EBUSY;
			goto end;
		}
787 788
	/* TODO: Use batch unregistration */
	while (!list_empty(&probe_list)) {
789 790
		tk = list_entry(probe_list.next, struct trace_kprobe, list);
		ret = unregister_trace_kprobe(tk);
791 792
		if (ret)
			goto end;
793
		free_trace_kprobe(tk);
794
	}
795 796

end:
797
	mutex_unlock(&probe_lock);
798 799

	return ret;
800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820
}

/* 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)
{
821
	struct trace_kprobe *tk = v;
822
	int i;
823

824
	seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
825
	seq_printf(m, ":%s/%s", tk->tp.call.class->system,
826
			trace_event_name(&tk->tp.call));
827

828 829 830 831 832
	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);
833
	else
834
		seq_printf(m, " %s", trace_kprobe_symbol(tk));
835

836 837
	for (i = 0; i < tk->tp.nr_args; i++)
		seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
838
	seq_putc(m, '\n');
839

840 841 842 843 844 845 846 847 848 849 850 851
	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)
{
852 853 854
	int ret;

	if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
855
		ret = release_all_trace_kprobes();
856 857 858
		if (ret < 0)
			return ret;
	}
859 860 861 862 863 864 865

	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)
{
866
	return traceprobe_probes_write(file, buffer, count, ppos,
867
			create_trace_kprobe);
868 869 870 871 872 873 874 875 876 877 878
}

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,
};

879 880 881
/* Probes profiling interfaces */
static int probes_profile_seq_show(struct seq_file *m, void *v)
{
882
	struct trace_kprobe *tk = v;
883 884 885 886 887
	unsigned long nhit = 0;
	int cpu;

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

889
	seq_printf(m, "  %-44s %15lu %15lu\n",
890
		   trace_event_name(&tk->tp.call), nhit,
891
		   tk->rp.kp.nmissed);
892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915

	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,
};

916
/* Kprobe handler */
917
static nokprobe_inline void
918
__kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
919
		    struct trace_event_file *trace_file)
920
{
921
	struct kprobe_trace_entry_head *entry;
922
	struct ring_buffer_event *event;
923
	struct ring_buffer *buffer;
924
	int size, dsize, pc;
925
	unsigned long irq_flags;
926
	struct trace_event_call *call = &tk->tp.call;
927

928
	WARN_ON(call != trace_file->event_call);
929

930
	if (trace_trigger_soft_disabled(trace_file))
931
		return;
932

933 934 935
	local_save_flags(irq_flags);
	pc = preempt_count();

936 937
	dsize = __get_data_size(&tk->tp, regs);
	size = sizeof(*entry) + tk->tp.size + dsize;
938

939
	event = trace_event_buffer_lock_reserve(&buffer, trace_file,
940 941
						call->event.type,
						size, irq_flags, pc);
942
	if (!event)
943
		return;
944 945

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

949
	event_trigger_unlock_commit_regs(trace_file, buffer, event,
950
					 entry, irq_flags, pc, regs);
951 952
}

953
static void
954
kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs)
955
{
956
	struct event_file_link *link;
957

958 959
	list_for_each_entry_rcu(link, &tk->tp.files, list)
		__kprobe_trace_func(tk, regs, link->file);
960
}
961
NOKPROBE_SYMBOL(kprobe_trace_func);
962

963
/* Kretprobe handler */
964
static nokprobe_inline void
965
__kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
966
		       struct pt_regs *regs,
967
		       struct trace_event_file *trace_file)
968
{
969
	struct kretprobe_trace_entry_head *entry;
970
	struct ring_buffer_event *event;
971
	struct ring_buffer *buffer;
972
	int size, pc, dsize;
973
	unsigned long irq_flags;
974
	struct trace_event_call *call = &tk->tp.call;
975

976
	WARN_ON(call != trace_file->event_call);
977

978
	if (trace_trigger_soft_disabled(trace_file))
979
		return;
980

981 982 983
	local_save_flags(irq_flags);
	pc = preempt_count();

984 985
	dsize = __get_data_size(&tk->tp, regs);
	size = sizeof(*entry) + tk->tp.size + dsize;
986

987
	event = trace_event_buffer_lock_reserve(&buffer, trace_file,
988 989
						call->event.type,
						size, irq_flags, pc);
990
	if (!event)
991
		return;
992 993

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

998
	event_trigger_unlock_commit_regs(trace_file, buffer, event,
999
					 entry, irq_flags, pc, regs);
1000 1001
}

1002
static void
1003
kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1004 1005
		     struct pt_regs *regs)
{
1006
	struct event_file_link *link;
1007

1008 1009
	list_for_each_entry_rcu(link, &tk->tp.files, list)
		__kretprobe_trace_func(tk, ri, regs, link->file);
1010
}
1011
NOKPROBE_SYMBOL(kretprobe_trace_func);
1012

1013
/* Event entry printers */
1014
static enum print_line_t
1015 1016
print_kprobe_event(struct trace_iterator *iter, int flags,
		   struct trace_event *event)
1017
{
1018
	struct kprobe_trace_entry_head *field;
1019
	struct trace_seq *s = &iter->seq;
1020
	struct trace_probe *tp;
1021
	u8 *data;
1022 1023
	int i;

1024
	field = (struct kprobe_trace_entry_head *)iter->ent;
1025
	tp = container_of(event, struct trace_probe, call.event);
1026

1027
	trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1028

1029
	if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET))
1030
		goto out;
1031

1032
	trace_seq_putc(s, ')');
1033

1034 1035 1036
	data = (u8 *)&field[1];
	for (i = 0; i < tp->nr_args; i++)
		if (!tp->args[i].type->print(s, tp->args[i].name,
1037
					     data + tp->args[i].offset, field))
1038
			goto out;
1039

1040 1041 1042
	trace_seq_putc(s, '\n');
 out:
	return trace_handle_return(s);
1043 1044
}

1045
static enum print_line_t
1046 1047
print_kretprobe_event(struct trace_iterator *iter, int flags,
		      struct trace_event *event)
1048
{
1049
	struct kretprobe_trace_entry_head *field;
1050
	struct trace_seq *s = &iter->seq;
1051
	struct trace_probe *tp;
1052
	u8 *data;
1053 1054
	int i;

1055
	field = (struct kretprobe_trace_entry_head *)iter->ent;
1056
	tp = container_of(event, struct trace_probe, call.event);
1057

1058
	trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1059

1060
	if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
1061
		goto out;
1062

1063
	trace_seq_puts(s, " <- ");
1064 1065

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

1068
	trace_seq_putc(s, ')');
1069

1070 1071 1072
	data = (u8 *)&field[1];
	for (i = 0; i < tp->nr_args; i++)
		if (!tp->args[i].type->print(s, tp->args[i].name,
1073
					     data + tp->args[i].offset, field))
1074
			goto out;
1075

1076
	trace_seq_putc(s, '\n');
1077

1078 1079
 out:
	return trace_handle_return(s);
1080 1081 1082
}


1083
static int kprobe_event_define_fields(struct trace_event_call *event_call)
1084 1085
{
	int ret, i;
1086
	struct kprobe_trace_entry_head field;
1087
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1088

1089
	DEFINE_FIELD(unsigned long, ip, FIELD_STRING_IP, 0);
1090
	/* Set argument names as fields */
1091 1092 1093 1094 1095 1096 1097 1098
	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,
1099 1100 1101 1102
					 FILTER_OTHER);
		if (ret)
			return ret;
	}
1103 1104 1105
	return 0;
}

1106
static int kretprobe_event_define_fields(struct trace_event_call *event_call)
1107 1108
{
	int ret, i;
1109
	struct kretprobe_trace_entry_head field;
1110
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1111

1112 1113
	DEFINE_FIELD(unsigned long, func, FIELD_STRING_FUNC, 0);
	DEFINE_FIELD(unsigned long, ret_ip, FIELD_STRING_RETIP, 0);
1114
	/* Set argument names as fields */
1115 1116 1117 1118 1119 1120 1121 1122
	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,
1123 1124 1125 1126
					 FILTER_OTHER);
		if (ret)
			return ret;
	}
1127 1128 1129
	return 0;
}

1130
#ifdef CONFIG_PERF_EVENTS
1131 1132

/* Kprobe profile handler */
1133
static void
1134
kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs)
1135
{
1136
	struct trace_event_call *call = &tk->tp.call;
1137
	struct bpf_prog *prog = call->prog;
1138
	struct kprobe_trace_entry_head *entry;
1139
	struct hlist_head *head;
1140
	int size, __size, dsize;
1141
	int rctx;
1142

1143 1144 1145
	if (prog && !trace_call_bpf(prog, regs))
		return;

1146 1147 1148 1149
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

1150 1151
	dsize = __get_data_size(&tk->tp, regs);
	__size = sizeof(*entry) + tk->tp.size + dsize;
1152 1153
	size = ALIGN(__size + sizeof(u32), sizeof(u64));
	size -= sizeof(u32);
1154

1155
	entry = perf_trace_buf_prepare(size, call->event.type, NULL, &rctx);
1156
	if (!entry)
1157
		return;
1158

1159
	entry->ip = (unsigned long)tk->rp.kp.addr;
1160
	memset(&entry[1], 0, dsize);
1161
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1162
	perf_trace_buf_submit(entry, size, rctx, 0, 1, regs, head, NULL);
1163
}
1164
NOKPROBE_SYMBOL(kprobe_perf_func);
1165 1166

/* Kretprobe profile handler */
1167
static void
1168
kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1169
		    struct pt_regs *regs)
1170
{
1171
	struct trace_event_call *call = &tk->tp.call;
1172
	struct bpf_prog *prog = call->prog;
1173
	struct kretprobe_trace_entry_head *entry;
1174
	struct hlist_head *head;
1175
	int size, __size, dsize;
1176
	int rctx;
1177

1178 1179 1180
	if (prog && !trace_call_bpf(prog, regs))
		return;

1181 1182 1183 1184
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

1185 1186
	dsize = __get_data_size(&tk->tp, regs);
	__size = sizeof(*entry) + tk->tp.size + dsize;
1187 1188
	size = ALIGN(__size + sizeof(u32), sizeof(u64));
	size -= sizeof(u32);
1189

1190
	entry = perf_trace_buf_prepare(size, call->event.type, NULL, &rctx);
1191
	if (!entry)
1192
		return;
1193

1194
	entry->func = (unsigned long)tk->rp.kp.addr;
1195
	entry->ret_ip = (unsigned long)ri->ret_addr;
1196
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1197
	perf_trace_buf_submit(entry, size, rctx, 0, 1, regs, head, NULL);
1198
}
1199
NOKPROBE_SYMBOL(kretprobe_perf_func);
1200
#endif	/* CONFIG_PERF_EVENTS */
1201

1202 1203 1204 1205 1206 1207
/*
 * 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.
 */
1208
static int kprobe_register(struct trace_event_call *event,
1209
			   enum trace_reg type, void *data)
1210
{
1211
	struct trace_kprobe *tk = (struct trace_kprobe *)event->data;
1212
	struct trace_event_file *file = data;
1213

1214 1215
	switch (type) {
	case TRACE_REG_REGISTER:
1216
		return enable_trace_kprobe(tk, file);
1217
	case TRACE_REG_UNREGISTER:
1218
		return disable_trace_kprobe(tk, file);
1219 1220 1221

#ifdef CONFIG_PERF_EVENTS
	case TRACE_REG_PERF_REGISTER:
1222
		return enable_trace_kprobe(tk, NULL);
1223
	case TRACE_REG_PERF_UNREGISTER:
1224
		return disable_trace_kprobe(tk, NULL);
1225 1226
	case TRACE_REG_PERF_OPEN:
	case TRACE_REG_PERF_CLOSE:
1227 1228
	case TRACE_REG_PERF_ADD:
	case TRACE_REG_PERF_DEL:
1229
		return 0;
1230 1231 1232 1233
#endif
	}
	return 0;
}
1234

1235
static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs)
1236
{
1237
	struct trace_kprobe *tk = container_of(kp, struct trace_kprobe, rp.kp);
1238

1239
	raw_cpu_inc(*tk->nhit);
1240

1241 1242
	if (tk->tp.flags & TP_FLAG_TRACE)
		kprobe_trace_func(tk, regs);
1243
#ifdef CONFIG_PERF_EVENTS
1244 1245
	if (tk->tp.flags & TP_FLAG_PROFILE)
		kprobe_perf_func(tk, regs);
1246
#endif
1247 1248
	return 0;	/* We don't tweek kernel, so just return 0 */
}
1249
NOKPROBE_SYMBOL(kprobe_dispatcher);
1250

1251 1252
static int
kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
1253
{
1254
	struct trace_kprobe *tk = container_of(ri->rp, struct trace_kprobe, rp);
1255

1256
	raw_cpu_inc(*tk->nhit);
1257

1258 1259
	if (tk->tp.flags & TP_FLAG_TRACE)
		kretprobe_trace_func(tk, ri, regs);
1260
#ifdef CONFIG_PERF_EVENTS
1261 1262
	if (tk->tp.flags & TP_FLAG_PROFILE)
		kretprobe_perf_func(tk, ri, regs);
1263
#endif
1264 1265
	return 0;	/* We don't tweek kernel, so just return 0 */
}
1266
NOKPROBE_SYMBOL(kretprobe_dispatcher);
1267

1268 1269 1270 1271 1272 1273 1274 1275
static struct trace_event_functions kretprobe_funcs = {
	.trace		= print_kretprobe_event
};

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

1276
static int register_kprobe_event(struct trace_kprobe *tk)
1277
{
1278
	struct trace_event_call *call = &tk->tp.call;
1279 1280
	int ret;

1281
	/* Initialize trace_event_call */
1282
	INIT_LIST_HEAD(&call->class->fields);
1283
	if (trace_kprobe_is_return(tk)) {
1284
		call->event.funcs = &kretprobe_funcs;
1285
		call->class->define_fields = kretprobe_event_define_fields;
1286
	} else {
1287
		call->event.funcs = &kprobe_funcs;
1288
		call->class->define_fields = kprobe_event_define_fields;
1289
	}
1290
	if (set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0)
1291
		return -ENOMEM;
1292
	ret = register_trace_event(&call->event);
1293
	if (!ret) {
1294
		kfree(call->print_fmt);
1295
		return -ENODEV;
1296
	}
A
Alexei Starovoitov 已提交
1297
	call->flags = TRACE_EVENT_FL_KPROBE;
1298
	call->class->reg = kprobe_register;
1299
	call->data = tk;
1300
	ret = trace_add_event_call(call);
1301
	if (ret) {
1302
		pr_info("Failed to register kprobe event: %s\n",
1303
			trace_event_name(call));
1304
		kfree(call->print_fmt);
1305
		unregister_trace_event(&call->event);
1306
	}
1307 1308 1309
	return ret;
}

1310
static int unregister_kprobe_event(struct trace_kprobe *tk)
1311
{
1312 1313
	int ret;

1314
	/* tp->event is unregistered in trace_remove_event_call() */
1315
	ret = trace_remove_event_call(&tk->tp.call);
1316
	if (!ret)
1317
		kfree(tk->tp.call.print_fmt);
1318
	return ret;
1319 1320
}

1321
/* Make a tracefs interface for controlling probe points */
1322 1323 1324 1325 1326
static __init int init_kprobe_trace(void)
{
	struct dentry *d_tracer;
	struct dentry *entry;

1327
	if (register_module_notifier(&trace_kprobe_module_nb))
1328 1329
		return -EINVAL;

1330
	d_tracer = tracing_init_dentry();
1331
	if (IS_ERR(d_tracer))
1332 1333
		return 0;

1334
	entry = tracefs_create_file("kprobe_events", 0644, d_tracer,
1335 1336
				    NULL, &kprobe_events_ops);

1337
	/* Event list interface */
1338
	if (!entry)
1339
		pr_warning("Could not create tracefs "
1340
			   "'kprobe_events' entry\n");
1341 1342

	/* Profile interface */
1343
	entry = tracefs_create_file("kprobe_profile", 0444, d_tracer,
1344 1345 1346
				    NULL, &kprobe_profile_ops);

	if (!entry)
1347
		pr_warning("Could not create tracefs "
1348
			   "'kprobe_profile' entry\n");
1349 1350 1351 1352 1353 1354 1355
	return 0;
}
fs_initcall(init_kprobe_trace);


#ifdef CONFIG_FTRACE_STARTUP_TEST

1356 1357 1358 1359 1360 1361
/*
 * The "__used" keeps gcc from removing the function symbol
 * from the kallsyms table.
 */
static __used int kprobe_trace_selftest_target(int a1, int a2, int a3,
					       int a4, int a5, int a6)
1362 1363 1364 1365
{
	return a1 + a2 + a3 + a4 + a5 + a6;
}

1366
static struct trace_event_file *
1367
find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
1368
{
1369
	struct trace_event_file *file;
1370 1371

	list_for_each_entry(file, &tr->events, list)
1372
		if (file->event_call == &tk->tp.call)
1373 1374 1375 1376 1377
			return file;

	return NULL;
}

1378
/*
1379
 * Nobody but us can call enable_trace_kprobe/disable_trace_kprobe at this
1380 1381
 * stage, we can do this lockless.
 */
1382 1383
static __init int kprobe_trace_self_tests_init(void)
{
1384
	int ret, warn = 0;
1385
	int (*target)(int, int, int, int, int, int);
1386
	struct trace_kprobe *tk;
1387
	struct trace_event_file *file;
1388

1389 1390 1391
	if (tracing_is_disabled())
		return -ENODEV;

1392 1393 1394 1395
	target = kprobe_trace_selftest_target;

	pr_info("Testing kprobe tracing: ");

1396 1397
	ret = traceprobe_command("p:testprobe kprobe_trace_selftest_target "
				  "$stack $stack0 +0($stack)",
1398
				  create_trace_kprobe);
1399
	if (WARN_ON_ONCE(ret)) {
1400
		pr_warn("error on probing function entry.\n");
1401 1402 1403
		warn++;
	} else {
		/* Enable trace point */
1404 1405
		tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
		if (WARN_ON_ONCE(tk == NULL)) {
1406
			pr_warn("error on getting new probe.\n");
1407
			warn++;
1408
		} else {
1409
			file = find_trace_probe_file(tk, top_trace_array());
1410 1411 1412 1413
			if (WARN_ON_ONCE(file == NULL)) {
				pr_warn("error on getting probe file.\n");
				warn++;
			} else
1414
				enable_trace_kprobe(tk, file);
1415
		}
1416
	}
1417

1418
	ret = traceprobe_command("r:testprobe2 kprobe_trace_selftest_target "
1419
				  "$retval", create_trace_kprobe);
1420
	if (WARN_ON_ONCE(ret)) {
1421
		pr_warn("error on probing function return.\n");
1422 1423 1424
		warn++;
	} else {
		/* Enable trace point */
1425 1426
		tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
		if (WARN_ON_ONCE(tk == NULL)) {
1427
			pr_warn("error on getting 2nd new probe.\n");
1428
			warn++;
1429
		} else {
1430
			file = find_trace_probe_file(tk, top_trace_array());
1431 1432 1433 1434
			if (WARN_ON_ONCE(file == NULL)) {
				pr_warn("error on getting probe file.\n");
				warn++;
			} else
1435
				enable_trace_kprobe(tk, file);
1436
		}
1437 1438 1439 1440
	}

	if (warn)
		goto end;
1441 1442 1443

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

1444
	/* Disable trace points before removing it */
1445 1446
	tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1447
		pr_warn("error on getting test probe.\n");
1448
		warn++;
1449
	} else {
1450
		file = find_trace_probe_file(tk, top_trace_array());
1451 1452 1453 1454
		if (WARN_ON_ONCE(file == NULL)) {
			pr_warn("error on getting probe file.\n");
			warn++;
		} else
1455
			disable_trace_kprobe(tk, file);
1456
	}
1457

1458 1459
	tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1460
		pr_warn("error on getting 2nd test probe.\n");
1461
		warn++;
1462
	} else {
1463
		file = find_trace_probe_file(tk, top_trace_array());
1464 1465 1466 1467
		if (WARN_ON_ONCE(file == NULL)) {
			pr_warn("error on getting probe file.\n");
			warn++;
		} else
1468
			disable_trace_kprobe(tk, file);
1469
	}
1470

1471
	ret = traceprobe_command("-:testprobe", create_trace_kprobe);
1472
	if (WARN_ON_ONCE(ret)) {
1473
		pr_warn("error on deleting a probe.\n");
1474 1475 1476
		warn++;
	}

1477
	ret = traceprobe_command("-:testprobe2", create_trace_kprobe);
1478
	if (WARN_ON_ONCE(ret)) {
1479
		pr_warn("error on deleting a probe.\n");
1480 1481
		warn++;
	}
1482

1483
end:
1484
	release_all_trace_kprobes();
1485 1486 1487 1488
	if (warn)
		pr_cont("NG: Some tests are failed. Please check them.\n");
	else
		pr_cont("OK\n");
1489 1490 1491 1492 1493 1494
	return 0;
}

late_initcall(kprobe_trace_self_tests_init);

#endif