trace_kprobe.c 37.8 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
 *
 * 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
 */
19
#define pr_fmt(fmt)	"trace_kprobe: " fmt
20 21 22

#include <linux/module.h>
#include <linux/uaccess.h>
23
#include <linux/rculist.h>
24

25
#include "trace_probe.h"
26

27
#define KPROBE_EVENT_SYSTEM "kprobes"
28
#define KRETPROBE_MAXACTIVE_MAX 4096
29

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

41 42
#define SIZEOF_TRACE_KPROBE(n)				\
	(offsetof(struct trace_kprobe, tp.args) +	\
43
	(sizeof(struct probe_arg) * (n)))
44

45

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

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

56
static nokprobe_inline unsigned long trace_kprobe_offset(struct trace_kprobe *tk)
57
{
58
	return tk->rp.kp.offset;
59 60
}

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

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

74
static nokprobe_inline bool trace_kprobe_is_on_module(struct trace_kprobe *tk)
75
{
76
	return !!strchr(trace_kprobe_symbol(tk), ':');
77 78
}

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

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

	return nhit;
}

90 91
static int register_kprobe_event(struct trace_kprobe *tk);
static int unregister_kprobe_event(struct trace_kprobe *tk);
92 93 94 95

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

96 97 98 99
static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs);
static int kretprobe_dispatcher(struct kretprobe_instance *ri,
				struct pt_regs *regs);

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
/* 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;
}

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

157 158 159 160 161
DEFINE_BASIC_FETCH_FUNCS(stack)
/* No string on the stack entry */
#define fetch_stack_string	NULL
#define fetch_stack_string_size	NULL

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

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

	if (!maxlen)
		return;

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

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

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

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

242 243 244 245
DEFINE_BASIC_FETCH_FUNCS(symbol)
DEFINE_FETCH_symbol(string)
DEFINE_FETCH_symbol(string_size)

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

254
/* Fetch type information table */
255
static const struct fetch_type kprobes_fetch_type_table[] = {
256 257 258 259 260 261 262 263 264 265 266 267 268 269
	/* 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),
270 271 272 273
	ASSIGN_FETCH_TYPE_ALIAS(x8,  u8,  u8,  0),
	ASSIGN_FETCH_TYPE_ALIAS(x16, u16, u16, 0),
	ASSIGN_FETCH_TYPE_ALIAS(x32, u32, u32, 0),
	ASSIGN_FETCH_TYPE_ALIAS(x64, u64, u64, 0),
274 275 276 277

	ASSIGN_FETCH_TYPE_END
};

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

292 293
	tk = kzalloc(SIZEOF_TRACE_KPROBE(nargs), GFP_KERNEL);
	if (!tk)
294
		return ERR_PTR(ret);
295

296 297 298 299
	tk->nhit = alloc_percpu(unsigned long);
	if (!tk->nhit)
		goto error;

300
	if (symbol) {
301 302
		tk->symbol = kstrdup(symbol, GFP_KERNEL);
		if (!tk->symbol)
303
			goto error;
304 305
		tk->rp.kp.symbol_name = tk->symbol;
		tk->rp.kp.offset = offs;
306
	} else
307
		tk->rp.kp.addr = addr;
308 309

	if (is_return)
310
		tk->rp.handler = kretprobe_dispatcher;
311
	else
312
		tk->rp.kp.pre_handler = kprobe_dispatcher;
313

314 315
	tk->rp.maxactive = maxactive;

316
	if (!event || !is_good_name(event)) {
317
		ret = -EINVAL;
318
		goto error;
319 320
	}

321 322 323
	tk->tp.call.class = &tk->tp.class;
	tk->tp.call.name = kstrdup(event, GFP_KERNEL);
	if (!tk->tp.call.name)
324
		goto error;
325

326
	if (!group || !is_good_name(group)) {
327
		ret = -EINVAL;
328
		goto error;
329 330
	}

331 332
	tk->tp.class.system = kstrdup(group, GFP_KERNEL);
	if (!tk->tp.class.system)
333 334
		goto error;

335 336 337
	INIT_LIST_HEAD(&tk->list);
	INIT_LIST_HEAD(&tk->tp.files);
	return tk;
338
error:
339 340
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
341
	free_percpu(tk->nhit);
342
	kfree(tk);
343
	return ERR_PTR(ret);
344 345
}

346
static void free_trace_kprobe(struct trace_kprobe *tk)
347 348 349
{
	int i;

350 351
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_free_probe_arg(&tk->tp.args[i]);
352

353 354 355
	kfree(tk->tp.call.class->system);
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
356
	free_percpu(tk->nhit);
357
	kfree(tk);
358 359
}

360 361
static struct trace_kprobe *find_trace_kprobe(const char *event,
					      const char *group)
362
{
363
	struct trace_kprobe *tk;
364

365
	list_for_each_entry(tk, &probe_list, list)
366
		if (strcmp(trace_event_name(&tk->tp.call), event) == 0 &&
367 368
		    strcmp(tk->tp.call.class->system, group) == 0)
			return tk;
369 370 371
	return NULL;
}

372 373 374 375 376
/*
 * Enable trace_probe
 * if the file is NULL, enable "perf" handler, or enable "trace" handler.
 */
static int
377
enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
378 379 380
{
	int ret = 0;

381
	if (file) {
382 383 384 385
		struct event_file_link *link;

		link = kmalloc(sizeof(*link), GFP_KERNEL);
		if (!link) {
386
			ret = -ENOMEM;
387
			goto out;
388 389
		}

390
		link->file = file;
391
		list_add_tail_rcu(&link->list, &tk->tp.files);
392

393
		tk->tp.flags |= TP_FLAG_TRACE;
394
	} else
395
		tk->tp.flags |= TP_FLAG_PROFILE;
396

397 398 399
	if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
		if (trace_kprobe_is_return(tk))
			ret = enable_kretprobe(&tk->rp);
400
		else
401
			ret = enable_kprobe(&tk->rp.kp);
402
	}
403
 out:
404 405 406
	return ret;
}

