trace_kprobe.c 36.2 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 		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 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
{
	long ret;
	int maxlen = get_rloc_len(*(u32 *)dest);
	u8 *dst = get_rloc_data(dest);
	u8 *src = addr;
	mm_segment_t old_fs = get_fs();

	if (!maxlen)
		return;

	/*
	 * Try to get string again, since the string can be changed while
	 * probing.
	 */
	set_fs(KERNEL_DS);
	pagefault_disable();

	do
		ret = __copy_from_user_inatomic(dst++, src++, 1);
	while (dst[-1] && ret == 0 && src - (u8 *)addr < maxlen);

	dst[-1] = '\0';
	pagefault_enable();
	set_fs(old_fs);

	if (ret < 0) {	/* Failed to fetch string */
		((u8 *)get_rloc_data(dest))[0] = '\0';
		*(u32 *)dest = make_data_rloc(0, get_rloc_offs(*(u32 *)dest));
	} else {
		*(u32 *)dest = make_data_rloc(src - (u8 *)addr,
					      get_rloc_offs(*(u32 *)dest));
	}
}
200
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string));
201 202

/* Return the length of string -- including null terminal byte */
203 204
static void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
						 void *addr, void *dest)
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
{
	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;
}
227
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string_size));
228

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

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

244 245 246 247 248 249 250 251
/* 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

252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
/* Fetch type information table */
const struct fetch_type kprobes_fetch_type_table[] = {
	/* 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
};

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

285 286
	tk = kzalloc(SIZEOF_TRACE_KPROBE(nargs), GFP_KERNEL);
	if (!tk)
287
		return ERR_PTR(ret);
288 289

	if (symbol) {
290 291
		tk->symbol = kstrdup(symbol, GFP_KERNEL);
		if (!tk->symbol)
292
			goto error;
293 294
		tk->rp.kp.symbol_name = tk->symbol;
		tk->rp.kp.offset = offs;
295
	} else
296
		tk->rp.kp.addr = addr;
297 298

	if (is_return)
299
		tk->rp.handler = kretprobe_dispatcher;
300
	else
301
		tk->rp.kp.pre_handler = kprobe_dispatcher;
302

303
	if (!event || !is_good_name(event)) {
304
		ret = -EINVAL;
305
		goto error;
306 307
	}

308 309 310
	tk->tp.call.class = &tk->tp.class;
	tk->tp.call.name = kstrdup(event, GFP_KERNEL);
	if (!tk->tp.call.name)
311
		goto error;
312

313
	if (!group || !is_good_name(group)) {
314
		ret = -EINVAL;
315
		goto error;
316 317
	}

318 319
	tk->tp.class.system = kstrdup(group, GFP_KERNEL);
	if (!tk->tp.class.system)
320 321
		goto error;

322 323 324
	INIT_LIST_HEAD(&tk->list);
	INIT_LIST_HEAD(&tk->tp.files);
	return tk;
325
error:
326 327 328
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
	kfree(tk);
329
	return ERR_PTR(ret);
330 331
}

332
static void free_trace_kprobe(struct trace_kprobe *tk)
333 334 335
{
	int i;

336 337
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_free_probe_arg(&tk->tp.args[i]);
338

339 340 341 342
	kfree(tk->tp.call.class->system);
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
	kfree(tk);
343 344
}

345 346
static struct trace_kprobe *find_trace_kprobe(const char *event,
					      const char *group)
347
{
348
	struct trace_kprobe *tk;
349

350
	list_for_each_entry(tk, &probe_list, list)
351
		if (strcmp(ftrace_event_name(&tk->tp.call), event) == 0 &&
352 353
		    strcmp(tk->tp.call.class->system, group) == 0)
			return tk;
354 355 356
	return NULL;
}

357 358 359 360 361
/*
 * Enable trace_probe
 * if the file is NULL, enable "perf" handler, or enable "trace" handler.
 */
static int
362
enable_trace_kprobe(struct trace_kprobe *tk, struct ftrace_event_file *file)
363 364 365
{
	int ret = 0;

366
	if (file) {
367 368 369 370
		struct event_file_link *link;

		link = kmalloc(sizeof(*link), GFP_KERNEL);
		if (!link) {
371
			ret = -ENOMEM;
372
			goto out;
373 374
		}

375
		link->file = file;
376
		list_add_tail_rcu(&link->list, &tk->tp.files);
377

378
		tk->tp.flags |= TP_FLAG_TRACE;
379
	} else
380
		tk->tp.flags |= TP_FLAG_PROFILE;
381

382 383 384
	if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
		if (trace_kprobe_is_return(tk))
			ret = enable_kretprobe(&tk->rp);
385
		else
386
			ret = enable_kprobe(&tk->rp.kp);
387
	}
388
 out:
389 390 391
	return ret;
}

