trace_kprobe.c 36.1 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
{
	int maxlen = get_rloc_len(*(u32 *)dest);
	u8 *dst = get_rloc_data(dest);
170
	long ret;
171 172 173 174 175 176 177 178

	if (!maxlen)
		return;

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

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

/* Return the length of string -- including null terminal byte */
191 192
static void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
						 void *addr, void *dest)
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
{
	mm_segment_t old_fs;
	int ret, len = 0;
	u8 c;

	old_fs = get_fs();
	set_fs(KERNEL_DS);
	pagefault_disable();

	do {
		ret = __copy_from_user_inatomic(&c, (u8 *)addr + len, 1);
		len++;
	} while (c && ret == 0 && len < MAX_STRING_SIZE);

	pagefault_enable();
	set_fs(old_fs);

	if (ret < 0)	/* Failed to check the length */
		*(u32 *)dest = 0;
	else
		*(u32 *)dest = len;
}
215
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string_size));
216

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

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

232 233 234 235 236 237 238 239
/* kprobes don't support file_offset fetch methods */
#define fetch_file_offset_u8		NULL
#define fetch_file_offset_u16		NULL
#define fetch_file_offset_u32		NULL
#define fetch_file_offset_u64		NULL
#define fetch_file_offset_string	NULL
#define fetch_file_offset_string_size	NULL

240
/* Fetch type information table */
241
static const struct fetch_type kprobes_fetch_type_table[] = {
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
	/* Special types */
	[FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
					sizeof(u32), 1, "__data_loc char[]"),
	[FETCH_TYPE_STRSIZE] = __ASSIGN_FETCH_TYPE("string_size", u32,
					string_size, sizeof(u32), 0, "u32"),
	/* Basic types */
	ASSIGN_FETCH_TYPE(u8,  u8,  0),
	ASSIGN_FETCH_TYPE(u16, u16, 0),
	ASSIGN_FETCH_TYPE(u32, u32, 0),
	ASSIGN_FETCH_TYPE(u64, u64, 0),
	ASSIGN_FETCH_TYPE(s8,  u8,  1),
	ASSIGN_FETCH_TYPE(s16, u16, 1),
	ASSIGN_FETCH_TYPE(s32, u32, 1),
	ASSIGN_FETCH_TYPE(s64, u64, 1),

	ASSIGN_FETCH_TYPE_END
};

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

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

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

	if (is_return)
287
		tk->rp.handler = kretprobe_dispatcher;
288
	else
289
		tk->rp.kp.pre_handler = kprobe_dispatcher;
290

291
	if (!event || !is_good_name(event)) {
292
		ret = -EINVAL;
293
		goto error;
294 295
	}

296 297 298
	tk->tp.call.class = &tk->tp.class;
	tk->tp.call.name = kstrdup(event, GFP_KERNEL);
	if (!tk->tp.call.name)
299
		goto error;
300

301
	if (!group || !is_good_name(group)) {
302
		ret = -EINVAL;
303
		goto error;
304 305
	}

306 307
	tk->tp.class.system = kstrdup(group, GFP_KERNEL);
	if (!tk->tp.class.system)
308 309
		goto error;

310 311 312
	INIT_LIST_HEAD(&tk->list);
	INIT_LIST_HEAD(&tk->tp.files);
	return tk;
313
error:
314 315 316
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
	kfree(tk);
317
	return ERR_PTR(ret);
318 319
}

320
static void free_trace_kprobe(struct trace_kprobe *tk)
321 322 323
{
	int i;

324 325
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_free_probe_arg(&tk->tp.args[i]);
326

327 328 329 330
	kfree(tk->tp.call.class->system);
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
	kfree(tk);
331 332
}

333 334
static struct trace_kprobe *find_trace_kprobe(const char *event,
					      const char *group)
335
{
336
	struct trace_kprobe *tk;
337

338
	list_for_each_entry(tk, &probe_list, list)
339
		if (strcmp(trace_event_name(&tk->tp.call), event) == 0 &&
340 341
		    strcmp(tk->tp.call.class->system, group) == 0)
			return tk;
342 343 344
	return NULL;
}