407 408 409 410 411
/*
 * Disable trace_probe
 * if the file is NULL, disable "perf" handler, or disable "trace" handler.
 */
static int
412
disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
413
{
414 415
	struct event_file_link *link = NULL;
	int wait = 0;
416 417 418
	int ret = 0;

	if (file) {
419
		link = find_event_file_link(&tk->tp, file);
420
		if (!link) {
421
			ret = -EINVAL;
422
			goto out;
423 424
		}

425
		list_del_rcu(&link->list);
426
		wait = 1;
427
		if (!list_empty(&tk->tp.files))
428
			goto out;
429

430
		tk->tp.flags &= ~TP_FLAG_TRACE;
431
	} else
432
		tk->tp.flags &= ~TP_FLAG_PROFILE;
433

434 435 436
	if (!trace_probe_is_enabled(&tk->tp) && trace_probe_is_registered(&tk->tp)) {
		if (trace_kprobe_is_return(tk))
			disable_kretprobe(&tk->rp);
437
		else
438
			disable_kprobe(&tk->rp.kp);
439
		wait = 1;
440
	}
441
 out:
442 443 444 445 446 447 448 449 450 451 452 453 454
	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 */
	}

455
	return ret;
456 457
}

458
/* Internal register function - just handle k*probes and flags */
459
static int __register_trace_kprobe(struct trace_kprobe *tk)
460
{
461
	int i, ret;
462

463
	if (trace_probe_is_registered(&tk->tp))
464 465
		return -EINVAL;

466 467
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_update_arg(&tk->tp.args[i]);
468

469
	/* Set/clear disabled flag according to tp->flag */
470 471
	if (trace_probe_is_enabled(&tk->tp))
		tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
472
	else
473
		tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
474

475 476
	if (trace_kprobe_is_return(tk))
		ret = register_kretprobe(&tk->rp);
477
	else
478
		ret = register_kprobe(&tk->rp.kp);
479 480

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

	return ret;
}

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

/* Unregister a trace_probe and probe_event: call with locking probe_lock */
514
static int unregister_trace_kprobe(struct trace_kprobe *tk)
515
{
516
	/* Enabled event can not be unregistered */
517
	if (trace_probe_is_enabled(&tk->tp))
518 519
		return -EBUSY;

520
	/* Will fail if probe is being used by ftrace or perf */
521
	if (unregister_kprobe_event(tk))
522 523
		return -EBUSY;

524 525
	__unregister_trace_kprobe(tk);
	list_del(&tk->list);
526 527

	return 0;
528 529 530
}

/* Register a trace_probe and probe_event */
531
static int register_trace_kprobe(struct trace_kprobe *tk)
532
{
533
	struct trace_kprobe *old_tk;
534 535 536 537
	int ret;

	mutex_lock(&probe_lock);

538
	/* Delete old (same name) event if exist */
539
	old_tk = find_trace_kprobe(trace_event_name(&tk->tp.call),
540
			tk->tp.call.class->system);
541 542
	if (old_tk) {
		ret = unregister_trace_kprobe(old_tk);
543 544
		if (ret < 0)
			goto end;
545
		free_trace_kprobe(old_tk);
546
	}
547 548

	/* Register new event */
549
	ret = register_kprobe_event(tk);
550
	if (ret) {
551
		pr_warn("Failed to register probe event(%d)\n", ret);
552 553 554
		goto end;
	}

555
	/* Register k*probe */
556
	ret = __register_trace_kprobe(tk);
557
	if (ret < 0)
558
		unregister_kprobe_event(tk);
559
	else
560
		list_add_tail(&tk->list, &probe_list);
561

562 563 564 565 566
end:
	mutex_unlock(&probe_lock);
	return ret;
}