392 393 394 395 396
/*
 * Disable trace_probe
 * if the file is NULL, disable "perf" handler, or disable "trace" handler.
 */
static int
397
disable_trace_kprobe(struct trace_kprobe *tk, struct ftrace_event_file *file)
398
{
399 400
	struct event_file_link *link = NULL;
	int wait = 0;
401 402 403
	int ret = 0;

	if (file) {
404
		link = find_event_file_link(&tk->tp, file);
405
		if (!link) {
406
			ret = -EINVAL;
407
			goto out;
408 409
		}

410
		list_del_rcu(&link->list);
411
		wait = 1;
412
		if (!list_empty(&tk->tp.files))
413
			goto out;
414

415
		tk->tp.flags &= ~TP_FLAG_TRACE;
416
	} else
417
		tk->tp.flags &= ~TP_FLAG_PROFILE;
418

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

440
	return ret;
441 442
}

443
/* Internal register function - just handle k*probes and flags */
444
static int __register_trace_kprobe(struct trace_kprobe *tk)
445
{
446
	int i, ret;
447

448
	if (trace_probe_is_registered(&tk->tp))
449 450
		return -EINVAL;

451 452
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_update_arg(&tk->tp.args[i]);
453

454
	/* Set/clear disabled flag according to tp->flag */
455 456
	if (trace_probe_is_enabled(&tk->tp))
		tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
457
	else
458
		tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
459

460 461
	if (trace_kprobe_is_return(tk))
		ret = register_kretprobe(&tk->rp);
462
	else
463
		ret = register_kprobe(&tk->rp.kp);
464 465

	if (ret == 0)
466
		tk->tp.flags |= TP_FLAG_REGISTERED;
467 468
	else {
		pr_warning("Could not insert probe at %s+%lu: %d\n",
469 470
			   trace_kprobe_symbol(tk), trace_kprobe_offset(tk), ret);
		if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) {
471 472 473 474 475 476
			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",
477
				   tk->rp.kp.addr);
478 479 480 481 482 483 484 485
			ret = -EINVAL;
		}
	}

	return ret;
}

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

/* Unregister a trace_probe and probe_event: call with locking probe_lock */
501
static int unregister_trace_kprobe(struct trace_kprobe *tk)
502
{
503
	/* Enabled event can not be unregistered */
504
	if (trace_probe_is_enabled(&tk->tp))
505 506
		return -EBUSY;

507
	/* Will fail if probe is being used by ftrace or perf */
508
	if (unregister_kprobe_event(tk))
509 510
		return -EBUSY;

511 512
	__unregister_trace_kprobe(tk);
	list_del(&tk->list);
513 514

	return 0;
515 516 517
}

/* Register a trace_probe and probe_event */
518
static int register_trace_kprobe(struct trace_kprobe *tk)
519
{
520
	struct trace_kprobe *old_tk;
521 522 523 524
	int ret;

	mutex_lock(&probe_lock);

525
	/* Delete old (same name) event if exist */
526 527
	old_tk = find_trace_kprobe(ftrace_event_name(&tk->tp.call),
			tk->tp.call.class->system);
528 529
	if (old_tk) {
		ret = unregister_trace_kprobe(old_tk);
530 531
		if (ret < 0)
			goto end;
532
		free_trace_kprobe(old_tk);
533
	}
534 535

	/* Register new event */
536
	ret = register_kprobe_event(tk);
537
	if (ret) {
P
Paul Bolle 已提交
538
		pr_warning("Failed to register probe event(%d)\n", ret);
539 540 541
		goto end;
	}

542
	/* Register k*probe */
543
	ret = __register_trace_kprobe(tk);
544
	if (ret < 0)
545
		unregister_kprobe_event(tk);
546
	else
547
		list_add_tail(&tk->list, &probe_list);
548

549 550 551 552 553
end:
	mutex_unlock(&probe_lock);
	return ret;
}

