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
/* Fetch type information table */
253
static const struct fetch_type kprobes_fetch_type_table[] = {
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
	/* 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 764
						is_return, true,
						kprobes_fetch_type_table);
765
		if (ret) {
766
			pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
767
			goto error;
768
		}
769 770
	}

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

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

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

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

end:
803
	mutex_unlock(&probe_lock);
804 805

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

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

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

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

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

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

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

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

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

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

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

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

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

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

931 932
	if (ftrace_trigger_soft_disabled(ftrace_file))
		return;
933

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

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

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

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

950 951
	event_trigger_unlock_commit_regs(ftrace_file, buffer, event,
					 entry, irq_flags, pc, regs);
952 953
}

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

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

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

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

979 980
	if (ftrace_trigger_soft_disabled(ftrace_file))
		return;
981

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

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

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

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

999 1000
	event_trigger_unlock_commit_regs(ftrace_file, buffer, event,
					 entry, irq_flags, pc, regs);
1001 1002
}

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

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

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

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

1028
	trace_seq_printf(s, "%s: (", ftrace_event_name(&tp->call));
1029

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

1033
	trace_seq_putc(s, ')');
1034

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

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

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

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

1059
	trace_seq_printf(s, "%s: (", ftrace_event_name(&tp->call));
1060

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

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

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

1069
	trace_seq_putc(s, ')');
1070

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

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

1079 1080
 out:
	return trace_handle_return(s);
1081 1082 1083 1084 1085 1086
}


static int kprobe_event_define_fields(struct ftrace_event_call *event_call)
{
	int ret, i;
1087
	struct kprobe_trace_entry_head field;
1088
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1089

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

static int kretprobe_event_define_fields(struct ftrace_event_call *event_call)
{
	int ret, i;
1110
	struct kretprobe_trace_entry_head field;
1111
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1112

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

1131
#ifdef CONFIG_PERF_EVENTS
1132 1133

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1240
	tk->nhit++;
1241

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

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

1257
	tk->nhit++;
1258

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

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

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

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

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

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

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

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

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

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

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

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

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

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


#ifdef CONFIG_FTRACE_STARTUP_TEST

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

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

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

	return NULL;
}

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

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

1393 1394 1395 1396
	target = kprobe_trace_selftest_target;

	pr_info("Testing kprobe tracing: ");

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

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

	if (warn)
		goto end;
1442 1443 1444

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

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

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

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

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

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

late_initcall(kprobe_trace_self_tests_init);

#endif