567
/* Module notifier call back, checking event on the module */
568
static int trace_kprobe_module_callback(struct notifier_block *nb,
569 570 571
				       unsigned long val, void *data)
{
	struct module *mod = data;
572
	struct trace_kprobe *tk;
573 574 575 576 577 578 579
	int ret;

	if (val != MODULE_STATE_COMING)
		return NOTIFY_DONE;

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

	return NOTIFY_DONE;
}

596 597
static struct notifier_block trace_kprobe_module_nb = {
	.notifier_call = trace_kprobe_module_callback,
598 599 600
	.priority = 1	/* Invoked after kprobe module callback */
};

601
static int create_trace_kprobe(int argc, char **argv)
602 603 604
{
	/*
	 * Argument syntax:
605 606 607 608
	 *  - Add kprobe:
	 *      p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
	 *  - Add kretprobe:
	 *      r[MAXACTIVE][:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
609
	 * Fetch args:
610 611 612
	 *  $retval	: fetch return value
	 *  $stack	: fetch stack address
	 *  $stackN	: fetch Nth of stack (N:0-)
613
	 *  $comm       : fetch current task comm
614 615 616
	 *  @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
617
	 * Dereferencing memory fetch:
618
	 *  +|-offs(ARG) : fetch memory at ARG +|- offs address.
619 620
	 * Alias name of args:
	 *  NAME=FETCHARG : set NAME as alias of FETCHARG.
621 622
	 * Type of args:
	 *  FETCHARG:TYPE : use TYPE instead of unsigned long.
623
	 */
624
	struct trace_kprobe *tk;
625
	int i, ret = 0;
626
	bool is_return = false, is_delete = false;
627
	char *symbol = NULL, *event = NULL, *group = NULL;
628
	int maxactive = 0;
629
	char *arg;
630
	unsigned long offset = 0;
631
	void *addr = NULL;
632
	char buf[MAX_EVENT_NAME_LEN];
633

634
	/* argc must be >= 1 */
635
	if (argv[0][0] == 'p')
636
		is_return = false;
637
	else if (argv[0][0] == 'r')
638
		is_return = true;
639
	else if (argv[0][0] == '-')
640
		is_delete = true;
641
	else {
642 643
		pr_info("Probe definition must be started with 'p', 'r' or"
			" '-'.\n");
644
		return -EINVAL;
645
	}
646

647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
	event = strchr(&argv[0][1], ':');
	if (event) {
		event[0] = '\0';
		event++;
	}
	if (is_return && isdigit(argv[0][1])) {
		ret = kstrtouint(&argv[0][1], 0, &maxactive);
		if (ret) {
			pr_info("Failed to parse maxactive.\n");
			return ret;
		}
		/* kretprobes instances are iterated over via a list. The
		 * maximum should stay reasonable.
		 */
		if (maxactive > KRETPROBE_MAXACTIVE_MAX) {
			pr_info("Maxactive is too big (%d > %d).\n",
				maxactive, KRETPROBE_MAXACTIVE_MAX);
			return -E2BIG;
		}
	}

	if (event) {
669 670 671 672 673
		if (strchr(event, '/')) {
			group = event;
			event = strchr(group, '/') + 1;
			event[-1] = '\0';
			if (strlen(group) == 0) {
674
				pr_info("Group name is not specified\n");
675 676 677
				return -EINVAL;
			}
		}
678
		if (strlen(event) == 0) {
679
			pr_info("Event name is not specified\n");
680 681 682
			return -EINVAL;
		}
	}
683 684
	if (!group)
		group = KPROBE_EVENT_SYSTEM;
685

686 687 688 689 690
	if (is_delete) {
		if (!event) {
			pr_info("Delete command needs an event name.\n");
			return -EINVAL;
		}
691
		mutex_lock(&probe_lock);
692 693
		tk = find_trace_kprobe(event, group);
		if (!tk) {
694
			mutex_unlock(&probe_lock);
695 696 697 698
			pr_info("Event %s/%s doesn't exist.\n", group, event);
			return -ENOENT;
		}
		/* delete an event */
699
		ret = unregister_trace_kprobe(tk);
700
		if (ret == 0)
701
			free_trace_kprobe(tk);
702
		mutex_unlock(&probe_lock);
703
		return ret;
704 705 706 707 708 709
	}

	if (argc < 2) {
		pr_info("Probe point is not specified.\n");
		return -EINVAL;
	}
710 711
	if (isdigit(argv[1][0])) {
		/* an address specified */
712
		ret = kstrtoul(&argv[1][0], 0, (unsigned long *)&addr);
713 714
		if (ret) {
			pr_info("Failed to parse address.\n");
715
			return ret;
716
		}
717 718 719 720
	} else {
		/* a symbol specified */
		symbol = argv[1];
		/* TODO: support .init module functions */
721
		ret = traceprobe_split_symbol_offset(symbol, &offset);
722 723
		if (ret) {
			pr_info("Failed to parse symbol.\n");
724
			return ret;
725
		}
726
		if (offset && is_return &&
727
		    !function_offset_within_entry(NULL, symbol, offset)) {
728
			pr_info("Given offset is not valid for return probe.\n");
729
			return -EINVAL;
730
		}
731
	}
732
	argc -= 2; argv += 2;
733 734

	/* setup a probe */
735 736 737
	if (!event) {
		/* Make a new event name */
		if (symbol)
738
			snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_%ld",
739 740
				 is_return ? 'r' : 'p', symbol, offset);
		else
741
			snprintf(buf, MAX_EVENT_NAME_LEN, "%c_0x%p",
742
				 is_return ? 'r' : 'p', addr);
743 744
		event = buf;
	}
