GNU Linux-libre 4.9.306-gnu1
[releases.git] / kernel / trace / trace_kprobe.c
1 /*
2  * Kprobes-based tracing events
3  *
4  * Created by Masami Hiramatsu <mhiramat@redhat.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19
20 #include <linux/module.h>
21 #include <linux/uaccess.h>
22
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 __percpu *nhit;
34         const char              *symbol;        /* symbol name */
35         struct trace_probe      tp;
36 };
37
38 #define SIZEOF_TRACE_KPROBE(n)                          \
39         (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         return strncmp(mod->name, name, len) == 0 && name[len] == ':';
69 }
70
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 static int register_kprobe_event(struct trace_kprobe *tk);
77 static int unregister_kprobe_event(struct trace_kprobe *tk);
78
79 static DEFINE_MUTEX(probe_lock);
80 static LIST_HEAD(probe_list);
81
82 static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs);
83 static int kretprobe_dispatcher(struct kretprobe_instance *ri,
84                                 struct pt_regs *regs);
85
86 /* Memory fetching by symbol */
87 struct symbol_cache {
88         char            *symbol;
89         long            offset;
90         unsigned long   addr;
91 };
92
93 unsigned long update_symbol_cache(struct symbol_cache *sc)
94 {
95         sc->addr = (unsigned long)kallsyms_lookup_name(sc->symbol);
96
97         if (sc->addr)
98                 sc->addr += sc->offset;
99
100         return sc->addr;
101 }
102
103 void free_symbol_cache(struct symbol_cache *sc)
104 {
105         kfree(sc->symbol);
106         kfree(sc);
107 }
108
109 struct symbol_cache *alloc_symbol_cache(const char *sym, long offset)
110 {
111         struct symbol_cache *sc;
112
113         if (!sym || strlen(sym) == 0)
114                 return NULL;
115
116         sc = kzalloc(sizeof(struct symbol_cache), GFP_KERNEL);
117         if (!sc)
118                 return NULL;
119
120         sc->symbol = kstrdup(sym, GFP_KERNEL);
121         if (!sc->symbol) {
122                 kfree(sc);
123                 return NULL;
124         }
125         sc->offset = offset;
126         update_symbol_cache(sc);
127
128         return sc;
129 }
130
131 /*
132  * Kprobes-specific fetch functions
133  */
134 #define DEFINE_FETCH_stack(type)                                        \
135 static void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs,          \
136                                           void *offset, void *dest)     \
137 {                                                                       \
138         *(type *)dest = (type)regs_get_kernel_stack_nth(regs,           \
139                                 (unsigned int)((unsigned long)offset)); \
140 }                                                                       \
141 NOKPROBE_SYMBOL(FETCH_FUNC_NAME(stack, type));
142
143 DEFINE_BASIC_FETCH_FUNCS(stack)
144 /* No string on the stack entry */
145 #define fetch_stack_string      NULL
146 #define fetch_stack_string_size NULL
147
148 #define DEFINE_FETCH_memory(type)                                       \
149 static void FETCH_FUNC_NAME(memory, type)(struct pt_regs *regs,         \
150                                           void *addr, void *dest)       \
151 {                                                                       \
152         type retval;                                                    \
153         if (probe_kernel_address(addr, retval))                         \
154                 *(type *)dest = 0;                                      \
155         else                                                            \
156                 *(type *)dest = retval;                                 \
157 }                                                                       \
158 NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, type));
159
160 DEFINE_BASIC_FETCH_FUNCS(memory)
161 /*
162  * Fetch a null-terminated string. Caller MUST set *(u32 *)dest with max
163  * length and relative data location.
164  */
165 static void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
166                                             void *addr, void *dest)
167 {
168         int maxlen = get_rloc_len(*(u32 *)dest);
169         u8 *dst = get_rloc_data(dest);
170         long ret;
171
172         if (!maxlen)
173                 return;
174
175         /*
176          * Try to get string again, since the string can be changed while
177          * probing.
178          */
179         ret = strncpy_from_unsafe(dst, addr, maxlen);
180
181         if (ret < 0) {  /* Failed to fetch string */
182                 dst[0] = '\0';
183                 *(u32 *)dest = make_data_rloc(0, get_rloc_offs(*(u32 *)dest));
184         } 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 static void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
192                                                  void *addr, void *dest)
193 {
194         mm_segment_t old_fs;
195         int ret, len = 0;
196         u8 c;
197
198         old_fs = get_fs();
199         set_fs(KERNEL_DS);
200         pagefault_disable();
201
202         do {
203                 ret = __copy_from_user_inatomic(&c, (u8 *)addr + len, 1);
204                 len++;
205         } while (c && ret == 0 && len < MAX_STRING_SIZE);
206
207         pagefault_enable();
208         set_fs(old_fs);
209
210         if (ret < 0)    /* Failed to check the length */
211                 *(u32 *)dest = 0;
212         else
213                 *(u32 *)dest = len;
214 }
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         struct symbol_cache *sc = data;                                 \
221         if (sc->addr)                                                   \
222                 fetch_memory_##type(regs, (void *)sc->addr, dest);      \
223         else                                                            \
224                 *(type *)dest = 0;                                      \
225 }                                                                       \
226 NOKPROBE_SYMBOL(FETCH_FUNC_NAME(symbol, type));
227
228 DEFINE_BASIC_FETCH_FUNCS(symbol)
229 DEFINE_FETCH_symbol(string)
230 DEFINE_FETCH_symbol(string_size)
231
232 /* kprobes don't support file_offset fetch methods */
233 #define fetch_file_offset_u8            NULL
234 #define fetch_file_offset_u16           NULL
235 #define fetch_file_offset_u32           NULL
236 #define fetch_file_offset_u64           NULL
237 #define fetch_file_offset_string        NULL
238 #define fetch_file_offset_string_size   NULL
239
240 /* Fetch type information table */
241 static const struct fetch_type kprobes_fetch_type_table[] = {
242         /* Special types */
243         [FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
244                                         sizeof(u32), 1, "__data_loc char[]"),
245         [FETCH_TYPE_STRSIZE] = __ASSIGN_FETCH_TYPE("string_size", u32,
246                                         string_size, sizeof(u32), 0, "u32"),
247         /* Basic types */
248         ASSIGN_FETCH_TYPE(u8,  u8,  0),
249         ASSIGN_FETCH_TYPE(u16, u16, 0),
250         ASSIGN_FETCH_TYPE(u32, u32, 0),
251         ASSIGN_FETCH_TYPE(u64, u64, 0),
252         ASSIGN_FETCH_TYPE(s8,  u8,  1),
253         ASSIGN_FETCH_TYPE(s16, u16, 1),
254         ASSIGN_FETCH_TYPE(s32, u32, 1),
255         ASSIGN_FETCH_TYPE(s64, u64, 1),
256         ASSIGN_FETCH_TYPE_ALIAS(x8,  u8,  u8,  0),
257         ASSIGN_FETCH_TYPE_ALIAS(x16, u16, u16, 0),
258         ASSIGN_FETCH_TYPE_ALIAS(x32, u32, u32, 0),
259         ASSIGN_FETCH_TYPE_ALIAS(x64, u64, u64, 0),
260
261         ASSIGN_FETCH_TYPE_END
262 };
263
264 /*
265  * Allocate new trace_probe and initialize it (including kprobes).
266  */
267 static struct trace_kprobe *alloc_trace_kprobe(const char *group,
268                                              const char *event,
269                                              void *addr,
270                                              const char *symbol,
271                                              unsigned long offs,
272                                              int nargs, bool is_return)
273 {
274         struct trace_kprobe *tk;
275         int ret = -ENOMEM;
276
277         tk = kzalloc(SIZEOF_TRACE_KPROBE(nargs), GFP_KERNEL);
278         if (!tk)
279                 return ERR_PTR(ret);
280
281         tk->nhit = alloc_percpu(unsigned long);
282         if (!tk->nhit)
283                 goto error;
284
285         if (symbol) {
286                 tk->symbol = kstrdup(symbol, GFP_KERNEL);
287                 if (!tk->symbol)
288                         goto error;
289                 tk->rp.kp.symbol_name = tk->symbol;
290                 tk->rp.kp.offset = offs;
291         } else
292                 tk->rp.kp.addr = addr;
293
294         if (is_return)
295                 tk->rp.handler = kretprobe_dispatcher;
296         else
297                 tk->rp.kp.pre_handler = kprobe_dispatcher;
298
299         if (!event || !is_good_name(event)) {
300                 ret = -EINVAL;
301                 goto error;
302         }
303
304         tk->tp.call.class = &tk->tp.class;
305         tk->tp.call.name = kstrdup(event, GFP_KERNEL);
306         if (!tk->tp.call.name)
307                 goto error;
308
309         if (!group || !is_good_name(group)) {
310                 ret = -EINVAL;
311                 goto error;
312         }
313
314         tk->tp.class.system = kstrdup(group, GFP_KERNEL);
315         if (!tk->tp.class.system)
316                 goto error;
317
318         INIT_LIST_HEAD(&tk->list);
319         INIT_LIST_HEAD(&tk->tp.files);
320         return tk;
321 error:
322         kfree(tk->tp.call.name);
323         kfree(tk->symbol);
324         free_percpu(tk->nhit);
325         kfree(tk);
326         return ERR_PTR(ret);
327 }
328
329 static void free_trace_kprobe(struct trace_kprobe *tk)
330 {
331         int i;
332
333         for (i = 0; i < tk->tp.nr_args; i++)
334                 traceprobe_free_probe_arg(&tk->tp.args[i]);
335
336         kfree(tk->tp.call.class->system);
337         kfree(tk->tp.call.name);
338         kfree(tk->symbol);
339         free_percpu(tk->nhit);
340         kfree(tk);
341 }
342
343 static struct trace_kprobe *find_trace_kprobe(const char *event,
344                                               const char *group)
345 {
346         struct trace_kprobe *tk;
347
348         list_for_each_entry(tk, &probe_list, list)
349                 if (strcmp(trace_event_name(&tk->tp.call), event) == 0 &&
350                     strcmp(tk->tp.call.class->system, group) == 0)
351                         return tk;
352         return NULL;
353 }
354
355 /*
356  * Enable trace_probe
357  * if the file is NULL, enable "perf" handler, or enable "trace" handler.
358  */
359 static int
360 enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
361 {
362         struct event_file_link *link = NULL;
363         int ret = 0;
364
365         if (file) {
366                 link = kmalloc(sizeof(*link), GFP_KERNEL);
367                 if (!link) {
368                         ret = -ENOMEM;
369                         goto out;
370                 }
371
372                 link->file = file;
373                 list_add_tail_rcu(&link->list, &tk->tp.files);
374
375                 tk->tp.flags |= TP_FLAG_TRACE;
376         } else
377                 tk->tp.flags |= TP_FLAG_PROFILE;
378
379         if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
380                 if (trace_kprobe_is_return(tk))
381                         ret = enable_kretprobe(&tk->rp);
382                 else
383                         ret = enable_kprobe(&tk->rp.kp);
384         }
385
386         if (ret) {
387                 if (file) {
388                         /* Notice the if is true on not WARN() */
389                         if (!WARN_ON_ONCE(!link))
390                                 list_del_rcu(&link->list);
391                         kfree(link);
392                         tk->tp.flags &= ~TP_FLAG_TRACE;
393                 } else {
394                         tk->tp.flags &= ~TP_FLAG_PROFILE;
395                 }
396         }
397  out:
398         return ret;
399 }
400
401 /*
402  * Disable trace_probe
403  * if the file is NULL, disable "perf" handler, or disable "trace" handler.
404  */
405 static int
406 disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
407 {
408         struct event_file_link *link = NULL;
409         int wait = 0;
410         int ret = 0;
411
412         if (file) {
413                 link = find_event_file_link(&tk->tp, file);
414                 if (!link) {
415                         ret = -EINVAL;
416                         goto out;
417                 }
418
419                 list_del_rcu(&link->list);
420                 wait = 1;
421                 if (!list_empty(&tk->tp.files))
422                         goto out;
423
424                 tk->tp.flags &= ~TP_FLAG_TRACE;
425         } else
426                 tk->tp.flags &= ~TP_FLAG_PROFILE;
427
428         if (!trace_probe_is_enabled(&tk->tp) && trace_probe_is_registered(&tk->tp)) {
429                 if (trace_kprobe_is_return(tk))
430                         disable_kretprobe(&tk->rp);
431                 else
432                         disable_kprobe(&tk->rp.kp);
433                 wait = 1;
434         }
435  out:
436         if (wait) {
437                 /*
438                  * Synchronize with kprobe_trace_func/kretprobe_trace_func
439                  * to ensure disabled (all running handlers are finished).
440                  * This is not only for kfree(), but also the caller,
441                  * trace_remove_event_call() supposes it for releasing
442                  * event_call related objects, which will be accessed in
443                  * the kprobe_trace_func/kretprobe_trace_func.
444                  */
445                 synchronize_sched();
446                 kfree(link);    /* Ignored if link == NULL */
447         }
448
449         return ret;
450 }
451
452 /* Internal register function - just handle k*probes and flags */
453 static int __register_trace_kprobe(struct trace_kprobe *tk)
454 {
455         int i, ret;
456
457         if (trace_probe_is_registered(&tk->tp))
458                 return -EINVAL;
459
460         for (i = 0; i < tk->tp.nr_args; i++)
461                 traceprobe_update_arg(&tk->tp.args[i]);
462
463         /* Set/clear disabled flag according to tp->flag */
464         if (trace_probe_is_enabled(&tk->tp))
465                 tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
466         else
467                 tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
468
469         if (trace_kprobe_is_return(tk))
470                 ret = register_kretprobe(&tk->rp);
471         else
472                 ret = register_kprobe(&tk->rp.kp);
473
474         if (ret == 0)
475                 tk->tp.flags |= TP_FLAG_REGISTERED;
476         else {
477                 pr_warn("Could not insert probe at %s+%lu: %d\n",
478                         trace_kprobe_symbol(tk), trace_kprobe_offset(tk), ret);
479                 if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) {
480                         pr_warn("This probe might be able to register after target module is loaded. Continue.\n");
481                         ret = 0;
482                 } else if (ret == -EILSEQ) {
483                         pr_warn("Probing address(0x%p) is not an instruction boundary.\n",
484                                 tk->rp.kp.addr);
485                         ret = -EINVAL;
486                 }
487         }
488
489         return ret;
490 }
491
492 /* Internal unregister function - just handle k*probes and flags */
493 static void __unregister_trace_kprobe(struct trace_kprobe *tk)
494 {
495         if (trace_probe_is_registered(&tk->tp)) {
496                 if (trace_kprobe_is_return(tk))
497                         unregister_kretprobe(&tk->rp);
498                 else
499                         unregister_kprobe(&tk->rp.kp);
500                 tk->tp.flags &= ~TP_FLAG_REGISTERED;
501                 /* Cleanup kprobe for reuse */
502                 if (tk->rp.kp.symbol_name)
503                         tk->rp.kp.addr = NULL;
504         }
505 }
506
507 /* Unregister a trace_probe and probe_event: call with locking probe_lock */
508 static int unregister_trace_kprobe(struct trace_kprobe *tk)
509 {
510         /* Enabled event can not be unregistered */
511         if (trace_probe_is_enabled(&tk->tp))
512                 return -EBUSY;
513
514         /* Will fail if probe is being used by ftrace or perf */
515         if (unregister_kprobe_event(tk))
516                 return -EBUSY;
517
518         __unregister_trace_kprobe(tk);
519         list_del(&tk->list);
520
521         return 0;
522 }
523
524 /* Register a trace_probe and probe_event */
525 static int register_trace_kprobe(struct trace_kprobe *tk)
526 {
527         struct trace_kprobe *old_tk;
528         int ret;
529
530         mutex_lock(&probe_lock);
531
532         /* Delete old (same name) event if exist */
533         old_tk = find_trace_kprobe(trace_event_name(&tk->tp.call),
534                         tk->tp.call.class->system);
535         if (old_tk) {
536                 ret = unregister_trace_kprobe(old_tk);
537                 if (ret < 0)
538                         goto end;
539                 free_trace_kprobe(old_tk);
540         }
541
542         /* Register new event */
543         ret = register_kprobe_event(tk);
544         if (ret) {
545                 pr_warn("Failed to register probe event(%d)\n", ret);
546                 goto end;
547         }
548
549         /* Register k*probe */
550         ret = __register_trace_kprobe(tk);
551         if (ret < 0)
552                 unregister_kprobe_event(tk);
553         else
554                 list_add_tail(&tk->list, &probe_list);
555
556 end:
557         mutex_unlock(&probe_lock);
558         return ret;
559 }
560
561 /* Module notifier call back, checking event on the module */
562 static int trace_kprobe_module_callback(struct notifier_block *nb,
563                                        unsigned long val, void *data)
564 {
565         struct module *mod = data;
566         struct trace_kprobe *tk;
567         int ret;
568
569         if (val != MODULE_STATE_COMING)
570                 return NOTIFY_DONE;
571
572         /* Update probes on coming module */
573         mutex_lock(&probe_lock);
574         list_for_each_entry(tk, &probe_list, list) {
575                 if (trace_kprobe_within_module(tk, mod)) {
576                         /* Don't need to check busy - this should have gone. */
577                         __unregister_trace_kprobe(tk);
578                         ret = __register_trace_kprobe(tk);
579                         if (ret)
580                                 pr_warn("Failed to re-register probe %s on %s: %d\n",
581                                         trace_event_name(&tk->tp.call),
582                                         mod->name, ret);
583                 }
584         }
585         mutex_unlock(&probe_lock);
586
587         return NOTIFY_DONE;
588 }
589
590 static struct notifier_block trace_kprobe_module_nb = {
591         .notifier_call = trace_kprobe_module_callback,
592         .priority = 1   /* Invoked after kprobe module callback */
593 };
594
595 static int create_trace_kprobe(int argc, char **argv)
596 {
597         /*
598          * Argument syntax:
599          *  - Add kprobe: p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
600          *  - Add kretprobe: r[:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
601          * Fetch args:
602          *  $retval     : fetch return value
603          *  $stack      : fetch stack address
604          *  $stackN     : fetch Nth of stack (N:0-)
605          *  $comm       : fetch current task comm
606          *  @ADDR       : fetch memory at ADDR (ADDR should be in kernel)
607          *  @SYM[+|-offs] : fetch memory at SYM +|- offs (SYM is a data symbol)
608          *  %REG        : fetch register REG
609          * Dereferencing memory fetch:
610          *  +|-offs(ARG) : fetch memory at ARG +|- offs address.
611          * Alias name of args:
612          *  NAME=FETCHARG : set NAME as alias of FETCHARG.
613          * Type of args:
614          *  FETCHARG:TYPE : use TYPE instead of unsigned long.
615          */
616         struct trace_kprobe *tk;
617         int i, ret = 0;
618         bool is_return = false, is_delete = false;
619         char *symbol = NULL, *event = NULL, *group = NULL;
620         char *arg;
621         long offset = 0;
622         void *addr = NULL;
623         char buf[MAX_EVENT_NAME_LEN];
624
625         /* argc must be >= 1 */
626         if (argv[0][0] == 'p')
627                 is_return = false;
628         else if (argv[0][0] == 'r')
629                 is_return = true;
630         else if (argv[0][0] == '-')
631                 is_delete = true;
632         else {
633                 pr_info("Probe definition must be started with 'p', 'r' or"
634                         " '-'.\n");
635                 return -EINVAL;
636         }
637
638         if (argv[0][1] == ':') {
639                 event = &argv[0][2];
640                 if (strchr(event, '/')) {
641                         group = event;
642                         event = strchr(group, '/') + 1;
643                         event[-1] = '\0';
644                         if (strlen(group) == 0) {
645                                 pr_info("Group name is not specified\n");
646                                 return -EINVAL;
647                         }
648                 }
649                 if (strlen(event) == 0) {
650                         pr_info("Event name is not specified\n");
651                         return -EINVAL;
652                 }
653         }
654         if (!group)
655                 group = KPROBE_EVENT_SYSTEM;
656
657         if (is_delete) {
658                 if (!event) {
659                         pr_info("Delete command needs an event name.\n");
660                         return -EINVAL;
661                 }
662                 mutex_lock(&probe_lock);
663                 tk = find_trace_kprobe(event, group);
664                 if (!tk) {
665                         mutex_unlock(&probe_lock);
666                         pr_info("Event %s/%s doesn't exist.\n", group, event);
667                         return -ENOENT;
668                 }
669                 /* delete an event */
670                 ret = unregister_trace_kprobe(tk);
671                 if (ret == 0)
672                         free_trace_kprobe(tk);
673                 mutex_unlock(&probe_lock);
674                 return ret;
675         }
676
677         if (argc < 2) {
678                 pr_info("Probe point is not specified.\n");
679                 return -EINVAL;
680         }
681
682         /* try to parse an address. if that fails, try to read the
683          * input as a symbol. */
684         if (kstrtoul(argv[1], 0, (unsigned long *)&addr)) {
685                 /* a symbol specified */
686                 symbol = argv[1];
687                 /* TODO: support .init module functions */
688                 ret = traceprobe_split_symbol_offset(symbol, &offset);
689                 if (ret || offset < 0 || offset > UINT_MAX) {
690                         pr_info("Failed to parse either an address or a symbol.\n");
691                         return ret;
692                 }
693                 if (offset && is_return) {
694                         pr_info("Return probe must be used without offset.\n");
695                         return -EINVAL;
696                 }
697         } else if (is_return) {
698                 pr_info("Return probe point must be a symbol.\n");
699                 return -EINVAL;
700         }
701         argc -= 2; argv += 2;
702
703         /* setup a probe */
704         if (!event) {
705                 /* Make a new event name */
706                 if (symbol)
707                         snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_%ld",
708                                  is_return ? 'r' : 'p', symbol, offset);
709                 else
710                         snprintf(buf, MAX_EVENT_NAME_LEN, "%c_0x%p",
711                                  is_return ? 'r' : 'p', addr);
712                 event = buf;
713         }
714         tk = alloc_trace_kprobe(group, event, addr, symbol, offset, argc,
715                                is_return);
716         if (IS_ERR(tk)) {
717                 pr_info("Failed to allocate trace_probe.(%d)\n",
718                         (int)PTR_ERR(tk));
719                 return PTR_ERR(tk);
720         }
721
722         /* parse arguments */
723         ret = 0;
724         for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
725                 struct probe_arg *parg = &tk->tp.args[i];
726
727                 /* Increment count for freeing args in error case */
728                 tk->tp.nr_args++;
729
730                 /* Parse argument name */
731                 arg = strchr(argv[i], '=');
732                 if (arg) {
733                         *arg++ = '\0';
734                         parg->name = kstrdup(argv[i], GFP_KERNEL);
735                 } else {
736                         arg = argv[i];
737                         /* If argument name is omitted, set "argN" */
738                         snprintf(buf, MAX_EVENT_NAME_LEN, "arg%d", i + 1);
739                         parg->name = kstrdup(buf, GFP_KERNEL);
740                 }
741
742                 if (!parg->name) {
743                         pr_info("Failed to allocate argument[%d] name.\n", i);
744                         ret = -ENOMEM;
745                         goto error;
746                 }
747
748                 if (!is_good_name(parg->name)) {
749                         pr_info("Invalid argument[%d] name: %s\n",
750                                 i, parg->name);
751                         ret = -EINVAL;
752                         goto error;
753                 }
754
755                 if (traceprobe_conflict_field_name(parg->name,
756                                                         tk->tp.args, i)) {
757                         pr_info("Argument[%d] name '%s' conflicts with "
758                                 "another field.\n", i, argv[i]);
759                         ret = -EINVAL;
760                         goto error;
761                 }
762
763                 /* Parse fetch argument */
764                 ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
765                                                 is_return, true,
766                                                 kprobes_fetch_type_table);
767                 if (ret) {
768                         pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
769                         goto error;
770                 }
771         }
772
773         ret = register_trace_kprobe(tk);
774         if (ret)
775                 goto error;
776         return 0;
777
778 error:
779         free_trace_kprobe(tk);
780         return ret;
781 }
782
783 static int release_all_trace_kprobes(void)
784 {
785         struct trace_kprobe *tk;
786         int ret = 0;
787
788         mutex_lock(&probe_lock);
789         /* Ensure no probe is in use. */
790         list_for_each_entry(tk, &probe_list, list)
791                 if (trace_probe_is_enabled(&tk->tp)) {
792                         ret = -EBUSY;
793                         goto end;
794                 }
795         /* TODO: Use batch unregistration */
796         while (!list_empty(&probe_list)) {
797                 tk = list_entry(probe_list.next, struct trace_kprobe, list);
798                 ret = unregister_trace_kprobe(tk);
799                 if (ret)
800                         goto end;
801                 free_trace_kprobe(tk);
802         }
803
804 end:
805         mutex_unlock(&probe_lock);
806
807         return ret;
808 }
809
810 /* Probes listing interfaces */
811 static void *probes_seq_start(struct seq_file *m, loff_t *pos)
812 {
813         mutex_lock(&probe_lock);
814         return seq_list_start(&probe_list, *pos);
815 }
816
817 static void *probes_seq_next(struct seq_file *m, void *v, loff_t *pos)
818 {
819         return seq_list_next(v, &probe_list, pos);
820 }
821
822 static void probes_seq_stop(struct seq_file *m, void *v)
823 {
824         mutex_unlock(&probe_lock);
825 }
826
827 static int probes_seq_show(struct seq_file *m, void *v)
828 {
829         struct trace_kprobe *tk = v;
830         int i;
831
832         seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
833         seq_printf(m, ":%s/%s", tk->tp.call.class->system,
834                         trace_event_name(&tk->tp.call));
835
836         if (!tk->symbol)
837                 seq_printf(m, " 0x%p", tk->rp.kp.addr);
838         else if (tk->rp.kp.offset)
839                 seq_printf(m, " %s+%u", trace_kprobe_symbol(tk),
840                            tk->rp.kp.offset);
841         else
842                 seq_printf(m, " %s", trace_kprobe_symbol(tk));
843
844         for (i = 0; i < tk->tp.nr_args; i++)
845                 seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
846         seq_putc(m, '\n');
847
848         return 0;
849 }
850
851 static const struct seq_operations probes_seq_op = {
852         .start  = probes_seq_start,
853         .next   = probes_seq_next,
854         .stop   = probes_seq_stop,
855         .show   = probes_seq_show
856 };
857
858 static int probes_open(struct inode *inode, struct file *file)
859 {
860         int ret;
861
862         if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
863                 ret = release_all_trace_kprobes();
864                 if (ret < 0)
865                         return ret;
866         }
867
868         return seq_open(file, &probes_seq_op);
869 }
870
871 static ssize_t probes_write(struct file *file, const char __user *buffer,
872                             size_t count, loff_t *ppos)
873 {
874         return traceprobe_probes_write(file, buffer, count, ppos,
875                         create_trace_kprobe);
876 }
877
878 static const struct file_operations kprobe_events_ops = {
879         .owner          = THIS_MODULE,
880         .open           = probes_open,
881         .read           = seq_read,
882         .llseek         = seq_lseek,
883         .release        = seq_release,
884         .write          = probes_write,
885 };
886
887 /* Probes profiling interfaces */
888 static int probes_profile_seq_show(struct seq_file *m, void *v)
889 {
890         struct trace_kprobe *tk = v;
891         unsigned long nhit = 0;
892         int cpu;
893
894         for_each_possible_cpu(cpu)
895                 nhit += *per_cpu_ptr(tk->nhit, cpu);
896
897         seq_printf(m, "  %-44s %15lu %15lu\n",
898                    trace_event_name(&tk->tp.call), nhit,
899                    tk->rp.kp.nmissed);
900
901         return 0;
902 }
903
904 static const struct seq_operations profile_seq_op = {
905         .start  = probes_seq_start,
906         .next   = probes_seq_next,
907         .stop   = probes_seq_stop,
908         .show   = probes_profile_seq_show
909 };
910
911 static int profile_open(struct inode *inode, struct file *file)
912 {
913         return seq_open(file, &profile_seq_op);
914 }
915
916 static const struct file_operations kprobe_profile_ops = {
917         .owner          = THIS_MODULE,
918         .open           = profile_open,
919         .read           = seq_read,
920         .llseek         = seq_lseek,
921         .release        = seq_release,
922 };
923
924 /* Kprobe handler */
925 static nokprobe_inline void
926 __kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
927                     struct trace_event_file *trace_file)
928 {
929         struct kprobe_trace_entry_head *entry;
930         struct ring_buffer_event *event;
931         struct ring_buffer *buffer;
932         int size, dsize, pc;
933         unsigned long irq_flags;
934         struct trace_event_call *call = &tk->tp.call;
935
936         WARN_ON(call != trace_file->event_call);
937
938         if (trace_trigger_soft_disabled(trace_file))
939                 return;
940
941         local_save_flags(irq_flags);
942         pc = preempt_count();
943
944         dsize = __get_data_size(&tk->tp, regs);
945         size = sizeof(*entry) + tk->tp.size + dsize;
946
947         event = trace_event_buffer_lock_reserve(&buffer, trace_file,
948                                                 call->event.type,
949                                                 size, irq_flags, pc);
950         if (!event)
951                 return;
952
953         entry = ring_buffer_event_data(event);
954         entry->ip = (unsigned long)tk->rp.kp.addr;
955         store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
956
957         event_trigger_unlock_commit_regs(trace_file, buffer, event,
958                                          entry, irq_flags, pc, regs);
959 }
960
961 static void
962 kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs)
963 {
964         struct event_file_link *link;
965
966         list_for_each_entry_rcu(link, &tk->tp.files, list)
967                 __kprobe_trace_func(tk, regs, link->file);
968 }
969 NOKPROBE_SYMBOL(kprobe_trace_func);
970
971 /* Kretprobe handler */
972 static nokprobe_inline void
973 __kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
974                        struct pt_regs *regs,
975                        struct trace_event_file *trace_file)
976 {
977         struct kretprobe_trace_entry_head *entry;
978         struct ring_buffer_event *event;
979         struct ring_buffer *buffer;
980         int size, pc, dsize;
981         unsigned long irq_flags;
982         struct trace_event_call *call = &tk->tp.call;
983
984         WARN_ON(call != trace_file->event_call);
985
986         if (trace_trigger_soft_disabled(trace_file))
987                 return;
988
989         local_save_flags(irq_flags);
990         pc = preempt_count();
991
992         dsize = __get_data_size(&tk->tp, regs);
993         size = sizeof(*entry) + tk->tp.size + dsize;
994
995         event = trace_event_buffer_lock_reserve(&buffer, trace_file,
996                                                 call->event.type,
997                                                 size, irq_flags, pc);
998         if (!event)
999                 return;
1000
1001         entry = ring_buffer_event_data(event);
1002         entry->func = (unsigned long)tk->rp.kp.addr;
1003         entry->ret_ip = (unsigned long)ri->ret_addr;
1004         store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1005
1006         event_trigger_unlock_commit_regs(trace_file, buffer, event,
1007                                          entry, irq_flags, pc, regs);
1008 }
1009
1010 static void
1011 kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1012                      struct pt_regs *regs)
1013 {
1014         struct event_file_link *link;
1015
1016         list_for_each_entry_rcu(link, &tk->tp.files, list)
1017                 __kretprobe_trace_func(tk, ri, regs, link->file);
1018 }
1019 NOKPROBE_SYMBOL(kretprobe_trace_func);
1020
1021 /* Event entry printers */
1022 static enum print_line_t
1023 print_kprobe_event(struct trace_iterator *iter, int flags,
1024                    struct trace_event *event)
1025 {
1026         struct kprobe_trace_entry_head *field;
1027         struct trace_seq *s = &iter->seq;
1028         struct trace_probe *tp;
1029         u8 *data;
1030         int i;
1031
1032         field = (struct kprobe_trace_entry_head *)iter->ent;
1033         tp = container_of(event, struct trace_probe, call.event);
1034
1035         trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1036
1037         if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET))
1038                 goto out;
1039
1040         trace_seq_putc(s, ')');
1041
1042         data = (u8 *)&field[1];
1043         for (i = 0; i < tp->nr_args; i++)
1044                 if (!tp->args[i].type->print(s, tp->args[i].name,
1045                                              data + tp->args[i].offset, field))
1046                         goto out;
1047
1048         trace_seq_putc(s, '\n');
1049  out:
1050         return trace_handle_return(s);
1051 }
1052
1053 static enum print_line_t
1054 print_kretprobe_event(struct trace_iterator *iter, int flags,
1055                       struct trace_event *event)
1056 {
1057         struct kretprobe_trace_entry_head *field;
1058         struct trace_seq *s = &iter->seq;
1059         struct trace_probe *tp;
1060         u8 *data;
1061         int i;
1062
1063         field = (struct kretprobe_trace_entry_head *)iter->ent;
1064         tp = container_of(event, struct trace_probe, call.event);
1065
1066         trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1067
1068         if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
1069                 goto out;
1070
1071         trace_seq_puts(s, " <- ");
1072
1073         if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER_SYM_OFFSET))
1074                 goto out;
1075
1076         trace_seq_putc(s, ')');
1077
1078         data = (u8 *)&field[1];
1079         for (i = 0; i < tp->nr_args; i++)
1080                 if (!tp->args[i].type->print(s, tp->args[i].name,
1081                                              data + tp->args[i].offset, field))
1082                         goto out;
1083
1084         trace_seq_putc(s, '\n');
1085
1086  out:
1087         return trace_handle_return(s);
1088 }
1089
1090
1091 static int kprobe_event_define_fields(struct trace_event_call *event_call)
1092 {
1093         int ret, i;
1094         struct kprobe_trace_entry_head field;
1095         struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1096
1097         DEFINE_FIELD(unsigned long, ip, FIELD_STRING_IP, 0);
1098         /* Set argument names as fields */
1099         for (i = 0; i < tk->tp.nr_args; i++) {
1100                 struct probe_arg *parg = &tk->tp.args[i];
1101
1102                 ret = trace_define_field(event_call, parg->type->fmttype,
1103                                          parg->name,
1104                                          sizeof(field) + parg->offset,
1105                                          parg->type->size,
1106                                          parg->type->is_signed,
1107                                          FILTER_OTHER);
1108                 if (ret)
1109                         return ret;
1110         }
1111         return 0;
1112 }
1113
1114 static int kretprobe_event_define_fields(struct trace_event_call *event_call)
1115 {
1116         int ret, i;
1117         struct kretprobe_trace_entry_head field;
1118         struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1119
1120         DEFINE_FIELD(unsigned long, func, FIELD_STRING_FUNC, 0);
1121         DEFINE_FIELD(unsigned long, ret_ip, FIELD_STRING_RETIP, 0);
1122         /* Set argument names as fields */
1123         for (i = 0; i < tk->tp.nr_args; i++) {
1124                 struct probe_arg *parg = &tk->tp.args[i];
1125
1126                 ret = trace_define_field(event_call, parg->type->fmttype,
1127                                          parg->name,
1128                                          sizeof(field) + parg->offset,
1129                                          parg->type->size,
1130                                          parg->type->is_signed,
1131                                          FILTER_OTHER);
1132                 if (ret)
1133                         return ret;
1134         }
1135         return 0;
1136 }
1137
1138 #ifdef CONFIG_PERF_EVENTS
1139
1140 /* Kprobe profile handler */
1141 static void
1142 kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs)
1143 {
1144         struct trace_event_call *call = &tk->tp.call;
1145         struct bpf_prog *prog = call->prog;
1146         struct kprobe_trace_entry_head *entry;
1147         struct hlist_head *head;
1148         int size, __size, dsize;
1149         int rctx;
1150
1151         if (prog && !trace_call_bpf(prog, regs))
1152                 return;
1153
1154         head = this_cpu_ptr(call->perf_events);
1155         if (hlist_empty(head))
1156                 return;
1157
1158         dsize = __get_data_size(&tk->tp, regs);
1159         __size = sizeof(*entry) + tk->tp.size + dsize;
1160         size = ALIGN(__size + sizeof(u32), sizeof(u64));
1161         size -= sizeof(u32);
1162
1163         entry = perf_trace_buf_alloc(size, NULL, &rctx);
1164         if (!entry)
1165                 return;
1166
1167         entry->ip = (unsigned long)tk->rp.kp.addr;
1168         memset(&entry[1], 0, dsize);
1169         store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1170         perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
1171                               head, NULL);
1172 }
1173 NOKPROBE_SYMBOL(kprobe_perf_func);
1174
1175 /* Kretprobe profile handler */
1176 static void
1177 kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1178                     struct pt_regs *regs)
1179 {
1180         struct trace_event_call *call = &tk->tp.call;
1181         struct bpf_prog *prog = call->prog;
1182         struct kretprobe_trace_entry_head *entry;
1183         struct hlist_head *head;
1184         int size, __size, dsize;
1185         int rctx;
1186
1187         if (prog && !trace_call_bpf(prog, regs))
1188                 return;
1189
1190         head = this_cpu_ptr(call->perf_events);
1191         if (hlist_empty(head))
1192                 return;
1193
1194         dsize = __get_data_size(&tk->tp, regs);
1195         __size = sizeof(*entry) + tk->tp.size + dsize;
1196         size = ALIGN(__size + sizeof(u32), sizeof(u64));
1197         size -= sizeof(u32);
1198
1199         entry = perf_trace_buf_alloc(size, NULL, &rctx);
1200         if (!entry)
1201                 return;
1202
1203         entry->func = (unsigned long)tk->rp.kp.addr;
1204         entry->ret_ip = (unsigned long)ri->ret_addr;
1205         store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1206         perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
1207                               head, NULL);
1208 }
1209 NOKPROBE_SYMBOL(kretprobe_perf_func);
1210 #endif  /* CONFIG_PERF_EVENTS */
1211
1212 /*
1213  * called by perf_trace_init() or __ftrace_set_clr_event() under event_mutex.
1214  *
1215  * kprobe_trace_self_tests_init() does enable_trace_probe/disable_trace_probe
1216  * lockless, but we can't race with this __init function.
1217  */
1218 static int kprobe_register(struct trace_event_call *event,
1219                            enum trace_reg type, void *data)
1220 {
1221         struct trace_kprobe *tk = (struct trace_kprobe *)event->data;
1222         struct trace_event_file *file = data;
1223
1224         switch (type) {
1225         case TRACE_REG_REGISTER:
1226                 return enable_trace_kprobe(tk, file);
1227         case TRACE_REG_UNREGISTER:
1228                 return disable_trace_kprobe(tk, file);
1229
1230 #ifdef CONFIG_PERF_EVENTS
1231         case TRACE_REG_PERF_REGISTER:
1232                 return enable_trace_kprobe(tk, NULL);
1233         case TRACE_REG_PERF_UNREGISTER:
1234                 return disable_trace_kprobe(tk, NULL);
1235         case TRACE_REG_PERF_OPEN:
1236         case TRACE_REG_PERF_CLOSE:
1237         case TRACE_REG_PERF_ADD:
1238         case TRACE_REG_PERF_DEL:
1239                 return 0;
1240 #endif
1241         }
1242         return 0;
1243 }
1244
1245 static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs)
1246 {
1247         struct trace_kprobe *tk = container_of(kp, struct trace_kprobe, rp.kp);
1248
1249         raw_cpu_inc(*tk->nhit);
1250
1251         if (tk->tp.flags & TP_FLAG_TRACE)
1252                 kprobe_trace_func(tk, regs);
1253 #ifdef CONFIG_PERF_EVENTS
1254         if (tk->tp.flags & TP_FLAG_PROFILE)
1255                 kprobe_perf_func(tk, regs);
1256 #endif
1257         return 0;       /* We don't tweek kernel, so just return 0 */
1258 }
1259 NOKPROBE_SYMBOL(kprobe_dispatcher);
1260
1261 static int
1262 kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
1263 {
1264         struct trace_kprobe *tk = container_of(ri->rp, struct trace_kprobe, rp);
1265
1266         raw_cpu_inc(*tk->nhit);
1267
1268         if (tk->tp.flags & TP_FLAG_TRACE)
1269                 kretprobe_trace_func(tk, ri, regs);
1270 #ifdef CONFIG_PERF_EVENTS
1271         if (tk->tp.flags & TP_FLAG_PROFILE)
1272                 kretprobe_perf_func(tk, ri, regs);
1273 #endif
1274         return 0;       /* We don't tweek kernel, so just return 0 */
1275 }
1276 NOKPROBE_SYMBOL(kretprobe_dispatcher);
1277
1278 static struct trace_event_functions kretprobe_funcs = {
1279         .trace          = print_kretprobe_event
1280 };
1281
1282 static struct trace_event_functions kprobe_funcs = {
1283         .trace          = print_kprobe_event
1284 };
1285
1286 static int register_kprobe_event(struct trace_kprobe *tk)
1287 {
1288         struct trace_event_call *call = &tk->tp.call;
1289         int ret;
1290
1291         /* Initialize trace_event_call */
1292         INIT_LIST_HEAD(&call->class->fields);
1293         if (trace_kprobe_is_return(tk)) {
1294                 call->event.funcs = &kretprobe_funcs;
1295                 call->class->define_fields = kretprobe_event_define_fields;
1296         } else {
1297                 call->event.funcs = &kprobe_funcs;
1298                 call->class->define_fields = kprobe_event_define_fields;
1299         }
1300         if (set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0)
1301                 return -ENOMEM;
1302         ret = register_trace_event(&call->event);
1303         if (!ret) {
1304                 kfree(call->print_fmt);
1305                 return -ENODEV;
1306         }
1307         call->flags = TRACE_EVENT_FL_KPROBE;
1308         call->class->reg = kprobe_register;
1309         call->data = tk;
1310         ret = trace_add_event_call(call);
1311         if (ret) {
1312                 pr_info("Failed to register kprobe event: %s\n",
1313                         trace_event_name(call));
1314                 kfree(call->print_fmt);
1315                 unregister_trace_event(&call->event);
1316         }
1317         return ret;
1318 }
1319
1320 static int unregister_kprobe_event(struct trace_kprobe *tk)
1321 {
1322         int ret;
1323
1324         /* tp->event is unregistered in trace_remove_event_call() */
1325         ret = trace_remove_event_call(&tk->tp.call);
1326         if (!ret)
1327                 kfree(tk->tp.call.print_fmt);
1328         return ret;
1329 }
1330
1331 /* Make a tracefs interface for controlling probe points */
1332 static __init int init_kprobe_trace(void)
1333 {
1334         struct dentry *d_tracer;
1335         struct dentry *entry;
1336
1337         if (register_module_notifier(&trace_kprobe_module_nb))
1338                 return -EINVAL;
1339
1340         d_tracer = tracing_init_dentry();
1341         if (IS_ERR(d_tracer))
1342                 return 0;
1343
1344         entry = tracefs_create_file("kprobe_events", 0644, d_tracer,
1345                                     NULL, &kprobe_events_ops);
1346
1347         /* Event list interface */
1348         if (!entry)
1349                 pr_warn("Could not create tracefs 'kprobe_events' entry\n");
1350
1351         /* Profile interface */
1352         entry = tracefs_create_file("kprobe_profile", 0444, d_tracer,
1353                                     NULL, &kprobe_profile_ops);
1354
1355         if (!entry)
1356                 pr_warn("Could not create tracefs 'kprobe_profile' entry\n");
1357         return 0;
1358 }
1359 fs_initcall(init_kprobe_trace);
1360
1361
1362 #ifdef CONFIG_FTRACE_STARTUP_TEST
1363
1364 /*
1365  * The "__used" keeps gcc from removing the function symbol
1366  * from the kallsyms table.
1367  */
1368 static __used int kprobe_trace_selftest_target(int a1, int a2, int a3,
1369                                                int a4, int a5, int a6)
1370 {
1371         return a1 + a2 + a3 + a4 + a5 + a6;
1372 }
1373
1374 static struct trace_event_file *
1375 find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
1376 {
1377         struct trace_event_file *file;
1378
1379         list_for_each_entry(file, &tr->events, list)
1380                 if (file->event_call == &tk->tp.call)
1381                         return file;
1382
1383         return NULL;
1384 }
1385
1386 /*
1387  * Nobody but us can call enable_trace_kprobe/disable_trace_kprobe at this
1388  * stage, we can do this lockless.
1389  */
1390 static __init int kprobe_trace_self_tests_init(void)
1391 {
1392         int ret, warn = 0;
1393         int (*target)(int, int, int, int, int, int);
1394         struct trace_kprobe *tk;
1395         struct trace_event_file *file;
1396
1397         if (tracing_is_disabled())
1398                 return -ENODEV;
1399
1400         target = kprobe_trace_selftest_target;
1401
1402         pr_info("Testing kprobe tracing: ");
1403
1404         ret = traceprobe_command("p:testprobe kprobe_trace_selftest_target "
1405                                   "$stack $stack0 +0($stack)",
1406                                   create_trace_kprobe);
1407         if (WARN_ON_ONCE(ret)) {
1408                 pr_warn("error on probing function entry.\n");
1409                 warn++;
1410         } else {
1411                 /* Enable trace point */
1412                 tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
1413                 if (WARN_ON_ONCE(tk == NULL)) {
1414                         pr_warn("error on getting new probe.\n");
1415                         warn++;
1416                 } else {
1417                         file = find_trace_probe_file(tk, top_trace_array());
1418                         if (WARN_ON_ONCE(file == NULL)) {
1419                                 pr_warn("error on getting probe file.\n");
1420                                 warn++;
1421                         } else
1422                                 enable_trace_kprobe(tk, file);
1423                 }
1424         }
1425
1426         ret = traceprobe_command("r:testprobe2 kprobe_trace_selftest_target "
1427                                   "$retval", create_trace_kprobe);
1428         if (WARN_ON_ONCE(ret)) {
1429                 pr_warn("error on probing function return.\n");
1430                 warn++;
1431         } else {
1432                 /* Enable trace point */
1433                 tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
1434                 if (WARN_ON_ONCE(tk == NULL)) {
1435                         pr_warn("error on getting 2nd new probe.\n");
1436                         warn++;
1437                 } else {
1438                         file = find_trace_probe_file(tk, top_trace_array());
1439                         if (WARN_ON_ONCE(file == NULL)) {
1440                                 pr_warn("error on getting probe file.\n");
1441                                 warn++;
1442                         } else
1443                                 enable_trace_kprobe(tk, file);
1444                 }
1445         }
1446
1447         if (warn)
1448                 goto end;
1449
1450         ret = target(1, 2, 3, 4, 5, 6);
1451
1452         /* Disable trace points before removing it */
1453         tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
1454         if (WARN_ON_ONCE(tk == NULL)) {
1455                 pr_warn("error on getting test probe.\n");
1456                 warn++;
1457         } else {
1458                 file = find_trace_probe_file(tk, top_trace_array());
1459                 if (WARN_ON_ONCE(file == NULL)) {
1460                         pr_warn("error on getting probe file.\n");
1461                         warn++;
1462                 } else
1463                         disable_trace_kprobe(tk, file);
1464         }
1465
1466         tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
1467         if (WARN_ON_ONCE(tk == NULL)) {
1468                 pr_warn("error on getting 2nd test probe.\n");
1469                 warn++;
1470         } else {
1471                 file = find_trace_probe_file(tk, top_trace_array());
1472                 if (WARN_ON_ONCE(file == NULL)) {
1473                         pr_warn("error on getting probe file.\n");
1474                         warn++;
1475                 } else
1476                         disable_trace_kprobe(tk, file);
1477         }
1478
1479         ret = traceprobe_command("-:testprobe", create_trace_kprobe);
1480         if (WARN_ON_ONCE(ret)) {
1481                 pr_warn("error on deleting a probe.\n");
1482                 warn++;
1483         }
1484
1485         ret = traceprobe_command("-:testprobe2", create_trace_kprobe);
1486         if (WARN_ON_ONCE(ret)) {
1487                 pr_warn("error on deleting a probe.\n");
1488                 warn++;
1489         }
1490
1491 end:
1492         release_all_trace_kprobes();
1493         /*
1494          * Wait for the optimizer work to finish. Otherwise it might fiddle
1495          * with probes in already freed __init text.
1496          */
1497         wait_for_kprobe_optimizer();
1498         if (warn)
1499                 pr_cont("NG: Some tests are failed. Please check them.\n");
1500         else
1501                 pr_cont("OK\n");
1502         return 0;
1503 }
1504
1505 late_initcall(kprobe_trace_self_tests_init);
1506
1507 #endif