Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[cascardo/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
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         int ret = 0;
363
364         if (file) {
365                 struct event_file_link *link;
366
367                 link = kmalloc(sizeof(*link), GFP_KERNEL);
368                 if (!link) {
369                         ret = -ENOMEM;
370                         goto out;
371                 }
372
373                 link->file = file;
374                 list_add_tail_rcu(&link->list, &tk->tp.files);
375
376                 tk->tp.flags |= TP_FLAG_TRACE;
377         } else
378                 tk->tp.flags |= TP_FLAG_PROFILE;
379
380         if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
381                 if (trace_kprobe_is_return(tk))
382                         ret = enable_kretprobe(&tk->rp);
383                 else
384                         ret = enable_kprobe(&tk->rp.kp);
385         }
386  out:
387         return ret;
388 }
389
390 /*
391  * Disable trace_probe
392  * if the file is NULL, disable "perf" handler, or disable "trace" handler.
393  */
394 static int
395 disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
396 {
397         struct event_file_link *link = NULL;
398         int wait = 0;
399         int ret = 0;
400
401         if (file) {
402                 link = find_event_file_link(&tk->tp, file);
403                 if (!link) {
404                         ret = -EINVAL;
405                         goto out;
406                 }
407
408                 list_del_rcu(&link->list);
409                 wait = 1;
410                 if (!list_empty(&tk->tp.files))
411                         goto out;
412
413                 tk->tp.flags &= ~TP_FLAG_TRACE;
414         } else
415                 tk->tp.flags &= ~TP_FLAG_PROFILE;
416
417         if (!trace_probe_is_enabled(&tk->tp) && trace_probe_is_registered(&tk->tp)) {
418                 if (trace_kprobe_is_return(tk))
419                         disable_kretprobe(&tk->rp);
420                 else
421                         disable_kprobe(&tk->rp.kp);
422                 wait = 1;
423         }
424  out:
425         if (wait) {
426                 /*
427                  * Synchronize with kprobe_trace_func/kretprobe_trace_func
428                  * to ensure disabled (all running handlers are finished).
429                  * This is not only for kfree(), but also the caller,
430                  * trace_remove_event_call() supposes it for releasing
431                  * event_call related objects, which will be accessed in
432                  * the kprobe_trace_func/kretprobe_trace_func.
433                  */
434                 synchronize_sched();
435                 kfree(link);    /* Ignored if link == NULL */
436         }
437
438         return ret;
439 }
440
441 /* Internal register function - just handle k*probes and flags */
442 static int __register_trace_kprobe(struct trace_kprobe *tk)
443 {
444         int i, ret;
445
446         if (trace_probe_is_registered(&tk->tp))
447                 return -EINVAL;
448
449         for (i = 0; i < tk->tp.nr_args; i++)
450                 traceprobe_update_arg(&tk->tp.args[i]);
451
452         /* Set/clear disabled flag according to tp->flag */
453         if (trace_probe_is_enabled(&tk->tp))
454                 tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
455         else
456                 tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
457
458         if (trace_kprobe_is_return(tk))
459                 ret = register_kretprobe(&tk->rp);
460         else
461                 ret = register_kprobe(&tk->rp.kp);
462
463         if (ret == 0)
464                 tk->tp.flags |= TP_FLAG_REGISTERED;
465         else {
466                 pr_warn("Could not insert probe at %s+%lu: %d\n",
467                         trace_kprobe_symbol(tk), trace_kprobe_offset(tk), ret);
468                 if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) {
469                         pr_warn("This probe might be able to register after target module is loaded. Continue.\n");
470                         ret = 0;
471                 } else if (ret == -EILSEQ) {
472                         pr_warn("Probing address(0x%p) is not an instruction boundary.\n",
473                                 tk->rp.kp.addr);
474                         ret = -EINVAL;
475                 }
476         }
477
478         return ret;
479 }
480
481 /* Internal unregister function - just handle k*probes and flags */
482 static void __unregister_trace_kprobe(struct trace_kprobe *tk)
483 {
484         if (trace_probe_is_registered(&tk->tp)) {
485                 if (trace_kprobe_is_return(tk))
486                         unregister_kretprobe(&tk->rp);
487                 else
488                         unregister_kprobe(&tk->rp.kp);
489                 tk->tp.flags &= ~TP_FLAG_REGISTERED;
490                 /* Cleanup kprobe for reuse */
491                 if (tk->rp.kp.symbol_name)
492                         tk->rp.kp.addr = NULL;
493         }
494 }
495
496 /* Unregister a trace_probe and probe_event: call with locking probe_lock */
497 static int unregister_trace_kprobe(struct trace_kprobe *tk)
498 {
499         /* Enabled event can not be unregistered */
500         if (trace_probe_is_enabled(&tk->tp))
501                 return -EBUSY;
502
503         /* Will fail if probe is being used by ftrace or perf */
504         if (unregister_kprobe_event(tk))
505                 return -EBUSY;
506
507         __unregister_trace_kprobe(tk);
508         list_del(&tk->list);
509
510         return 0;
511 }
512
513 /* Register a trace_probe and probe_event */
514 static int register_trace_kprobe(struct trace_kprobe *tk)
515 {
516         struct trace_kprobe *old_tk;
517         int ret;
518
519         mutex_lock(&probe_lock);
520
521         /* Delete old (same name) event if exist */
522         old_tk = find_trace_kprobe(trace_event_name(&tk->tp.call),
523                         tk->tp.call.class->system);
524         if (old_tk) {
525                 ret = unregister_trace_kprobe(old_tk);
526                 if (ret < 0)
527                         goto end;
528                 free_trace_kprobe(old_tk);
529         }
530
531         /* Register new event */
532         ret = register_kprobe_event(tk);
533         if (ret) {
534                 pr_warn("Failed to register probe event(%d)\n", ret);
535                 goto end;
536         }
537
538         /* Register k*probe */
539         ret = __register_trace_kprobe(tk);
540         if (ret < 0)
541                 unregister_kprobe_event(tk);
542         else
543                 list_add_tail(&tk->list, &probe_list);
544
545 end:
546         mutex_unlock(&probe_lock);
547         return ret;
548 }
549
550 /* Module notifier call back, checking event on the module */
551 static int trace_kprobe_module_callback(struct notifier_block *nb,
552                                        unsigned long val, void *data)
553 {
554         struct module *mod = data;
555         struct trace_kprobe *tk;
556         int ret;
557
558         if (val != MODULE_STATE_COMING)
559                 return NOTIFY_DONE;
560
561         /* Update probes on coming module */
562         mutex_lock(&probe_lock);
563         list_for_each_entry(tk, &probe_list, list) {
564                 if (trace_kprobe_within_module(tk, mod)) {
565                         /* Don't need to check busy - this should have gone. */
566                         __unregister_trace_kprobe(tk);
567                         ret = __register_trace_kprobe(tk);
568                         if (ret)
569                                 pr_warn("Failed to re-register probe %s on %s: %d\n",
570                                         trace_event_name(&tk->tp.call),
571                                         mod->name, ret);
572                 }
573         }
574         mutex_unlock(&probe_lock);
575
576         return NOTIFY_DONE;
577 }
578
579 static struct notifier_block trace_kprobe_module_nb = {
580         .notifier_call = trace_kprobe_module_callback,
581         .priority = 1   /* Invoked after kprobe module callback */
582 };
583
584 static int create_trace_kprobe(int argc, char **argv)
585 {
586         /*
587          * Argument syntax:
588          *  - Add kprobe: p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
589          *  - Add kretprobe: r[:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
590          * Fetch args:
591          *  $retval     : fetch return value
592          *  $stack      : fetch stack address
593          *  $stackN     : fetch Nth of stack (N:0-)
594          *  $comm       : fetch current task comm
595          *  @ADDR       : fetch memory at ADDR (ADDR should be in kernel)
596          *  @SYM[+|-offs] : fetch memory at SYM +|- offs (SYM is a data symbol)
597          *  %REG        : fetch register REG
598          * Dereferencing memory fetch:
599          *  +|-offs(ARG) : fetch memory at ARG +|- offs address.
600          * Alias name of args:
601          *  NAME=FETCHARG : set NAME as alias of FETCHARG.
602          * Type of args:
603          *  FETCHARG:TYPE : use TYPE instead of unsigned long.
604          */
605         struct trace_kprobe *tk;
606         int i, ret = 0;
607         bool is_return = false, is_delete = false;
608         char *symbol = NULL, *event = NULL, *group = NULL;
609         char *arg;
610         unsigned long offset = 0;
611         void *addr = NULL;
612         char buf[MAX_EVENT_NAME_LEN];
613
614         /* argc must be >= 1 */
615         if (argv[0][0] == 'p')
616                 is_return = false;
617         else if (argv[0][0] == 'r')
618                 is_return = true;
619         else if (argv[0][0] == '-')
620                 is_delete = true;
621         else {
622                 pr_info("Probe definition must be started with 'p', 'r' or"
623                         " '-'.\n");
624                 return -EINVAL;
625         }
626
627         if (argv[0][1] == ':') {
628                 event = &argv[0][2];
629                 if (strchr(event, '/')) {
630                         group = event;
631                         event = strchr(group, '/') + 1;
632                         event[-1] = '\0';
633                         if (strlen(group) == 0) {
634                                 pr_info("Group name is not specified\n");
635                                 return -EINVAL;
636                         }
637                 }
638                 if (strlen(event) == 0) {
639                         pr_info("Event name is not specified\n");
640                         return -EINVAL;
641                 }
642         }
643         if (!group)
644                 group = KPROBE_EVENT_SYSTEM;
645
646         if (is_delete) {
647                 if (!event) {
648                         pr_info("Delete command needs an event name.\n");
649                         return -EINVAL;
650                 }
651                 mutex_lock(&probe_lock);
652                 tk = find_trace_kprobe(event, group);
653                 if (!tk) {
654                         mutex_unlock(&probe_lock);
655                         pr_info("Event %s/%s doesn't exist.\n", group, event);
656                         return -ENOENT;
657                 }
658                 /* delete an event */
659                 ret = unregister_trace_kprobe(tk);
660                 if (ret == 0)
661                         free_trace_kprobe(tk);
662                 mutex_unlock(&probe_lock);
663                 return ret;
664         }
665
666         if (argc < 2) {
667                 pr_info("Probe point is not specified.\n");
668                 return -EINVAL;
669         }
670         if (isdigit(argv[1][0])) {
671                 if (is_return) {
672                         pr_info("Return probe point must be a symbol.\n");
673                         return -EINVAL;
674                 }
675                 /* an address specified */
676                 ret = kstrtoul(&argv[1][0], 0, (unsigned long *)&addr);
677                 if (ret) {
678                         pr_info("Failed to parse address.\n");
679                         return ret;
680                 }
681         } else {
682                 /* a symbol specified */
683                 symbol = argv[1];
684                 /* TODO: support .init module functions */
685                 ret = traceprobe_split_symbol_offset(symbol, &offset);
686                 if (ret) {
687                         pr_info("Failed to parse symbol.\n");
688                         return ret;
689                 }
690                 if (offset && is_return) {
691                         pr_info("Return probe must be used without offset.\n");
692                         return -EINVAL;
693                 }
694         }
695         argc -= 2; argv += 2;
696
697         /* setup a probe */
698         if (!event) {
699                 /* Make a new event name */
700                 if (symbol)
701                         snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_%ld",
702                                  is_return ? 'r' : 'p', symbol, offset);
703                 else
704                         snprintf(buf, MAX_EVENT_NAME_LEN, "%c_0x%p",
705                                  is_return ? 'r' : 'p', addr);
706                 event = buf;
707         }
708         tk = alloc_trace_kprobe(group, event, addr, symbol, offset, argc,
709                                is_return);
710         if (IS_ERR(tk)) {
711                 pr_info("Failed to allocate trace_probe.(%d)\n",
712                         (int)PTR_ERR(tk));
713                 return PTR_ERR(tk);
714         }
715
716         /* parse arguments */
717         ret = 0;
718         for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
719                 struct probe_arg *parg = &tk->tp.args[i];
720
721                 /* Increment count for freeing args in error case */
722                 tk->tp.nr_args++;
723
724                 /* Parse argument name */
725                 arg = strchr(argv[i], '=');
726                 if (arg) {
727                         *arg++ = '\0';
728                         parg->name = kstrdup(argv[i], GFP_KERNEL);
729                 } else {
730                         arg = argv[i];
731                         /* If argument name is omitted, set "argN" */
732                         snprintf(buf, MAX_EVENT_NAME_LEN, "arg%d", i + 1);
733                         parg->name = kstrdup(buf, GFP_KERNEL);
734                 }
735
736                 if (!parg->name) {
737                         pr_info("Failed to allocate argument[%d] name.\n", i);
738                         ret = -ENOMEM;
739                         goto error;
740                 }
741
742                 if (!is_good_name(parg->name)) {
743                         pr_info("Invalid argument[%d] name: %s\n",
744                                 i, parg->name);
745                         ret = -EINVAL;
746                         goto error;
747                 }
748
749                 if (traceprobe_conflict_field_name(parg->name,
750                                                         tk->tp.args, i)) {
751                         pr_info("Argument[%d] name '%s' conflicts with "
752                                 "another field.\n", i, argv[i]);
753                         ret = -EINVAL;
754                         goto error;
755                 }
756
757                 /* Parse fetch argument */
758                 ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
759                                                 is_return, true,
760                                                 kprobes_fetch_type_table);
761                 if (ret) {
762                         pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
763                         goto error;
764                 }
765         }
766
767         ret = register_trace_kprobe(tk);
768         if (ret)
769                 goto error;
770         return 0;
771
772 error:
773         free_trace_kprobe(tk);
774         return ret;
775 }
776
777 static int release_all_trace_kprobes(void)
778 {
779         struct trace_kprobe *tk;
780         int ret = 0;
781
782         mutex_lock(&probe_lock);
783         /* Ensure no probe is in use. */
784         list_for_each_entry(tk, &probe_list, list)
785                 if (trace_probe_is_enabled(&tk->tp)) {
786                         ret = -EBUSY;
787                         goto end;
788                 }
789         /* TODO: Use batch unregistration */
790         while (!list_empty(&probe_list)) {
791                 tk = list_entry(probe_list.next, struct trace_kprobe, list);
792                 ret = unregister_trace_kprobe(tk);
793                 if (ret)
794                         goto end;
795                 free_trace_kprobe(tk);
796         }
797
798 end:
799         mutex_unlock(&probe_lock);
800
801         return ret;
802 }
803
804 /* Probes listing interfaces */
805 static void *probes_seq_start(struct seq_file *m, loff_t *pos)
806 {
807         mutex_lock(&probe_lock);
808         return seq_list_start(&probe_list, *pos);
809 }
810
811 static void *probes_seq_next(struct seq_file *m, void *v, loff_t *pos)
812 {
813         return seq_list_next(v, &probe_list, pos);
814 }
815
816 static void probes_seq_stop(struct seq_file *m, void *v)
817 {
818         mutex_unlock(&probe_lock);
819 }
820
821 static int probes_seq_show(struct seq_file *m, void *v)
822 {
823         struct trace_kprobe *tk = v;
824         int i;
825
826         seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
827         seq_printf(m, ":%s/%s", tk->tp.call.class->system,
828                         trace_event_name(&tk->tp.call));
829
830         if (!tk->symbol)
831                 seq_printf(m, " 0x%p", tk->rp.kp.addr);
832         else if (tk->rp.kp.offset)
833                 seq_printf(m, " %s+%u", trace_kprobe_symbol(tk),
834                            tk->rp.kp.offset);
835         else
836                 seq_printf(m, " %s", trace_kprobe_symbol(tk));
837
838         for (i = 0; i < tk->tp.nr_args; i++)
839                 seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
840         seq_putc(m, '\n');
841
842         return 0;
843 }
844
845 static const struct seq_operations probes_seq_op = {
846         .start  = probes_seq_start,
847         .next   = probes_seq_next,
848         .stop   = probes_seq_stop,
849         .show   = probes_seq_show
850 };
851
852 static int probes_open(struct inode *inode, struct file *file)
853 {
854         int ret;
855
856         if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
857                 ret = release_all_trace_kprobes();
858                 if (ret < 0)
859                         return ret;
860         }
861
862         return seq_open(file, &probes_seq_op);
863 }
864
865 static ssize_t probes_write(struct file *file, const char __user *buffer,
866                             size_t count, loff_t *ppos)
867 {
868         return traceprobe_probes_write(file, buffer, count, ppos,
869                         create_trace_kprobe);
870 }
871
872 static const struct file_operations kprobe_events_ops = {
873         .owner          = THIS_MODULE,
874         .open           = probes_open,
875         .read           = seq_read,
876         .llseek         = seq_lseek,
877         .release        = seq_release,
878         .write          = probes_write,
879 };
880
881 /* Probes profiling interfaces */
882 static int probes_profile_seq_show(struct seq_file *m, void *v)
883 {
884         struct trace_kprobe *tk = v;
885         unsigned long nhit = 0;
886         int cpu;
887
888         for_each_possible_cpu(cpu)
889                 nhit += *per_cpu_ptr(tk->nhit, cpu);
890
891         seq_printf(m, "  %-44s %15lu %15lu\n",
892                    trace_event_name(&tk->tp.call), nhit,
893                    tk->rp.kp.nmissed);
894
895         return 0;
896 }
897
898 static const struct seq_operations profile_seq_op = {
899         .start  = probes_seq_start,
900         .next   = probes_seq_next,
901         .stop   = probes_seq_stop,
902         .show   = probes_profile_seq_show
903 };
904
905 static int profile_open(struct inode *inode, struct file *file)
906 {
907         return seq_open(file, &profile_seq_op);
908 }
909
910 static const struct file_operations kprobe_profile_ops = {
911         .owner          = THIS_MODULE,
912         .open           = profile_open,
913         .read           = seq_read,
914         .llseek         = seq_lseek,
915         .release        = seq_release,
916 };
917
918 /* Kprobe handler */
919 static nokprobe_inline void
920 __kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
921                     struct trace_event_file *trace_file)
922 {
923         struct kprobe_trace_entry_head *entry;
924         struct ring_buffer_event *event;
925         struct ring_buffer *buffer;
926         int size, dsize, pc;
927         unsigned long irq_flags;
928         struct trace_event_call *call = &tk->tp.call;
929
930         WARN_ON(call != trace_file->event_call);
931
932         if (trace_trigger_soft_disabled(trace_file))
933                 return;
934
935         local_save_flags(irq_flags);
936         pc = preempt_count();
937
938         dsize = __get_data_size(&tk->tp, regs);
939         size = sizeof(*entry) + tk->tp.size + dsize;
940
941         event = trace_event_buffer_lock_reserve(&buffer, trace_file,
942                                                 call->event.type,
943                                                 size, irq_flags, pc);
944         if (!event)
945                 return;
946
947         entry = ring_buffer_event_data(event);
948         entry->ip = (unsigned long)tk->rp.kp.addr;
949         store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
950
951         event_trigger_unlock_commit_regs(trace_file, buffer, event,
952                                          entry, irq_flags, pc, regs);
953 }
954
955 static void
956 kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs)
957 {
958         struct event_file_link *link;
959
960         list_for_each_entry_rcu(link, &tk->tp.files, list)
961                 __kprobe_trace_func(tk, regs, link->file);
962 }
963 NOKPROBE_SYMBOL(kprobe_trace_func);
964
965 /* Kretprobe handler */
966 static nokprobe_inline void
967 __kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
968                        struct pt_regs *regs,
969                        struct trace_event_file *trace_file)
970 {
971         struct kretprobe_trace_entry_head *entry;
972         struct ring_buffer_event *event;
973         struct ring_buffer *buffer;
974         int size, pc, dsize;
975         unsigned long irq_flags;
976         struct trace_event_call *call = &tk->tp.call;
977
978         WARN_ON(call != trace_file->event_call);
979
980         if (trace_trigger_soft_disabled(trace_file))
981                 return;
982
983         local_save_flags(irq_flags);
984         pc = preempt_count();
985
986         dsize = __get_data_size(&tk->tp, regs);
987         size = sizeof(*entry) + tk->tp.size + dsize;
988
989         event = trace_event_buffer_lock_reserve(&buffer, trace_file,
990                                                 call->event.type,
991                                                 size, irq_flags, pc);
992         if (!event)
993                 return;
994
995         entry = ring_buffer_event_data(event);
996         entry->func = (unsigned long)tk->rp.kp.addr;
997         entry->ret_ip = (unsigned long)ri->ret_addr;
998         store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
999
1000         event_trigger_unlock_commit_regs(trace_file, buffer, event,
1001                                          entry, irq_flags, pc, regs);
1002 }
1003
1004 static void
1005 kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1006                      struct pt_regs *regs)
1007 {
1008         struct event_file_link *link;
1009
1010         list_for_each_entry_rcu(link, &tk->tp.files, list)
1011                 __kretprobe_trace_func(tk, ri, regs, link->file);
1012 }
1013 NOKPROBE_SYMBOL(kretprobe_trace_func);
1014
1015 /* Event entry printers */
1016 static enum print_line_t
1017 print_kprobe_event(struct trace_iterator *iter, int flags,
1018                    struct trace_event *event)
1019 {
1020         struct kprobe_trace_entry_head *field;
1021         struct trace_seq *s = &iter->seq;
1022         struct trace_probe *tp;
1023         u8 *data;
1024         int i;
1025
1026         field = (struct kprobe_trace_entry_head *)iter->ent;
1027         tp = container_of(event, struct trace_probe, call.event);
1028
1029         trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1030
1031         if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET))
1032                 goto out;
1033
1034         trace_seq_putc(s, ')');
1035
1036         data = (u8 *)&field[1];
1037         for (i = 0; i < tp->nr_args; i++)
1038                 if (!tp->args[i].type->print(s, tp->args[i].name,
1039                                              data + tp->args[i].offset, field))
1040                         goto out;
1041
1042         trace_seq_putc(s, '\n');
1043  out:
1044         return trace_handle_return(s);
1045 }
1046
1047 static enum print_line_t
1048 print_kretprobe_event(struct trace_iterator *iter, int flags,
1049                       struct trace_event *event)
1050 {
1051         struct kretprobe_trace_entry_head *field;
1052         struct trace_seq *s = &iter->seq;
1053         struct trace_probe *tp;
1054         u8 *data;
1055         int i;
1056
1057         field = (struct kretprobe_trace_entry_head *)iter->ent;
1058         tp = container_of(event, struct trace_probe, call.event);
1059
1060         trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1061
1062         if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
1063                 goto out;
1064
1065         trace_seq_puts(s, " <- ");
1066
1067         if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER_SYM_OFFSET))
1068                 goto out;
1069
1070         trace_seq_putc(s, ')');
1071
1072         data = (u8 *)&field[1];
1073         for (i = 0; i < tp->nr_args; i++)
1074                 if (!tp->args[i].type->print(s, tp->args[i].name,
1075                                              data + tp->args[i].offset, field))
1076                         goto out;
1077
1078         trace_seq_putc(s, '\n');
1079
1080  out:
1081         return trace_handle_return(s);
1082 }
1083
1084
1085 static int kprobe_event_define_fields(struct trace_event_call *event_call)
1086 {
1087         int ret, i;
1088         struct kprobe_trace_entry_head field;
1089         struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1090
1091         DEFINE_FIELD(unsigned long, ip, FIELD_STRING_IP, 0);
1092         /* Set argument names as fields */
1093         for (i = 0; i < tk->tp.nr_args; i++) {
1094                 struct probe_arg *parg = &tk->tp.args[i];
1095
1096                 ret = trace_define_field(event_call, parg->type->fmttype,
1097                                          parg->name,
1098                                          sizeof(field) + parg->offset,
1099                                          parg->type->size,
1100                                          parg->type->is_signed,
1101                                          FILTER_OTHER);
1102                 if (ret)
1103                         return ret;
1104         }
1105         return 0;
1106 }
1107
1108 static int kretprobe_event_define_fields(struct trace_event_call *event_call)
1109 {
1110         int ret, i;
1111         struct kretprobe_trace_entry_head field;
1112         struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1113
1114         DEFINE_FIELD(unsigned long, func, FIELD_STRING_FUNC, 0);
1115         DEFINE_FIELD(unsigned long, ret_ip, FIELD_STRING_RETIP, 0);
1116         /* Set argument names as fields */
1117         for (i = 0; i < tk->tp.nr_args; i++) {
1118                 struct probe_arg *parg = &tk->tp.args[i];
1119
1120                 ret = trace_define_field(event_call, parg->type->fmttype,
1121                                          parg->name,
1122                                          sizeof(field) + parg->offset,
1123                                          parg->type->size,
1124                                          parg->type->is_signed,
1125                                          FILTER_OTHER);
1126                 if (ret)
1127                         return ret;
1128         }
1129         return 0;
1130 }
1131
1132 #ifdef CONFIG_PERF_EVENTS
1133
1134 /* Kprobe profile handler */
1135 static void
1136 kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs)
1137 {
1138         struct trace_event_call *call = &tk->tp.call;
1139         struct bpf_prog *prog = call->prog;
1140         struct kprobe_trace_entry_head *entry;
1141         struct hlist_head *head;
1142         int size, __size, dsize;
1143         int rctx;
1144
1145         if (prog && !trace_call_bpf(prog, regs))
1146                 return;
1147
1148         head = this_cpu_ptr(call->perf_events);
1149         if (hlist_empty(head))
1150                 return;
1151
1152         dsize = __get_data_size(&tk->tp, regs);
1153         __size = sizeof(*entry) + tk->tp.size + dsize;
1154         size = ALIGN(__size + sizeof(u32), sizeof(u64));
1155         size -= sizeof(u32);
1156
1157         entry = perf_trace_buf_alloc(size, NULL, &rctx);
1158         if (!entry)
1159                 return;
1160
1161         entry->ip = (unsigned long)tk->rp.kp.addr;
1162         memset(&entry[1], 0, dsize);
1163         store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1164         perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
1165                               head, NULL);
1166 }
1167 NOKPROBE_SYMBOL(kprobe_perf_func);
1168
1169 /* Kretprobe profile handler */
1170 static void
1171 kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1172                     struct pt_regs *regs)
1173 {
1174         struct trace_event_call *call = &tk->tp.call;
1175         struct bpf_prog *prog = call->prog;
1176         struct kretprobe_trace_entry_head *entry;
1177         struct hlist_head *head;
1178         int size, __size, dsize;
1179         int rctx;
1180
1181         if (prog && !trace_call_bpf(prog, regs))
1182                 return;
1183
1184         head = this_cpu_ptr(call->perf_events);
1185         if (hlist_empty(head))
1186                 return;
1187
1188         dsize = __get_data_size(&tk->tp, regs);
1189         __size = sizeof(*entry) + tk->tp.size + dsize;
1190         size = ALIGN(__size + sizeof(u32), sizeof(u64));
1191         size -= sizeof(u32);
1192
1193         entry = perf_trace_buf_alloc(size, NULL, &rctx);
1194         if (!entry)
1195                 return;
1196
1197         entry->func = (unsigned long)tk->rp.kp.addr;
1198         entry->ret_ip = (unsigned long)ri->ret_addr;
1199         store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1200         perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
1201                               head, NULL);
1202 }
1203 NOKPROBE_SYMBOL(kretprobe_perf_func);
1204 #endif  /* CONFIG_PERF_EVENTS */
1205
1206 /*
1207  * called by perf_trace_init() or __ftrace_set_clr_event() under event_mutex.
1208  *
1209  * kprobe_trace_self_tests_init() does enable_trace_probe/disable_trace_probe
1210  * lockless, but we can't race with this __init function.
1211  */
1212 static int kprobe_register(struct trace_event_call *event,
1213                            enum trace_reg type, void *data)
1214 {
1215         struct trace_kprobe *tk = (struct trace_kprobe *)event->data;
1216         struct trace_event_file *file = data;
1217
1218         switch (type) {
1219         case TRACE_REG_REGISTER:
1220                 return enable_trace_kprobe(tk, file);
1221         case TRACE_REG_UNREGISTER:
1222                 return disable_trace_kprobe(tk, file);
1223
1224 #ifdef CONFIG_PERF_EVENTS
1225         case TRACE_REG_PERF_REGISTER:
1226                 return enable_trace_kprobe(tk, NULL);
1227         case TRACE_REG_PERF_UNREGISTER:
1228                 return disable_trace_kprobe(tk, NULL);
1229         case TRACE_REG_PERF_OPEN:
1230         case TRACE_REG_PERF_CLOSE:
1231         case TRACE_REG_PERF_ADD:
1232         case TRACE_REG_PERF_DEL:
1233                 return 0;
1234 #endif
1235         }
1236         return 0;
1237 }
1238
1239 static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs)
1240 {
1241         struct trace_kprobe *tk = container_of(kp, struct trace_kprobe, rp.kp);
1242
1243         raw_cpu_inc(*tk->nhit);
1244
1245         if (tk->tp.flags & TP_FLAG_TRACE)
1246                 kprobe_trace_func(tk, regs);
1247 #ifdef CONFIG_PERF_EVENTS
1248         if (tk->tp.flags & TP_FLAG_PROFILE)
1249                 kprobe_perf_func(tk, regs);
1250 #endif
1251         return 0;       /* We don't tweek kernel, so just return 0 */
1252 }
1253 NOKPROBE_SYMBOL(kprobe_dispatcher);
1254
1255 static int
1256 kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
1257 {
1258         struct trace_kprobe *tk = container_of(ri->rp, struct trace_kprobe, rp);
1259
1260         raw_cpu_inc(*tk->nhit);
1261
1262         if (tk->tp.flags & TP_FLAG_TRACE)
1263                 kretprobe_trace_func(tk, ri, regs);
1264 #ifdef CONFIG_PERF_EVENTS
1265         if (tk->tp.flags & TP_FLAG_PROFILE)
1266                 kretprobe_perf_func(tk, ri, regs);
1267 #endif
1268         return 0;       /* We don't tweek kernel, so just return 0 */
1269 }
1270 NOKPROBE_SYMBOL(kretprobe_dispatcher);
1271
1272 static struct trace_event_functions kretprobe_funcs = {
1273         .trace          = print_kretprobe_event
1274 };
1275
1276 static struct trace_event_functions kprobe_funcs = {
1277         .trace          = print_kprobe_event
1278 };
1279
1280 static int register_kprobe_event(struct trace_kprobe *tk)
1281 {
1282         struct trace_event_call *call = &tk->tp.call;
1283         int ret;
1284
1285         /* Initialize trace_event_call */
1286         INIT_LIST_HEAD(&call->class->fields);
1287         if (trace_kprobe_is_return(tk)) {
1288                 call->event.funcs = &kretprobe_funcs;
1289                 call->class->define_fields = kretprobe_event_define_fields;
1290         } else {
1291                 call->event.funcs = &kprobe_funcs;
1292                 call->class->define_fields = kprobe_event_define_fields;
1293         }
1294         if (set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0)
1295                 return -ENOMEM;
1296         ret = register_trace_event(&call->event);
1297         if (!ret) {
1298                 kfree(call->print_fmt);
1299                 return -ENODEV;
1300         }
1301         call->flags = TRACE_EVENT_FL_KPROBE;
1302         call->class->reg = kprobe_register;
1303         call->data = tk;
1304         ret = trace_add_event_call(call);
1305         if (ret) {
1306                 pr_info("Failed to register kprobe event: %s\n",
1307                         trace_event_name(call));
1308                 kfree(call->print_fmt);
1309                 unregister_trace_event(&call->event);
1310         }
1311         return ret;
1312 }
1313
1314 static int unregister_kprobe_event(struct trace_kprobe *tk)
1315 {
1316         int ret;
1317
1318         /* tp->event is unregistered in trace_remove_event_call() */
1319         ret = trace_remove_event_call(&tk->tp.call);
1320         if (!ret)
1321                 kfree(tk->tp.call.print_fmt);
1322         return ret;
1323 }
1324
1325 /* Make a tracefs interface for controlling probe points */
1326 static __init int init_kprobe_trace(void)
1327 {
1328         struct dentry *d_tracer;
1329         struct dentry *entry;
1330
1331         if (register_module_notifier(&trace_kprobe_module_nb))
1332                 return -EINVAL;
1333
1334         d_tracer = tracing_init_dentry();
1335         if (IS_ERR(d_tracer))
1336                 return 0;
1337
1338         entry = tracefs_create_file("kprobe_events", 0644, d_tracer,
1339                                     NULL, &kprobe_events_ops);
1340
1341         /* Event list interface */
1342         if (!entry)
1343                 pr_warn("Could not create tracefs 'kprobe_events' entry\n");
1344
1345         /* Profile interface */
1346         entry = tracefs_create_file("kprobe_profile", 0444, d_tracer,
1347                                     NULL, &kprobe_profile_ops);
1348
1349         if (!entry)
1350                 pr_warn("Could not create tracefs 'kprobe_profile' entry\n");
1351         return 0;
1352 }
1353 fs_initcall(init_kprobe_trace);
1354
1355
1356 #ifdef CONFIG_FTRACE_STARTUP_TEST
1357
1358 /*
1359  * The "__used" keeps gcc from removing the function symbol
1360  * from the kallsyms table.
1361  */
1362 static __used int kprobe_trace_selftest_target(int a1, int a2, int a3,
1363                                                int a4, int a5, int a6)
1364 {
1365         return a1 + a2 + a3 + a4 + a5 + a6;
1366 }
1367
1368 static struct trace_event_file *
1369 find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
1370 {
1371         struct trace_event_file *file;
1372
1373         list_for_each_entry(file, &tr->events, list)
1374                 if (file->event_call == &tk->tp.call)
1375                         return file;
1376
1377         return NULL;
1378 }
1379
1380 /*
1381  * Nobody but us can call enable_trace_kprobe/disable_trace_kprobe at this
1382  * stage, we can do this lockless.
1383  */
1384 static __init int kprobe_trace_self_tests_init(void)
1385 {
1386         int ret, warn = 0;
1387         int (*target)(int, int, int, int, int, int);
1388         struct trace_kprobe *tk;
1389         struct trace_event_file *file;
1390
1391         if (tracing_is_disabled())
1392                 return -ENODEV;
1393
1394         target = kprobe_trace_selftest_target;
1395
1396         pr_info("Testing kprobe tracing: ");
1397
1398         ret = traceprobe_command("p:testprobe kprobe_trace_selftest_target "
1399                                   "$stack $stack0 +0($stack)",
1400                                   create_trace_kprobe);
1401         if (WARN_ON_ONCE(ret)) {
1402                 pr_warn("error on probing function entry.\n");
1403                 warn++;
1404         } else {
1405                 /* Enable trace point */
1406                 tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
1407                 if (WARN_ON_ONCE(tk == NULL)) {
1408                         pr_warn("error on getting new probe.\n");
1409                         warn++;
1410                 } else {
1411                         file = find_trace_probe_file(tk, top_trace_array());
1412                         if (WARN_ON_ONCE(file == NULL)) {
1413                                 pr_warn("error on getting probe file.\n");
1414                                 warn++;
1415                         } else
1416                                 enable_trace_kprobe(tk, file);
1417                 }
1418         }
1419
1420         ret = traceprobe_command("r:testprobe2 kprobe_trace_selftest_target "
1421                                   "$retval", create_trace_kprobe);
1422         if (WARN_ON_ONCE(ret)) {
1423                 pr_warn("error on probing function return.\n");
1424                 warn++;
1425         } else {
1426                 /* Enable trace point */
1427                 tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
1428                 if (WARN_ON_ONCE(tk == NULL)) {
1429                         pr_warn("error on getting 2nd new probe.\n");
1430                         warn++;
1431                 } else {
1432                         file = find_trace_probe_file(tk, top_trace_array());
1433                         if (WARN_ON_ONCE(file == NULL)) {
1434                                 pr_warn("error on getting probe file.\n");
1435                                 warn++;
1436                         } else
1437                                 enable_trace_kprobe(tk, file);
1438                 }
1439         }
1440
1441         if (warn)
1442                 goto end;
1443
1444         ret = target(1, 2, 3, 4, 5, 6);
1445
1446         /* Disable trace points before removing it */
1447         tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
1448         if (WARN_ON_ONCE(tk == NULL)) {
1449                 pr_warn("error on getting test probe.\n");
1450                 warn++;
1451         } else {
1452                 file = find_trace_probe_file(tk, top_trace_array());
1453                 if (WARN_ON_ONCE(file == NULL)) {
1454                         pr_warn("error on getting probe file.\n");
1455                         warn++;
1456                 } else
1457                         disable_trace_kprobe(tk, file);
1458         }
1459
1460         tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
1461         if (WARN_ON_ONCE(tk == NULL)) {
1462                 pr_warn("error on getting 2nd test probe.\n");
1463                 warn++;
1464         } else {
1465                 file = find_trace_probe_file(tk, top_trace_array());
1466                 if (WARN_ON_ONCE(file == NULL)) {
1467                         pr_warn("error on getting probe file.\n");
1468                         warn++;
1469                 } else
1470                         disable_trace_kprobe(tk, file);
1471         }
1472
1473         ret = traceprobe_command("-:testprobe", create_trace_kprobe);
1474         if (WARN_ON_ONCE(ret)) {
1475                 pr_warn("error on deleting a probe.\n");
1476                 warn++;
1477         }
1478
1479         ret = traceprobe_command("-:testprobe2", create_trace_kprobe);
1480         if (WARN_ON_ONCE(ret)) {
1481                 pr_warn("error on deleting a probe.\n");
1482                 warn++;
1483         }
1484
1485 end:
1486         release_all_trace_kprobes();
1487         if (warn)
1488                 pr_cont("NG: Some tests are failed. Please check them.\n");
1489         else
1490                 pr_cont("OK\n");
1491         return 0;
1492 }
1493
1494 late_initcall(kprobe_trace_self_tests_init);
1495
1496 #endif