745 746
	tk = alloc_trace_kprobe(group, event, addr, symbol, offset, maxactive,
			       argc, is_return);
747
	if (IS_ERR(tk)) {
748
		pr_info("Failed to allocate trace_probe.(%d)\n",
749 750
			(int)PTR_ERR(tk));
		return PTR_ERR(tk);
751
	}
752 753

	/* parse arguments */
754 755
	ret = 0;
	for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
756 757
		struct probe_arg *parg = &tk->tp.args[i];

758
		/* Increment count for freeing args in error case */
759
		tk->tp.nr_args++;
760

761 762
		/* Parse argument name */
		arg = strchr(argv[i], '=');
763
		if (arg) {
764
			*arg++ = '\0';
765
			parg->name = kstrdup(argv[i], GFP_KERNEL);
766
		} else {
767
			arg = argv[i];
768 769
			/* If argument name is omitted, set "argN" */
			snprintf(buf, MAX_EVENT_NAME_LEN, "arg%d", i + 1);
770
			parg->name = kstrdup(buf, GFP_KERNEL);
771
		}
772

773
		if (!parg->name) {
774
			pr_info("Failed to allocate argument[%d] name.\n", i);
775
			ret = -ENOMEM;
776 777
			goto error;
		}
778

779
		if (!is_good_name(parg->name)) {
780
			pr_info("Invalid argument[%d] name: %s\n",
781
				i, parg->name);
782 783 784
			ret = -EINVAL;
			goto error;
		}
785

786 787
		if (traceprobe_conflict_field_name(parg->name,
							tk->tp.args, i)) {
788
			pr_info("Argument[%d] name '%s' conflicts with "
789 790 791 792
				"another field.\n", i, argv[i]);
			ret = -EINVAL;
			goto error;
		}
793 794

		/* Parse fetch argument */
795
		ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
796 797
						is_return, true,
						kprobes_fetch_type_table);
798
		if (ret) {
799
			pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
800
			goto error;
801
		}
802 803
	}

804
	ret = register_trace_kprobe(tk);
805 806 807 808 809
	if (ret)
		goto error;
	return 0;

error:
810
	free_trace_kprobe(tk);
811 812 813
	return ret;
}

814
static int release_all_trace_kprobes(void)
815
{
816
	struct trace_kprobe *tk;
817
	int ret = 0;
818 819

	mutex_lock(&probe_lock);
820
	/* Ensure no probe is in use. */
821 822
	list_for_each_entry(tk, &probe_list, list)
		if (trace_probe_is_enabled(&tk->tp)) {
823 824 825
			ret = -EBUSY;
			goto end;
		}
826 827
	/* TODO: Use batch unregistration */
	while (!list_empty(&probe_list)) {
828 829
		tk = list_entry(probe_list.next, struct trace_kprobe, list);
		ret = unregister_trace_kprobe(tk);
830 831
		if (ret)
			goto end;
832
		free_trace_kprobe(tk);
833
	}
834 835

end:
836
	mutex_unlock(&probe_lock);
837 838

	return ret;
839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859
}

/* 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)
{
860
	struct trace_kprobe *tk = v;
861
	int i;
862

863
	seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
864
	seq_printf(m, ":%s/%s", tk->tp.call.class->system,
865
			trace_event_name(&tk->tp.call));
866

867 868 869 870 871
	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);
872
	else
873
		seq_printf(m, " %s", trace_kprobe_symbol(tk));
874

875 876
	for (i = 0; i < tk->tp.nr_args; i++)
		seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
877
	seq_putc(m, '\n');
878

879 880 881 882 883 884 885 886 887 888 889 890
	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)
{
891 892 893
	int ret;

	if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
894
		ret = release_all_trace_kprobes();
895 896 897
		if (ret < 0)
			return ret;
	}
898 899 900 901 902 903 904

	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)
{
905
	return traceprobe_probes_write(file, buffer, count, ppos,
906
			create_trace_kprobe);
907 908 909 910 911 912 913 914 915 916 917
}

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

918 919 920
/* Probes profiling interfaces */
static int probes_profile_seq_show(struct seq_file *m, void *v)
{
921
	struct trace_kprobe *tk = v;
922

923
	seq_printf(m, "  %-44s %15lu %15lu\n",
924 925
		   trace_event_name(&tk->tp.call),
		   trace_kprobe_nhit(tk),
926
		   tk->rp.kp.nmissed);
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950

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

951
/* Kprobe handler */
952
static nokprobe_inline void
953
__kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
954
		    struct trace_event_file *trace_file)