345 346 347 348 349
/*
 * Enable trace_probe
 * if the file is NULL, enable "perf" handler, or enable "trace" handler.
 */
static int
350
enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
351 352 353
{
	int ret = 0;

354
	if (file) {
355 356 357 358
		struct event_file_link *link;

		link = kmalloc(sizeof(*link), GFP_KERNEL);
		if (!link) {
359
			ret = -ENOMEM;
360
			goto out;
361 362
		}

363
		link->file = file;
364
		list_add_tail_rcu(&link->list, &tk->tp.files);
365

366
		tk->tp.flags |= TP_FLAG_TRACE;
367
	} else
368
		tk->tp.flags |= TP_FLAG_PROFILE;
369

370 371 372
	if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
		if (trace_kprobe_is_return(tk))
			ret = enable_kretprobe(&tk->rp);
373
		else
374
			ret = enable_kprobe(&tk->rp.kp);
375
	}
376
 out:
377 378 379
	return ret;
}

380 381 382 383 384
/*
 * Disable trace_probe
 * if the file is NULL, disable "perf" handler, or disable "trace" handler.
 */
static int
385
disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
386
{
387 388
	struct event_file_link *link = NULL;
	int wait = 0;
389 390 391
	int ret = 0;

	if (file) {
392
		link = find_event_file_link(&tk->tp, file);
393
		if (!link) {
394
			ret = -EINVAL;
395
			goto out;
396 397
		}

398
		list_del_rcu(&link->list);
399
		wait = 1;
400
		if (!list_empty(&tk->tp.files))
401
			goto out;
402

403
		tk->tp.flags &= ~TP_FLAG_TRACE;
404
	} else
405
		tk->tp.flags &= ~TP_FLAG_PROFILE;
406

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

428
	return ret;
429 430
}

431
/* Internal register function - just handle k*probes and flags */
432
static int __register_trace_kprobe(struct trace_kprobe *tk)
433
{
434
	int i, ret;
435

436
	if (trace_probe_is_registered(&tk->tp))
437 438
		return -EINVAL;

439 440
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_update_arg(&tk->tp.args[i]);
441

442
	/* Set/clear disabled flag according to tp->flag */
443 444
	if (trace_probe_is_enabled(&tk->tp))
		tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
445
	else
446
		tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
447

448 449
	if (trace_kprobe_is_return(tk))
		ret = register_kretprobe(&tk->rp);
450
	else
451
		ret = register_kprobe(&tk->rp.kp);
452 453

	if (ret == 0)
454
		tk->tp.flags |= TP_FLAG_REGISTERED;
455 456
	else {
		pr_warning("Could not insert probe at %s+%lu: %d\n",
457 458
			   trace_kprobe_symbol(tk), trace_kprobe_offset(tk), ret);
		if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) {
459 460 461 462 463 464
			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",
465
				   tk->rp.kp.addr);
466 467 468 469 470 471 472 473
			ret = -EINVAL;
		}
	}

	return ret;
}

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

/* Unregister a trace_probe and probe_event: call with locking probe_lock */
489
static int unregister_trace_kprobe(struct trace_kprobe *tk)
490
{
491
	/* Enabled event can not be unregistered */
492
	if (trace_probe_is_enabled(&tk->tp))
493 494
		return -EBUSY;

495
	/* Will fail if probe is being used by ftrace or perf */
496
	if (unregister_kprobe_event(tk))
497 498
		return -EBUSY;

499 500
	__unregister_trace_kprobe(tk);
	list_del(&tk->list);
501 502

	return 0;
503 504 505
}

/* Register a trace_probe and probe_event */
506
static int register_trace_kprobe(struct trace_kprobe *tk)
507
{
508
	struct trace_kprobe *old_tk;
509 510 511 512
	int ret;

	mutex_lock(&probe_lock);

513
	/* Delete old (same name) event if exist */
514
	old_tk = find_trace_kprobe(trace_event_name(&tk->tp.call),
515
			tk->tp.call.class->system);
516 517
	if (old_tk) {
		ret = unregister_trace_kprobe(old_tk);
518 519
		if (ret < 0)
			goto end;
520
		free_trace_kprobe(old_tk);
521
	}
522 523

	/* Register new event */
524
	ret = register_kprobe_event(tk);
525
	if (ret) {
P
Paul Bolle 已提交
526
		pr_warning("Failed to register probe event(%d)\n", ret);
527 528 529
		goto end;
	}

530
	/* Register k*probe */
531
	ret = __register_trace_kprobe(tk);
532
	if (ret < 0)
533
		unregister_kprobe_event(tk);
534
	else
535
		list_add_tail(&tk->list, &probe_list);
536

537 538 539 540 541
end:
	mutex_unlock(&probe_lock);
	return ret;
}