554
/* Module notifier call back, checking event on the module */
555
static int trace_kprobe_module_callback(struct notifier_block *nb,
556 557 558
				       unsigned long val, void *data)
{
	struct module *mod = data;
559
	struct trace_kprobe *tk;
560 561 562 563 564 565 566
	int ret;

	if (val != MODULE_STATE_COMING)
		return NOTIFY_DONE;

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

	return NOTIFY_DONE;
}

584 585
static struct notifier_block trace_kprobe_module_nb = {
	.notifier_call = trace_kprobe_module_callback,
586 587 588
	.priority = 1	/* Invoked after kprobe module callback */
};

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

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

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

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

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

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

	/* parse arguments */
721 722
	ret = 0;
	for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
723 724
		struct probe_arg *parg = &tk->tp.args[i];

725
		/* Increment count for freeing args in error case */
726
		tk->tp.nr_args++;
727

728 729
		/* Parse argument name */
		arg = strchr(argv[i], '=');
730
		if (arg) {
731
			*arg++ = '\0';
732
			parg->name = kstrdup(argv[i], GFP_KERNEL);
733
		} else {
734
			arg = argv[i];
735 736
			/* If argument name is omitted, set "argN" */
			snprintf(buf, MAX_EVENT_NAME_LEN, "arg%d", i + 1);
737
			parg->name = kstrdup(buf, GFP_KERNEL);
738
		}
739

740
		if (!parg->name) {
741
			pr_info("Failed to allocate argument[%d] name.\n", i);
742
			ret = -ENOMEM;
743 744
			goto error;
		}
745

746
		if (!is_good_name(parg->name)) {
747
			pr_info("Invalid argument[%d] name: %s\n",
748
				i, parg->name);
749 750 751
			ret = -EINVAL;
			goto error;
		}
752

753 754
		if (traceprobe_conflict_field_name(parg->name,
							tk->tp.args, i)) {
755
			pr_info("Argument[%d] name '%s' conflicts with "
756 757 758 759
				"another field.\n", i, argv[i]);
			ret = -EINVAL;
			goto error;
		}
760 761

		/* Parse fetch argument */
762
		ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
763
						is_return, true);
764
		if (ret) {
765
			pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
766
			goto error;
767
		}
768 769
	}

770
	ret = register_trace_kprobe(tk);
771 772 773 774 775
	if (ret)
		goto error;
	return 0;

error:
776
	free_trace_kprobe(tk);
777 778 779
	return ret;
}

780
static int release_all_trace_kprobes(void)
781
{
782
	struct trace_kprobe *tk;
783
	int ret = 0;
784 785

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

end:
802
	mutex_unlock(&probe_lock);
803 804

	return ret;
805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
}