955
{
956
	struct kprobe_trace_entry_head *entry;
957
	struct ring_buffer_event *event;
958
	struct ring_buffer *buffer;
959
	int size, dsize, pc;
960
	unsigned long irq_flags;
961
	struct trace_event_call *call = &tk->tp.call;
962

963
	WARN_ON(call != trace_file->event_call);
964

965
	if (trace_trigger_soft_disabled(trace_file))
966
		return;
967

968 969 970
	local_save_flags(irq_flags);
	pc = preempt_count();

971 972
	dsize = __get_data_size(&tk->tp, regs);
	size = sizeof(*entry) + tk->tp.size + dsize;
973

974
	event = trace_event_buffer_lock_reserve(&buffer, trace_file,
975 976
						call->event.type,
						size, irq_flags, pc);
977
	if (!event)
978
		return;
979 980

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

984
	event_trigger_unlock_commit_regs(trace_file, buffer, event,
985
					 entry, irq_flags, pc, regs);
986 987
}

988
static void
989
kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs)
990
{
991
	struct event_file_link *link;
992

993 994
	list_for_each_entry_rcu(link, &tk->tp.files, list)
		__kprobe_trace_func(tk, regs, link->file);
995
}
996
NOKPROBE_SYMBOL(kprobe_trace_func);
997

998
/* Kretprobe handler */
999
static nokprobe_inline void
1000
__kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1001
		       struct pt_regs *regs,
1002
		       struct trace_event_file *trace_file)
1003
{
1004
	struct kretprobe_trace_entry_head *entry;
1005
	struct ring_buffer_event *event;
1006
	struct ring_buffer *buffer;
1007
	int size, pc, dsize;
1008
	unsigned long irq_flags;
1009
	struct trace_event_call *call = &tk->tp.call;
1010

1011
	WARN_ON(call != trace_file->event_call);
1012

1013
	if (trace_trigger_soft_disabled(trace_file))
1014
		return;
1015

1016 1017 1018
	local_save_flags(irq_flags);
	pc = preempt_count();

1019 1020
	dsize = __get_data_size(&tk->tp, regs);
	size = sizeof(*entry) + tk->tp.size + dsize;
1021

1022
	event = trace_event_buffer_lock_reserve(&buffer, trace_file,
1023 1024
						call->event.type,
						size, irq_flags, pc);
1025
	if (!event)
1026
		return;
1027 1028

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

1033
	event_trigger_unlock_commit_regs(trace_file, buffer, event,
1034
					 entry, irq_flags, pc, regs);
1035 1036
}

1037
static void
1038
kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1039 1040
		     struct pt_regs *regs)
{
1041
	struct event_file_link *link;
1042

1043 1044
	list_for_each_entry_rcu(link, &tk->tp.files, list)
		__kretprobe_trace_func(tk, ri, regs, link->file);
1045
}
1046
NOKPROBE_SYMBOL(kretprobe_trace_func);
1047

1048
/* Event entry printers */
1049
static enum print_line_t
1050 1051
print_kprobe_event(struct trace_iterator *iter, int flags,
		   struct trace_event *event)
1052
{
1053
	struct kprobe_trace_entry_head *field;
1054
	struct trace_seq *s = &iter->seq;
1055
	struct trace_probe *tp;
1056
	u8 *data;
1057 1058
	int i;

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

1062
	trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1063

1064
	if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET))
1065
		goto out;
1066

1067
	trace_seq_putc(s, ')');
1068

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

1075 1076 1077
	trace_seq_putc(s, '\n');
 out:
	return trace_handle_return(s);
1078 1079
}

1080
static enum print_line_t
1081 1082
print_kretprobe_event(struct trace_iterator *iter, int flags,
		      struct trace_event *event)