542
/* Module notifier call back, checking event on the module */
543
static int trace_kprobe_module_callback(struct notifier_block *nb,
544 545 546
				       unsigned long val, void *data)
{
	struct module *mod = data;
547
	struct trace_kprobe *tk;
548 549 550 551 552 553 554
	int ret;

	if (val != MODULE_STATE_COMING)
		return NOTIFY_DONE;

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

	return NOTIFY_DONE;
}

572 573
static struct notifier_block trace_kprobe_module_nb = {
	.notifier_call = trace_kprobe_module_callback,
574 575 576
	.priority = 1	/* Invoked after kprobe module callback */
};

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

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

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

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

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

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

	/* parse arguments */
709 710
	ret = 0;
	for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
711 712
		struct probe_arg *parg = &tk->tp.args[i];

713
		/* Increment count for freeing args in error case */
714
		tk->tp.nr_args++;
715

716 717
		/* Parse argument name */
		arg = strchr(argv[i], '=');
718
		if (arg) {
719
			*arg++ = '\0';
720
			parg->name = kstrdup(argv[i], GFP_KERNEL);
721
		} else {
722
			arg = argv[i];
723 724
			/* If argument name is omitted, set "argN" */
			snprintf(buf, MAX_EVENT_NAME_LEN, "arg%d", i + 1);
725
			parg->name = kstrdup(buf, GFP_KERNEL);
726
		}
727

728
		if (!parg->name) {
729
			pr_info("Failed to allocate argument[%d] name.\n", i);
730
			ret = -ENOMEM;
731 732
			goto error;
		}
733

734
		if (!is_good_name(parg->name)) {
735
			pr_info("Invalid argument[%d] name: %s\n",
736
				i, parg->name);
737 738 739
			ret = -EINVAL;
			goto error;
		}
740

741 742
		if (traceprobe_conflict_field_name(parg->name,
							tk->tp.args, i)) {
743
			pr_info("Argument[%d] name '%s' conflicts with "
744 745 746 747
				"another field.\n", i, argv[i]);
			ret = -EINVAL;
			goto error;
		}
748 749

		/* Parse fetch argument */
750
		ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
751 752
						is_return, true,
						kprobes_fetch_type_table);
753
		if (ret) {
754
			pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
755
			goto error;
756
		}
757 758
	}

759
	ret = register_trace_kprobe(tk);
760 761 762 763 764
	if (ret)
		goto error;
	return 0;

error:
765
	free_trace_kprobe(tk);
766 767 768
	return ret;
}

769
static int release_all_trace_kprobes(void)
770
{
771
	struct trace_kprobe *tk;
772
	int ret = 0;
773 774

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

end:
791
	mutex_unlock(&probe_lock);
792 793

	return ret;
794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
}

/* 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)
{
815
	struct trace_kprobe *tk = v;
816
	int i;
817

818
	seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
819
	seq_printf(m, ":%s/%s", tk->tp.call.class->system,
820
			trace_event_name(&tk->tp.call));
821

822 823 824 825 826
	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);
827
	else
828
		seq_printf(m, " %s", trace_kprobe_symbol(tk));
829

830 831
	for (i = 0; i < tk->tp.nr_args; i++)
		seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
832
	seq_putc(m, '\n');
833

834 835 836 837 838 839 840 841 842 843 844 845
	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)
{
846 847 848
	int ret;

	if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
849
		ret = release_all_trace_kprobes();
850 851 852
		if (ret < 0)
			return ret;
	}
853 854 855 856 857 858 859

	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)
{
860
	return traceprobe_probes_write(file, buffer, count, ppos,
861
			create_trace_kprobe);
862 863 864 865 866 867 868 869 870 871 872
}

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

873 874 875
/* Probes profiling interfaces */
static int probes_profile_seq_show(struct seq_file *m, void *v)
{
876
	struct trace_kprobe *tk = v;
877

878
	seq_printf(m, "  %-44s %15lu %15lu\n",
879
		   trace_event_name(&tk->tp.call), tk->nhit,
880
		   tk->rp.kp.nmissed);
881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904

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

905
/* Kprobe handler */
906
static nokprobe_inline void
907
__kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
908
		    struct trace_event_file *trace_file)
