]> git.karo-electronics.de Git - karo-tx-linux.git/blob - kernel/trace/trace_kprobe.c
Merge tag 'perf-core-for-mingo-4.12-20170316' of git://git.kernel.org/pub/scm/linux...
[karo-tx-linux.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 #define pr_fmt(fmt)     "trace_kprobe: " fmt
20
21 #include <linux/module.h>
22 #include <linux/uaccess.h>
23 #include <linux/rculist.h>
24
25 #include "trace_probe.h"
26
27 #define KPROBE_EVENT_SYSTEM "kprobes"
28
29 /**
30  * Kprobe event core functions
31  */
32 struct trace_kprobe {
33         struct list_head        list;
34         struct kretprobe        rp;     /* Use rp.kp for kprobe use */
35         unsigned long __percpu *nhit;
36         const char              *symbol;        /* symbol name */
37         struct trace_probe      tp;
38 };
39
40 #define SIZEOF_TRACE_KPROBE(n)                          \
41         (offsetof(struct trace_kprobe, tp.args) +       \
42         (sizeof(struct probe_arg) * (n)))
43
44
45 static nokprobe_inline bool trace_kprobe_is_return(struct trace_kprobe *tk)
46 {
47         return tk->rp.handler != NULL;
48 }
49
50 static nokprobe_inline const char *trace_kprobe_symbol(struct trace_kprobe *tk)
51 {
52         return tk->symbol ? tk->symbol : "unknown";
53 }
54
55 static nokprobe_inline unsigned long trace_kprobe_offset(struct trace_kprobe *tk)
56 {
57         return tk->rp.kp.offset;
58 }
59
60 static nokprobe_inline bool trace_kprobe_has_gone(struct trace_kprobe *tk)
61 {
62         return !!(kprobe_gone(&tk->rp.kp));
63 }
64
65 static nokprobe_inline bool trace_kprobe_within_module(struct trace_kprobe *tk,
66                                                  struct module *mod)
67 {
68         int len = strlen(mod->name);
69         const char *name = trace_kprobe_symbol(tk);
70         return strncmp(mod->name, name, len) == 0 && name[len] == ':';
71 }
72
73 static nokprobe_inline bool trace_kprobe_is_on_module(struct trace_kprobe *tk)
74 {
75         return !!strchr(trace_kprobe_symbol(tk), ':');
76 }
77
78 static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk)
79 {
80         unsigned long nhit = 0;
81         int cpu;
82
83         for_each_possible_cpu(cpu)
84                 nhit += *per_cpu_ptr(tk->nhit, cpu);
85
86         return nhit;
87 }
88
89 static int register_kprobe_event(struct trace_kprobe *tk);
90 static int unregister_kprobe_event(struct trace_kprobe *tk);
91
92 static DEFINE_MUTEX(probe_lock);
93 static LIST_HEAD(probe_list);
94
95 static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs);
96 static int kretprobe_dispatcher(struct kretprobe_instance *ri,
97                                 struct pt_regs *regs);
98
99 /* Memory fetching by symbol */
100 struct symbol_cache {
101         char            *symbol;
102         long            offset;
103         unsigned long   addr;
104 };
105
106 unsigned long update_symbol_cache(struct symbol_cache *sc)
107 {
108         sc->addr = (unsigned long)kallsyms_lookup_name(sc->symbol);
109
110         if (sc->addr)
111                 sc->addr += sc->offset;
112
113         return sc->addr;
114 }
115
116 void free_symbol_cache(struct symbol_cache *sc)
117 {
118         kfree(sc->symbol);
119         kfree(sc);
120 }
121
122 struct symbol_cache *alloc_symbol_cache(const char *sym, long offset)
123 {
124         struct symbol_cache *sc;
125
126         if (!sym || strlen(sym) == 0)
127                 return NULL;
128
129         sc = kzalloc(sizeof(struct symbol_cache), GFP_KERNEL);
130         if (!sc)
131                 return NULL;
132
133         sc->symbol = kstrdup(sym, GFP_KERNEL);
134         if (!sc->symbol) {
135                 kfree(sc);
136                 return NULL;
137         }
138         sc->offset = offset;
139         update_symbol_cache(sc);
140
141         return sc;
142 }
143
144 /*
145  * Kprobes-specific fetch functions
146  */
147 #define DEFINE_FETCH_stack(type)                                        \
148 static void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs,          \
149                                           void *offset, void *dest)     \
150 {                                                                       \
151         *(type *)dest = (type)regs_get_kernel_stack_nth(regs,           \
152                                 (unsigned int)((unsigned long)offset)); \
153 }                                                                       \
154 NOKPROBE_SYMBOL(FETCH_FUNC_NAME(stack, type));
155
156 DEFINE_BASIC_FETCH_FUNCS(stack)
157 /* No string on the stack entry */
158 #define fetch_stack_string      NULL
159 #define fetch_stack_string_size NULL
160
161 #define DEFINE_FETCH_memory(type)                                       \
162 static void FETCH_FUNC_NAME(memory, type)(struct pt_regs *regs,         \
163                                           void *addr, void *dest)       \
164 {                                                                       \
165         type retval;                                                    \
166         if (probe_kernel_address(addr, retval))                         \
167                 *(type *)dest = 0;                                      \
168         else                                                            \
169                 *(type *)dest = retval;                                 \
170 }                                                                       \
171 NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, type));
172
173 DEFINE_BASIC_FETCH_FUNCS(memory)
174 /*
175  * Fetch a null-terminated string. Caller MUST set *(u32 *)dest with max
176  * length and relative data location.
177  */
178 static void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
179                                             void *addr, void *dest)
180 {
181         int maxlen = get_rloc_len(*(u32 *)dest);
182         u8 *dst = get_rloc_data(dest);
183         long ret;
184
185         if (!maxlen)
186                 return;
187
188         /*
189          * Try to get string again, since the string can be changed while
190          * probing.
191          */
192         ret = strncpy_from_unsafe(dst, addr, maxlen);
193
194         if (ret < 0) {  /* Failed to fetch string */
195                 dst[0] = '\0';
196                 *(u32 *)dest = make_data_rloc(0, get_rloc_offs(*(u32 *)dest));
197         } else {
198                 *(u32 *)dest = make_data_rloc(ret, get_rloc_offs(*(u32 *)dest));
199         }
200 }
201 NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string));
202
203 /* Return the length of string -- including null terminal byte */
204 static void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
205                                                  void *addr, void *dest)
206 {
207         mm_segment_t old_fs;
208         int ret, len = 0;
209         u8 c;
210
211         old_fs = get_fs();
212         set_fs(KERNEL_DS);
213         pagefault_disable();
214
215         do {
216                 ret = __copy_from_user_inatomic(&c, (u8 *)addr + len, 1);
217                 len++;
218         } while (c && ret == 0 && len < MAX_STRING_SIZE);
219
220         pagefault_enable();
221         set_fs(old_fs);
222
223         if (ret < 0)    /* Failed to check the length */
224                 *(u32 *)dest = 0;
225         else
226                 *(u32 *)dest = len;
227 }
228 NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string_size));
229
230 #define DEFINE_FETCH_symbol(type)                                       \
231 void FETCH_FUNC_NAME(symbol, type)(struct pt_regs *regs, void *data, void *dest)\
232 {                                                                       \
233         struct symbol_cache *sc = data;                                 \
234         if (sc->addr)                                                   \
235                 fetch_memory_##type(regs, (void *)sc->addr, dest);      \
236         else                                                            \
237                 *(type *)dest = 0;                                      \
238 }                                                                       \
239 NOKPROBE_SYMBOL(FETCH_FUNC_NAME(symbol, type));
240
241 DEFINE_BASIC_FETCH_FUNCS(symbol)
242 DEFINE_FETCH_symbol(string)
243 DEFINE_FETCH_symbol(string_size)
244
245 /* kprobes don't support file_offset fetch methods */
246 #define fetch_file_offset_u8            NULL
247 #define fetch_file_offset_u16           NULL
248 #define fetch_file_offset_u32           NULL
249 #define fetch_file_offset_u64           NULL
250 #define fetch_file_offset_string        NULL
251 #define fetch_file_offset_string_size   NULL
252
253 /* Fetch type information table */
254 static const struct fetch_type kprobes_fetch_type_table[] = {
255         /* Special types */
256         [FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
257                                         sizeof(u32), 1, "__data_loc char[]"),
258         [FETCH_TYPE_STRSIZE] = __ASSIGN_FETCH_TYPE("string_size", u32,
259                                         string_size, sizeof(u32), 0, "u32"),
260         /* Basic types */
261         ASSIGN_FETCH_TYPE(u8,  u8,  0),
262         ASSIGN_FETCH_TYPE(u16, u16, 0),
263         ASSIGN_FETCH_TYPE(u32, u32, 0),
264         ASSIGN_FETCH_TYPE(u64, u64, 0),
265         ASSIGN_FETCH_TYPE(s8,  u8,  1),
266         ASSIGN_FETCH_TYPE(s16, u16, 1),
267         ASSIGN_FETCH_TYPE(s32, u32, 1),
268         ASSIGN_FETCH_TYPE(s64, u64, 1),
269         ASSIGN_FETCH_TYPE_ALIAS(x8,  u8,  u8,  0),
270         ASSIGN_FETCH_TYPE_ALIAS(x16, u16, u16, 0),
271         ASSIGN_FETCH_TYPE_ALIAS(x32, u32, u32, 0),
272         ASSIGN_FETCH_TYPE_ALIAS(x64, u64, u64, 0),
273
274         ASSIGN_FETCH_TYPE_END
275 };
276
277 /*
278  * Allocate new trace_probe and initialize it (including kprobes).
279  */
280 static struct trace_kprobe *alloc_trace_kprobe(const char *group,
281                                              const char *event,
282                                              void *addr,
283                                              const char *symbol,
284                                              unsigned long offs,
285                                              int nargs, bool is_return)
286 {
287         struct trace_kprobe *tk;
288         int ret = -ENOMEM;
289
290         tk = kzalloc(SIZEOF_TRACE_KPROBE(nargs), GFP_KERNEL);
291         if (!tk)
292                 return ERR_PTR(ret);
293
294         tk->nhit = alloc_percpu(unsigned long);
295         if (!tk->nhit)
296                 goto error;
297
298         if (symbol) {
299                 tk->symbol = kstrdup(symbol, GFP_KERNEL);
300                 if (!tk->symbol)
301                         goto error;
302                 tk->rp.kp.symbol_name = tk->symbol;
303                 tk->rp.kp.offset = offs;
304         } else
305                 tk->rp.kp.addr = addr;
306
307         if (is_return)
308                 tk->rp.handler = kretprobe_dispatcher;
309         else
310                 tk->rp.kp.pre_handler = kprobe_dispatcher;
311
312         if (!event || !is_good_name(event)) {
313                 ret = -EINVAL;
314                 goto error;
315         }
316
317         tk->tp.call.class = &tk->tp.class;
318         tk->tp.call.name = kstrdup(event, GFP_KERNEL);
319         if (!tk->tp.call.name)
320                 goto error;
321
322         if (!group || !is_good_name(group)) {
323                 ret = -EINVAL;
324                 goto error;
325         }
326
327         tk->tp.class.system = kstrdup(group, GFP_KERNEL);
328         if (!tk->tp.class.system)
329                 goto error;
330
331         INIT_LIST_HEAD(&tk->list);
332         INIT_LIST_HEAD(&tk->tp.files);
333         return tk;
334 error:
335         kfree(tk->tp.call.name);
336         kfree(tk->symbol);
337         free_percpu(tk->nhit);
338         kfree(tk);
339         return ERR_PTR(ret);
340 }
341
342 static void free_trace_kprobe(struct trace_kprobe *tk)
343 {
344         int i;
345
346         for (i = 0; i < tk->tp.nr_args; i++)
347                 traceprobe_free_probe_arg(&tk->tp.args[i]);
348
349         kfree(tk->tp.call.class->system);
350         kfree(tk->tp.call.name);
351         kfree(tk->symbol);
352         free_percpu(tk->nhit);
353         kfree(tk);
354 }
355
356 static struct trace_kprobe *find_trace_kprobe(const char *event,
357                                               const char *group)
358 {
359         struct trace_kprobe *tk;
360
361         list_for_each_entry(tk, &probe_list, list)
362                 if (strcmp(trace_event_name(&tk->tp.call), event) == 0 &&
363                     strcmp(tk->tp.call.class->system, group) == 0)
364                         return tk;
365         return NULL;
366 }
367
368 /*
369  * Enable trace_probe
370  * if the file is NULL, enable "perf" handler, or enable "trace" handler.
371  */
372 static int
373 enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
374 {
375         int ret = 0;
376
377         if (file) {
378                 struct event_file_link *link;
379
380                 link = kmalloc(sizeof(*link), GFP_KERNEL);
381                 if (!link) {
382                         ret = -ENOMEM;
383                         goto out;
384                 }
385
386                 link->file = file;
387                 list_add_tail_rcu(&link->list, &tk->tp.files);
388
389                 tk->tp.flags |= TP_FLAG_TRACE;
390         } else
391                 tk->tp.flags |= TP_FLAG_PROFILE;
392
393         if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
394                 if (trace_kprobe_is_return(tk))
395                         ret = enable_kretprobe(&tk->rp);
396                 else
397                         ret = enable_kprobe(&tk->rp.kp);
398         }
399  out:
400         return ret;
401 }
402
403 /*
404  * Disable trace_probe
405  * if the file is NULL, disable "perf" handler, or disable "trace" handler.
406  */
407 static int
408 disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
409 {
410         struct event_file_link *link = NULL;
411         int wait = 0;
412         int ret = 0;
413
414         if (file) {
415                 link = find_event_file_link(&tk->tp, file);
416                 if (!link) {
417                         ret = -EINVAL;
418                         goto out;
419                 }
420
421                 list_del_rcu(&link->list);
422                 wait = 1;
423                 if (!list_empty(&tk->tp.files))
424                         goto out;
425
426                 tk->tp.flags &= ~TP_FLAG_TRACE;
427         } else
428                 tk->tp.flags &= ~TP_FLAG_PROFILE;
429
430         if (!trace_probe_is_enabled(&tk->tp) && trace_probe_is_registered(&tk->tp)) {
431                 if (trace_kprobe_is_return(tk))
432                         disable_kretprobe(&tk->rp);
433                 else
434                         disable_kprobe(&tk->rp.kp);
435                 wait = 1;
436         }
437  out:
438         if (wait) {
439                 /*
440                  * Synchronize with kprobe_trace_func/kretprobe_trace_func
441                  * to ensure disabled (all running handlers are finished).
442                  * This is not only for kfree(), but also the caller,
443                  * trace_remove_event_call() supposes it for releasing
444                  * event_call related objects, which will be accessed in
445                  * the kprobe_trace_func/kretprobe_trace_func.
446                  */
447                 synchronize_sched();
448                 kfree(link);    /* Ignored if link == NULL */
449         }
450
451         return ret;
452 }
453
454 /* Internal register function - just handle k*probes and flags */
455 static int __register_trace_kprobe(struct trace_kprobe *tk)
456 {
457         int i, ret;
458
459         if (trace_probe_is_registered(&tk->tp))
460                 return -EINVAL;
461
462         for (i = 0; i < tk->tp.nr_args; i++)
463                 traceprobe_update_arg(&tk->tp.args[i]);
464
465         /* Set/clear disabled flag according to tp->flag */
466         if (trace_probe_is_enabled(&tk->tp))
467                 tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
468         else
469                 tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
470
471         if (trace_kprobe_is_return(tk))
472                 ret = register_kretprobe(&tk->rp);
473         else
474                 ret = register_kprobe(&tk->rp.kp);
475
476         if (ret == 0)
477                 tk->tp.flags |= TP_FLAG_REGISTERED;
478         else {
479                 pr_warn("Could not insert probe at %s+%lu: %d\n",
480                         trace_kprobe_symbol(tk), trace_kprobe_offset(tk), ret);
481                 if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) {
482                         pr_warn("This probe might be able to register after target module is loaded. Continue.\n");
483                         ret = 0;
484                 } else if (ret == -EILSEQ) {
485                         pr_warn("Probing address(0x%p) is not an instruction boundary.\n",
486                                 tk->rp.kp.addr);
487                         ret = -EINVAL;
488                 }
489         }
490
491         return ret;
492 }
493
494 /* Internal unregister function - just handle k*probes and flags */
495 static void __unregister_trace_kprobe(struct trace_kprobe *tk)
496 {
497         if (trace_probe_is_registered(&tk->tp)) {
498                 if (trace_kprobe_is_return(tk))
499                         unregister_kretprobe(&tk->rp);
500                 else
501                         unregister_kprobe(&tk->rp.kp);
502                 tk->tp.flags &= ~TP_FLAG_REGISTERED;
503                 /* Cleanup kprobe for reuse */
504                 if (tk->rp.kp.symbol_name)
505                         tk->rp.kp.addr = NULL;
506         }
507 }
508
509 /* Unregister a trace_probe and probe_event: call with locking probe_lock */
510 static int unregister_trace_kprobe(struct trace_kprobe *tk)
511 {
512         /* Enabled event can not be unregistered */
513         if (trace_probe_is_enabled(&tk->tp))
514                 return -EBUSY;
515
516         /* Will fail if probe is being used by ftrace or perf */
517         if (unregister_kprobe_event(tk))
518                 return -EBUSY;
519
520         __unregister_trace_kprobe(tk);
521         list_del(&tk->list);
522
523         return 0;
524 }
525
526 /* Register a trace_probe and probe_event */
527 static int register_trace_kprobe(struct trace_kprobe *tk)
528 {
529         struct trace_kprobe *old_tk;
530         int ret;
531
532         mutex_lock(&probe_lock);
533
534         /* Delete old (same name) event if exist */
535         old_tk = find_trace_kprobe(trace_event_name(&tk->tp.call),
536                         tk->tp.call.class->system);
537         if (old_tk) {
538                 ret = unregister_trace_kprobe(old_tk);
539                 if (ret < 0)
540                         goto end;
541                 free_trace_kprobe(old_tk);
542         }
543
544         /* Register new event */
545         ret = register_kprobe_event(tk);
546         if (ret) {
547                 pr_warn("Failed to register probe event(%d)\n", ret);
548                 goto end;
549         }
550
551         /* Register k*probe */
552         ret = __register_trace_kprobe(tk);
553         if (ret < 0)
554                 unregister_kprobe_event(tk);
555         else
556                 list_add_tail(&tk->list, &probe_list);
557
558 end:
559         mutex_unlock(&probe_lock);
560         return ret;
561 }
562
563 /* Module notifier call back, checking event on the module */
564 static int trace_kprobe_module_callback(struct notifier_block *nb,
565                                        unsigned long val, void *data)
566 {
567         struct module *mod = data;
568         struct trace_kprobe *tk;
569         int ret;
570
571         if (val != MODULE_STATE_COMING)
572                 return NOTIFY_DONE;
573
574         /* Update probes on coming module */
575         mutex_lock(&probe_lock);
576         list_for_each_entry(tk, &probe_list, list) {
577                 if (trace_kprobe_within_module(tk, mod)) {
578                         /* Don't need to check busy - this should have gone. */
579                         __unregister_trace_kprobe(tk);
580                         ret = __register_trace_kprobe(tk);
581                         if (ret)
582                                 pr_warn("Failed to re-register probe %s on %s: %d\n",
583                                         trace_event_name(&tk->tp.call),
584                                         mod->name, ret);
585                 }
586         }
587         mutex_unlock(&probe_lock);
588
589         return NOTIFY_DONE;
590 }
591
592 static struct notifier_block trace_kprobe_module_nb = {
593         .notifier_call = trace_kprobe_module_callback,
594         .priority = 1   /* Invoked after kprobe module callback */
595 };
596
597 static int create_trace_kprobe(int argc, char **argv)
598 {
599         /*
600          * Argument syntax:
601          *  - Add kprobe: p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
602          *  - Add kretprobe: r[:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
603          * Fetch args:
604          *  $retval     : fetch return value
605          *  $stack      : fetch stack address
606          *  $stackN     : fetch Nth of stack (N:0-)
607          *  $comm       : fetch current task comm
608          *  @ADDR       : fetch memory at ADDR (ADDR should be in kernel)
609          *  @SYM[+|-offs] : fetch memory at SYM +|- offs (SYM is a data symbol)
610          *  %REG        : fetch register REG
611          * Dereferencing memory fetch:
612          *  +|-offs(ARG) : fetch memory at ARG +|- offs address.
613          * Alias name of args:
614          *  NAME=FETCHARG : set NAME as alias of FETCHARG.
615          * Type of args:
616          *  FETCHARG:TYPE : use TYPE instead of unsigned long.
617          */
618         struct trace_kprobe *tk;
619         int i, ret = 0;
620         bool is_return = false, is_delete = false;
621         char *symbol = NULL, *event = NULL, *group = NULL;
622         char *arg;
623         unsigned long offset = 0;
624         void *addr = NULL;
625         char buf[MAX_EVENT_NAME_LEN];
626
627         /* argc must be >= 1 */
628         if (argv[0][0] == 'p')
629                 is_return = false;
630         else if (argv[0][0] == 'r')
631                 is_return = true;
632         else if (argv[0][0] == '-')
633                 is_delete = true;
634         else {
635                 pr_info("Probe definition must be started with 'p', 'r' or"
636                         " '-'.\n");
637                 return -EINVAL;
638         }
639
640         if (argv[0][1] == ':') {
641                 event = &argv[0][2];
642                 if (strchr(event, '/')) {
643                         group = event;
644                         event = strchr(group, '/') + 1;
645                         event[-1] = '\0';
646                         if (strlen(group) == 0) {
647                                 pr_info("Group name is not specified\n");
648                                 return -EINVAL;
649                         }
650                 }
651                 if (strlen(event) == 0) {
652                         pr_info("Event name is not specified\n");
653                         return -EINVAL;
654                 }
655         }
656         if (!group)
657                 group = KPROBE_EVENT_SYSTEM;
658
659         if (is_delete) {
660                 if (!event) {
661                         pr_info("Delete command needs an event name.\n");
662                         return -EINVAL;
663                 }
664                 mutex_lock(&probe_lock);
665                 tk = find_trace_kprobe(event, group);
666                 if (!tk) {
667                         mutex_unlock(&probe_lock);
668                         pr_info("Event %s/%s doesn't exist.\n", group, event);
669                         return -ENOENT;
670                 }
671                 /* delete an event */
672                 ret = unregister_trace_kprobe(tk);
673                 if (ret == 0)
674                         free_trace_kprobe(tk);
675                 mutex_unlock(&probe_lock);
676                 return ret;
677         }
678
679         if (argc < 2) {
680                 pr_info("Probe point is not specified.\n");
681                 return -EINVAL;
682         }
683         if (isdigit(argv[1][0])) {
684                 /* an address specified */
685                 ret = kstrtoul(&argv[1][0], 0, (unsigned long *)&addr);
686                 if (ret) {
687                         pr_info("Failed to parse address.\n");
688                         return ret;
689                 }
690         } else {
691                 /* a symbol specified */
692                 symbol = argv[1];
693                 /* TODO: support .init module functions */
694                 ret = traceprobe_split_symbol_offset(symbol, &offset);
695                 if (ret) {
696                         pr_info("Failed to parse symbol.\n");
697                         return ret;
698                 }
699                 if (offset && is_return &&
700                     !function_offset_within_entry(NULL, symbol, offset)) {
701                         pr_info("Given offset is not valid for return probe.\n");
702                         return -EINVAL;
703                 }
704         }
705         argc -= 2; argv += 2;
706
707         /* setup a probe */
708         if (!event) {
709                 /* Make a new event name */
710                 if (symbol)
711                         snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_%ld",
712                                  is_return ? 'r' : 'p', symbol, offset);
713                 else
714                         snprintf(buf, MAX_EVENT_NAME_LEN, "%c_0x%p",
715                                  is_return ? 'r' : 'p', addr);
716                 event = buf;
717         }
718         tk = alloc_trace_kprobe(group, event, addr, symbol, offset, argc,
719                                is_return);
720         if (IS_ERR(tk)) {
721                 pr_info("Failed to allocate trace_probe.(%d)\n",
722                         (int)PTR_ERR(tk));
723                 return PTR_ERR(tk);
724         }
725
726         /* parse arguments */
727         ret = 0;
728         for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
729                 struct probe_arg *parg = &tk->tp.args[i];
730
731                 /* Increment count for freeing args in error case */
732                 tk->tp.nr_args++;
733
734                 /* Parse argument name */
735                 arg = strchr(argv[i], '=');
736                 if (arg) {
737                         *arg++ = '\0';
738                         parg->name = kstrdup(argv[i], GFP_KERNEL);
739                 } else {
740                         arg = argv[i];
741                         /* If argument name is omitted, set "argN" */
742                         snprintf(buf, MAX_EVENT_NAME_LEN, "arg%d", i + 1);
743                         parg->name = kstrdup(buf, GFP_KERNEL);
744                 }
745
746                 if (!parg->name) {
747                         pr_info("Failed to allocate argument[%d] name.\n", i);
748                         ret = -ENOMEM;
749                         goto error;
750                 }
751
752                 if (!is_good_name(parg->name)) {
753                         pr_info("Invalid argument[%d] name: %s\n",
754                                 i, parg->name);
755                         ret = -EINVAL;
756                         goto error;
757                 }
758
759                 if (traceprobe_conflict_field_name(parg->name,
760                                                         tk->tp.args, i)) {
761                         pr_info("Argument[%d] name '%s' conflicts with "
762                                 "another field.\n", i, argv[i]);
763                         ret = -EINVAL;
764                         goto error;
765                 }
766
767                 /* Parse fetch argument */
768                 ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
769                                                 is_return, true,
770                                                 kprobes_fetch_type_table);
771                 if (ret) {
772                         pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
773                         goto error;
774                 }
775         }
776
777         ret = register_trace_kprobe(tk);
778         if (ret)
779                 goto error;
780         return 0;
781
782 error:
783         free_trace_kprobe(tk);
784         return ret;
785 }
786
787 static int release_all_trace_kprobes(void)
788 {
789         struct trace_kprobe *tk;
790         int ret = 0;
791
792         mutex_lock(&probe_lock);
793         /* Ensure no probe is in use. */
794         list_for_each_entry(tk, &probe_list, list)
795                 if (trace_probe_is_enabled(&tk->tp)) {
796                         ret = -EBUSY;
797                         goto end;
798                 }
799         /* TODO: Use batch unregistration */
800         while (!list_empty(&probe_list)) {
801                 tk = list_entry(probe_list.next, struct trace_kprobe, list);
802                 ret = unregister_trace_kprobe(tk);
803                 if (ret)
804                         goto end;
805                 free_trace_kprobe(tk);
806         }
807
808 end:
809         mutex_unlock(&probe_lock);
810
811         return ret;
812 }
813
814 /* Probes listing interfaces */
815 static void *probes_seq_start(struct seq_file *m, loff_t *pos)
816 {
817         mutex_lock(&probe_lock);
818         return seq_list_start(&probe_list, *pos);
819 }
820
821 static void *probes_seq_next(struct seq_file *m, void *v, loff_t *pos)
822 {
823         return seq_list_next(v, &probe_list, pos);
824 }
825
826 static void probes_seq_stop(struct seq_file *m, void *v)
827 {
828         mutex_unlock(&probe_lock);
829 }
830
831 static int probes_seq_show(struct seq_file *m, void *v)
832 {
833         struct trace_kprobe *tk = v;
834         int i;
835
836         seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
837         seq_printf(m, ":%s/%s", tk->tp.call.class->system,
838                         trace_event_name(&tk->tp.call));
839
840         if (!tk->symbol)
841                 seq_printf(m, " 0x%p", tk->rp.kp.addr);
842         else if (tk->rp.kp.offset)
843                 seq_printf(m, " %s+%u", trace_kprobe_symbol(tk),
844                            tk->rp.kp.offset);
845         else
846                 seq_printf(m, " %s", trace_kprobe_symbol(tk));
847
848         for (i = 0; i < tk->tp.nr_args; i++)
849                 seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
850         seq_putc(m, '\n');
851
852         return 0;
853 }
854
855 static const struct seq_operations probes_seq_op = {
856         .start  = probes_seq_start,
857         .next   = probes_seq_next,
858         .stop   = probes_seq_stop,
859         .show   = probes_seq_show
860 };
861
862 static int probes_open(struct inode *inode, struct file *file)
863 {
864         int ret;
865
866         if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
867                 ret = release_all_trace_kprobes();
868                 if (ret < 0)
869                         return ret;
870         }
871
872         return seq_open(file, &probes_seq_op);
873 }
874
875 static ssize_t probes_write(struct file *file, const char __user *buffer,
876                             size_t count, loff_t *ppos)
877 {
878         return traceprobe_probes_write(file, buffer, count, ppos,
879                         create_trace_kprobe);
880 }
881
882 static const struct file_operations kprobe_events_ops = {
883         .owner          = THIS_MODULE,
884         .open           = probes_open,
885         .read           = seq_read,
886         .llseek         = seq_lseek,
887         .release        = seq_release,
888         .write          = probes_write,
889 };
890
891 /* Probes profiling interfaces */
892 static int probes_profile_seq_show(struct seq_file *m, void *v)
893 {
894         struct trace_kprobe *tk = v;
895
896         seq_printf(m, "  %-44s %15lu %15lu\n",
897                    trace_event_name(&tk->tp.call),
898                    trace_kprobe_nhit(tk),
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  * The "__used" keeps gcc from removing the function symbol
1365  * from the kallsyms table. 'noinline' makes sure that there
1366  * isn't an inlined version used by the test method below
1367  */
1368 static __used __init noinline int
1369 kprobe_trace_selftest_target(int a1, int a2, int a3, int a4, int a5, int a6)
1370 {
1371         return a1 + a2 + a3 + a4 + a5 + a6;
1372 }
1373
1374 static __init 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         /*
1453          * Not expecting an error here, the check is only to prevent the
1454          * optimizer from removing the call to target() as otherwise there
1455          * are no side-effects and the call is never performed.
1456          */
1457         if (ret != 21)
1458                 warn++;
1459
1460         /* Disable trace points before removing it */
1461         tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
1462         if (WARN_ON_ONCE(tk == NULL)) {
1463                 pr_warn("error on getting test probe.\n");
1464                 warn++;
1465         } else {
1466                 if (trace_kprobe_nhit(tk) != 1) {
1467                         pr_warn("incorrect number of testprobe hits\n");
1468                         warn++;
1469                 }
1470
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         tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
1480         if (WARN_ON_ONCE(tk == NULL)) {
1481                 pr_warn("error on getting 2nd test probe.\n");
1482                 warn++;
1483         } else {
1484                 if (trace_kprobe_nhit(tk) != 1) {
1485                         pr_warn("incorrect number of testprobe2 hits\n");
1486                         warn++;
1487                 }
1488
1489                 file = find_trace_probe_file(tk, top_trace_array());
1490                 if (WARN_ON_ONCE(file == NULL)) {
1491                         pr_warn("error on getting probe file.\n");
1492                         warn++;
1493                 } else
1494                         disable_trace_kprobe(tk, file);
1495         }
1496
1497         ret = traceprobe_command("-:testprobe", create_trace_kprobe);
1498         if (WARN_ON_ONCE(ret)) {
1499                 pr_warn("error on deleting a probe.\n");
1500                 warn++;
1501         }
1502
1503         ret = traceprobe_command("-:testprobe2", create_trace_kprobe);
1504         if (WARN_ON_ONCE(ret)) {
1505                 pr_warn("error on deleting a probe.\n");
1506                 warn++;
1507         }
1508
1509 end:
1510         release_all_trace_kprobes();
1511         if (warn)
1512                 pr_cont("NG: Some tests are failed. Please check them.\n");
1513         else
1514                 pr_cont("OK\n");
1515         return 0;
1516 }
1517
1518 late_initcall(kprobe_trace_self_tests_init);
1519
1520 #endif