1083
{
1084
	struct kretprobe_trace_entry_head *field;
1085
	struct trace_seq *s = &iter->seq;
1086
	struct trace_probe *tp;
1087
	u8 *data;
1088 1089
	int i;

1090
	field = (struct kretprobe_trace_entry_head *)iter->ent;
1091
	tp = container_of(event, struct trace_probe, call.event);
1092

1093
	trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1094

1095
	if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
1096
		goto out;
1097

1098
	trace_seq_puts(s, " <- ");
1099 1100

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

1103
	trace_seq_putc(s, ')');
1104

1105 1106 1107
	data = (u8 *)&field[1];
	for (i = 0; i < tp->nr_args; i++)
		if (!tp->args[i].type->print(s, tp->args[i].name,
1108
					     data + tp->args[i].offset, field))
1109
			goto out;
1110

1111
	trace_seq_putc(s, '\n');
1112

1113 1114
 out:
	return trace_handle_return(s);
1115 1116 1117
}


1118
static int kprobe_event_define_fields(struct trace_event_call *event_call)
1119 1120
{
	int ret, i;
1121
	struct kprobe_trace_entry_head field;
1122
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1123

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

1141
static int kretprobe_event_define_fields(struct trace_event_call *event_call)
1142 1143
{
	int ret, i;
1144
	struct kretprobe_trace_entry_head field;
1145
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1146

1147 1148
	DEFINE_FIELD(unsigned long, func, FIELD_STRING_FUNC, 0);
	DEFINE_FIELD(unsigned long, ret_ip, FIELD_STRING_RETIP, 0);
1149
	/* Set argument names as fields */
1150 1151 1152 1153 1154 1155 1156 1157
	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,
1158 1159 1160 1161
					 FILTER_OTHER);
		if (ret)
			return ret;
	}
1162 1163 1164
	return 0;
}

1165
#ifdef CONFIG_PERF_EVENTS
1166 1167

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

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

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

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

1190
	entry = perf_trace_buf_alloc(size, NULL, &rctx);
1191
	if (!entry)
1192
		return;
1193

1194
	entry->ip = (unsigned long)tk->rp.kp.addr;
1195
	memset(&entry[1], 0, dsize);
1196
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1197 1198
	perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
			      head, NULL);
1199
}
1200
NOKPROBE_SYMBOL(kprobe_perf_func);
1201 1202

/* Kretprobe profile handler */
1203
static void
1204
kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1205
		    struct pt_regs *regs)
1206
{
1207
	struct trace_event_call *call = &tk->tp.call;
1208
	struct bpf_prog *prog = call->prog;
1209
	struct kretprobe_trace_entry_head *entry;
1210
	struct hlist_head *head;
1211
	int size, __size, dsize;
1212
	int rctx;
1213

1214 1215 1216
	if (prog && !trace_call_bpf(prog, regs))
		return;

1217 1218 1219 1220
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

1221 1222
	dsize = __get_data_size(&tk->tp, regs);
	__size = sizeof(*entry) + tk->tp.size + dsize;
1223 1224
	size = ALIGN(__size + sizeof(u32), sizeof(u64));
	size -= sizeof(u32);
1225

1226
	entry = perf_trace_buf_alloc(size, NULL, &rctx);
1227
	if (!entry)
1228
		return;
1229

1230
	entry->func = (unsigned long)tk->rp.kp.addr;
1231
	entry->ret_ip = (unsigned long)ri->ret_addr;
1232
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1233 1234
	perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
			      head, NULL);
1235
}
1236
NOKPROBE_SYMBOL(kretprobe_perf_func);
1237
#endif	/* CONFIG_PERF_EVENTS */
1238

1239 1240 1241 1242 1243 1244
/*
 * 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.
 */
1245
static int kprobe_register(struct trace_event_call *event,
1246
			   enum trace_reg type, void *data)
1247
{
1248
	struct trace_kprobe *tk = (struct trace_kprobe *)event->data;
1249
	struct trace_event_file *file = data;
1250

1251 1252
	switch (type) {
	case TRACE_REG_REGISTER:
1253
		return enable_trace_kprobe(tk, file);
1254
	case TRACE_REG_UNREGISTER:
1255
		return disable_trace_kprobe(tk, file);
1256 1257 1258

#ifdef CONFIG_PERF_EVENTS
	case TRACE_REG_PERF_REGISTER:
1259
		return enable_trace_kprobe(tk, NULL);
1260
	case TRACE_REG_PERF_UNREGISTER:
1261
		return disable_trace_kprobe(tk, NULL);
1262 1263
	case TRACE_REG_PERF_OPEN:
	case TRACE_REG_PERF_CLOSE:
1264 1265
	case TRACE_REG_PERF_ADD:
	case TRACE_REG_PERF_DEL:
1266
		return 0;
1267 1268 1269 1270
#endif
	}
	return 0;
}
1271