909
{
910
	struct kprobe_trace_entry_head *entry;
911
	struct ring_buffer_event *event;
912
	struct ring_buffer *buffer;
913
	int size, dsize, pc;
914
	unsigned long irq_flags;
915
	struct trace_event_call *call = &tk->tp.call;
916

917
	WARN_ON(call != trace_file->event_call);
918

919
	if (trace_trigger_soft_disabled(trace_file))
920
		return;
921

922 923 924
	local_save_flags(irq_flags);
	pc = preempt_count();

925 926
	dsize = __get_data_size(&tk->tp, regs);
	size = sizeof(*entry) + tk->tp.size + dsize;
927

928
	event = trace_event_buffer_lock_reserve(&buffer, trace_file,
929 930
						call->event.type,
						size, irq_flags, pc);
931
	if (!event)
932
		return;
933 934

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

938
	event_trigger_unlock_commit_regs(trace_file, buffer, event,
939
					 entry, irq_flags, pc, regs);
940 941
}

942
static void
943
kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs)
944
{
945
	struct event_file_link *link;
946

947 948
	list_for_each_entry_rcu(link, &tk->tp.files, list)
		__kprobe_trace_func(tk, regs, link->file);
949
}
950
NOKPROBE_SYMBOL(kprobe_trace_func);
951

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

965
	WARN_ON(call != trace_file->event_call);
966

967
	if (trace_trigger_soft_disabled(trace_file))
968
		return;
969

970 971 972
	local_save_flags(irq_flags);
	pc = preempt_count();

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

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

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

987
	event_trigger_unlock_commit_regs(trace_file, buffer, event,
988
					 entry, irq_flags, pc, regs);
989 990
}

991
static void
992
kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
993 994
		     struct pt_regs *regs)
{
995
	struct event_file_link *link;
996

997 998
	list_for_each_entry_rcu(link, &tk->tp.files, list)
		__kretprobe_trace_func(tk, ri, regs, link->file);
999
}
1000
NOKPROBE_SYMBOL(kretprobe_trace_func);
1001

1002
/* Event entry printers */
1003
static enum print_line_t
1004 1005
print_kprobe_event(struct trace_iterator *iter, int flags,
		   struct trace_event *event)
1006
{
1007
	struct kprobe_trace_entry_head *field;
1008
	struct trace_seq *s = &iter->seq;
1009
	struct trace_probe *tp;
1010
	u8 *data;
1011 1012
	int i;

1013
	field = (struct kprobe_trace_entry_head *)iter->ent;
1014
	tp = container_of(event, struct trace_probe, call.event);
1015

1016
	trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1017

1018
	if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET))
1019
		goto out;
1020

1021
	trace_seq_putc(s, ')');
1022

1023 1024 1025
	data = (u8 *)&field[1];
	for (i = 0; i < tp->nr_args; i++)
		if (!tp->args[i].type->print(s, tp->args[i].name,
1026
					     data + tp->args[i].offset, field))
1027
			goto out;
1028

1029 1030 1031
	trace_seq_putc(s, '\n');
 out:
	return trace_handle_return(s);
1032 1033
}

1034
static enum print_line_t
1035 1036
print_kretprobe_event(struct trace_iterator *iter, int flags,
		      struct trace_event *event)
