tracing/uprobe: Add multi-probe per uprobe event support
[linux-2.6-block.git] / kernel / trace / trace_kprobe.c
CommitLineData
bcea3f96 1// SPDX-License-Identifier: GPL-2.0
413d37d1 2/*
77b44d1b 3 * Kprobes-based tracing events
413d37d1
MH
4 *
5 * Created by Masami Hiramatsu <mhiramat@redhat.com>
6 *
413d37d1 7 */
72576341 8#define pr_fmt(fmt) "trace_kprobe: " fmt
413d37d1
MH
9
10#include <linux/module.h>
11#include <linux/uaccess.h>
b2d09103 12#include <linux/rculist.h>
540adea3 13#include <linux/error-injection.h>
413d37d1 14
970988e1
MH
15#include <asm/setup.h> /* for COMMAND_LINE_SIZE */
16
6212dd29 17#include "trace_dynevent.h"
d899926f 18#include "trace_kprobe_selftest.h"
8ab83f56 19#include "trace_probe.h"
53305928 20#include "trace_probe_tmpl.h"
1ff511e3 21
8ab83f56 22#define KPROBE_EVENT_SYSTEM "kprobes"
696ced4f 23#define KRETPROBE_MAXACTIVE_MAX 4096
970988e1
MH
24#define MAX_KPROBE_CMDLINE_SIZE 1024
25
26/* Kprobe early definition from command line */
27static char kprobe_boot_events_buf[COMMAND_LINE_SIZE] __initdata;
b6399cc7 28static bool kprobe_boot_events_enabled __initdata;
970988e1
MH
29
30static int __init set_kprobe_boot_events(char *str)
31{
32 strlcpy(kprobe_boot_events_buf, str, COMMAND_LINE_SIZE);
33 return 0;
34}
35__setup("kprobe_event=", set_kprobe_boot_events);
e09c8614 36
6212dd29
MH
37static int trace_kprobe_create(int argc, const char **argv);
38static int trace_kprobe_show(struct seq_file *m, struct dyn_event *ev);
39static int trace_kprobe_release(struct dyn_event *ev);
40static bool trace_kprobe_is_busy(struct dyn_event *ev);
41static bool trace_kprobe_match(const char *system, const char *event,
30199137 42 int argc, const char **argv, struct dyn_event *ev);
6212dd29
MH
43
44static struct dyn_event_operations trace_kprobe_ops = {
45 .create = trace_kprobe_create,
46 .show = trace_kprobe_show,
47 .is_busy = trace_kprobe_is_busy,
48 .free = trace_kprobe_release,
49 .match = trace_kprobe_match,
50};
51
cede666e 52/*
77b44d1b 53 * Kprobe event core functions
413d37d1 54 */
c31ffb3f 55struct trace_kprobe {
6212dd29 56 struct dyn_event devent;
4a846b44 57 struct kretprobe rp; /* Use rp.kp for kprobe use */
a7636d9e 58 unsigned long __percpu *nhit;
413d37d1 59 const char *symbol; /* symbol name */
c31ffb3f 60 struct trace_probe tp;
413d37d1
MH
61};
62
6212dd29
MH
63static bool is_trace_kprobe(struct dyn_event *ev)
64{
65 return ev->ops == &trace_kprobe_ops;
66}
67
68static struct trace_kprobe *to_trace_kprobe(struct dyn_event *ev)
69{
70 return container_of(ev, struct trace_kprobe, devent);
71}
72
73/**
74 * for_each_trace_kprobe - iterate over the trace_kprobe list
75 * @pos: the struct trace_kprobe * for each entry
76 * @dpos: the struct dyn_event * to use as a loop cursor
77 */
78#define for_each_trace_kprobe(pos, dpos) \
79 for_each_dyn_event(dpos) \
80 if (is_trace_kprobe(dpos) && (pos = to_trace_kprobe(dpos)))
81
c31ffb3f
NK
82#define SIZEOF_TRACE_KPROBE(n) \
83 (offsetof(struct trace_kprobe, tp.args) + \
eca0d916 84 (sizeof(struct probe_arg) * (n)))
a82378d8 85
3da0f180 86static nokprobe_inline bool trace_kprobe_is_return(struct trace_kprobe *tk)
413d37d1 87{
c31ffb3f 88 return tk->rp.handler != NULL;
413d37d1
MH
89}
90
3da0f180 91static nokprobe_inline const char *trace_kprobe_symbol(struct trace_kprobe *tk)
413d37d1 92{
c31ffb3f 93 return tk->symbol ? tk->symbol : "unknown";
413d37d1
MH
94}
95
3da0f180 96static nokprobe_inline unsigned long trace_kprobe_offset(struct trace_kprobe *tk)
61424318 97{
c31ffb3f 98 return tk->rp.kp.offset;
61424318
MH
99}
100
3da0f180 101static nokprobe_inline bool trace_kprobe_has_gone(struct trace_kprobe *tk)
61424318 102{
c31ffb3f 103 return !!(kprobe_gone(&tk->rp.kp));
61424318
MH
104}
105
3da0f180 106static nokprobe_inline bool trace_kprobe_within_module(struct trace_kprobe *tk,
c31ffb3f 107 struct module *mod)
61424318
MH
108{
109 int len = strlen(mod->name);
c31ffb3f 110 const char *name = trace_kprobe_symbol(tk);
61424318
MH
111 return strncmp(mod->name, name, len) == 0 && name[len] == ':';
112}
113
59158ec4 114static nokprobe_inline bool trace_kprobe_module_exist(struct trace_kprobe *tk)
61424318 115{
59158ec4
MH
116 char *p;
117 bool ret;
118
119 if (!tk->symbol)
120 return false;
121 p = strchr(tk->symbol, ':');
122 if (!p)
123 return true;
124 *p = '\0';
125 mutex_lock(&module_mutex);
126 ret = !!find_module(tk->symbol);
127 mutex_unlock(&module_mutex);
128 *p = ':';
129
130 return ret;
61424318
MH
131}
132
6212dd29
MH
133static bool trace_kprobe_is_busy(struct dyn_event *ev)
134{
135 struct trace_kprobe *tk = to_trace_kprobe(ev);
136
137 return trace_probe_is_enabled(&tk->tp);
138}
139
140static bool trace_kprobe_match(const char *system, const char *event,
30199137 141 int argc, const char **argv, struct dyn_event *ev)
6212dd29
MH
142{
143 struct trace_kprobe *tk = to_trace_kprobe(ev);
144
b55ce203
MH
145 return strcmp(trace_probe_name(&tk->tp), event) == 0 &&
146 (!system || strcmp(trace_probe_group_name(&tk->tp), system) == 0);
6212dd29
MH
147}
148
f18f97ac
MN
149static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk)
150{
151 unsigned long nhit = 0;
152 int cpu;
153
154 for_each_possible_cpu(cpu)
155 nhit += *per_cpu_ptr(tk->nhit, cpu);
156
157 return nhit;
158}
159
715fa2fd
MH
160static nokprobe_inline bool trace_kprobe_is_registered(struct trace_kprobe *tk)
161{
162 return !(list_empty(&tk->rp.kp.list) &&
163 hlist_unhashed(&tk->rp.kp.hlist));
164}
165
6bc6c77c 166/* Return 0 if it fails to find the symbol address */
45408c4f
MH
167static nokprobe_inline
168unsigned long trace_kprobe_address(struct trace_kprobe *tk)
169{
170 unsigned long addr;
171
172 if (tk->symbol) {
173 addr = (unsigned long)
174 kallsyms_lookup_name(trace_kprobe_symbol(tk));
6bc6c77c
MH
175 if (addr)
176 addr += tk->rp.kp.offset;
45408c4f
MH
177 } else {
178 addr = (unsigned long)tk->rp.kp.addr;
179 }
180 return addr;
181}
182
60d53e2c
MH
183static nokprobe_inline struct trace_kprobe *
184trace_kprobe_primary_from_call(struct trace_event_call *call)
185{
186 struct trace_probe *tp;
187
188 tp = trace_probe_primary_from_call(call);
189 if (WARN_ON_ONCE(!tp))
190 return NULL;
191
192 return container_of(tp, struct trace_kprobe, tp);
193}
194
b4da3340 195bool trace_kprobe_on_func_entry(struct trace_event_call *call)
9802d865 196{
60d53e2c 197 struct trace_kprobe *tk = trace_kprobe_primary_from_call(call);
b4da3340 198
60d53e2c 199 return tk ? kprobe_on_func_entry(tk->rp.kp.addr,
b4da3340 200 tk->rp.kp.addr ? NULL : tk->rp.kp.symbol_name,
60d53e2c 201 tk->rp.kp.addr ? 0 : tk->rp.kp.offset) : false;
9802d865
JB
202}
203
b4da3340 204bool trace_kprobe_error_injectable(struct trace_event_call *call)
9802d865 205{
60d53e2c 206 struct trace_kprobe *tk = trace_kprobe_primary_from_call(call);
9802d865 207
60d53e2c
MH
208 return tk ? within_error_injection_list(trace_kprobe_address(tk)) :
209 false;
9802d865
JB
210}
211
c31ffb3f
NK
212static int register_kprobe_event(struct trace_kprobe *tk);
213static int unregister_kprobe_event(struct trace_kprobe *tk);
413d37d1 214
50d78056
MH
215static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs);
216static int kretprobe_dispatcher(struct kretprobe_instance *ri,
217 struct pt_regs *regs);
218
455b2899
MH
219static void free_trace_kprobe(struct trace_kprobe *tk)
220{
221 if (tk) {
222 trace_probe_cleanup(&tk->tp);
223 kfree(tk->symbol);
224 free_percpu(tk->nhit);
225 kfree(tk);
226 }
227}
228
4a846b44
MH
229/*
230 * Allocate new trace_probe and initialize it (including kprobes).
231 */
c31ffb3f 232static struct trace_kprobe *alloc_trace_kprobe(const char *group,
f52487e9 233 const char *event,
4a846b44
MH
234 void *addr,
235 const char *symbol,
236 unsigned long offs,
696ced4f 237 int maxactive,
3a6b7666 238 int nargs, bool is_return)
413d37d1 239{
c31ffb3f 240 struct trace_kprobe *tk;
6f3cf440 241 int ret = -ENOMEM;
413d37d1 242
c31ffb3f
NK
243 tk = kzalloc(SIZEOF_TRACE_KPROBE(nargs), GFP_KERNEL);
244 if (!tk)
6f3cf440 245 return ERR_PTR(ret);
413d37d1 246
a7636d9e
MKL
247 tk->nhit = alloc_percpu(unsigned long);
248 if (!tk->nhit)
249 goto error;
250
413d37d1 251 if (symbol) {
c31ffb3f
NK
252 tk->symbol = kstrdup(symbol, GFP_KERNEL);
253 if (!tk->symbol)
413d37d1 254 goto error;
c31ffb3f
NK
255 tk->rp.kp.symbol_name = tk->symbol;
256 tk->rp.kp.offset = offs;
4a846b44 257 } else
c31ffb3f 258 tk->rp.kp.addr = addr;
4a846b44
MH
259
260 if (is_return)
c31ffb3f 261 tk->rp.handler = kretprobe_dispatcher;
4a846b44 262 else
c31ffb3f 263 tk->rp.kp.pre_handler = kprobe_dispatcher;
4a846b44 264
696ced4f 265 tk->rp.maxactive = maxactive;
715fa2fd
MH
266 INIT_HLIST_NODE(&tk->rp.kp.hlist);
267 INIT_LIST_HEAD(&tk->rp.kp.list);
696ced4f 268
455b2899
MH
269 ret = trace_probe_init(&tk->tp, event, group);
270 if (ret < 0)
f52487e9
MH
271 goto error;
272
6212dd29 273 dyn_event_init(&tk->devent, &trace_kprobe_ops);
c31ffb3f 274 return tk;
413d37d1 275error:
455b2899 276 free_trace_kprobe(tk);
6f3cf440 277 return ERR_PTR(ret);
413d37d1
MH
278}
279
c31ffb3f
NK
280static struct trace_kprobe *find_trace_kprobe(const char *event,
281 const char *group)
413d37d1 282{
6212dd29 283 struct dyn_event *pos;
c31ffb3f 284 struct trace_kprobe *tk;
413d37d1 285
6212dd29 286 for_each_trace_kprobe(tk, pos)
b55ce203
MH
287 if (strcmp(trace_probe_name(&tk->tp), event) == 0 &&
288 strcmp(trace_probe_group_name(&tk->tp), group) == 0)
c31ffb3f 289 return tk;
413d37d1
MH
290 return NULL;
291}
292
87107a25
SRV
293static inline int __enable_trace_kprobe(struct trace_kprobe *tk)
294{
295 int ret = 0;
296
715fa2fd 297 if (trace_kprobe_is_registered(tk) && !trace_kprobe_has_gone(tk)) {
87107a25
SRV
298 if (trace_kprobe_is_return(tk))
299 ret = enable_kretprobe(&tk->rp);
300 else
301 ret = enable_kprobe(&tk->rp.kp);
302 }
303
304 return ret;
305}
306
60d53e2c
MH
307static void __disable_trace_kprobe(struct trace_probe *tp)
308{
309 struct trace_probe *pos;
310 struct trace_kprobe *tk;
311
312 list_for_each_entry(pos, trace_probe_probe_list(tp), list) {
313 tk = container_of(pos, struct trace_kprobe, tp);
314 if (!trace_kprobe_is_registered(tk))
315 continue;
316 if (trace_kprobe_is_return(tk))
317 disable_kretprobe(&tk->rp);
318 else
319 disable_kprobe(&tk->rp.kp);
320 }
321}
322
41a7dd42
MH
323/*
324 * Enable trace_probe
325 * if the file is NULL, enable "perf" handler, or enable "trace" handler.
326 */
60d53e2c
MH
327static int enable_trace_kprobe(struct trace_event_call *call,
328 struct trace_event_file *file)
1538f888 329{
60d53e2c
MH
330 struct trace_probe *pos, *tp;
331 struct trace_kprobe *tk;
332 bool enabled;
1538f888
MH
333 int ret = 0;
334
60d53e2c
MH
335 tp = trace_probe_primary_from_call(call);
336 if (WARN_ON_ONCE(!tp))
337 return -ENODEV;
338 enabled = trace_probe_is_enabled(tp);
339
340 /* This also changes "enabled" state */
41a7dd42 341 if (file) {
60d53e2c 342 ret = trace_probe_add_file(tp, file);
b5f935ee
MH
343 if (ret)
344 return ret;
345 } else
60d53e2c 346 trace_probe_set_flag(tp, TP_FLAG_PROFILE);
41a7dd42 347
b5f935ee
MH
348 if (enabled)
349 return 0;
87107a25 350
60d53e2c
MH
351 enabled = false;
352 list_for_each_entry(pos, trace_probe_probe_list(tp), list) {
353 tk = container_of(pos, struct trace_kprobe, tp);
354 if (trace_kprobe_has_gone(tk))
355 continue;
356 ret = __enable_trace_kprobe(tk);
357 if (ret) {
358 if (enabled) {
359 __disable_trace_kprobe(tp);
360 enabled = false;
361 }
362 break;
363 }
364 enabled = true;
365 }
366
367 if (!enabled) {
368 /* No probe is enabled. Roll back */
b5f935ee 369 if (file)
60d53e2c 370 trace_probe_remove_file(tp, file);
b5f935ee 371 else
60d53e2c
MH
372 trace_probe_clear_flag(tp, TP_FLAG_PROFILE);
373 if (!ret)
374 /* Since all probes are gone, this is not available */
375 ret = -EADDRNOTAVAIL;
57ea2a34 376 }
b5f935ee 377
1538f888
MH
378 return ret;
379}
380
41a7dd42
MH
381/*
382 * Disable trace_probe
383 * if the file is NULL, disable "perf" handler, or disable "trace" handler.
384 */
60d53e2c
MH
385static int disable_trace_kprobe(struct trace_event_call *call,
386 struct trace_event_file *file)
1538f888 387{
60d53e2c
MH
388 struct trace_probe *tp;
389
390 tp = trace_probe_primary_from_call(call);
391 if (WARN_ON_ONCE(!tp))
392 return -ENODEV;
41a7dd42 393
41a7dd42 394 if (file) {
b5f935ee
MH
395 if (!trace_probe_get_file_link(tp, file))
396 return -ENOENT;
397 if (!trace_probe_has_single_file(tp))
b04d52e3 398 goto out;
747774d6 399 trace_probe_clear_flag(tp, TP_FLAG_TRACE);
41a7dd42 400 } else
747774d6 401 trace_probe_clear_flag(tp, TP_FLAG_PROFILE);
41a7dd42 402
60d53e2c
MH
403 if (!trace_probe_is_enabled(tp))
404 __disable_trace_kprobe(tp);
e12f03d7 405
3fe3d619 406 out:
b5f935ee 407 if (file)
a232e270 408 /*
b5f935ee
MH
409 * Synchronization is done in below function. For perf event,
410 * file == NULL and perf_trace_event_unreg() calls
411 * tracepoint_synchronize_unregister() to ensure synchronize
412 * event. We don't need to care about it.
a232e270 413 */
b5f935ee 414 trace_probe_remove_file(tp, file);
a232e270 415
60d53e2c 416 return 0;
1538f888
MH
417}
418
45408c4f
MH
419#if defined(CONFIG_KPROBES_ON_FTRACE) && \
420 !defined(CONFIG_KPROBE_EVENTS_ON_NOTRACE)
421static bool within_notrace_func(struct trace_kprobe *tk)
422{
423 unsigned long offset, size, addr;
424
425 addr = trace_kprobe_address(tk);
6bc6c77c
MH
426 if (!addr || !kallsyms_lookup_size_offset(addr, &size, &offset))
427 return false;
45408c4f 428
9161a864
MH
429 /* Get the entry address of the target function */
430 addr -= offset;
431
432 /*
433 * Since ftrace_location_range() does inclusive range check, we need
434 * to subtract 1 byte from the end address.
435 */
436 return !ftrace_location_range(addr, addr + size - 1);
45408c4f
MH
437}
438#else
439#define within_notrace_func(tk) (false)
440#endif
441
61424318 442/* Internal register function - just handle k*probes and flags */
c31ffb3f 443static int __register_trace_kprobe(struct trace_kprobe *tk)
413d37d1 444{
a6682814 445 int i, ret;
61424318 446
715fa2fd 447 if (trace_kprobe_is_registered(tk))
61424318
MH
448 return -EINVAL;
449
45408c4f
MH
450 if (within_notrace_func(tk)) {
451 pr_warn("Could not probe notrace function %s\n",
452 trace_kprobe_symbol(tk));
453 return -EINVAL;
454 }
455
a6682814
MH
456 for (i = 0; i < tk->tp.nr_args; i++) {
457 ret = traceprobe_update_arg(&tk->tp.args[i]);
458 if (ret)
459 return ret;
460 }
461
61424318 462 /* Set/clear disabled flag according to tp->flag */
c31ffb3f
NK
463 if (trace_probe_is_enabled(&tk->tp))
464 tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
61424318 465 else
c31ffb3f 466 tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
61424318 467
c31ffb3f
NK
468 if (trace_kprobe_is_return(tk))
469 ret = register_kretprobe(&tk->rp);
413d37d1 470 else
c31ffb3f 471 ret = register_kprobe(&tk->rp.kp);
61424318 472
61424318
MH
473 return ret;
474}
475
476/* Internal unregister function - just handle k*probes and flags */
c31ffb3f 477static void __unregister_trace_kprobe(struct trace_kprobe *tk)
61424318 478{
715fa2fd 479 if (trace_kprobe_is_registered(tk)) {
c31ffb3f
NK
480 if (trace_kprobe_is_return(tk))
481 unregister_kretprobe(&tk->rp);
61424318 482 else
c31ffb3f 483 unregister_kprobe(&tk->rp.kp);
715fa2fd
MH
484 /* Cleanup kprobe for reuse and mark it unregistered */
485 INIT_HLIST_NODE(&tk->rp.kp.hlist);
486 INIT_LIST_HEAD(&tk->rp.kp.list);
c31ffb3f
NK
487 if (tk->rp.kp.symbol_name)
488 tk->rp.kp.addr = NULL;
61424318
MH
489 }
490}
491
6212dd29 492/* Unregister a trace_probe and probe_event */
c31ffb3f 493static int unregister_trace_kprobe(struct trace_kprobe *tk)
61424318 494{
ca89bc07
MH
495 /* If other probes are on the event, just unregister kprobe */
496 if (trace_probe_has_sibling(&tk->tp))
497 goto unreg;
498
02ca1521 499 /* Enabled event can not be unregistered */
c31ffb3f 500 if (trace_probe_is_enabled(&tk->tp))
02ca1521
MH
501 return -EBUSY;
502
40c32592 503 /* Will fail if probe is being used by ftrace or perf */
c31ffb3f 504 if (unregister_kprobe_event(tk))
40c32592
SRRH
505 return -EBUSY;
506
ca89bc07 507unreg:
c31ffb3f 508 __unregister_trace_kprobe(tk);
6212dd29 509 dyn_event_remove(&tk->devent);
ca89bc07 510 trace_probe_unlink(&tk->tp);
02ca1521
MH
511
512 return 0;
413d37d1
MH
513}
514
ca89bc07
MH
515static int append_trace_kprobe(struct trace_kprobe *tk, struct trace_kprobe *to)
516{
517 int ret;
518
519 /* Append to existing event */
520 ret = trace_probe_append(&tk->tp, &to->tp);
521 if (ret)
522 return ret;
523
524 /* Register k*probe */
525 ret = __register_trace_kprobe(tk);
526 if (ret == -ENOENT && !trace_kprobe_module_exist(tk)) {
527 pr_warn("This probe might be able to register after target module is loaded. Continue.\n");
528 ret = 0;
529 }
530
531 if (ret)
532 trace_probe_unlink(&tk->tp);
533 else
534 dyn_event_add(&tk->devent);
535
536 return ret;
537}
538
413d37d1 539/* Register a trace_probe and probe_event */
c31ffb3f 540static int register_trace_kprobe(struct trace_kprobe *tk)
413d37d1 541{
c31ffb3f 542 struct trace_kprobe *old_tk;
413d37d1
MH
543 int ret;
544
6212dd29 545 mutex_lock(&event_mutex);
413d37d1 546
b55ce203
MH
547 old_tk = find_trace_kprobe(trace_probe_name(&tk->tp),
548 trace_probe_group_name(&tk->tp));
c31ffb3f 549 if (old_tk) {
ca89bc07
MH
550 if (trace_kprobe_is_return(tk) != trace_kprobe_is_return(old_tk)) {
551 trace_probe_log_set_index(0);
552 trace_probe_log_err(0, DIFF_PROBE_TYPE);
553 ret = -EEXIST;
554 } else {
555 ret = trace_probe_compare_arg_type(&tk->tp, &old_tk->tp);
556 if (ret) {
557 /* Note that argument starts index = 2 */
558 trace_probe_log_set_index(ret + 1);
559 trace_probe_log_err(0, DIFF_ARG_TYPE);
560 ret = -EEXIST;
561 } else
562 ret = append_trace_kprobe(tk, old_tk);
563 }
564 goto end;
2d5e067e 565 }
61424318
MH
566
567 /* Register new event */
c31ffb3f 568 ret = register_kprobe_event(tk);
2d5e067e 569 if (ret) {
a395d6a7 570 pr_warn("Failed to register probe event(%d)\n", ret);
2d5e067e
MH
571 goto end;
572 }
573
61424318 574 /* Register k*probe */
c31ffb3f 575 ret = __register_trace_kprobe(tk);
59158ec4
MH
576 if (ret == -ENOENT && !trace_kprobe_module_exist(tk)) {
577 pr_warn("This probe might be able to register after target module is loaded. Continue.\n");
578 ret = 0;
579 }
580
61424318 581 if (ret < 0)
c31ffb3f 582 unregister_kprobe_event(tk);
61424318 583 else
6212dd29 584 dyn_event_add(&tk->devent);
61424318 585
413d37d1 586end:
6212dd29 587 mutex_unlock(&event_mutex);
413d37d1
MH
588 return ret;
589}
590
61424318 591/* Module notifier call back, checking event on the module */
c31ffb3f 592static int trace_kprobe_module_callback(struct notifier_block *nb,
61424318
MH
593 unsigned long val, void *data)
594{
595 struct module *mod = data;
6212dd29 596 struct dyn_event *pos;
c31ffb3f 597 struct trace_kprobe *tk;
61424318
MH
598 int ret;
599
600 if (val != MODULE_STATE_COMING)
601 return NOTIFY_DONE;
602
603 /* Update probes on coming module */
6212dd29
MH
604 mutex_lock(&event_mutex);
605 for_each_trace_kprobe(tk, pos) {
c31ffb3f 606 if (trace_kprobe_within_module(tk, mod)) {
02ca1521 607 /* Don't need to check busy - this should have gone. */
c31ffb3f
NK
608 __unregister_trace_kprobe(tk);
609 ret = __register_trace_kprobe(tk);
61424318 610 if (ret)
a395d6a7 611 pr_warn("Failed to re-register probe %s on %s: %d\n",
b55ce203 612 trace_probe_name(&tk->tp),
a395d6a7 613 mod->name, ret);
61424318
MH
614 }
615 }
6212dd29 616 mutex_unlock(&event_mutex);
61424318
MH
617
618 return NOTIFY_DONE;
619}
620
c31ffb3f
NK
621static struct notifier_block trace_kprobe_module_nb = {
622 .notifier_call = trace_kprobe_module_callback,
61424318
MH
623 .priority = 1 /* Invoked after kprobe module callback */
624};
625
fca18a47
NR
626/* Convert certain expected symbols into '_' when generating event names */
627static inline void sanitize_event_name(char *name)
628{
629 while (*name++ != '\0')
630 if (*name == ':' || *name == '.')
631 *name = '_';
632}
633
6212dd29 634static int trace_kprobe_create(int argc, const char *argv[])
413d37d1
MH
635{
636 /*
637 * Argument syntax:
696ced4f
AC
638 * - Add kprobe:
639 * p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
640 * - Add kretprobe:
641 * r[MAXACTIVE][:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
413d37d1 642 * Fetch args:
2e06ff63
MH
643 * $retval : fetch return value
644 * $stack : fetch stack address
645 * $stackN : fetch Nth of stack (N:0-)
35abb67d 646 * $comm : fetch current task comm
413d37d1
MH
647 * @ADDR : fetch memory at ADDR (ADDR should be in kernel)
648 * @SYM[+|-offs] : fetch memory at SYM +|- offs (SYM is a data symbol)
649 * %REG : fetch register REG
93ccae7a 650 * Dereferencing memory fetch:
413d37d1 651 * +|-offs(ARG) : fetch memory at ARG +|- offs address.
eca0d916
MH
652 * Alias name of args:
653 * NAME=FETCHARG : set NAME as alias of FETCHARG.
93ccae7a
MH
654 * Type of args:
655 * FETCHARG:TYPE : use TYPE instead of unsigned long.
413d37d1 656 */
ab105a4f 657 struct trace_kprobe *tk = NULL;
6212dd29
MH
658 int i, len, ret = 0;
659 bool is_return = false;
660 char *symbol = NULL, *tmp = NULL;
661 const char *event = NULL, *group = KPROBE_EVENT_SYSTEM;
696ced4f 662 int maxactive = 0;
c5d343b6 663 long offset = 0;
413d37d1 664 void *addr = NULL;
4a846b44 665 char buf[MAX_EVENT_NAME_LEN];
a1303af5 666 unsigned int flags = TPARG_FL_KERNEL;
413d37d1 667
8b05a3a7
AR
668 switch (argv[0][0]) {
669 case 'r':
3a6b7666 670 is_return = true;
a1303af5 671 flags |= TPARG_FL_RETURN;
8b05a3a7
AR
672 break;
673 case 'p':
674 break;
675 default:
676 return -ECANCELED;
677 }
678 if (argc < 2)
6212dd29 679 return -ECANCELED;
413d37d1 680
ab105a4f
MH
681 trace_probe_log_init("trace_kprobe", argc, argv);
682
696ced4f 683 event = strchr(&argv[0][1], ':');
6212dd29 684 if (event)
696ced4f 685 event++;
6212dd29 686
287c038c
MH
687 if (isdigit(argv[0][1])) {
688 if (!is_return) {
ab105a4f
MH
689 trace_probe_log_err(1, MAXACT_NO_KPROBE);
690 goto parse_error;
287c038c 691 }
6212dd29
MH
692 if (event)
693 len = event - &argv[0][1] - 1;
694 else
695 len = strlen(&argv[0][1]);
ab105a4f
MH
696 if (len > MAX_EVENT_NAME_LEN - 1) {
697 trace_probe_log_err(1, BAD_MAXACT);
698 goto parse_error;
699 }
6212dd29
MH
700 memcpy(buf, &argv[0][1], len);
701 buf[len] = '\0';
702 ret = kstrtouint(buf, 0, &maxactive);
287c038c 703 if (ret || !maxactive) {
ab105a4f
MH
704 trace_probe_log_err(1, BAD_MAXACT);
705 goto parse_error;
696ced4f
AC
706 }
707 /* kretprobes instances are iterated over via a list. The
708 * maximum should stay reasonable.
709 */
710 if (maxactive > KRETPROBE_MAXACTIVE_MAX) {
ab105a4f
MH
711 trace_probe_log_err(1, MAXACT_TOO_BIG);
712 goto parse_error;
696ced4f
AC
713 }
714 }
715
9e52b325
SD
716 /* try to parse an address. if that fails, try to read the
717 * input as a symbol. */
718 if (kstrtoul(argv[1], 0, (unsigned long *)&addr)) {
ab105a4f 719 trace_probe_log_set_index(1);
6212dd29 720 /* Check whether uprobe event specified */
ab105a4f
MH
721 if (strchr(argv[1], '/') && strchr(argv[1], ':')) {
722 ret = -ECANCELED;
723 goto error;
724 }
413d37d1 725 /* a symbol specified */
6212dd29
MH
726 symbol = kstrdup(argv[1], GFP_KERNEL);
727 if (!symbol)
728 return -ENOMEM;
413d37d1 729 /* TODO: support .init module functions */
8ab83f56 730 ret = traceprobe_split_symbol_offset(symbol, &offset);
c5d343b6 731 if (ret || offset < 0 || offset > UINT_MAX) {
ab105a4f
MH
732 trace_probe_log_err(0, BAD_PROBE_ADDR);
733 goto parse_error;
e63cc239 734 }
a1303af5
MH
735 if (kprobe_on_func_entry(NULL, symbol, offset))
736 flags |= TPARG_FL_FENTRY;
737 if (offset && is_return && !(flags & TPARG_FL_FENTRY)) {
ab105a4f
MH
738 trace_probe_log_err(0, BAD_RETPROBE);
739 goto parse_error;
e63cc239 740 }
413d37d1
MH
741 }
742
ab105a4f 743 trace_probe_log_set_index(0);
6212dd29 744 if (event) {
ab105a4f
MH
745 ret = traceprobe_parse_event_name(&event, &group, buf,
746 event - argv[0]);
6212dd29 747 if (ret)
ab105a4f 748 goto parse_error;
6212dd29 749 } else {
4263565d 750 /* Make a new event name */
4263565d 751 if (symbol)
6f3cf440 752 snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_%ld",
4263565d
MH
753 is_return ? 'r' : 'p', symbol, offset);
754 else
6f3cf440 755 snprintf(buf, MAX_EVENT_NAME_LEN, "%c_0x%p",
4263565d 756 is_return ? 'r' : 'p', addr);
fca18a47 757 sanitize_event_name(buf);
4a846b44
MH
758 event = buf;
759 }
6212dd29
MH
760
761 /* setup a probe */
696ced4f 762 tk = alloc_trace_kprobe(group, event, addr, symbol, offset, maxactive,
ab105a4f 763 argc - 2, is_return);
c31ffb3f 764 if (IS_ERR(tk)) {
6212dd29 765 ret = PTR_ERR(tk);
ab105a4f 766 /* This must return -ENOMEM, else there is a bug */
a039480e 767 WARN_ON_ONCE(ret != -ENOMEM);
ab105a4f 768 goto out; /* We know tk is not allocated */
e63cc239 769 }
ab105a4f 770 argc -= 2; argv += 2;
413d37d1 771
413d37d1 772 /* parse arguments */
a82378d8 773 for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
6212dd29
MH
774 tmp = kstrdup(argv[i], GFP_KERNEL);
775 if (!tmp) {
ba8665d7 776 ret = -ENOMEM;
413d37d1
MH
777 goto error;
778 }
da34634f 779
ab105a4f 780 trace_probe_log_set_index(i + 2);
6212dd29
MH
781 ret = traceprobe_parse_probe_arg(&tk->tp, i, tmp, flags);
782 kfree(tmp);
d00bbea9 783 if (ret)
ab105a4f 784 goto error; /* This can be -ENOMEM */
413d37d1 785 }
413d37d1 786
f730e0f2
MH
787 ret = traceprobe_set_print_fmt(&tk->tp, is_return);
788 if (ret < 0)
789 goto error;
790
c31ffb3f 791 ret = register_trace_kprobe(tk);
ab105a4f
MH
792 if (ret) {
793 trace_probe_log_set_index(1);
794 if (ret == -EILSEQ)
795 trace_probe_log_err(0, BAD_INSN_BNDRY);
796 else if (ret == -ENOENT)
797 trace_probe_log_err(0, BAD_PROBE_ADDR);
ca89bc07 798 else if (ret != -ENOMEM && ret != -EEXIST)
ab105a4f 799 trace_probe_log_err(0, FAIL_REG_PROBE);
413d37d1 800 goto error;
ab105a4f
MH
801 }
802
6212dd29 803out:
ab105a4f 804 trace_probe_log_clear();
6212dd29
MH
805 kfree(symbol);
806 return ret;
413d37d1 807
ab105a4f
MH
808parse_error:
809 ret = -EINVAL;
413d37d1 810error:
c31ffb3f 811 free_trace_kprobe(tk);
6212dd29 812 goto out;
413d37d1
MH
813}
814
6212dd29 815static int create_or_delete_trace_kprobe(int argc, char **argv)
413d37d1 816{
6212dd29 817 int ret;
02ca1521 818
6212dd29
MH
819 if (argv[0][0] == '-')
820 return dyn_event_release(argc, argv, &trace_kprobe_ops);
413d37d1 821
6212dd29
MH
822 ret = trace_kprobe_create(argc, (const char **)argv);
823 return ret == -ECANCELED ? -EINVAL : ret;
413d37d1
MH
824}
825
6212dd29 826static int trace_kprobe_release(struct dyn_event *ev)
413d37d1 827{
6212dd29
MH
828 struct trace_kprobe *tk = to_trace_kprobe(ev);
829 int ret = unregister_trace_kprobe(tk);
413d37d1 830
6212dd29
MH
831 if (!ret)
832 free_trace_kprobe(tk);
833 return ret;
413d37d1
MH
834}
835
6212dd29 836static int trace_kprobe_show(struct seq_file *m, struct dyn_event *ev)
413d37d1 837{
6212dd29 838 struct trace_kprobe *tk = to_trace_kprobe(ev);
93ccae7a 839 int i;
413d37d1 840
fa6f0cc7 841 seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
b55ce203
MH
842 seq_printf(m, ":%s/%s", trace_probe_group_name(&tk->tp),
843 trace_probe_name(&tk->tp));
413d37d1 844
c31ffb3f
NK
845 if (!tk->symbol)
846 seq_printf(m, " 0x%p", tk->rp.kp.addr);
847 else if (tk->rp.kp.offset)
848 seq_printf(m, " %s+%u", trace_kprobe_symbol(tk),
849 tk->rp.kp.offset);
413d37d1 850 else
c31ffb3f 851 seq_printf(m, " %s", trace_kprobe_symbol(tk));
413d37d1 852
c31ffb3f
NK
853 for (i = 0; i < tk->tp.nr_args; i++)
854 seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
fa6f0cc7 855 seq_putc(m, '\n');
93ccae7a 856
413d37d1
MH
857 return 0;
858}
859
6212dd29
MH
860static int probes_seq_show(struct seq_file *m, void *v)
861{
862 struct dyn_event *ev = v;
863
864 if (!is_trace_kprobe(ev))
865 return 0;
866
867 return trace_kprobe_show(m, ev);
868}
869
413d37d1 870static const struct seq_operations probes_seq_op = {
6212dd29
MH
871 .start = dyn_event_seq_start,
872 .next = dyn_event_seq_next,
873 .stop = dyn_event_seq_stop,
413d37d1
MH
874 .show = probes_seq_show
875};
876
877static int probes_open(struct inode *inode, struct file *file)
878{
02ca1521
MH
879 int ret;
880
881 if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
6212dd29 882 ret = dyn_events_release_all(&trace_kprobe_ops);
02ca1521
MH
883 if (ret < 0)
884 return ret;
885 }
413d37d1
MH
886
887 return seq_open(file, &probes_seq_op);
888}
889
413d37d1
MH
890static ssize_t probes_write(struct file *file, const char __user *buffer,
891 size_t count, loff_t *ppos)
892{
7e465baa 893 return trace_parse_run_command(file, buffer, count, ppos,
6212dd29 894 create_or_delete_trace_kprobe);
413d37d1
MH
895}
896
897static const struct file_operations kprobe_events_ops = {
898 .owner = THIS_MODULE,
899 .open = probes_open,
900 .read = seq_read,
901 .llseek = seq_lseek,
902 .release = seq_release,
903 .write = probes_write,
904};
905
cd7e7bd5
MH
906/* Probes profiling interfaces */
907static int probes_profile_seq_show(struct seq_file *m, void *v)
908{
6212dd29
MH
909 struct dyn_event *ev = v;
910 struct trace_kprobe *tk;
cd7e7bd5 911
6212dd29
MH
912 if (!is_trace_kprobe(ev))
913 return 0;
cd7e7bd5 914
6212dd29 915 tk = to_trace_kprobe(ev);
de7b2973 916 seq_printf(m, " %-44s %15lu %15lu\n",
b55ce203 917 trace_probe_name(&tk->tp),
f18f97ac 918 trace_kprobe_nhit(tk),
c31ffb3f 919 tk->rp.kp.nmissed);
cd7e7bd5
MH
920
921 return 0;
922}
923
924static const struct seq_operations profile_seq_op = {
6212dd29
MH
925 .start = dyn_event_seq_start,
926 .next = dyn_event_seq_next,
927 .stop = dyn_event_seq_stop,
cd7e7bd5
MH
928 .show = probes_profile_seq_show
929};
930
931static int profile_open(struct inode *inode, struct file *file)
932{
933 return seq_open(file, &profile_seq_op);
934}
935
936static const struct file_operations kprobe_profile_ops = {
937 .owner = THIS_MODULE,
938 .open = profile_open,
939 .read = seq_read,
940 .llseek = seq_lseek,
941 .release = seq_release,
942};
943
53305928
MH
944/* Kprobe specific fetch functions */
945
946/* Return the length of string -- including null terminal byte */
9178412d
MH
947static nokprobe_inline int
948fetch_store_strlen(unsigned long addr)
53305928 949{
53305928
MH
950 int ret, len = 0;
951 u8 c;
952
53305928 953 do {
49ef5f45 954 ret = probe_kernel_read(&c, (u8 *)addr + len, 1);
53305928
MH
955 len++;
956 } while (c && ret == 0 && len < MAX_STRING_SIZE);
957
9178412d 958 return (ret < 0) ? ret : len;
53305928
MH
959}
960
88903c46
MH
961/* Return the length of string -- including null terminal byte */
962static nokprobe_inline int
963fetch_store_strlen_user(unsigned long addr)
964{
965 const void __user *uaddr = (__force const void __user *)addr;
966
967 return strnlen_unsafe_user(uaddr, MAX_STRING_SIZE);
968}
969
53305928
MH
970/*
971 * Fetch a null-terminated string. Caller MUST set *(u32 *)buf with max
972 * length and relative data location.
973 */
9178412d
MH
974static nokprobe_inline int
975fetch_store_string(unsigned long addr, void *dest, void *base)
53305928 976{
9178412d 977 int maxlen = get_loc_len(*(u32 *)dest);
88903c46 978 void *__dest;
53305928
MH
979 long ret;
980
9178412d
MH
981 if (unlikely(!maxlen))
982 return -ENOMEM;
88903c46
MH
983
984 __dest = get_loc_data(dest, base);
985
53305928
MH
986 /*
987 * Try to get string again, since the string can be changed while
988 * probing.
989 */
88903c46
MH
990 ret = strncpy_from_unsafe(__dest, (void *)addr, maxlen);
991 if (ret >= 0)
992 *(u32 *)dest = make_data_loc(ret, __dest - base);
993
994 return ret;
995}
53305928 996
88903c46
MH
997/*
998 * Fetch a null-terminated string from user. Caller MUST set *(u32 *)buf
999 * with max length and relative data location.
1000 */
1001static nokprobe_inline int
1002fetch_store_string_user(unsigned long addr, void *dest, void *base)
1003{
1004 const void __user *uaddr = (__force const void __user *)addr;
1005 int maxlen = get_loc_len(*(u32 *)dest);
1006 void *__dest;
1007 long ret;
1008
1009 if (unlikely(!maxlen))
1010 return -ENOMEM;
1011
1012 __dest = get_loc_data(dest, base);
1013
1014 ret = strncpy_from_unsafe_user(__dest, uaddr, maxlen);
9178412d 1015 if (ret >= 0)
88903c46
MH
1016 *(u32 *)dest = make_data_loc(ret, __dest - base);
1017
9178412d 1018 return ret;
53305928
MH
1019}
1020
9b960a38
MH
1021static nokprobe_inline int
1022probe_mem_read(void *dest, void *src, size_t size)
1023{
1024 return probe_kernel_read(dest, src, size);
1025}
1026
e65f7ae7
MH
1027static nokprobe_inline int
1028probe_mem_read_user(void *dest, void *src, size_t size)
1029{
539b75b2
MH
1030 const void __user *uaddr = (__force const void __user *)src;
1031
1032 return probe_user_read(dest, uaddr, size);
e65f7ae7
MH
1033}
1034
53305928
MH
1035/* Note that we don't verify it, since the code does not come from user space */
1036static int
1037process_fetch_insn(struct fetch_insn *code, struct pt_regs *regs, void *dest,
9178412d 1038 void *base)
53305928
MH
1039{
1040 unsigned long val;
53305928 1041
a6682814 1042retry:
53305928
MH
1043 /* 1st stage: get value from context */
1044 switch (code->op) {
1045 case FETCH_OP_REG:
1046 val = regs_get_register(regs, code->param);
1047 break;
1048 case FETCH_OP_STACK:
1049 val = regs_get_kernel_stack_nth(regs, code->param);
1050 break;
1051 case FETCH_OP_STACKP:
1052 val = kernel_stack_pointer(regs);
1053 break;
1054 case FETCH_OP_RETVAL:
1055 val = regs_return_value(regs);
1056 break;
1057 case FETCH_OP_IMM:
1058 val = code->immediate;
1059 break;
1060 case FETCH_OP_COMM:
1061 val = (unsigned long)current->comm;
1062 break;
a1303af5
MH
1063#ifdef CONFIG_HAVE_FUNCTION_ARG_ACCESS_API
1064 case FETCH_OP_ARG:
1065 val = regs_get_kernel_argument(regs, code->param);
1066 break;
1067#endif
a6682814
MH
1068 case FETCH_NOP_SYMBOL: /* Ignore a place holder */
1069 code++;
1070 goto retry;
53305928
MH
1071 default:
1072 return -EILSEQ;
1073 }
1074 code++;
1075
9b960a38 1076 return process_fetch_insn_bottom(code, val, dest, base);
53305928
MH
1077}
1078NOKPROBE_SYMBOL(process_fetch_insn)
1079
413d37d1 1080/* Kprobe handler */
3da0f180 1081static nokprobe_inline void
c31ffb3f 1082__kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
7f1d2f82 1083 struct trace_event_file *trace_file)
413d37d1 1084{
93ccae7a 1085 struct kprobe_trace_entry_head *entry;
413d37d1 1086 struct ring_buffer_event *event;
8f8ffe24 1087 struct ring_buffer *buffer;
e09c8614 1088 int size, dsize, pc;
413d37d1 1089 unsigned long irq_flags;
e3dc9f89 1090 struct trace_event_call *call = trace_probe_event_call(&tk->tp);
413d37d1 1091
7f1d2f82 1092 WARN_ON(call != trace_file->event_call);
41a7dd42 1093
09a5059a 1094 if (trace_trigger_soft_disabled(trace_file))
13a1e4ae 1095 return;
b8820084 1096
413d37d1
MH
1097 local_save_flags(irq_flags);
1098 pc = preempt_count();
1099
c31ffb3f
NK
1100 dsize = __get_data_size(&tk->tp, regs);
1101 size = sizeof(*entry) + tk->tp.size + dsize;
413d37d1 1102
7f1d2f82 1103 event = trace_event_buffer_lock_reserve(&buffer, trace_file,
41a7dd42
MH
1104 call->event.type,
1105 size, irq_flags, pc);
413d37d1 1106 if (!event)
1e12a4a7 1107 return;
413d37d1
MH
1108
1109 entry = ring_buffer_event_data(event);
c31ffb3f 1110 entry->ip = (unsigned long)tk->rp.kp.addr;
9178412d 1111 store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);
413d37d1 1112
7f1d2f82 1113 event_trigger_unlock_commit_regs(trace_file, buffer, event,
13a1e4ae 1114 entry, irq_flags, pc, regs);
413d37d1
MH
1115}
1116
3da0f180 1117static void
c31ffb3f 1118kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs)
41a7dd42 1119{
b04d52e3 1120 struct event_file_link *link;
41a7dd42 1121
b5f935ee 1122 trace_probe_for_each_link_rcu(link, &tk->tp)
c31ffb3f 1123 __kprobe_trace_func(tk, regs, link->file);
41a7dd42 1124}
3da0f180 1125NOKPROBE_SYMBOL(kprobe_trace_func);
41a7dd42 1126
413d37d1 1127/* Kretprobe handler */
3da0f180 1128static nokprobe_inline void
c31ffb3f 1129__kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
41a7dd42 1130 struct pt_regs *regs,
7f1d2f82 1131 struct trace_event_file *trace_file)
413d37d1 1132{
93ccae7a 1133 struct kretprobe_trace_entry_head *entry;
413d37d1 1134 struct ring_buffer_event *event;
8f8ffe24 1135 struct ring_buffer *buffer;
e09c8614 1136 int size, pc, dsize;
413d37d1 1137 unsigned long irq_flags;
e3dc9f89 1138 struct trace_event_call *call = trace_probe_event_call(&tk->tp);
413d37d1 1139
7f1d2f82 1140 WARN_ON(call != trace_file->event_call);
41a7dd42 1141
09a5059a 1142 if (trace_trigger_soft_disabled(trace_file))
13a1e4ae 1143 return;
b8820084 1144
413d37d1
MH
1145 local_save_flags(irq_flags);
1146 pc = preempt_count();
1147
c31ffb3f
NK
1148 dsize = __get_data_size(&tk->tp, regs);
1149 size = sizeof(*entry) + tk->tp.size + dsize;
413d37d1 1150
7f1d2f82 1151 event = trace_event_buffer_lock_reserve(&buffer, trace_file,
41a7dd42
MH
1152 call->event.type,
1153 size, irq_flags, pc);
413d37d1 1154 if (!event)
1e12a4a7 1155 return;
413d37d1
MH
1156
1157 entry = ring_buffer_event_data(event);
c31ffb3f 1158 entry->func = (unsigned long)tk->rp.kp.addr;
413d37d1 1159 entry->ret_ip = (unsigned long)ri->ret_addr;
9178412d 1160 store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);
413d37d1 1161
7f1d2f82 1162 event_trigger_unlock_commit_regs(trace_file, buffer, event,
13a1e4ae 1163 entry, irq_flags, pc, regs);
413d37d1
MH
1164}
1165
3da0f180 1166static void
c31ffb3f 1167kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
41a7dd42
MH
1168 struct pt_regs *regs)
1169{
b04d52e3 1170 struct event_file_link *link;
41a7dd42 1171
b5f935ee 1172 trace_probe_for_each_link_rcu(link, &tk->tp)
c31ffb3f 1173 __kretprobe_trace_func(tk, ri, regs, link->file);
41a7dd42 1174}
3da0f180 1175NOKPROBE_SYMBOL(kretprobe_trace_func);
41a7dd42 1176
413d37d1 1177/* Event entry printers */
b62fdd97 1178static enum print_line_t
a9a57763
SR
1179print_kprobe_event(struct trace_iterator *iter, int flags,
1180 struct trace_event *event)
413d37d1 1181{
93ccae7a 1182 struct kprobe_trace_entry_head *field;
413d37d1 1183 struct trace_seq *s = &iter->seq;
eca0d916 1184 struct trace_probe *tp;
413d37d1 1185
93ccae7a 1186 field = (struct kprobe_trace_entry_head *)iter->ent;
60d53e2c
MH
1187 tp = trace_probe_primary_from_call(
1188 container_of(event, struct trace_event_call, event));
1189 if (WARN_ON_ONCE(!tp))
1190 goto out;
413d37d1 1191
b55ce203 1192 trace_seq_printf(s, "%s: (", trace_probe_name(tp));
6e9f23d1 1193
413d37d1 1194 if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET))
85224da0 1195 goto out;
413d37d1 1196
85224da0 1197 trace_seq_putc(s, ')');
413d37d1 1198
56de7630
MH
1199 if (print_probe_args(s, tp->args, tp->nr_args,
1200 (u8 *)&field[1], field) < 0)
1201 goto out;
413d37d1 1202
85224da0
SRRH
1203 trace_seq_putc(s, '\n');
1204 out:
1205 return trace_handle_return(s);
413d37d1
MH
1206}
1207
b62fdd97 1208static enum print_line_t
a9a57763
SR
1209print_kretprobe_event(struct trace_iterator *iter, int flags,
1210 struct trace_event *event)
413d37d1 1211{
93ccae7a 1212 struct kretprobe_trace_entry_head *field;
413d37d1 1213 struct trace_seq *s = &iter->seq;
eca0d916 1214 struct trace_probe *tp;
413d37d1 1215
93ccae7a 1216 field = (struct kretprobe_trace_entry_head *)iter->ent;
60d53e2c
MH
1217 tp = trace_probe_primary_from_call(
1218 container_of(event, struct trace_event_call, event));
1219 if (WARN_ON_ONCE(!tp))
1220 goto out;
413d37d1 1221
b55ce203 1222 trace_seq_printf(s, "%s: (", trace_probe_name(tp));
6e9f23d1 1223
413d37d1 1224 if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
85224da0 1225 goto out;
413d37d1 1226
85224da0 1227 trace_seq_puts(s, " <- ");
413d37d1
MH
1228
1229 if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER_SYM_OFFSET))
85224da0 1230 goto out;
413d37d1 1231
85224da0 1232 trace_seq_putc(s, ')');
413d37d1 1233
56de7630
MH
1234 if (print_probe_args(s, tp->args, tp->nr_args,
1235 (u8 *)&field[1], field) < 0)
1236 goto out;
413d37d1 1237
85224da0 1238 trace_seq_putc(s, '\n');
413d37d1 1239
85224da0
SRRH
1240 out:
1241 return trace_handle_return(s);
413d37d1
MH
1242}
1243
413d37d1 1244
2425bcb9 1245static int kprobe_event_define_fields(struct trace_event_call *event_call)
413d37d1 1246{
eeb07b06 1247 int ret;
93ccae7a 1248 struct kprobe_trace_entry_head field;
60d53e2c
MH
1249 struct trace_probe *tp;
1250
1251 tp = trace_probe_primary_from_call(event_call);
1252 if (WARN_ON_ONCE(!tp))
1253 return -ENOENT;
413d37d1 1254
a703d946 1255 DEFINE_FIELD(unsigned long, ip, FIELD_STRING_IP, 0);
c31ffb3f 1256
60d53e2c 1257 return traceprobe_define_arg_fields(event_call, sizeof(field), tp);
413d37d1
MH
1258}
1259
2425bcb9 1260static int kretprobe_event_define_fields(struct trace_event_call *event_call)
413d37d1 1261{
eeb07b06 1262 int ret;
93ccae7a 1263 struct kretprobe_trace_entry_head field;
60d53e2c
MH
1264 struct trace_probe *tp;
1265
1266 tp = trace_probe_primary_from_call(event_call);
1267 if (WARN_ON_ONCE(!tp))
1268 return -ENOENT;
413d37d1 1269
a703d946
MH
1270 DEFINE_FIELD(unsigned long, func, FIELD_STRING_FUNC, 0);
1271 DEFINE_FIELD(unsigned long, ret_ip, FIELD_STRING_RETIP, 0);
c31ffb3f 1272
60d53e2c 1273 return traceprobe_define_arg_fields(event_call, sizeof(field), tp);
413d37d1
MH
1274}
1275
07b139c8 1276#ifdef CONFIG_PERF_EVENTS
e08d1c65
MH
1277
1278/* Kprobe profile handler */
9802d865 1279static int
c31ffb3f 1280kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs)
e08d1c65 1281{
e3dc9f89 1282 struct trace_event_call *call = trace_probe_event_call(&tk->tp);
93ccae7a 1283 struct kprobe_trace_entry_head *entry;
1c024eca 1284 struct hlist_head *head;
e09c8614 1285 int size, __size, dsize;
4ed7c92d 1286 int rctx;
e08d1c65 1287
9802d865 1288 if (bpf_prog_array_valid(call)) {
66665ad2 1289 unsigned long orig_ip = instruction_pointer(regs);
9802d865
JB
1290 int ret;
1291
1292 ret = trace_call_bpf(call, regs);
1293
1294 /*
1295 * We need to check and see if we modified the pc of the
cce188bd
MH
1296 * pt_regs, and if so return 1 so that we don't do the
1297 * single stepping.
9802d865 1298 */
cce188bd 1299 if (orig_ip != instruction_pointer(regs))
9802d865 1300 return 1;
9802d865
JB
1301 if (!ret)
1302 return 0;
1303 }
2541517c 1304
288e984e
ON
1305 head = this_cpu_ptr(call->perf_events);
1306 if (hlist_empty(head))
9802d865 1307 return 0;
288e984e 1308
c31ffb3f
NK
1309 dsize = __get_data_size(&tk->tp, regs);
1310 __size = sizeof(*entry) + tk->tp.size + dsize;
74ebb63e
MH
1311 size = ALIGN(__size + sizeof(u32), sizeof(u64));
1312 size -= sizeof(u32);
ce71b9df 1313
1e1dcd93 1314 entry = perf_trace_buf_alloc(size, NULL, &rctx);
430ad5a6 1315 if (!entry)
9802d865 1316 return 0;
a1a138d0 1317
c31ffb3f 1318 entry->ip = (unsigned long)tk->rp.kp.addr;
e09c8614 1319 memset(&entry[1], 0, dsize);
9178412d 1320 store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);
1e1dcd93 1321 perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
8fd0fbbe 1322 head, NULL);
9802d865 1323 return 0;
e08d1c65 1324}
3da0f180 1325NOKPROBE_SYMBOL(kprobe_perf_func);
e08d1c65
MH
1326
1327/* Kretprobe profile handler */
3da0f180 1328static void
c31ffb3f 1329kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
2b106aab 1330 struct pt_regs *regs)
e08d1c65 1331{
e3dc9f89 1332 struct trace_event_call *call = trace_probe_event_call(&tk->tp);
93ccae7a 1333 struct kretprobe_trace_entry_head *entry;
1c024eca 1334 struct hlist_head *head;
e09c8614 1335 int size, __size, dsize;
4ed7c92d 1336 int rctx;
e08d1c65 1337
e87c6bc3 1338 if (bpf_prog_array_valid(call) && !trace_call_bpf(call, regs))
2541517c
AS
1339 return;
1340
288e984e
ON
1341 head = this_cpu_ptr(call->perf_events);
1342 if (hlist_empty(head))
1343 return;
1344
c31ffb3f
NK
1345 dsize = __get_data_size(&tk->tp, regs);
1346 __size = sizeof(*entry) + tk->tp.size + dsize;
74ebb63e
MH
1347 size = ALIGN(__size + sizeof(u32), sizeof(u64));
1348 size -= sizeof(u32);
444a2a3b 1349
1e1dcd93 1350 entry = perf_trace_buf_alloc(size, NULL, &rctx);
430ad5a6 1351 if (!entry)
1e12a4a7 1352 return;
e08d1c65 1353
c31ffb3f 1354 entry->func = (unsigned long)tk->rp.kp.addr;
a1a138d0 1355 entry->ret_ip = (unsigned long)ri->ret_addr;
9178412d 1356 store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);
1e1dcd93 1357 perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
8fd0fbbe 1358 head, NULL);
e08d1c65 1359}
3da0f180 1360NOKPROBE_SYMBOL(kretprobe_perf_func);
41bdc4b4
YS
1361
1362int bpf_get_kprobe_info(const struct perf_event *event, u32 *fd_type,
1363 const char **symbol, u64 *probe_offset,
1364 u64 *probe_addr, bool perf_type_tracepoint)
1365{
1366 const char *pevent = trace_event_name(event->tp_event);
1367 const char *group = event->tp_event->class->system;
1368 struct trace_kprobe *tk;
1369
1370 if (perf_type_tracepoint)
1371 tk = find_trace_kprobe(pevent, group);
1372 else
1373 tk = event->tp_event->data;
1374 if (!tk)
1375 return -EINVAL;
1376
1377 *fd_type = trace_kprobe_is_return(tk) ? BPF_FD_TYPE_KRETPROBE
1378 : BPF_FD_TYPE_KPROBE;
1379 if (tk->symbol) {
1380 *symbol = tk->symbol;
1381 *probe_offset = tk->rp.kp.offset;
1382 *probe_addr = 0;
1383 } else {
1384 *symbol = NULL;
1385 *probe_offset = 0;
1386 *probe_addr = (unsigned long)tk->rp.kp.addr;
1387 }
1388 return 0;
1389}
07b139c8 1390#endif /* CONFIG_PERF_EVENTS */
50d78056 1391
3fe3d619
ON
1392/*
1393 * called by perf_trace_init() or __ftrace_set_clr_event() under event_mutex.
1394 *
1395 * kprobe_trace_self_tests_init() does enable_trace_probe/disable_trace_probe
1396 * lockless, but we can't race with this __init function.
1397 */
2425bcb9 1398static int kprobe_register(struct trace_event_call *event,
fbc1963d 1399 enum trace_reg type, void *data)
2239291a 1400{
7f1d2f82 1401 struct trace_event_file *file = data;
1538f888 1402
2239291a
SR
1403 switch (type) {
1404 case TRACE_REG_REGISTER:
60d53e2c 1405 return enable_trace_kprobe(event, file);
2239291a 1406 case TRACE_REG_UNREGISTER:
60d53e2c 1407 return disable_trace_kprobe(event, file);
2239291a
SR
1408
1409#ifdef CONFIG_PERF_EVENTS
1410 case TRACE_REG_PERF_REGISTER:
60d53e2c 1411 return enable_trace_kprobe(event, NULL);
2239291a 1412 case TRACE_REG_PERF_UNREGISTER:
60d53e2c 1413 return disable_trace_kprobe(event, NULL);
ceec0b6f
JO
1414 case TRACE_REG_PERF_OPEN:
1415 case TRACE_REG_PERF_CLOSE:
489c75c3
JO
1416 case TRACE_REG_PERF_ADD:
1417 case TRACE_REG_PERF_DEL:
ceec0b6f 1418 return 0;
2239291a
SR
1419#endif
1420 }
1421 return 0;
1422}
50d78056 1423
3da0f180 1424static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs)
50d78056 1425{
c31ffb3f 1426 struct trace_kprobe *tk = container_of(kp, struct trace_kprobe, rp.kp);
9802d865 1427 int ret = 0;
e08d1c65 1428
a7636d9e 1429 raw_cpu_inc(*tk->nhit);
48182bd2 1430
747774d6 1431 if (trace_probe_test_flag(&tk->tp, TP_FLAG_TRACE))
c31ffb3f 1432 kprobe_trace_func(tk, regs);
07b139c8 1433#ifdef CONFIG_PERF_EVENTS
747774d6 1434 if (trace_probe_test_flag(&tk->tp, TP_FLAG_PROFILE))
9802d865 1435 ret = kprobe_perf_func(tk, regs);
07b139c8 1436#endif
9802d865 1437 return ret;
50d78056 1438}
3da0f180 1439NOKPROBE_SYMBOL(kprobe_dispatcher);
50d78056 1440
3da0f180
MH
1441static int
1442kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
50d78056 1443{
c31ffb3f 1444 struct trace_kprobe *tk = container_of(ri->rp, struct trace_kprobe, rp);
50d78056 1445
a7636d9e 1446 raw_cpu_inc(*tk->nhit);
48182bd2 1447
747774d6 1448 if (trace_probe_test_flag(&tk->tp, TP_FLAG_TRACE))
c31ffb3f 1449 kretprobe_trace_func(tk, ri, regs);
07b139c8 1450#ifdef CONFIG_PERF_EVENTS
747774d6 1451 if (trace_probe_test_flag(&tk->tp, TP_FLAG_PROFILE))
c31ffb3f 1452 kretprobe_perf_func(tk, ri, regs);
07b139c8 1453#endif
50d78056
MH
1454 return 0; /* We don't tweek kernel, so just return 0 */
1455}
3da0f180 1456NOKPROBE_SYMBOL(kretprobe_dispatcher);
e08d1c65 1457
a9a57763
SR
1458static struct trace_event_functions kretprobe_funcs = {
1459 .trace = print_kretprobe_event
1460};
1461
1462static struct trace_event_functions kprobe_funcs = {
1463 .trace = print_kprobe_event
1464};
1465
e3dc9f89 1466static inline void init_trace_event_call(struct trace_kprobe *tk)
413d37d1 1467{
e3dc9f89
MH
1468 struct trace_event_call *call = trace_probe_event_call(&tk->tp);
1469
c31ffb3f 1470 if (trace_kprobe_is_return(tk)) {
80decc70 1471 call->event.funcs = &kretprobe_funcs;
2e33af02 1472 call->class->define_fields = kretprobe_event_define_fields;
413d37d1 1473 } else {
80decc70 1474 call->event.funcs = &kprobe_funcs;
2e33af02 1475 call->class->define_fields = kprobe_event_define_fields;
413d37d1 1476 }
e12f03d7
SL
1477
1478 call->flags = TRACE_EVENT_FL_KPROBE;
1479 call->class->reg = kprobe_register;
e12f03d7
SL
1480}
1481
1482static int register_kprobe_event(struct trace_kprobe *tk)
1483{
e3dc9f89 1484 init_trace_event_call(tk);
f730e0f2 1485
46e5376d 1486 return trace_probe_register_event_call(&tk->tp);
413d37d1
MH
1487}
1488
c31ffb3f 1489static int unregister_kprobe_event(struct trace_kprobe *tk)
413d37d1 1490{
46e5376d 1491 return trace_probe_unregister_event_call(&tk->tp);
413d37d1
MH
1492}
1493
e12f03d7
SL
1494#ifdef CONFIG_PERF_EVENTS
1495/* create a trace_kprobe, but don't add it to global lists */
1496struct trace_event_call *
1497create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
1498 bool is_return)
1499{
1500 struct trace_kprobe *tk;
1501 int ret;
1502 char *event;
1503
1504 /*
6212dd29 1505 * local trace_kprobes are not added to dyn_event, so they are never
e12f03d7
SL
1506 * searched in find_trace_kprobe(). Therefore, there is no concern of
1507 * duplicated name here.
1508 */
1509 event = func ? func : "DUMMY_EVENT";
1510
1511 tk = alloc_trace_kprobe(KPROBE_EVENT_SYSTEM, event, (void *)addr, func,
1512 offs, 0 /* maxactive */, 0 /* nargs */,
1513 is_return);
1514
1515 if (IS_ERR(tk)) {
1516 pr_info("Failed to allocate trace_probe.(%d)\n",
1517 (int)PTR_ERR(tk));
1518 return ERR_CAST(tk);
1519 }
1520
e3dc9f89 1521 init_trace_event_call(tk);
e12f03d7 1522
0a46c854 1523 if (traceprobe_set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0) {
e12f03d7
SL
1524 ret = -ENOMEM;
1525 goto error;
1526 }
1527
1528 ret = __register_trace_kprobe(tk);
f730e0f2 1529 if (ret < 0)
e12f03d7
SL
1530 goto error;
1531
e3dc9f89 1532 return trace_probe_event_call(&tk->tp);
e12f03d7
SL
1533error:
1534 free_trace_kprobe(tk);
1535 return ERR_PTR(ret);
1536}
1537
1538void destroy_local_trace_kprobe(struct trace_event_call *event_call)
1539{
1540 struct trace_kprobe *tk;
1541
60d53e2c
MH
1542 tk = trace_kprobe_primary_from_call(event_call);
1543 if (unlikely(!tk))
1544 return;
e12f03d7
SL
1545
1546 if (trace_probe_is_enabled(&tk->tp)) {
1547 WARN_ON(1);
1548 return;
1549 }
1550
1551 __unregister_trace_kprobe(tk);
0fc8c358 1552
e12f03d7
SL
1553 free_trace_kprobe(tk);
1554}
1555#endif /* CONFIG_PERF_EVENTS */
1556
970988e1
MH
1557static __init void enable_boot_kprobe_events(void)
1558{
1559 struct trace_array *tr = top_trace_array();
1560 struct trace_event_file *file;
1561 struct trace_kprobe *tk;
1562 struct dyn_event *pos;
1563
1564 mutex_lock(&event_mutex);
1565 for_each_trace_kprobe(tk, pos) {
1566 list_for_each_entry(file, &tr->events, list)
e3dc9f89 1567 if (file->event_call == trace_probe_event_call(&tk->tp))
970988e1
MH
1568 trace_event_enable_disable(file, 1, 0);
1569 }
1570 mutex_unlock(&event_mutex);
1571}
1572
1573static __init void setup_boot_kprobe_events(void)
1574{
1575 char *p, *cmd = kprobe_boot_events_buf;
1576 int ret;
1577
1578 strreplace(kprobe_boot_events_buf, ',', ' ');
1579
1580 while (cmd && *cmd != '\0') {
1581 p = strchr(cmd, ';');
1582 if (p)
1583 *p++ = '\0';
1584
1585 ret = trace_run_command(cmd, create_or_delete_trace_kprobe);
1586 if (ret)
1587 pr_warn("Failed to add event(%d): %s\n", ret, cmd);
b6399cc7
SRV
1588 else
1589 kprobe_boot_events_enabled = true;
970988e1
MH
1590
1591 cmd = p;
1592 }
1593
1594 enable_boot_kprobe_events();
1595}
1596
8434dc93 1597/* Make a tracefs interface for controlling probe points */
413d37d1
MH
1598static __init int init_kprobe_trace(void)
1599{
1600 struct dentry *d_tracer;
1601 struct dentry *entry;
6212dd29
MH
1602 int ret;
1603
1604 ret = dyn_event_register(&trace_kprobe_ops);
1605 if (ret)
1606 return ret;
413d37d1 1607
c31ffb3f 1608 if (register_module_notifier(&trace_kprobe_module_nb))
61424318
MH
1609 return -EINVAL;
1610
413d37d1 1611 d_tracer = tracing_init_dentry();
14a5ae40 1612 if (IS_ERR(d_tracer))
413d37d1
MH
1613 return 0;
1614
8434dc93 1615 entry = tracefs_create_file("kprobe_events", 0644, d_tracer,
413d37d1
MH
1616 NULL, &kprobe_events_ops);
1617
cd7e7bd5 1618 /* Event list interface */
413d37d1 1619 if (!entry)
a395d6a7 1620 pr_warn("Could not create tracefs 'kprobe_events' entry\n");
cd7e7bd5
MH
1621
1622 /* Profile interface */
8434dc93 1623 entry = tracefs_create_file("kprobe_profile", 0444, d_tracer,
cd7e7bd5
MH
1624 NULL, &kprobe_profile_ops);
1625
1626 if (!entry)
a395d6a7 1627 pr_warn("Could not create tracefs 'kprobe_profile' entry\n");
970988e1
MH
1628
1629 setup_boot_kprobe_events();
1630
413d37d1
MH
1631 return 0;
1632}
1633fs_initcall(init_kprobe_trace);
1634
1635
1636#ifdef CONFIG_FTRACE_STARTUP_TEST
26a346f2 1637static __init struct trace_event_file *
c31ffb3f 1638find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
41a7dd42 1639{
7f1d2f82 1640 struct trace_event_file *file;
41a7dd42
MH
1641
1642 list_for_each_entry(file, &tr->events, list)
e3dc9f89 1643 if (file->event_call == trace_probe_event_call(&tk->tp))
41a7dd42
MH
1644 return file;
1645
1646 return NULL;
1647}
1648
3fe3d619 1649/*
c31ffb3f 1650 * Nobody but us can call enable_trace_kprobe/disable_trace_kprobe at this
3fe3d619
ON
1651 * stage, we can do this lockless.
1652 */
413d37d1
MH
1653static __init int kprobe_trace_self_tests_init(void)
1654{
231e36f4 1655 int ret, warn = 0;
413d37d1 1656 int (*target)(int, int, int, int, int, int);
c31ffb3f 1657 struct trace_kprobe *tk;
7f1d2f82 1658 struct trace_event_file *file;
413d37d1 1659
748ec3a2
YY
1660 if (tracing_is_disabled())
1661 return -ENODEV;
1662
b6399cc7
SRV
1663 if (kprobe_boot_events_enabled) {
1664 pr_info("Skipping kprobe tests due to kprobe_event on cmdline\n");
1665 return 0;
1666 }
1667
413d37d1
MH
1668 target = kprobe_trace_selftest_target;
1669
1670 pr_info("Testing kprobe tracing: ");
1671
6212dd29
MH
1672 ret = trace_run_command("p:testprobe kprobe_trace_selftest_target $stack $stack0 +0($stack)",
1673 create_or_delete_trace_kprobe);
231e36f4 1674 if (WARN_ON_ONCE(ret)) {
41a7dd42 1675 pr_warn("error on probing function entry.\n");
231e36f4
MH
1676 warn++;
1677 } else {
1678 /* Enable trace point */
c31ffb3f
NK
1679 tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
1680 if (WARN_ON_ONCE(tk == NULL)) {
41a7dd42 1681 pr_warn("error on getting new probe.\n");
231e36f4 1682 warn++;
41a7dd42 1683 } else {
c31ffb3f 1684 file = find_trace_probe_file(tk, top_trace_array());
41a7dd42
MH
1685 if (WARN_ON_ONCE(file == NULL)) {
1686 pr_warn("error on getting probe file.\n");
1687 warn++;
1688 } else
60d53e2c
MH
1689 enable_trace_kprobe(
1690 trace_probe_event_call(&tk->tp), file);
41a7dd42 1691 }
231e36f4 1692 }
413d37d1 1693
6212dd29
MH
1694 ret = trace_run_command("r:testprobe2 kprobe_trace_selftest_target $retval",
1695 create_or_delete_trace_kprobe);
231e36f4 1696 if (WARN_ON_ONCE(ret)) {
41a7dd42 1697 pr_warn("error on probing function return.\n");
231e36f4
MH
1698 warn++;
1699 } else {
1700 /* Enable trace point */
c31ffb3f
NK
1701 tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
1702 if (WARN_ON_ONCE(tk == NULL)) {
41a7dd42 1703 pr_warn("error on getting 2nd new probe.\n");
231e36f4 1704 warn++;
41a7dd42 1705 } else {
c31ffb3f 1706 file = find_trace_probe_file(tk, top_trace_array());
41a7dd42
MH
1707 if (WARN_ON_ONCE(file == NULL)) {
1708 pr_warn("error on getting probe file.\n");
1709 warn++;
1710 } else
60d53e2c
MH
1711 enable_trace_kprobe(
1712 trace_probe_event_call(&tk->tp), file);
41a7dd42 1713 }
231e36f4
MH
1714 }
1715
1716 if (warn)
1717 goto end;
413d37d1
MH
1718
1719 ret = target(1, 2, 3, 4, 5, 6);
1720
d4d7ccc8
MN
1721 /*
1722 * Not expecting an error here, the check is only to prevent the
1723 * optimizer from removing the call to target() as otherwise there
1724 * are no side-effects and the call is never performed.
1725 */
1726 if (ret != 21)
1727 warn++;
1728
02ca1521 1729 /* Disable trace points before removing it */
c31ffb3f
NK
1730 tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
1731 if (WARN_ON_ONCE(tk == NULL)) {
41a7dd42 1732 pr_warn("error on getting test probe.\n");
02ca1521 1733 warn++;
41a7dd42 1734 } else {
d4d7ccc8
MN
1735 if (trace_kprobe_nhit(tk) != 1) {
1736 pr_warn("incorrect number of testprobe hits\n");
1737 warn++;
1738 }
1739
c31ffb3f 1740 file = find_trace_probe_file(tk, top_trace_array());
41a7dd42
MH
1741 if (WARN_ON_ONCE(file == NULL)) {
1742 pr_warn("error on getting probe file.\n");
1743 warn++;
1744 } else
60d53e2c
MH
1745 disable_trace_kprobe(
1746 trace_probe_event_call(&tk->tp), file);
41a7dd42 1747 }
02ca1521 1748
c31ffb3f
NK
1749 tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
1750 if (WARN_ON_ONCE(tk == NULL)) {
41a7dd42 1751 pr_warn("error on getting 2nd test probe.\n");
02ca1521 1752 warn++;
41a7dd42 1753 } else {
d4d7ccc8
MN
1754 if (trace_kprobe_nhit(tk) != 1) {
1755 pr_warn("incorrect number of testprobe2 hits\n");
1756 warn++;
1757 }
1758
c31ffb3f 1759 file = find_trace_probe_file(tk, top_trace_array());
41a7dd42
MH
1760 if (WARN_ON_ONCE(file == NULL)) {
1761 pr_warn("error on getting probe file.\n");
1762 warn++;
1763 } else
60d53e2c
MH
1764 disable_trace_kprobe(
1765 trace_probe_event_call(&tk->tp), file);
41a7dd42 1766 }
02ca1521 1767
6212dd29 1768 ret = trace_run_command("-:testprobe", create_or_delete_trace_kprobe);
231e36f4 1769 if (WARN_ON_ONCE(ret)) {
41a7dd42 1770 pr_warn("error on deleting a probe.\n");
231e36f4
MH
1771 warn++;
1772 }
1773
6212dd29 1774 ret = trace_run_command("-:testprobe2", create_or_delete_trace_kprobe);
231e36f4 1775 if (WARN_ON_ONCE(ret)) {
41a7dd42 1776 pr_warn("error on deleting a probe.\n");
231e36f4
MH
1777 warn++;
1778 }
413d37d1 1779
231e36f4 1780end:
6212dd29
MH
1781 ret = dyn_events_release_all(&trace_kprobe_ops);
1782 if (WARN_ON_ONCE(ret)) {
1783 pr_warn("error on cleaning up probes.\n");
1784 warn++;
1785 }
30e7d894
TG
1786 /*
1787 * Wait for the optimizer work to finish. Otherwise it might fiddle
1788 * with probes in already freed __init text.
1789 */
1790 wait_for_kprobe_optimizer();
231e36f4
MH
1791 if (warn)
1792 pr_cont("NG: Some tests are failed. Please check them.\n");
1793 else
1794 pr_cont("OK\n");
413d37d1
MH
1795 return 0;
1796}
1797
1798late_initcall(kprobe_trace_self_tests_init);
1799
1800#endif