1272
static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs)
1273
{
1274
	struct trace_kprobe *tk = container_of(kp, struct trace_kprobe, rp.kp);
1275

1276
	raw_cpu_inc(*tk->nhit);
1277

1278 1279
	if (tk->tp.flags & TP_FLAG_TRACE)
		kprobe_trace_func(tk, regs);
1280
#ifdef CONFIG_PERF_EVENTS
1281 1282
	if (tk->tp.flags & TP_FLAG_PROFILE)
		kprobe_perf_func(tk, regs);
1283
#endif
1284 1285
	return 0;	/* We don't tweek kernel, so just return 0 */
}
1286
NOKPROBE_SYMBOL(kprobe_dispatcher);
1287

1288 1289
static int
kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
1290
{
1291
	struct trace_kprobe *tk = container_of(ri->rp, struct trace_kprobe, rp);
1292

1293
	raw_cpu_inc(*tk->nhit);
1294

1295 1296
	if (tk->tp.flags & TP_FLAG_TRACE)
		kretprobe_trace_func(tk, ri, regs);
1297
#ifdef CONFIG_PERF_EVENTS
1298 1299
	if (tk->tp.flags & TP_FLAG_PROFILE)
		kretprobe_perf_func(tk, ri, regs);
1300
#endif
1301 1302
	return 0;	/* We don't tweek kernel, so just return 0 */
}
1303
NOKPROBE_SYMBOL(kretprobe_dispatcher);
1304

1305 1306 1307 1308 1309 1310 1311 1312
static struct trace_event_functions kretprobe_funcs = {
	.trace		= print_kretprobe_event
};

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

1313
static int register_kprobe_event(struct trace_kprobe *tk)
1314
{
1315
	struct trace_event_call *call = &tk->tp.call;
1316 1317
	int ret;

1318
	/* Initialize trace_event_call */
1319
	INIT_LIST_HEAD(&call->class->fields);
1320
	if (trace_kprobe_is_return(tk)) {
1321
		call->event.funcs = &kretprobe_funcs;
1322
		call->class->define_fields = kretprobe_event_define_fields;
1323
	} else {
1324
		call->event.funcs = &kprobe_funcs;
1325
		call->class->define_fields = kprobe_event_define_fields;
1326
	}
1327
	if (set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0)
1328
		return -ENOMEM;
1329
	ret = register_trace_event(&call->event);
1330
	if (!ret) {
1331
		kfree(call->print_fmt);
1332
		return -ENODEV;
1333
	}
A
Alexei Starovoitov 已提交
1334
	call->flags = TRACE_EVENT_FL_KPROBE;
1335
	call->class->reg = kprobe_register;
1336
	call->data = tk;
1337
	ret = trace_add_event_call(call);
1338
	if (ret) {
1339
		pr_info("Failed to register kprobe event: %s\n",
1340
			trace_event_name(call));
1341
		kfree(call->print_fmt);
1342
		unregister_trace_event(&call->event);
1343
	}
1344 1345 1346
	return ret;
}

1347
static int unregister_kprobe_event(struct trace_kprobe *tk)
1348
{
1349 1350
	int ret;

1351
	/* tp->event is unregistered in trace_remove_event_call() */
1352
	ret = trace_remove_event_call(&tk->tp.call);
1353
	if (!ret)
1354
		kfree(tk->tp.call.print_fmt);
1355
	return ret;
1356 1357
}

1358
/* Make a tracefs interface for controlling probe points */
1359 1360 1361 1362 1363
static __init int init_kprobe_trace(void)
{
	struct dentry *d_tracer;
	struct dentry *entry;

1364
	if (register_module_notifier(&trace_kprobe_module_nb))
1365 1366
		return -EINVAL;

1367
	d_tracer = tracing_init_dentry();
1368
	if (IS_ERR(d_tracer))
1369 1370
		return 0;

1371
	entry = tracefs_create_file("kprobe_events", 0644, d_tracer,
1372 1373
				    NULL, &kprobe_events_ops);

1374
	/* Event list interface */
1375
	if (!entry)
1376
		pr_warn("Could not create tracefs 'kprobe_events' entry\n");
1377 1378

	/* Profile interface */
1379
	entry = tracefs_create_file("kprobe_profile", 0444, d_tracer,
1380 1381 1382
				    NULL, &kprobe_profile_ops);

	if (!entry)
1383
		pr_warn("Could not create tracefs 'kprobe_profile' entry\n");
1384 1385 1386 1387 1388 1389
	return 0;
}
fs_initcall(init_kprobe_trace);


#ifdef CONFIG_FTRACE_STARTUP_TEST
1390 1391
/*
 * The "__used" keeps gcc from removing the function symbol
1392 1393
 * from the kallsyms table. 'noinline' makes sure that there
 * isn't an inlined version used by the test method below
1394
 */
1395 1396
static __used __init noinline int
kprobe_trace_selftest_target(int a1, int a2, int a3, int a4, int a5, int a6)
1397 1398 1399 1400
{
	return a1 + a2 + a3 + a4 + a5 + a6;
}