1037
{
1038
	struct kretprobe_trace_entry_head *field;
1039
	struct trace_seq *s = &iter->seq;
1040
	struct trace_probe *tp;
1041
	u8 *data;
1042 1043
	int i;

1044
	field = (struct kretprobe_trace_entry_head *)iter->ent;
1045
	tp = container_of(event, struct trace_probe, call.event);
1046

1047
	trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1048

1049
	if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
1050
		goto out;
1051

1052
	trace_seq_puts(s, " <- ");
1053 1054

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

1057
	trace_seq_putc(s, ')');
1058

1059 1060 1061
	data = (u8 *)&field[1];
	for (i = 0; i < tp->nr_args; i++)
		if (!tp->args[i].type->print(s, tp->args[i].name,
1062
					     data + tp->args[i].offset, field))
1063
			goto out;
1064

1065
	trace_seq_putc(s, '\n');
1066

1067 1068
 out:
	return trace_handle_return(s);
1069 1070 1071
}


1072
static int kprobe_event_define_fields(struct trace_event_call *event_call)
1073 1074
{
	int ret, i;
1075
	struct kprobe_trace_entry_head field;
1076
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1077

1078
	DEFINE_FIELD(unsigned long, ip, FIELD_STRING_IP, 0);
1079
	/* Set argument names as fields */
1080 1081 1082 1083 1084 1085 1086 1087
	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,
1088 1089 1090 1091
					 FILTER_OTHER);
		if (ret)
			return ret;
	}
1092 1093 1094
	return 0;
}

1095
static int kretprobe_event_define_fields(struct trace_event_call *event_call)
1096 1097
{
	int ret, i;
1098
	struct kretprobe_trace_entry_head field;
1099
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1100

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

1119
#ifdef CONFIG_PERF_EVENTS
1120 1121

/* Kprobe profile handler */
1122
static void
1123
kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs)
1124
{
1125
	struct trace_event_call *call = &tk->tp.call;
1126
	struct bpf_prog *prog = call->prog;
1127
	struct kprobe_trace_entry_head *entry;
1128
	struct hlist_head *head;
1129
	int size, __size, dsize;
1130
	int rctx;
1131

1132 1133 1134
	if (prog && !trace_call_bpf(prog, regs))
		return;

1135 1136 1137 1138
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

1139 1140
	dsize = __get_data_size(&tk->tp, regs);
	__size = sizeof(*entry) + tk->tp.size + dsize;
1141 1142
	size = ALIGN(__size + sizeof(u32), sizeof(u64));
	size -= sizeof(u32);
1143

1144
	entry = perf_trace_buf_prepare(size, call->event.type, NULL, &rctx);
1145
	if (!entry)
1146
		return;
1147

1148
	entry->ip = (unsigned long)tk->rp.kp.addr;
1149
	memset(&entry[1], 0, dsize);
1150
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1151
	perf_trace_buf_submit(entry, size, rctx, 0, 1, regs, head, NULL);
1152
}
1153
NOKPROBE_SYMBOL(kprobe_perf_func);
1154 1155

/* Kretprobe profile handler */
1156
static void
1157
kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1158
		    struct pt_regs *regs)