/* 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)
{
826
	struct trace_kprobe *tk = v;
827
	int i;
828

829
	seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
830 831
	seq_printf(m, ":%s/%s", tk->tp.call.class->system,
			ftrace_event_name(&tk->tp.call));
832

833 834 835 836 837
	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);
838
	else
839
		seq_printf(m, " %s", trace_kprobe_symbol(tk));
840

841 842
	for (i = 0; i < tk->tp.nr_args; i++)
		seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
843
	seq_putc(m, '\n');
844

845 846 847 848 849 850 851 852 853 854 855 856
	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)
{
857 858 859
	int ret;

	if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
860
		ret = release_all_trace_kprobes();
861 862 863
		if (ret < 0)
			return ret;
	}
864 865 866 867 868 869 870

	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)
{
871
	return traceprobe_probes_write(file, buffer, count, ppos,
872
			create_trace_kprobe);
873 874 875 876 877 878 879 880 881 882 883
}

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

884 885 886
/* Probes profiling interfaces */
static int probes_profile_seq_show(struct seq_file *m, void *v)
{
887
	struct trace_kprobe *tk = v;
888

889 890
	seq_printf(m, "  %-44s %15lu %15lu\n",
		   ftrace_event_name(&tk->tp.call), tk->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 ftrace_event_file *ftrace_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 ftrace_event_call *call = &tk->tp.call;
927

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

930 931
	if (ftrace_trigger_soft_disabled(ftrace_file))
		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 940 941
	event = trace_event_buffer_lock_reserve(&buffer, ftrace_file,
						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 950
	event_trigger_unlock_commit_regs(ftrace_file, buffer, event,
					 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 967
		       struct pt_regs *regs,
		       struct ftrace_event_file *ftrace_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 ftrace_event_call *call = &tk->tp.call;
975

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

978 979
	if (ftrace_trigger_soft_disabled(ftrace_file))
		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 988 989
	event = trace_event_buffer_lock_reserve(&buffer, ftrace_file,
						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 999
	event_trigger_unlock_commit_regs(ftrace_file, buffer, event,
					 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: (", ftrace_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: (", ftrace_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 1084 1085
}


static int kprobe_event_define_fields(struct ftrace_event_call *event_call)
{
	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 1106 1107 1108
	return 0;
}

static int kretprobe_event_define_fields(struct ftrace_event_call *event_call)
{
	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 ftrace_event_call *call = &tk->tp.call;
1137
	struct kprobe_trace_entry_head *entry;
1138
	struct hlist_head *head;
1139
	int size, __size, dsize;
1140
	int rctx;
1141

1142 1143 1144 1145
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

1146 1147
	dsize = __get_data_size(&tk->tp, regs);
	__size = sizeof(*entry) + tk->tp.size + dsize;
1148 1149
	size = ALIGN(__size + sizeof(u32), sizeof(u64));
	size -= sizeof(u32);
1150

S
Steven Rostedt 已提交
1151
	entry = perf_trace_buf_prepare(size, call->event.type, regs, &rctx);
1152
	if (!entry)
1153
		return;
1154

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

/* Kretprobe profile handler */
1163
static void
1164
kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1165
		    struct pt_regs *regs)
1166
{
1167
	struct ftrace_event_call *call = &tk->tp.call;
1168
	struct kretprobe_trace_entry_head *entry;
1169
	struct hlist_head *head;
1170
	int size, __size, dsize;
1171
	int rctx;
1172

1173 1174 1175 1176
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

1177 1178
	dsize = __get_data_size(&tk->tp, regs);
	__size = sizeof(*entry) + tk->tp.size + dsize;
1179 1180
	size = ALIGN(__size + sizeof(u32), sizeof(u64));
	size -= sizeof(u32);
1181

S
Steven Rostedt 已提交
1182
	entry = perf_trace_buf_prepare(size, call->event.type, regs, &rctx);
1183
	if (!entry)
1184
		return;
1185

1186
	entry->func = (unsigned long)tk->rp.kp.addr;
1187
	entry->ret_ip = (unsigned long)ri->ret_addr;
1188
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1189
	perf_trace_buf_submit(entry, size, rctx, 0, 1, regs, head, NULL);
1190
}
1191
NOKPROBE_SYMBOL(kretprobe_perf_func);
1192
#endif	/* CONFIG_PERF_EVENTS */
1193

1194 1195 1196 1197 1198 1199
/*
 * 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.
 */
1200 1201
static int kprobe_register(struct ftrace_event_call *event,
			   enum trace_reg type, void *data)
1202
{
1203
	struct trace_kprobe *tk = (struct trace_kprobe *)event->data;
1204
	struct ftrace_event_file *file = data;
1205

1206 1207
	switch (type) {
	case TRACE_REG_REGISTER:
1208
		return enable_trace_kprobe(tk, file);
1209
	case TRACE_REG_UNREGISTER:
1210
		return disable_trace_kprobe(tk, file);
1211 1212 1213

#ifdef CONFIG_PERF_EVENTS
	case TRACE_REG_PERF_REGISTER:
1214
		return enable_trace_kprobe(tk, NULL);
1215
	case TRACE_REG_PERF_UNREGISTER:
1216
		return disable_trace_kprobe(tk, NULL);
1217 1218
	case TRACE_REG_PERF_OPEN:
	case TRACE_REG_PERF_CLOSE:
1219 1220
	case TRACE_REG_PERF_ADD:
	case TRACE_REG_PERF_DEL:
1221
		return 0;
1222 1223 1224 1225
#endif
	}
	return 0;
}
1226

1227
static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs)
1228
{
1229
	struct trace_kprobe *tk = container_of(kp, struct trace_kprobe, rp.kp);
1230

1231
	tk->nhit++;
1232

1233 1234
	if (tk->tp.flags & TP_FLAG_TRACE)
		kprobe_trace_func(tk, regs);
1235
#ifdef CONFIG_PERF_EVENTS
1236 1237
	if (tk->tp.flags & TP_FLAG_PROFILE)
		kprobe_perf_func(tk, regs);
1238
#endif
1239 1240
	return 0;	/* We don't tweek kernel, so just return 0 */
}
1241
NOKPROBE_SYMBOL(kprobe_dispatcher);
1242

1243 1244
static int
kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
1245
{
1246
	struct trace_kprobe *tk = container_of(ri->rp, struct trace_kprobe, rp);
1247

1248
	tk->nhit++;
1249

1250 1251
	if (tk->tp.flags & TP_FLAG_TRACE)
		kretprobe_trace_func(tk, ri, regs);
1252
#ifdef CONFIG_PERF_EVENTS
1253 1254
	if (tk->tp.flags & TP_FLAG_PROFILE)
		kretprobe_perf_func(tk, ri, regs);
1255
#endif
1256 1257
	return 0;	/* We don't tweek kernel, so just return 0 */
}
1258
NOKPROBE_SYMBOL(kretprobe_dispatcher);
1259

1260 1261 1262 1263 1264 1265 1266 1267
static struct trace_event_functions kretprobe_funcs = {
	.trace		= print_kretprobe_event
};

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

1268
static int register_kprobe_event(struct trace_kprobe *tk)
1269
{
1270
	struct ftrace_event_call *call = &tk->tp.call;
1271 1272 1273
	int ret;

	/* Initialize ftrace_event_call */
1274
	INIT_LIST_HEAD(&call->class->fields);
1275
	if (trace_kprobe_is_return(tk)) {
1276
		call->event.funcs = &kretprobe_funcs;
1277
		call->class->define_fields = kretprobe_event_define_fields;
1278
	} else {
1279
		call->event.funcs = &kprobe_funcs;
1280
		call->class->define_fields = kprobe_event_define_fields;
1281
	}
1282
	if (set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0)
1283
		return -ENOMEM;
1284 1285
	ret = register_ftrace_event(&call->event);
	if (!ret) {
1286
		kfree(call->print_fmt);
1287
		return -ENODEV;
1288
	}
1289
	call->flags = 0;
1290
	call->class->reg = kprobe_register;
1291
	call->data = tk;
1292
	ret = trace_add_event_call(call);
1293
	if (ret) {
1294 1295
		pr_info("Failed to register kprobe event: %s\n",
			ftrace_event_name(call));
1296
		kfree(call->print_fmt);
1297
		unregister_ftrace_event(&call->event);
1298
	}
1299 1300 1301
	return ret;
}

1302
static int unregister_kprobe_event(struct trace_kprobe *tk)
1303
{
1304 1305
	int ret;

1306
	/* tp->event is unregistered in trace_remove_event_call() */
1307
	ret = trace_remove_event_call(&tk->tp.call);
1308
	if (!ret)
1309
		kfree(tk->tp.call.print_fmt);
1310
	return ret;
1311 1312
}

L
Lucas De Marchi 已提交
1313
/* Make a debugfs interface for controlling probe points */
1314 1315 1316 1317 1318
static __init int init_kprobe_trace(void)
{
	struct dentry *d_tracer;
	struct dentry *entry;

1319
	if (register_module_notifier(&trace_kprobe_module_nb))
1320 1321
		return -EINVAL;

1322
	d_tracer = tracing_init_dentry();
1323
	if (IS_ERR(d_tracer))
1324 1325 1326 1327 1328
		return 0;

	entry = debugfs_create_file("kprobe_events", 0644, d_tracer,
				    NULL, &kprobe_events_ops);

1329
	/* Event list interface */
1330 1331 1332
	if (!entry)
		pr_warning("Could not create debugfs "
			   "'kprobe_events' entry\n");
1333 1334 1335 1336 1337 1338 1339 1340

	/* Profile interface */
	entry = debugfs_create_file("kprobe_profile", 0444, d_tracer,
				    NULL, &kprobe_profile_ops);

	if (!entry)
		pr_warning("Could not create debugfs "
			   "'kprobe_profile' entry\n");
1341 1342 1343 1344 1345 1346 1347
	return 0;
}
fs_initcall(init_kprobe_trace);


#ifdef CONFIG_FTRACE_STARTUP_TEST

1348 1349 1350 1351 1352 1353
/*
 * 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)
1354 1355 1356 1357
{
	return a1 + a2 + a3 + a4 + a5 + a6;
}

1358
static struct ftrace_event_file *
1359
find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
1360 1361 1362 1363
{
	struct ftrace_event_file *file;

	list_for_each_entry(file, &tr->events, list)
1364
		if (file->event_call == &tk->tp.call)
1365 1366 1367 1368 1369
			return file;

	return NULL;
}

1370
/*
1371
 * Nobody but us can call enable_trace_kprobe/disable_trace_kprobe at this
1372 1373
 * stage, we can do this lockless.
 */
1374 1375
static __init int kprobe_trace_self_tests_init(void)
{
1376
	int ret, warn = 0;
1377
	int (*target)(int, int, int, int, int, int);
1378
	struct trace_kprobe *tk;
1379
	struct ftrace_event_file *file;
1380

1381 1382 1383
	if (tracing_is_disabled())
		return -ENODEV;

1384 1385 1386 1387
	target = kprobe_trace_selftest_target;

	pr_info("Testing kprobe tracing: ");

1388 1389
	ret = traceprobe_command("p:testprobe kprobe_trace_selftest_target "
				  "$stack $stack0 +0($stack)",
1390
				  create_trace_kprobe);
1391
	if (WARN_ON_ONCE(ret)) {
1392
		pr_warn("error on probing function entry.\n");
1393 1394 1395
		warn++;
	} else {
		/* Enable trace point */
1396 1397
		tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
		if (WARN_ON_ONCE(tk == NULL)) {
1398
			pr_warn("error on getting new probe.\n");
1399
			warn++;
1400
		} else {
1401
			file = find_trace_probe_file(tk, top_trace_array());
1402 1403 1404 1405
			if (WARN_ON_ONCE(file == NULL)) {
				pr_warn("error on getting probe file.\n");
				warn++;
			} else
1406
				enable_trace_kprobe(tk, file);
1407
		}
1408
	}
1409

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

	if (warn)
		goto end;
1433 1434 1435

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

1436
	/* Disable trace points before removing it */
1437 1438
	tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1439
		pr_warn("error on getting test probe.\n");
1440
		warn++;
1441
	} else {
1442
		file = find_trace_probe_file(tk, top_trace_array());
1443 1444 1445 1446
		if (WARN_ON_ONCE(file == NULL)) {
			pr_warn("error on getting probe file.\n");
			warn++;
		} else
1447
			disable_trace_kprobe(tk, file);
1448
	}
1449

1450 1451
	tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1452
		pr_warn("error on getting 2nd test probe.\n");
1453
		warn++;
1454
	} else {
1455
		file = find_trace_probe_file(tk, top_trace_array());
1456 1457 1458 1459
		if (WARN_ON_ONCE(file == NULL)) {
			pr_warn("error on getting probe file.\n");
			warn++;
		} else
1460
			disable_trace_kprobe(tk, file);
1461
	}
1462

1463
	ret = traceprobe_command("-:testprobe", create_trace_kprobe);
1464
	if (WARN_ON_ONCE(ret)) {
1465
		pr_warn("error on deleting a probe.\n");
1466 1467 1468
		warn++;
	}

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

1475
end:
1476
	release_all_trace_kprobes();
1477 1478 1479 1480
	if (warn)
		pr_cont("NG: Some tests are failed. Please check them.\n");
	else
		pr_cont("OK\n");
1481 1482 1483 1484 1485 1486
	return 0;
}

late_initcall(kprobe_trace_self_tests_init);

#endif