1401
static __init struct trace_event_file *
1402
find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
1403
{
1404
	struct trace_event_file *file;
1405 1406

	list_for_each_entry(file, &tr->events, list)
1407
		if (file->event_call == &tk->tp.call)
1408 1409 1410 1411 1412
			return file;

	return NULL;
}

1413
/*
1414
 * Nobody but us can call enable_trace_kprobe/disable_trace_kprobe at this
1415 1416
 * stage, we can do this lockless.
 */
1417 1418
static __init int kprobe_trace_self_tests_init(void)
{
1419
	int ret, warn = 0;
1420
	int (*target)(int, int, int, int, int, int);
1421
	struct trace_kprobe *tk;
1422
	struct trace_event_file *file;
1423

1424 1425 1426
	if (tracing_is_disabled())
		return -ENODEV;

1427 1428 1429 1430
	target = kprobe_trace_selftest_target;

	pr_info("Testing kprobe tracing: ");

1431 1432
	ret = traceprobe_command("p:testprobe kprobe_trace_selftest_target "
				  "$stack $stack0 +0($stack)",
1433
				  create_trace_kprobe);
1434
	if (WARN_ON_ONCE(ret)) {
1435
		pr_warn("error on probing function entry.\n");
1436 1437 1438
		warn++;
	} else {
		/* Enable trace point */
1439 1440
		tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
		if (WARN_ON_ONCE(tk == NULL)) {
1441
			pr_warn("error on getting new probe.\n");
1442
			warn++;
1443
		} else {
1444
			file = find_trace_probe_file(tk, top_trace_array());
1445 1446 1447 1448
			if (WARN_ON_ONCE(file == NULL)) {
				pr_warn("error on getting probe file.\n");
				warn++;
			} else
1449
				enable_trace_kprobe(tk, file);
1450
		}
1451
	}
1452

1453
	ret = traceprobe_command("r:testprobe2 kprobe_trace_selftest_target "
1454
				  "$retval", create_trace_kprobe);
1455
	if (WARN_ON_ONCE(ret)) {
1456
		pr_warn("error on probing function return.\n");
1457 1458 1459
		warn++;
	} else {
		/* Enable trace point */
1460 1461
		tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
		if (WARN_ON_ONCE(tk == NULL)) {
1462
			pr_warn("error on getting 2nd new 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
				enable_trace_kprobe(tk, file);
1471
		}
1472 1473 1474 1475
	}

	if (warn)
		goto end;
1476 1477 1478

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

1479 1480 1481 1482 1483 1484 1485 1486
	/*
	 * Not expecting an error here, the check is only to prevent the
	 * optimizer from removing the call to target() as otherwise there
	 * are no side-effects and the call is never performed.
	 */
	if (ret != 21)
		warn++;

1487
	/* Disable trace points before removing it */
1488 1489
	tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1490
		pr_warn("error on getting test probe.\n");
1491
		warn++;
1492
	} else {
1493 1494 1495 1496 1497
		if (trace_kprobe_nhit(tk) != 1) {
			pr_warn("incorrect number of testprobe hits\n");
			warn++;
		}

1498
		file = find_trace_probe_file(tk, top_trace_array());
1499 1500 1501 1502
		if (WARN_ON_ONCE(file == NULL)) {
			pr_warn("error on getting probe file.\n");
			warn++;
		} else
1503
			disable_trace_kprobe(tk, file);
1504
	}
1505

1506 1507
	tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1508
		pr_warn("error on getting 2nd test probe.\n");
1509
		warn++;
1510
	} else {
1511 1512 1513 1514 1515
		if (trace_kprobe_nhit(tk) != 1) {
			pr_warn("incorrect number of testprobe2 hits\n");
			warn++;
		}

1516
		file = find_trace_probe_file(tk, top_trace_array());
1517 1518 1519 1520
		if (WARN_ON_ONCE(file == NULL)) {
			pr_warn("error on getting probe file.\n");
			warn++;
		} else
1521
			disable_trace_kprobe(tk, file);
1522
	}
1523

1524
	ret = traceprobe_command("-:testprobe", create_trace_kprobe);
1525
	if (WARN_ON_ONCE(ret)) {
1526
		pr_warn("error on deleting a probe.\n");
1527 1528 1529
		warn++;
	}

1530
	ret = traceprobe_command("-:testprobe2", create_trace_kprobe);
1531
	if (WARN_ON_ONCE(ret)) {
1532
		pr_warn("error on deleting a probe.\n");
1533 1534
		warn++;
	}
1535

1536
end:
1537
	release_all_trace_kprobes();
1538 1539 1540 1541
	if (warn)
		pr_cont("NG: Some tests are failed. Please check them.\n");
	else
		pr_cont("OK\n");
1542 1543 1544 1545 1546 1547
	return 0;
}

late_initcall(kprobe_trace_self_tests_init);

#endif