trace_kprobe.c 36.4 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
	if (!trace_seq_printf(s, "%s: (", ftrace_event_name(&tp->call)))
1028 1029
		goto partial;

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

1033
	if (!trace_seq_putc(s, ')'))
1034 1035
		goto partial;

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

1042
	if (!trace_seq_putc(s, '\n'))
1043 1044 1045 1046 1047 1048 1049
		goto partial;

	return TRACE_TYPE_HANDLED;
partial:
	return TRACE_TYPE_PARTIAL_LINE;
}

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

1060
	field = (struct kretprobe_trace_entry_head *)iter->ent;
1061
	tp = container_of(event, struct trace_probe, call.event);
1062

1063
	if (!trace_seq_printf(s, "%s: (", ftrace_event_name(&tp->call)))
1064 1065
		goto partial;

1066 1067 1068 1069 1070 1071 1072 1073 1074
	if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
		goto partial;

	if (!trace_seq_puts(s, " <- "))
		goto partial;

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

1075
	if (!trace_seq_putc(s, ')'))
1076 1077
		goto partial;

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

1084
	if (!trace_seq_putc(s, '\n'))
1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095
		goto partial;

	return TRACE_TYPE_HANDLED;
partial:
	return TRACE_TYPE_PARTIAL_LINE;
}


static int kprobe_event_define_fields(struct ftrace_event_call *event_call)
{
	int ret, i;
1096
	struct kprobe_trace_entry_head field;
1097
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1098

1099
	DEFINE_FIELD(unsigned long, ip, FIELD_STRING_IP, 0);
1100
	/* Set argument names as fields */
1101 1102 1103 1104 1105 1106 1107 1108
	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,
1109 1110 1111 1112
					 FILTER_OTHER);
		if (ret)
			return ret;
	}
1113 1114 1115 1116 1117 1118
	return 0;
}

static int kretprobe_event_define_fields(struct ftrace_event_call *event_call)
{
	int ret, i;
1119
	struct kretprobe_trace_entry_head field;
1120
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1121

1122 1123
	DEFINE_FIELD(unsigned long, func, FIELD_STRING_FUNC, 0);
	DEFINE_FIELD(unsigned long, ret_ip, FIELD_STRING_RETIP, 0);
1124
	/* Set argument names as fields */
1125 1126 1127 1128 1129 1130 1131 1132
	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,
1133 1134 1135 1136
					 FILTER_OTHER);
		if (ret)
			return ret;
	}
1137 1138 1139
	return 0;
}

1140
#ifdef CONFIG_PERF_EVENTS
1141 1142

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

1152 1153 1154 1155
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

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

S
Steven Rostedt 已提交
1161
	entry = perf_trace_buf_prepare(size, call->event.type, regs, &rctx);
1162
	if (!entry)
1163
		return;
1164

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

/* Kretprobe profile handler */
1173
static void
1174
kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1175
		    struct pt_regs *regs)
1176
{
1177
	struct ftrace_event_call *call = &tk->tp.call;
1178
	struct kretprobe_trace_entry_head *entry;
1179
	struct hlist_head *head;
1180
	int size, __size, dsize;
1181
	int rctx;
1182

1183 1184 1185 1186
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

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

S
Steven Rostedt 已提交
1192
	entry = perf_trace_buf_prepare(size, call->event.type, regs, &rctx);
1193
	if (!entry)
1194
		return;
1195

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

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

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

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

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

1241
	tk->nhit++;
1242

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

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

1258
	tk->nhit++;
1259

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

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

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

1278
static int register_kprobe_event(struct trace_kprobe *tk)
1279
{
1280
	struct ftrace_event_call *call = &tk->tp.call;
1281 1282 1283
	int ret;

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

1312
static int unregister_kprobe_event(struct trace_kprobe *tk)
1313
{
1314 1315
	int ret;

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

L
Lucas De Marchi 已提交
1323
/* Make a debugfs interface for controlling probe points */
1324 1325 1326 1327 1328
static __init int init_kprobe_trace(void)
{
	struct dentry *d_tracer;
	struct dentry *entry;

1329
	if (register_module_notifier(&trace_kprobe_module_nb))
1330 1331
		return -EINVAL;

1332 1333 1334 1335 1336 1337 1338
	d_tracer = tracing_init_dentry();
	if (!d_tracer)
		return 0;

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

1339
	/* Event list interface */
1340 1341 1342
	if (!entry)
		pr_warning("Could not create debugfs "
			   "'kprobe_events' entry\n");
1343 1344 1345 1346 1347 1348 1349 1350

	/* 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");
1351 1352 1353 1354 1355 1356 1357
	return 0;
}
fs_initcall(init_kprobe_trace);


#ifdef CONFIG_FTRACE_STARTUP_TEST

1358 1359 1360 1361 1362 1363
/*
 * 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)
1364 1365 1366 1367
{
	return a1 + a2 + a3 + a4 + a5 + a6;
}

1368
static struct ftrace_event_file *
1369
find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
1370 1371 1372 1373
{
	struct ftrace_event_file *file;

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

	return NULL;
}

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

1391 1392 1393
	if (tracing_is_disabled())
		return -ENODEV;

1394 1395 1396 1397
	target = kprobe_trace_selftest_target;

	pr_info("Testing kprobe tracing: ");

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

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

	if (warn)
		goto end;
1443 1444 1445

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

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

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

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

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

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

late_initcall(kprobe_trace_self_tests_init);

#endif