1159
{
1160
	struct trace_event_call *call = &tk->tp.call;
1161
	struct bpf_prog *prog = call->prog;
1162
	struct kretprobe_trace_entry_head *entry;
1163
	struct hlist_head *head;
1164
	int size, __size, dsize;
1165
	int rctx;
1166

1167 1168 1169
	if (prog && !trace_call_bpf(prog, regs))
		return;

1170 1171 1172 1173
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

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

1179
	entry = perf_trace_buf_prepare(size, call->event.type, NULL, &rctx);
1180
	if (!entry)
1181
		return;
1182

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

1191 1192 1193 1194 1195 1196
/*
 * 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.
 */
1197
static int kprobe_register(struct trace_event_call *event,
1198
			   enum trace_reg type, void *data)
1199
{
1200
	struct trace_kprobe *tk = (struct trace_kprobe *)event->data;
1201
	struct trace_event_file *file = data;
1202

1203 1204
	switch (type) {
	case TRACE_REG_REGISTER:
1205
		return enable_trace_kprobe(tk, file);
1206
	case TRACE_REG_UNREGISTER:
1207
		return disable_trace_kprobe(tk, file);
1208 1209 1210

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

1224
static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs)
1225
{
1226
	struct trace_kprobe *tk = container_of(kp, struct trace_kprobe, rp.kp);
1227

1228
	tk->nhit++;
1229

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

1240 1241
static int
kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
1242
{
1243
	struct trace_kprobe *tk = container_of(ri->rp, struct trace_kprobe, rp);
1244

1245
	tk->nhit++;
1246

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

1257 1258 1259 1260 1261 1262 1263 1264
static struct trace_event_functions kretprobe_funcs = {
	.trace		= print_kretprobe_event
};

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

1265
static int register_kprobe_event(struct trace_kprobe *tk)
1266
{
1267
	struct trace_event_call *call = &tk->tp.call;
1268 1269
	int ret;

1270
	/* Initialize trace_event_call */
1271
	INIT_LIST_HEAD(&call->class->fields);
1272
	if (trace_kprobe_is_return(tk)) {
1273
		call->event.funcs = &kretprobe_funcs;
1274
		call->class->define_fields = kretprobe_event_define_fields;
1275
	} else {
1276
		call->event.funcs = &kprobe_funcs;
1277
		call->class->define_fields = kprobe_event_define_fields;
1278
	}
1279
	if (set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0)
1280
		return -ENOMEM;
1281
	ret = register_trace_event(&call->event);
1282
	if (!ret) {
1283
		kfree(call->print_fmt);
1284
		return -ENODEV;
1285
	}
A
Alexei Starovoitov 已提交
1286
	call->flags = TRACE_EVENT_FL_KPROBE;
1287
	call->class->reg = kprobe_register;
1288
	call->data = tk;
1289
	ret = trace_add_event_call(call);
1290
	if (ret) {
1291
		pr_info("Failed to register kprobe event: %s\n",
1292
			trace_event_name(call));
1293
		kfree(call->print_fmt);
1294
		unregister_trace_event(&call->event);
1295
	}
1296 1297 1298
	return ret;
}

1299
static int unregister_kprobe_event(struct trace_kprobe *tk)
1300
{
1301 1302
	int ret;

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

1310
/* Make a tracefs interface for controlling probe points */
1311 1312 1313 1314 1315
static __init int init_kprobe_trace(void)
{
	struct dentry *d_tracer;
	struct dentry *entry;

1316
	if (register_module_notifier(&trace_kprobe_module_nb))
1317 1318
		return -EINVAL;

1319
	d_tracer = tracing_init_dentry();
1320
	if (IS_ERR(d_tracer))
1321 1322
		return 0;

1323
	entry = tracefs_create_file("kprobe_events", 0644, d_tracer,
1324 1325
				    NULL, &kprobe_events_ops);

1326
	/* Event list interface */
1327
	if (!entry)
1328
		pr_warning("Could not create tracefs "
1329
			   "'kprobe_events' entry\n");
1330 1331

	/* Profile interface */
1332
	entry = tracefs_create_file("kprobe_profile", 0444, d_tracer,
1333 1334 1335
				    NULL, &kprobe_profile_ops);

	if (!entry)
1336
		pr_warning("Could not create tracefs "
1337
			   "'kprobe_profile' entry\n");
1338 1339 1340 1341 1342 1343 1344
	return 0;
}
fs_initcall(init_kprobe_trace);


#ifdef CONFIG_FTRACE_STARTUP_TEST

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

1355
static struct trace_event_file *
1356
find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
1357
{
1358
	struct trace_event_file *file;
1359 1360

	list_for_each_entry(file, &tr->events, list)
1361
		if (file->event_call == &tk->tp.call)
1362 1363 1364 1365 1366
			return file;

	return NULL;
}

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

1378 1379 1380
	if (tracing_is_disabled())
		return -ENODEV;

1381 1382 1383 1384
	target = kprobe_trace_selftest_target;

	pr_info("Testing kprobe tracing: ");

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

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

	if (warn)
		goto end;
1430 1431 1432

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

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

1447 1448
	tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1449
		pr_warn("error on getting 2nd 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
	ret = traceprobe_command("-:testprobe", create_trace_kprobe);
1461
	if (WARN_ON_ONCE(ret)) {
1462
		pr_warn("error on deleting a probe.\n");
1463 1464 1465
		warn++;
	}

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

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

late_initcall(kprobe_trace_self_tests_init);

#endif