Merge tag 'sched_ext-for-6.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tj...
[linux-2.6-block.git] / kernel / trace / trace_probe.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Common code for probe-based Dynamic events.
4  *
5  * This code was copied from kernel/trace/trace_kprobe.c written by
6  * Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
7  *
8  * Updates to make this generic:
9  * Copyright (C) IBM Corporation, 2010-2011
10  * Author:     Srikar Dronamraju
11  */
12 #define pr_fmt(fmt)     "trace_probe: " fmt
13
14 #include <linux/bpf.h>
15 #include <linux/fs.h>
16 #include "trace_btf.h"
17
18 #include "trace_probe.h"
19
20 #undef C
21 #define C(a, b)         b
22
23 static const char *trace_probe_err_text[] = { ERRORS };
24
25 static const char *reserved_field_names[] = {
26         "common_type",
27         "common_flags",
28         "common_preempt_count",
29         "common_pid",
30         "common_tgid",
31         FIELD_STRING_IP,
32         FIELD_STRING_RETIP,
33         FIELD_STRING_FUNC,
34 };
35
36 /* Printing  in basic type function template */
37 #define DEFINE_BASIC_PRINT_TYPE_FUNC(tname, type, fmt)                  \
38 int PRINT_TYPE_FUNC_NAME(tname)(struct trace_seq *s, void *data, void *ent)\
39 {                                                                       \
40         trace_seq_printf(s, fmt, *(type *)data);                        \
41         return !trace_seq_has_overflowed(s);                            \
42 }                                                                       \
43 const char PRINT_TYPE_FMT_NAME(tname)[] = fmt;
44
45 DEFINE_BASIC_PRINT_TYPE_FUNC(u8,  u8,  "%u")
46 DEFINE_BASIC_PRINT_TYPE_FUNC(u16, u16, "%u")
47 DEFINE_BASIC_PRINT_TYPE_FUNC(u32, u32, "%u")
48 DEFINE_BASIC_PRINT_TYPE_FUNC(u64, u64, "%Lu")
49 DEFINE_BASIC_PRINT_TYPE_FUNC(s8,  s8,  "%d")
50 DEFINE_BASIC_PRINT_TYPE_FUNC(s16, s16, "%d")
51 DEFINE_BASIC_PRINT_TYPE_FUNC(s32, s32, "%d")
52 DEFINE_BASIC_PRINT_TYPE_FUNC(s64, s64, "%Ld")
53 DEFINE_BASIC_PRINT_TYPE_FUNC(x8,  u8,  "0x%x")
54 DEFINE_BASIC_PRINT_TYPE_FUNC(x16, u16, "0x%x")
55 DEFINE_BASIC_PRINT_TYPE_FUNC(x32, u32, "0x%x")
56 DEFINE_BASIC_PRINT_TYPE_FUNC(x64, u64, "0x%Lx")
57 DEFINE_BASIC_PRINT_TYPE_FUNC(char, u8, "'%c'")
58
59 int PRINT_TYPE_FUNC_NAME(symbol)(struct trace_seq *s, void *data, void *ent)
60 {
61         trace_seq_printf(s, "%pS", (void *)*(unsigned long *)data);
62         return !trace_seq_has_overflowed(s);
63 }
64 const char PRINT_TYPE_FMT_NAME(symbol)[] = "%pS";
65
66 /* Print type function for string type */
67 int PRINT_TYPE_FUNC_NAME(string)(struct trace_seq *s, void *data, void *ent)
68 {
69         int len = *(u32 *)data >> 16;
70
71         if (!len)
72                 trace_seq_puts(s, FAULT_STRING);
73         else
74                 trace_seq_printf(s, "\"%s\"",
75                                  (const char *)get_loc_data(data, ent));
76         return !trace_seq_has_overflowed(s);
77 }
78
79 const char PRINT_TYPE_FMT_NAME(string)[] = "\\\"%s\\\"";
80
81 /* Fetch type information table */
82 static const struct fetch_type probe_fetch_types[] = {
83         /* Special types */
84         __ASSIGN_FETCH_TYPE("string", string, string, sizeof(u32), 1, 1,
85                             "__data_loc char[]"),
86         __ASSIGN_FETCH_TYPE("ustring", string, string, sizeof(u32), 1, 1,
87                             "__data_loc char[]"),
88         __ASSIGN_FETCH_TYPE("symstr", string, string, sizeof(u32), 1, 1,
89                             "__data_loc char[]"),
90         /* Basic types */
91         ASSIGN_FETCH_TYPE(u8,  u8,  0),
92         ASSIGN_FETCH_TYPE(u16, u16, 0),
93         ASSIGN_FETCH_TYPE(u32, u32, 0),
94         ASSIGN_FETCH_TYPE(u64, u64, 0),
95         ASSIGN_FETCH_TYPE(s8,  u8,  1),
96         ASSIGN_FETCH_TYPE(s16, u16, 1),
97         ASSIGN_FETCH_TYPE(s32, u32, 1),
98         ASSIGN_FETCH_TYPE(s64, u64, 1),
99         ASSIGN_FETCH_TYPE_ALIAS(x8,  u8,  u8,  0),
100         ASSIGN_FETCH_TYPE_ALIAS(x16, u16, u16, 0),
101         ASSIGN_FETCH_TYPE_ALIAS(x32, u32, u32, 0),
102         ASSIGN_FETCH_TYPE_ALIAS(x64, u64, u64, 0),
103         ASSIGN_FETCH_TYPE_ALIAS(char, u8, u8,  0),
104         ASSIGN_FETCH_TYPE_ALIAS(symbol, ADDR_FETCH_TYPE, ADDR_FETCH_TYPE, 0),
105
106         ASSIGN_FETCH_TYPE_END
107 };
108
109 static const struct fetch_type *find_fetch_type(const char *type, unsigned long flags)
110 {
111         int i;
112
113         /* Reject the symbol/symstr for uprobes */
114         if (type && (flags & TPARG_FL_USER) &&
115             (!strcmp(type, "symbol") || !strcmp(type, "symstr")))
116                 return NULL;
117
118         if (!type)
119                 type = DEFAULT_FETCH_TYPE_STR;
120
121         /* Special case: bitfield */
122         if (*type == 'b') {
123                 unsigned long bs;
124
125                 type = strchr(type, '/');
126                 if (!type)
127                         goto fail;
128
129                 type++;
130                 if (kstrtoul(type, 0, &bs))
131                         goto fail;
132
133                 switch (bs) {
134                 case 8:
135                         return find_fetch_type("u8", flags);
136                 case 16:
137                         return find_fetch_type("u16", flags);
138                 case 32:
139                         return find_fetch_type("u32", flags);
140                 case 64:
141                         return find_fetch_type("u64", flags);
142                 default:
143                         goto fail;
144                 }
145         }
146
147         for (i = 0; probe_fetch_types[i].name; i++) {
148                 if (strcmp(type, probe_fetch_types[i].name) == 0)
149                         return &probe_fetch_types[i];
150         }
151
152 fail:
153         return NULL;
154 }
155
156 static struct trace_probe_log trace_probe_log;
157
158 void trace_probe_log_init(const char *subsystem, int argc, const char **argv)
159 {
160         trace_probe_log.subsystem = subsystem;
161         trace_probe_log.argc = argc;
162         trace_probe_log.argv = argv;
163         trace_probe_log.index = 0;
164 }
165
166 void trace_probe_log_clear(void)
167 {
168         memset(&trace_probe_log, 0, sizeof(trace_probe_log));
169 }
170
171 void trace_probe_log_set_index(int index)
172 {
173         trace_probe_log.index = index;
174 }
175
176 void __trace_probe_log_err(int offset, int err_type)
177 {
178         char *command, *p;
179         int i, len = 0, pos = 0;
180
181         if (!trace_probe_log.argv)
182                 return;
183
184         /* Recalculate the length and allocate buffer */
185         for (i = 0; i < trace_probe_log.argc; i++) {
186                 if (i == trace_probe_log.index)
187                         pos = len;
188                 len += strlen(trace_probe_log.argv[i]) + 1;
189         }
190         command = kzalloc(len, GFP_KERNEL);
191         if (!command)
192                 return;
193
194         if (trace_probe_log.index >= trace_probe_log.argc) {
195                 /**
196                  * Set the error position is next to the last arg + space.
197                  * Note that len includes the terminal null and the cursor
198                  * appears at pos + 1.
199                  */
200                 pos = len;
201                 offset = 0;
202         }
203
204         /* And make a command string from argv array */
205         p = command;
206         for (i = 0; i < trace_probe_log.argc; i++) {
207                 len = strlen(trace_probe_log.argv[i]);
208                 strcpy(p, trace_probe_log.argv[i]);
209                 p[len] = ' ';
210                 p += len + 1;
211         }
212         *(p - 1) = '\0';
213
214         tracing_log_err(NULL, trace_probe_log.subsystem, command,
215                         trace_probe_err_text, err_type, pos + offset);
216
217         kfree(command);
218 }
219
220 /* Split symbol and offset. */
221 int traceprobe_split_symbol_offset(char *symbol, long *offset)
222 {
223         char *tmp;
224         int ret;
225
226         if (!offset)
227                 return -EINVAL;
228
229         tmp = strpbrk(symbol, "+-");
230         if (tmp) {
231                 ret = kstrtol(tmp, 0, offset);
232                 if (ret)
233                         return ret;
234                 *tmp = '\0';
235         } else
236                 *offset = 0;
237
238         return 0;
239 }
240
241 /* @buf must has MAX_EVENT_NAME_LEN size */
242 int traceprobe_parse_event_name(const char **pevent, const char **pgroup,
243                                 char *buf, int offset)
244 {
245         const char *slash, *event = *pevent;
246         int len;
247
248         slash = strchr(event, '/');
249         if (!slash)
250                 slash = strchr(event, '.');
251
252         if (slash) {
253                 if (slash == event) {
254                         trace_probe_log_err(offset, NO_GROUP_NAME);
255                         return -EINVAL;
256                 }
257                 if (slash - event + 1 > MAX_EVENT_NAME_LEN) {
258                         trace_probe_log_err(offset, GROUP_TOO_LONG);
259                         return -EINVAL;
260                 }
261                 strscpy(buf, event, slash - event + 1);
262                 if (!is_good_system_name(buf)) {
263                         trace_probe_log_err(offset, BAD_GROUP_NAME);
264                         return -EINVAL;
265                 }
266                 *pgroup = buf;
267                 *pevent = slash + 1;
268                 offset += slash - event + 1;
269                 event = *pevent;
270         }
271         len = strlen(event);
272         if (len == 0) {
273                 if (slash) {
274                         *pevent = NULL;
275                         return 0;
276                 }
277                 trace_probe_log_err(offset, NO_EVENT_NAME);
278                 return -EINVAL;
279         } else if (len > MAX_EVENT_NAME_LEN) {
280                 trace_probe_log_err(offset, EVENT_TOO_LONG);
281                 return -EINVAL;
282         }
283         if (!is_good_name(event)) {
284                 trace_probe_log_err(offset, BAD_EVENT_NAME);
285                 return -EINVAL;
286         }
287         return 0;
288 }
289
290 static int parse_trace_event_arg(char *arg, struct fetch_insn *code,
291                                  struct traceprobe_parse_context *ctx)
292 {
293         struct ftrace_event_field *field;
294         struct list_head *head;
295
296         head = trace_get_fields(ctx->event);
297         list_for_each_entry(field, head, link) {
298                 if (!strcmp(arg, field->name)) {
299                         code->op = FETCH_OP_TP_ARG;
300                         code->data = field;
301                         return 0;
302                 }
303         }
304         return -ENOENT;
305 }
306
307 #ifdef CONFIG_PROBE_EVENTS_BTF_ARGS
308
309 static u32 btf_type_int(const struct btf_type *t)
310 {
311         return *(u32 *)(t + 1);
312 }
313
314 static bool btf_type_is_char_ptr(struct btf *btf, const struct btf_type *type)
315 {
316         const struct btf_type *real_type;
317         u32 intdata;
318         s32 tid;
319
320         real_type = btf_type_skip_modifiers(btf, type->type, &tid);
321         if (!real_type)
322                 return false;
323
324         if (BTF_INFO_KIND(real_type->info) != BTF_KIND_INT)
325                 return false;
326
327         intdata = btf_type_int(real_type);
328         return !(BTF_INT_ENCODING(intdata) & BTF_INT_SIGNED)
329                 && BTF_INT_BITS(intdata) == 8;
330 }
331
332 static bool btf_type_is_char_array(struct btf *btf, const struct btf_type *type)
333 {
334         const struct btf_type *real_type;
335         const struct btf_array *array;
336         u32 intdata;
337         s32 tid;
338
339         if (BTF_INFO_KIND(type->info) != BTF_KIND_ARRAY)
340                 return false;
341
342         array = (const struct btf_array *)(type + 1);
343
344         real_type = btf_type_skip_modifiers(btf, array->type, &tid);
345
346         intdata = btf_type_int(real_type);
347         return !(BTF_INT_ENCODING(intdata) & BTF_INT_SIGNED)
348                 && BTF_INT_BITS(intdata) == 8;
349 }
350
351 static int check_prepare_btf_string_fetch(char *typename,
352                                 struct fetch_insn **pcode,
353                                 struct traceprobe_parse_context *ctx)
354 {
355         struct btf *btf = ctx->btf;
356
357         if (!btf || !ctx->last_type)
358                 return 0;
359
360         /* char [] does not need any change. */
361         if (btf_type_is_char_array(btf, ctx->last_type))
362                 return 0;
363
364         /* char * requires dereference the pointer. */
365         if (btf_type_is_char_ptr(btf, ctx->last_type)) {
366                 struct fetch_insn *code = *pcode + 1;
367
368                 if (code->op == FETCH_OP_END) {
369                         trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
370                         return -E2BIG;
371                 }
372                 if (typename[0] == 'u')
373                         code->op = FETCH_OP_UDEREF;
374                 else
375                         code->op = FETCH_OP_DEREF;
376                 code->offset = 0;
377                 *pcode = code;
378                 return 0;
379         }
380         /* Other types are not available for string */
381         trace_probe_log_err(ctx->offset, BAD_TYPE4STR);
382         return -EINVAL;
383 }
384
385 static const char *fetch_type_from_btf_type(struct btf *btf,
386                                         const struct btf_type *type,
387                                         struct traceprobe_parse_context *ctx)
388 {
389         u32 intdata;
390
391         /* TODO: const char * could be converted as a string */
392         switch (BTF_INFO_KIND(type->info)) {
393         case BTF_KIND_ENUM:
394                 /* enum is "int", so convert to "s32" */
395                 return "s32";
396         case BTF_KIND_ENUM64:
397                 return "s64";
398         case BTF_KIND_PTR:
399                 /* pointer will be converted to "x??" */
400                 if (IS_ENABLED(CONFIG_64BIT))
401                         return "x64";
402                 else
403                         return "x32";
404         case BTF_KIND_INT:
405                 intdata = btf_type_int(type);
406                 if (BTF_INT_ENCODING(intdata) & BTF_INT_SIGNED) {
407                         switch (BTF_INT_BITS(intdata)) {
408                         case 8:
409                                 return "s8";
410                         case 16:
411                                 return "s16";
412                         case 32:
413                                 return "s32";
414                         case 64:
415                                 return "s64";
416                         }
417                 } else {        /* unsigned */
418                         switch (BTF_INT_BITS(intdata)) {
419                         case 8:
420                                 return "u8";
421                         case 16:
422                                 return "u16";
423                         case 32:
424                                 return "u32";
425                         case 64:
426                                 return "u64";
427                         }
428                         /* bitfield, size is encoded in the type */
429                         ctx->last_bitsize = BTF_INT_BITS(intdata);
430                         ctx->last_bitoffs += BTF_INT_OFFSET(intdata);
431                         return "u64";
432                 }
433         }
434         /* TODO: support other types */
435
436         return NULL;
437 }
438
439 static int query_btf_context(struct traceprobe_parse_context *ctx)
440 {
441         const struct btf_param *param;
442         const struct btf_type *type;
443         struct btf *btf;
444         s32 nr;
445
446         if (ctx->btf)
447                 return 0;
448
449         if (!ctx->funcname)
450                 return -EINVAL;
451
452         type = btf_find_func_proto(ctx->funcname, &btf);
453         if (!type)
454                 return -ENOENT;
455
456         ctx->btf = btf;
457         ctx->proto = type;
458
459         /* ctx->params is optional, since func(void) will not have params. */
460         nr = 0;
461         param = btf_get_func_param(type, &nr);
462         if (!IS_ERR_OR_NULL(param)) {
463                 /* Hide the first 'data' argument of tracepoint */
464                 if (ctx->flags & TPARG_FL_TPOINT) {
465                         nr--;
466                         param++;
467                 }
468         }
469
470         if (nr > 0) {
471                 ctx->nr_params = nr;
472                 ctx->params = param;
473         } else {
474                 ctx->nr_params = 0;
475                 ctx->params = NULL;
476         }
477
478         return 0;
479 }
480
481 static void clear_btf_context(struct traceprobe_parse_context *ctx)
482 {
483         if (ctx->btf) {
484                 btf_put(ctx->btf);
485                 ctx->btf = NULL;
486                 ctx->proto = NULL;
487                 ctx->params = NULL;
488                 ctx->nr_params = 0;
489         }
490 }
491
492 /* Return 1 if the field separater is arrow operator ('->') */
493 static int split_next_field(char *varname, char **next_field,
494                             struct traceprobe_parse_context *ctx)
495 {
496         char *field;
497         int ret = 0;
498
499         field = strpbrk(varname, ".-");
500         if (field) {
501                 if (field[0] == '-' && field[1] == '>') {
502                         field[0] = '\0';
503                         field += 2;
504                         ret = 1;
505                 } else if (field[0] == '.') {
506                         field[0] = '\0';
507                         field += 1;
508                 } else {
509                         trace_probe_log_err(ctx->offset + field - varname, BAD_HYPHEN);
510                         return -EINVAL;
511                 }
512                 *next_field = field;
513         }
514
515         return ret;
516 }
517
518 /*
519  * Parse the field of data structure. The @type must be a pointer type
520  * pointing the target data structure type.
521  */
522 static int parse_btf_field(char *fieldname, const struct btf_type *type,
523                            struct fetch_insn **pcode, struct fetch_insn *end,
524                            struct traceprobe_parse_context *ctx)
525 {
526         struct fetch_insn *code = *pcode;
527         const struct btf_member *field;
528         u32 bitoffs, anon_offs;
529         char *next;
530         int is_ptr;
531         s32 tid;
532
533         do {
534                 /* Outer loop for solving arrow operator ('->') */
535                 if (BTF_INFO_KIND(type->info) != BTF_KIND_PTR) {
536                         trace_probe_log_err(ctx->offset, NO_PTR_STRCT);
537                         return -EINVAL;
538                 }
539                 /* Convert a struct pointer type to a struct type */
540                 type = btf_type_skip_modifiers(ctx->btf, type->type, &tid);
541                 if (!type) {
542                         trace_probe_log_err(ctx->offset, BAD_BTF_TID);
543                         return -EINVAL;
544                 }
545
546                 bitoffs = 0;
547                 do {
548                         /* Inner loop for solving dot operator ('.') */
549                         next = NULL;
550                         is_ptr = split_next_field(fieldname, &next, ctx);
551                         if (is_ptr < 0)
552                                 return is_ptr;
553
554                         anon_offs = 0;
555                         field = btf_find_struct_member(ctx->btf, type, fieldname,
556                                                        &anon_offs);
557                         if (!field) {
558                                 trace_probe_log_err(ctx->offset, NO_BTF_FIELD);
559                                 return -ENOENT;
560                         }
561                         /* Add anonymous structure/union offset */
562                         bitoffs += anon_offs;
563
564                         /* Accumulate the bit-offsets of the dot-connected fields */
565                         if (btf_type_kflag(type)) {
566                                 bitoffs += BTF_MEMBER_BIT_OFFSET(field->offset);
567                                 ctx->last_bitsize = BTF_MEMBER_BITFIELD_SIZE(field->offset);
568                         } else {
569                                 bitoffs += field->offset;
570                                 ctx->last_bitsize = 0;
571                         }
572
573                         type = btf_type_skip_modifiers(ctx->btf, field->type, &tid);
574                         if (!type) {
575                                 trace_probe_log_err(ctx->offset, BAD_BTF_TID);
576                                 return -EINVAL;
577                         }
578
579                         ctx->offset += next - fieldname;
580                         fieldname = next;
581                 } while (!is_ptr && fieldname);
582
583                 if (++code == end) {
584                         trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
585                         return -EINVAL;
586                 }
587                 code->op = FETCH_OP_DEREF;      /* TODO: user deref support */
588                 code->offset = bitoffs / 8;
589                 *pcode = code;
590
591                 ctx->last_bitoffs = bitoffs % 8;
592                 ctx->last_type = type;
593         } while (fieldname);
594
595         return 0;
596 }
597
598 static int __store_entry_arg(struct trace_probe *tp, int argnum);
599
600 static int parse_btf_arg(char *varname,
601                          struct fetch_insn **pcode, struct fetch_insn *end,
602                          struct traceprobe_parse_context *ctx)
603 {
604         struct fetch_insn *code = *pcode;
605         const struct btf_param *params;
606         const struct btf_type *type;
607         char *field = NULL;
608         int i, is_ptr, ret;
609         u32 tid;
610
611         if (WARN_ON_ONCE(!ctx->funcname))
612                 return -EINVAL;
613
614         is_ptr = split_next_field(varname, &field, ctx);
615         if (is_ptr < 0)
616                 return is_ptr;
617         if (!is_ptr && field) {
618                 /* dot-connected field on an argument is not supported. */
619                 trace_probe_log_err(ctx->offset + field - varname,
620                                     NOSUP_DAT_ARG);
621                 return -EOPNOTSUPP;
622         }
623
624         if (ctx->flags & TPARG_FL_RETURN && !strcmp(varname, "$retval")) {
625                 code->op = FETCH_OP_RETVAL;
626                 /* Check whether the function return type is not void */
627                 if (query_btf_context(ctx) == 0) {
628                         if (ctx->proto->type == 0) {
629                                 trace_probe_log_err(ctx->offset, NO_RETVAL);
630                                 return -ENOENT;
631                         }
632                         tid = ctx->proto->type;
633                         goto found;
634                 }
635                 if (field) {
636                         trace_probe_log_err(ctx->offset + field - varname,
637                                             NO_BTF_ENTRY);
638                         return -ENOENT;
639                 }
640                 return 0;
641         }
642
643         if (!ctx->btf) {
644                 ret = query_btf_context(ctx);
645                 if (ret < 0 || ctx->nr_params == 0) {
646                         trace_probe_log_err(ctx->offset, NO_BTF_ENTRY);
647                         return PTR_ERR(params);
648                 }
649         }
650         params = ctx->params;
651
652         for (i = 0; i < ctx->nr_params; i++) {
653                 const char *name = btf_name_by_offset(ctx->btf, params[i].name_off);
654
655                 if (name && !strcmp(name, varname)) {
656                         if (tparg_is_function_entry(ctx->flags)) {
657                                 code->op = FETCH_OP_ARG;
658                                 if (ctx->flags & TPARG_FL_TPOINT)
659                                         code->param = i + 1;
660                                 else
661                                         code->param = i;
662                         } else if (tparg_is_function_return(ctx->flags)) {
663                                 code->op = FETCH_OP_EDATA;
664                                 ret = __store_entry_arg(ctx->tp, i);
665                                 if (ret < 0) {
666                                         /* internal error */
667                                         return ret;
668                                 }
669                                 code->offset = ret;
670                         }
671                         tid = params[i].type;
672                         goto found;
673                 }
674         }
675         trace_probe_log_err(ctx->offset, NO_BTFARG);
676         return -ENOENT;
677
678 found:
679         type = btf_type_skip_modifiers(ctx->btf, tid, &tid);
680         if (!type) {
681                 trace_probe_log_err(ctx->offset, BAD_BTF_TID);
682                 return -EINVAL;
683         }
684         /* Initialize the last type information */
685         ctx->last_type = type;
686         ctx->last_bitoffs = 0;
687         ctx->last_bitsize = 0;
688         if (field) {
689                 ctx->offset += field - varname;
690                 return parse_btf_field(field, type, pcode, end, ctx);
691         }
692         return 0;
693 }
694
695 static const struct fetch_type *find_fetch_type_from_btf_type(
696                                         struct traceprobe_parse_context *ctx)
697 {
698         struct btf *btf = ctx->btf;
699         const char *typestr = NULL;
700
701         if (btf && ctx->last_type)
702                 typestr = fetch_type_from_btf_type(btf, ctx->last_type, ctx);
703
704         return find_fetch_type(typestr, ctx->flags);
705 }
706
707 static int parse_btf_bitfield(struct fetch_insn **pcode,
708                               struct traceprobe_parse_context *ctx)
709 {
710         struct fetch_insn *code = *pcode;
711
712         if ((ctx->last_bitsize % 8 == 0) && ctx->last_bitoffs == 0)
713                 return 0;
714
715         code++;
716         if (code->op != FETCH_OP_NOP) {
717                 trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
718                 return -EINVAL;
719         }
720         *pcode = code;
721
722         code->op = FETCH_OP_MOD_BF;
723         code->lshift = 64 - (ctx->last_bitsize + ctx->last_bitoffs);
724         code->rshift = 64 - ctx->last_bitsize;
725         code->basesize = 64 / 8;
726         return 0;
727 }
728
729 #else
730 static void clear_btf_context(struct traceprobe_parse_context *ctx)
731 {
732         ctx->btf = NULL;
733 }
734
735 static int query_btf_context(struct traceprobe_parse_context *ctx)
736 {
737         return -EOPNOTSUPP;
738 }
739
740 static int parse_btf_arg(char *varname,
741                          struct fetch_insn **pcode, struct fetch_insn *end,
742                          struct traceprobe_parse_context *ctx)
743 {
744         trace_probe_log_err(ctx->offset, NOSUP_BTFARG);
745         return -EOPNOTSUPP;
746 }
747
748 static int parse_btf_bitfield(struct fetch_insn **pcode,
749                               struct traceprobe_parse_context *ctx)
750 {
751         trace_probe_log_err(ctx->offset, NOSUP_BTFARG);
752         return -EOPNOTSUPP;
753 }
754
755 #define find_fetch_type_from_btf_type(ctx)              \
756         find_fetch_type(NULL, ctx->flags)
757
758 static int check_prepare_btf_string_fetch(char *typename,
759                                 struct fetch_insn **pcode,
760                                 struct traceprobe_parse_context *ctx)
761 {
762         return 0;
763 }
764
765 #endif
766
767 #ifdef CONFIG_HAVE_FUNCTION_ARG_ACCESS_API
768
769 static int __store_entry_arg(struct trace_probe *tp, int argnum)
770 {
771         struct probe_entry_arg *earg = tp->entry_arg;
772         bool match = false;
773         int i, offset;
774
775         if (!earg) {
776                 earg = kzalloc(sizeof(*tp->entry_arg), GFP_KERNEL);
777                 if (!earg)
778                         return -ENOMEM;
779                 earg->size = 2 * tp->nr_args + 1;
780                 earg->code = kcalloc(earg->size, sizeof(struct fetch_insn),
781                                      GFP_KERNEL);
782                 if (!earg->code) {
783                         kfree(earg);
784                         return -ENOMEM;
785                 }
786                 /* Fill the code buffer with 'end' to simplify it */
787                 for (i = 0; i < earg->size; i++)
788                         earg->code[i].op = FETCH_OP_END;
789                 tp->entry_arg = earg;
790         }
791
792         offset = 0;
793         for (i = 0; i < earg->size - 1; i++) {
794                 switch (earg->code[i].op) {
795                 case FETCH_OP_END:
796                         earg->code[i].op = FETCH_OP_ARG;
797                         earg->code[i].param = argnum;
798                         earg->code[i + 1].op = FETCH_OP_ST_EDATA;
799                         earg->code[i + 1].offset = offset;
800                         return offset;
801                 case FETCH_OP_ARG:
802                         match = (earg->code[i].param == argnum);
803                         break;
804                 case FETCH_OP_ST_EDATA:
805                         offset = earg->code[i].offset;
806                         if (match)
807                                 return offset;
808                         offset += sizeof(unsigned long);
809                         break;
810                 default:
811                         break;
812                 }
813         }
814         return -ENOSPC;
815 }
816
817 int traceprobe_get_entry_data_size(struct trace_probe *tp)
818 {
819         struct probe_entry_arg *earg = tp->entry_arg;
820         int i, size = 0;
821
822         if (!earg)
823                 return 0;
824
825         for (i = 0; i < earg->size; i++) {
826                 switch (earg->code[i].op) {
827                 case FETCH_OP_END:
828                         goto out;
829                 case FETCH_OP_ST_EDATA:
830                         size = earg->code[i].offset + sizeof(unsigned long);
831                         break;
832                 default:
833                         break;
834                 }
835         }
836 out:
837         return size;
838 }
839
840 void store_trace_entry_data(void *edata, struct trace_probe *tp, struct pt_regs *regs)
841 {
842         struct probe_entry_arg *earg = tp->entry_arg;
843         unsigned long val = 0;
844         int i;
845
846         if (!earg)
847                 return;
848
849         for (i = 0; i < earg->size; i++) {
850                 struct fetch_insn *code = &earg->code[i];
851
852                 switch (code->op) {
853                 case FETCH_OP_ARG:
854                         val = regs_get_kernel_argument(regs, code->param);
855                         break;
856                 case FETCH_OP_ST_EDATA:
857                         *(unsigned long *)((unsigned long)edata + code->offset) = val;
858                         break;
859                 case FETCH_OP_END:
860                         goto end;
861                 default:
862                         break;
863                 }
864         }
865 end:
866         return;
867 }
868 NOKPROBE_SYMBOL(store_trace_entry_data)
869 #endif
870
871 #define PARAM_MAX_STACK (THREAD_SIZE / sizeof(unsigned long))
872
873 /* Parse $vars. @orig_arg points '$', which syncs to @ctx->offset */
874 static int parse_probe_vars(char *orig_arg, const struct fetch_type *t,
875                             struct fetch_insn **pcode,
876                             struct fetch_insn *end,
877                             struct traceprobe_parse_context *ctx)
878 {
879         struct fetch_insn *code = *pcode;
880         int err = TP_ERR_BAD_VAR;
881         char *arg = orig_arg + 1;
882         unsigned long param;
883         int ret = 0;
884         int len;
885
886         if (ctx->flags & TPARG_FL_TEVENT) {
887                 if (code->data)
888                         return -EFAULT;
889                 ret = parse_trace_event_arg(arg, code, ctx);
890                 if (!ret)
891                         return 0;
892                 if (strcmp(arg, "comm") == 0 || strcmp(arg, "COMM") == 0) {
893                         code->op = FETCH_OP_COMM;
894                         return 0;
895                 }
896                 /* backward compatibility */
897                 ctx->offset = 0;
898                 goto inval;
899         }
900
901         if (str_has_prefix(arg, "retval")) {
902                 if (!(ctx->flags & TPARG_FL_RETURN)) {
903                         err = TP_ERR_RETVAL_ON_PROBE;
904                         goto inval;
905                 }
906                 if (!(ctx->flags & TPARG_FL_KERNEL) ||
907                     !IS_ENABLED(CONFIG_PROBE_EVENTS_BTF_ARGS)) {
908                         code->op = FETCH_OP_RETVAL;
909                         return 0;
910                 }
911                 return parse_btf_arg(orig_arg, pcode, end, ctx);
912         }
913
914         len = str_has_prefix(arg, "stack");
915         if (len) {
916
917                 if (arg[len] == '\0') {
918                         code->op = FETCH_OP_STACKP;
919                         return 0;
920                 }
921
922                 if (isdigit(arg[len])) {
923                         ret = kstrtoul(arg + len, 10, &param);
924                         if (ret)
925                                 goto inval;
926
927                         if ((ctx->flags & TPARG_FL_KERNEL) &&
928                             param > PARAM_MAX_STACK) {
929                                 err = TP_ERR_BAD_STACK_NUM;
930                                 goto inval;
931                         }
932                         code->op = FETCH_OP_STACK;
933                         code->param = (unsigned int)param;
934                         return 0;
935                 }
936                 goto inval;
937         }
938
939         if (strcmp(arg, "comm") == 0 || strcmp(arg, "COMM") == 0) {
940                 code->op = FETCH_OP_COMM;
941                 return 0;
942         }
943
944 #ifdef CONFIG_HAVE_FUNCTION_ARG_ACCESS_API
945         len = str_has_prefix(arg, "arg");
946         if (len) {
947                 ret = kstrtoul(arg + len, 10, &param);
948                 if (ret)
949                         goto inval;
950
951                 if (!param || param > PARAM_MAX_STACK) {
952                         err = TP_ERR_BAD_ARG_NUM;
953                         goto inval;
954                 }
955                 param--; /* argN starts from 1, but internal arg[N] starts from 0 */
956
957                 if (tparg_is_function_entry(ctx->flags)) {
958                         code->op = FETCH_OP_ARG;
959                         code->param = (unsigned int)param;
960                         /*
961                          * The tracepoint probe will probe a stub function, and the
962                          * first parameter of the stub is a dummy and should be ignored.
963                          */
964                         if (ctx->flags & TPARG_FL_TPOINT)
965                                 code->param++;
966                 } else if (tparg_is_function_return(ctx->flags)) {
967                         /* function entry argument access from return probe */
968                         ret = __store_entry_arg(ctx->tp, param);
969                         if (ret < 0)    /* This error should be an internal error */
970                                 return ret;
971
972                         code->op = FETCH_OP_EDATA;
973                         code->offset = ret;
974                 } else {
975                         err = TP_ERR_NOFENTRY_ARGS;
976                         goto inval;
977                 }
978                 return 0;
979         }
980 #endif
981
982 inval:
983         __trace_probe_log_err(ctx->offset, err);
984         return -EINVAL;
985 }
986
987 static int str_to_immediate(char *str, unsigned long *imm)
988 {
989         if (isdigit(str[0]))
990                 return kstrtoul(str, 0, imm);
991         else if (str[0] == '-')
992                 return kstrtol(str, 0, (long *)imm);
993         else if (str[0] == '+')
994                 return kstrtol(str + 1, 0, (long *)imm);
995         return -EINVAL;
996 }
997
998 static int __parse_imm_string(char *str, char **pbuf, int offs)
999 {
1000         size_t len = strlen(str);
1001
1002         if (str[len - 1] != '"') {
1003                 trace_probe_log_err(offs + len, IMMSTR_NO_CLOSE);
1004                 return -EINVAL;
1005         }
1006         *pbuf = kstrndup(str, len - 1, GFP_KERNEL);
1007         if (!*pbuf)
1008                 return -ENOMEM;
1009         return 0;
1010 }
1011
1012 /* Recursive argument parser */
1013 static int
1014 parse_probe_arg(char *arg, const struct fetch_type *type,
1015                 struct fetch_insn **pcode, struct fetch_insn *end,
1016                 struct traceprobe_parse_context *ctx)
1017 {
1018         struct fetch_insn *code = *pcode;
1019         unsigned long param;
1020         int deref = FETCH_OP_DEREF;
1021         long offset = 0;
1022         char *tmp;
1023         int ret = 0;
1024
1025         switch (arg[0]) {
1026         case '$':
1027                 ret = parse_probe_vars(arg, type, pcode, end, ctx);
1028                 break;
1029
1030         case '%':       /* named register */
1031                 if (ctx->flags & (TPARG_FL_TEVENT | TPARG_FL_FPROBE)) {
1032                         /* eprobe and fprobe do not handle registers */
1033                         trace_probe_log_err(ctx->offset, BAD_VAR);
1034                         break;
1035                 }
1036                 ret = regs_query_register_offset(arg + 1);
1037                 if (ret >= 0) {
1038                         code->op = FETCH_OP_REG;
1039                         code->param = (unsigned int)ret;
1040                         ret = 0;
1041                 } else
1042                         trace_probe_log_err(ctx->offset, BAD_REG_NAME);
1043                 break;
1044
1045         case '@':       /* memory, file-offset or symbol */
1046                 if (isdigit(arg[1])) {
1047                         ret = kstrtoul(arg + 1, 0, &param);
1048                         if (ret) {
1049                                 trace_probe_log_err(ctx->offset, BAD_MEM_ADDR);
1050                                 break;
1051                         }
1052                         /* load address */
1053                         code->op = FETCH_OP_IMM;
1054                         code->immediate = param;
1055                 } else if (arg[1] == '+') {
1056                         /* kprobes don't support file offsets */
1057                         if (ctx->flags & TPARG_FL_KERNEL) {
1058                                 trace_probe_log_err(ctx->offset, FILE_ON_KPROBE);
1059                                 return -EINVAL;
1060                         }
1061                         ret = kstrtol(arg + 2, 0, &offset);
1062                         if (ret) {
1063                                 trace_probe_log_err(ctx->offset, BAD_FILE_OFFS);
1064                                 break;
1065                         }
1066
1067                         code->op = FETCH_OP_FOFFS;
1068                         code->immediate = (unsigned long)offset;  // imm64?
1069                 } else {
1070                         /* uprobes don't support symbols */
1071                         if (!(ctx->flags & TPARG_FL_KERNEL)) {
1072                                 trace_probe_log_err(ctx->offset, SYM_ON_UPROBE);
1073                                 return -EINVAL;
1074                         }
1075                         /* Preserve symbol for updating */
1076                         code->op = FETCH_NOP_SYMBOL;
1077                         code->data = kstrdup(arg + 1, GFP_KERNEL);
1078                         if (!code->data)
1079                                 return -ENOMEM;
1080                         if (++code == end) {
1081                                 trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1082                                 return -EINVAL;
1083                         }
1084                         code->op = FETCH_OP_IMM;
1085                         code->immediate = 0;
1086                 }
1087                 /* These are fetching from memory */
1088                 if (++code == end) {
1089                         trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1090                         return -EINVAL;
1091                 }
1092                 *pcode = code;
1093                 code->op = FETCH_OP_DEREF;
1094                 code->offset = offset;
1095                 break;
1096
1097         case '+':       /* deref memory */
1098         case '-':
1099                 if (arg[1] == 'u') {
1100                         deref = FETCH_OP_UDEREF;
1101                         arg[1] = arg[0];
1102                         arg++;
1103                 }
1104                 if (arg[0] == '+')
1105                         arg++;  /* Skip '+', because kstrtol() rejects it. */
1106                 tmp = strchr(arg, '(');
1107                 if (!tmp) {
1108                         trace_probe_log_err(ctx->offset, DEREF_NEED_BRACE);
1109                         return -EINVAL;
1110                 }
1111                 *tmp = '\0';
1112                 ret = kstrtol(arg, 0, &offset);
1113                 if (ret) {
1114                         trace_probe_log_err(ctx->offset, BAD_DEREF_OFFS);
1115                         break;
1116                 }
1117                 ctx->offset += (tmp + 1 - arg) + (arg[0] != '-' ? 1 : 0);
1118                 arg = tmp + 1;
1119                 tmp = strrchr(arg, ')');
1120                 if (!tmp) {
1121                         trace_probe_log_err(ctx->offset + strlen(arg),
1122                                             DEREF_OPEN_BRACE);
1123                         return -EINVAL;
1124                 } else {
1125                         const struct fetch_type *t2 = find_fetch_type(NULL, ctx->flags);
1126                         int cur_offs = ctx->offset;
1127
1128                         *tmp = '\0';
1129                         ret = parse_probe_arg(arg, t2, &code, end, ctx);
1130                         if (ret)
1131                                 break;
1132                         ctx->offset = cur_offs;
1133                         if (code->op == FETCH_OP_COMM ||
1134                             code->op == FETCH_OP_DATA) {
1135                                 trace_probe_log_err(ctx->offset, COMM_CANT_DEREF);
1136                                 return -EINVAL;
1137                         }
1138                         if (++code == end) {
1139                                 trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1140                                 return -EINVAL;
1141                         }
1142                         *pcode = code;
1143
1144                         code->op = deref;
1145                         code->offset = offset;
1146                         /* Reset the last type if used */
1147                         ctx->last_type = NULL;
1148                 }
1149                 break;
1150         case '\\':      /* Immediate value */
1151                 if (arg[1] == '"') {    /* Immediate string */
1152                         ret = __parse_imm_string(arg + 2, &tmp, ctx->offset + 2);
1153                         if (ret)
1154                                 break;
1155                         code->op = FETCH_OP_DATA;
1156                         code->data = tmp;
1157                 } else {
1158                         ret = str_to_immediate(arg + 1, &code->immediate);
1159                         if (ret)
1160                                 trace_probe_log_err(ctx->offset + 1, BAD_IMM);
1161                         else
1162                                 code->op = FETCH_OP_IMM;
1163                 }
1164                 break;
1165         default:
1166                 if (isalpha(arg[0]) || arg[0] == '_') { /* BTF variable */
1167                         if (!tparg_is_function_entry(ctx->flags) &&
1168                             !tparg_is_function_return(ctx->flags)) {
1169                                 trace_probe_log_err(ctx->offset, NOSUP_BTFARG);
1170                                 return -EINVAL;
1171                         }
1172                         ret = parse_btf_arg(arg, pcode, end, ctx);
1173                         break;
1174                 }
1175         }
1176         if (!ret && code->op == FETCH_OP_NOP) {
1177                 /* Parsed, but do not find fetch method */
1178                 trace_probe_log_err(ctx->offset, BAD_FETCH_ARG);
1179                 ret = -EINVAL;
1180         }
1181         return ret;
1182 }
1183
1184 /* Bitfield type needs to be parsed into a fetch function */
1185 static int __parse_bitfield_probe_arg(const char *bf,
1186                                       const struct fetch_type *t,
1187                                       struct fetch_insn **pcode)
1188 {
1189         struct fetch_insn *code = *pcode;
1190         unsigned long bw, bo;
1191         char *tail;
1192
1193         if (*bf != 'b')
1194                 return 0;
1195
1196         bw = simple_strtoul(bf + 1, &tail, 0);  /* Use simple one */
1197
1198         if (bw == 0 || *tail != '@')
1199                 return -EINVAL;
1200
1201         bf = tail + 1;
1202         bo = simple_strtoul(bf, &tail, 0);
1203
1204         if (tail == bf || *tail != '/')
1205                 return -EINVAL;
1206         code++;
1207         if (code->op != FETCH_OP_NOP)
1208                 return -EINVAL;
1209         *pcode = code;
1210
1211         code->op = FETCH_OP_MOD_BF;
1212         code->lshift = BYTES_TO_BITS(t->size) - (bw + bo);
1213         code->rshift = BYTES_TO_BITS(t->size) - bw;
1214         code->basesize = t->size;
1215
1216         return (BYTES_TO_BITS(t->size) < (bw + bo)) ? -EINVAL : 0;
1217 }
1218
1219 /* Split type part from @arg and return it. */
1220 static char *parse_probe_arg_type(char *arg, struct probe_arg *parg,
1221                                   struct traceprobe_parse_context *ctx)
1222 {
1223         char *t = NULL, *t2, *t3;
1224         int offs;
1225
1226         t = strchr(arg, ':');
1227         if (t) {
1228                 *t++ = '\0';
1229                 t2 = strchr(t, '[');
1230                 if (t2) {
1231                         *t2++ = '\0';
1232                         t3 = strchr(t2, ']');
1233                         if (!t3) {
1234                                 offs = t2 + strlen(t2) - arg;
1235
1236                                 trace_probe_log_err(ctx->offset + offs,
1237                                                     ARRAY_NO_CLOSE);
1238                                 return ERR_PTR(-EINVAL);
1239                         } else if (t3[1] != '\0') {
1240                                 trace_probe_log_err(ctx->offset + t3 + 1 - arg,
1241                                                     BAD_ARRAY_SUFFIX);
1242                                 return ERR_PTR(-EINVAL);
1243                         }
1244                         *t3 = '\0';
1245                         if (kstrtouint(t2, 0, &parg->count) || !parg->count) {
1246                                 trace_probe_log_err(ctx->offset + t2 - arg,
1247                                                     BAD_ARRAY_NUM);
1248                                 return ERR_PTR(-EINVAL);
1249                         }
1250                         if (parg->count > MAX_ARRAY_LEN) {
1251                                 trace_probe_log_err(ctx->offset + t2 - arg,
1252                                                     ARRAY_TOO_BIG);
1253                                 return ERR_PTR(-EINVAL);
1254                         }
1255                 }
1256         }
1257         offs = t ? t - arg : 0;
1258
1259         /*
1260          * Since $comm and immediate string can not be dereferenced,
1261          * we can find those by strcmp. But ignore for eprobes.
1262          */
1263         if (!(ctx->flags & TPARG_FL_TEVENT) &&
1264             (strcmp(arg, "$comm") == 0 || strcmp(arg, "$COMM") == 0 ||
1265              strncmp(arg, "\\\"", 2) == 0)) {
1266                 /* The type of $comm must be "string", and not an array type. */
1267                 if (parg->count || (t && strcmp(t, "string"))) {
1268                         trace_probe_log_err(ctx->offset + offs, NEED_STRING_TYPE);
1269                         return ERR_PTR(-EINVAL);
1270                 }
1271                 parg->type = find_fetch_type("string", ctx->flags);
1272         } else
1273                 parg->type = find_fetch_type(t, ctx->flags);
1274
1275         if (!parg->type) {
1276                 trace_probe_log_err(ctx->offset + offs, BAD_TYPE);
1277                 return ERR_PTR(-EINVAL);
1278         }
1279
1280         return t;
1281 }
1282
1283 /* After parsing, adjust the fetch_insn according to the probe_arg */
1284 static int finalize_fetch_insn(struct fetch_insn *code,
1285                                struct probe_arg *parg,
1286                                char *type,
1287                                int type_offset,
1288                                struct traceprobe_parse_context *ctx)
1289 {
1290         struct fetch_insn *scode;
1291         int ret;
1292
1293         /* Store operation */
1294         if (parg->type->is_string) {
1295                 /* Check bad combination of the type and the last fetch_insn. */
1296                 if (!strcmp(parg->type->name, "symstr")) {
1297                         if (code->op != FETCH_OP_REG && code->op != FETCH_OP_STACK &&
1298                             code->op != FETCH_OP_RETVAL && code->op != FETCH_OP_ARG &&
1299                             code->op != FETCH_OP_DEREF && code->op != FETCH_OP_TP_ARG) {
1300                                 trace_probe_log_err(ctx->offset + type_offset,
1301                                                     BAD_SYMSTRING);
1302                                 return -EINVAL;
1303                         }
1304                 } else {
1305                         if (code->op != FETCH_OP_DEREF && code->op != FETCH_OP_UDEREF &&
1306                             code->op != FETCH_OP_IMM && code->op != FETCH_OP_COMM &&
1307                             code->op != FETCH_OP_DATA && code->op != FETCH_OP_TP_ARG) {
1308                                 trace_probe_log_err(ctx->offset + type_offset,
1309                                                     BAD_STRING);
1310                                 return -EINVAL;
1311                         }
1312                 }
1313
1314                 if (!strcmp(parg->type->name, "symstr") ||
1315                     (code->op == FETCH_OP_IMM || code->op == FETCH_OP_COMM ||
1316                      code->op == FETCH_OP_DATA) || code->op == FETCH_OP_TP_ARG ||
1317                      parg->count) {
1318                         /*
1319                          * IMM, DATA and COMM is pointing actual address, those
1320                          * must be kept, and if parg->count != 0, this is an
1321                          * array of string pointers instead of string address
1322                          * itself.
1323                          * For the symstr, it doesn't need to dereference, thus
1324                          * it just get the value.
1325                          */
1326                         code++;
1327                         if (code->op != FETCH_OP_NOP) {
1328                                 trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1329                                 return -EINVAL;
1330                         }
1331                 }
1332
1333                 /* If op == DEREF, replace it with STRING */
1334                 if (!strcmp(parg->type->name, "ustring") ||
1335                     code->op == FETCH_OP_UDEREF)
1336                         code->op = FETCH_OP_ST_USTRING;
1337                 else if (!strcmp(parg->type->name, "symstr"))
1338                         code->op = FETCH_OP_ST_SYMSTR;
1339                 else
1340                         code->op = FETCH_OP_ST_STRING;
1341                 code->size = parg->type->size;
1342                 parg->dynamic = true;
1343         } else if (code->op == FETCH_OP_DEREF) {
1344                 code->op = FETCH_OP_ST_MEM;
1345                 code->size = parg->type->size;
1346         } else if (code->op == FETCH_OP_UDEREF) {
1347                 code->op = FETCH_OP_ST_UMEM;
1348                 code->size = parg->type->size;
1349         } else {
1350                 code++;
1351                 if (code->op != FETCH_OP_NOP) {
1352                         trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1353                         return -E2BIG;
1354                 }
1355                 code->op = FETCH_OP_ST_RAW;
1356                 code->size = parg->type->size;
1357         }
1358
1359         /* Save storing fetch_insn. */
1360         scode = code;
1361
1362         /* Modify operation */
1363         if (type != NULL) {
1364                 /* Bitfield needs a special fetch_insn. */
1365                 ret = __parse_bitfield_probe_arg(type, parg->type, &code);
1366                 if (ret) {
1367                         trace_probe_log_err(ctx->offset + type_offset, BAD_BITFIELD);
1368                         return ret;
1369                 }
1370         } else if (IS_ENABLED(CONFIG_PROBE_EVENTS_BTF_ARGS) &&
1371                    ctx->last_type) {
1372                 /* If user not specified the type, try parsing BTF bitfield. */
1373                 ret = parse_btf_bitfield(&code, ctx);
1374                 if (ret)
1375                         return ret;
1376         }
1377
1378         /* Loop(Array) operation */
1379         if (parg->count) {
1380                 if (scode->op != FETCH_OP_ST_MEM &&
1381                     scode->op != FETCH_OP_ST_STRING &&
1382                     scode->op != FETCH_OP_ST_USTRING) {
1383                         trace_probe_log_err(ctx->offset + type_offset, BAD_STRING);
1384                         return -EINVAL;
1385                 }
1386                 code++;
1387                 if (code->op != FETCH_OP_NOP) {
1388                         trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1389                         return -E2BIG;
1390                 }
1391                 code->op = FETCH_OP_LP_ARRAY;
1392                 code->param = parg->count;
1393         }
1394
1395         /* Finalize the fetch_insn array. */
1396         code++;
1397         code->op = FETCH_OP_END;
1398
1399         return 0;
1400 }
1401
1402 /* String length checking wrapper */
1403 static int traceprobe_parse_probe_arg_body(const char *argv, ssize_t *size,
1404                                            struct probe_arg *parg,
1405                                            struct traceprobe_parse_context *ctx)
1406 {
1407         struct fetch_insn *code, *tmp = NULL;
1408         char *type, *arg;
1409         int ret, len;
1410
1411         len = strlen(argv);
1412         if (len > MAX_ARGSTR_LEN) {
1413                 trace_probe_log_err(ctx->offset, ARG_TOO_LONG);
1414                 return -E2BIG;
1415         } else if (len == 0) {
1416                 trace_probe_log_err(ctx->offset, NO_ARG_BODY);
1417                 return -EINVAL;
1418         }
1419
1420         arg = kstrdup(argv, GFP_KERNEL);
1421         if (!arg)
1422                 return -ENOMEM;
1423
1424         parg->comm = kstrdup(arg, GFP_KERNEL);
1425         if (!parg->comm) {
1426                 ret = -ENOMEM;
1427                 goto out;
1428         }
1429
1430         type = parse_probe_arg_type(arg, parg, ctx);
1431         if (IS_ERR(type)) {
1432                 ret = PTR_ERR(type);
1433                 goto out;
1434         }
1435
1436         code = tmp = kcalloc(FETCH_INSN_MAX, sizeof(*code), GFP_KERNEL);
1437         if (!code) {
1438                 ret = -ENOMEM;
1439                 goto out;
1440         }
1441         code[FETCH_INSN_MAX - 1].op = FETCH_OP_END;
1442
1443         ctx->last_type = NULL;
1444         ret = parse_probe_arg(arg, parg->type, &code, &code[FETCH_INSN_MAX - 1],
1445                               ctx);
1446         if (ret < 0)
1447                 goto fail;
1448
1449         /* Update storing type if BTF is available */
1450         if (IS_ENABLED(CONFIG_PROBE_EVENTS_BTF_ARGS) &&
1451             ctx->last_type) {
1452                 if (!type) {
1453                         parg->type = find_fetch_type_from_btf_type(ctx);
1454                 } else if (strstr(type, "string")) {
1455                         ret = check_prepare_btf_string_fetch(type, &code, ctx);
1456                         if (ret)
1457                                 goto fail;
1458                 }
1459         }
1460         parg->offset = *size;
1461         *size += parg->type->size * (parg->count ?: 1);
1462
1463         if (parg->count) {
1464                 len = strlen(parg->type->fmttype) + 6;
1465                 parg->fmt = kmalloc(len, GFP_KERNEL);
1466                 if (!parg->fmt) {
1467                         ret = -ENOMEM;
1468                         goto fail;
1469                 }
1470                 snprintf(parg->fmt, len, "%s[%d]", parg->type->fmttype,
1471                          parg->count);
1472         }
1473
1474         ret = finalize_fetch_insn(code, parg, type, type ? type - arg : 0, ctx);
1475         if (ret < 0)
1476                 goto fail;
1477
1478         for (; code < tmp + FETCH_INSN_MAX; code++)
1479                 if (code->op == FETCH_OP_END)
1480                         break;
1481         /* Shrink down the code buffer */
1482         parg->code = kcalloc(code - tmp + 1, sizeof(*code), GFP_KERNEL);
1483         if (!parg->code)
1484                 ret = -ENOMEM;
1485         else
1486                 memcpy(parg->code, tmp, sizeof(*code) * (code - tmp + 1));
1487
1488 fail:
1489         if (ret < 0) {
1490                 for (code = tmp; code < tmp + FETCH_INSN_MAX; code++)
1491                         if (code->op == FETCH_NOP_SYMBOL ||
1492                             code->op == FETCH_OP_DATA)
1493                                 kfree(code->data);
1494         }
1495         kfree(tmp);
1496 out:
1497         kfree(arg);
1498
1499         return ret;
1500 }
1501
1502 /* Return 1 if name is reserved or already used by another argument */
1503 static int traceprobe_conflict_field_name(const char *name,
1504                                           struct probe_arg *args, int narg)
1505 {
1506         int i;
1507
1508         for (i = 0; i < ARRAY_SIZE(reserved_field_names); i++)
1509                 if (strcmp(reserved_field_names[i], name) == 0)
1510                         return 1;
1511
1512         for (i = 0; i < narg; i++)
1513                 if (strcmp(args[i].name, name) == 0)
1514                         return 1;
1515
1516         return 0;
1517 }
1518
1519 static char *generate_probe_arg_name(const char *arg, int idx)
1520 {
1521         char *name = NULL;
1522         const char *end;
1523
1524         /*
1525          * If argument name is omitted, try arg as a name (BTF variable)
1526          * or "argN".
1527          */
1528         if (IS_ENABLED(CONFIG_PROBE_EVENTS_BTF_ARGS)) {
1529                 end = strchr(arg, ':');
1530                 if (!end)
1531                         end = arg + strlen(arg);
1532
1533                 name = kmemdup_nul(arg, end - arg, GFP_KERNEL);
1534                 if (!name || !is_good_name(name)) {
1535                         kfree(name);
1536                         name = NULL;
1537                 }
1538         }
1539
1540         if (!name)
1541                 name = kasprintf(GFP_KERNEL, "arg%d", idx + 1);
1542
1543         return name;
1544 }
1545
1546 int traceprobe_parse_probe_arg(struct trace_probe *tp, int i, const char *arg,
1547                                struct traceprobe_parse_context *ctx)
1548 {
1549         struct probe_arg *parg = &tp->args[i];
1550         const char *body;
1551
1552         ctx->tp = tp;
1553         body = strchr(arg, '=');
1554         if (body) {
1555                 if (body - arg > MAX_ARG_NAME_LEN) {
1556                         trace_probe_log_err(0, ARG_NAME_TOO_LONG);
1557                         return -EINVAL;
1558                 } else if (body == arg) {
1559                         trace_probe_log_err(0, NO_ARG_NAME);
1560                         return -EINVAL;
1561                 }
1562                 parg->name = kmemdup_nul(arg, body - arg, GFP_KERNEL);
1563                 body++;
1564         } else {
1565                 parg->name = generate_probe_arg_name(arg, i);
1566                 body = arg;
1567         }
1568         if (!parg->name)
1569                 return -ENOMEM;
1570
1571         if (!is_good_name(parg->name)) {
1572                 trace_probe_log_err(0, BAD_ARG_NAME);
1573                 return -EINVAL;
1574         }
1575         if (traceprobe_conflict_field_name(parg->name, tp->args, i)) {
1576                 trace_probe_log_err(0, USED_ARG_NAME);
1577                 return -EINVAL;
1578         }
1579         ctx->offset = body - arg;
1580         /* Parse fetch argument */
1581         return traceprobe_parse_probe_arg_body(body, &tp->size, parg, ctx);
1582 }
1583
1584 void traceprobe_free_probe_arg(struct probe_arg *arg)
1585 {
1586         struct fetch_insn *code = arg->code;
1587
1588         while (code && code->op != FETCH_OP_END) {
1589                 if (code->op == FETCH_NOP_SYMBOL ||
1590                     code->op == FETCH_OP_DATA)
1591                         kfree(code->data);
1592                 code++;
1593         }
1594         kfree(arg->code);
1595         kfree(arg->name);
1596         kfree(arg->comm);
1597         kfree(arg->fmt);
1598 }
1599
1600 static int argv_has_var_arg(int argc, const char *argv[], int *args_idx,
1601                             struct traceprobe_parse_context *ctx)
1602 {
1603         int i, found = 0;
1604
1605         for (i = 0; i < argc; i++)
1606                 if (str_has_prefix(argv[i], "$arg")) {
1607                         trace_probe_log_set_index(i + 2);
1608
1609                         if (!tparg_is_function_entry(ctx->flags) &&
1610                             !tparg_is_function_return(ctx->flags)) {
1611                                 trace_probe_log_err(0, NOFENTRY_ARGS);
1612                                 return -EINVAL;
1613                         }
1614
1615                         if (isdigit(argv[i][4])) {
1616                                 found = 1;
1617                                 continue;
1618                         }
1619
1620                         if (argv[i][4] != '*') {
1621                                 trace_probe_log_err(0, BAD_VAR);
1622                                 return -EINVAL;
1623                         }
1624
1625                         if (*args_idx >= 0 && *args_idx < argc) {
1626                                 trace_probe_log_err(0, DOUBLE_ARGS);
1627                                 return -EINVAL;
1628                         }
1629                         found = 1;
1630                         *args_idx = i;
1631                 }
1632
1633         return found;
1634 }
1635
1636 static int sprint_nth_btf_arg(int idx, const char *type,
1637                               char *buf, int bufsize,
1638                               struct traceprobe_parse_context *ctx)
1639 {
1640         const char *name;
1641         int ret;
1642
1643         if (idx >= ctx->nr_params) {
1644                 trace_probe_log_err(0, NO_BTFARG);
1645                 return -ENOENT;
1646         }
1647         name = btf_name_by_offset(ctx->btf, ctx->params[idx].name_off);
1648         if (!name) {
1649                 trace_probe_log_err(0, NO_BTF_ENTRY);
1650                 return -ENOENT;
1651         }
1652         ret = snprintf(buf, bufsize, "%s%s", name, type);
1653         if (ret >= bufsize) {
1654                 trace_probe_log_err(0, ARGS_2LONG);
1655                 return -E2BIG;
1656         }
1657         return ret;
1658 }
1659
1660 /* Return new_argv which must be freed after use */
1661 const char **traceprobe_expand_meta_args(int argc, const char *argv[],
1662                                          int *new_argc, char *buf, int bufsize,
1663                                          struct traceprobe_parse_context *ctx)
1664 {
1665         const struct btf_param *params = NULL;
1666         int i, j, n, used, ret, args_idx = -1;
1667         const char **new_argv = NULL;
1668
1669         ret = argv_has_var_arg(argc, argv, &args_idx, ctx);
1670         if (ret < 0)
1671                 return ERR_PTR(ret);
1672
1673         if (!ret) {
1674                 *new_argc = argc;
1675                 return NULL;
1676         }
1677
1678         ret = query_btf_context(ctx);
1679         if (ret < 0 || ctx->nr_params == 0) {
1680                 if (args_idx != -1) {
1681                         /* $arg* requires BTF info */
1682                         trace_probe_log_err(0, NOSUP_BTFARG);
1683                         return (const char **)params;
1684                 }
1685                 *new_argc = argc;
1686                 return NULL;
1687         }
1688
1689         if (args_idx >= 0)
1690                 *new_argc = argc + ctx->nr_params - 1;
1691         else
1692                 *new_argc = argc;
1693
1694         new_argv = kcalloc(*new_argc, sizeof(char *), GFP_KERNEL);
1695         if (!new_argv)
1696                 return ERR_PTR(-ENOMEM);
1697
1698         used = 0;
1699         for (i = 0, j = 0; i < argc; i++) {
1700                 trace_probe_log_set_index(i + 2);
1701                 if (i == args_idx) {
1702                         for (n = 0; n < ctx->nr_params; n++) {
1703                                 ret = sprint_nth_btf_arg(n, "", buf + used,
1704                                                          bufsize - used, ctx);
1705                                 if (ret < 0)
1706                                         goto error;
1707
1708                                 new_argv[j++] = buf + used;
1709                                 used += ret + 1;
1710                         }
1711                         continue;
1712                 }
1713
1714                 if (str_has_prefix(argv[i], "$arg")) {
1715                         char *type = NULL;
1716
1717                         n = simple_strtoul(argv[i] + 4, &type, 10);
1718                         if (type && !(*type == ':' || *type == '\0')) {
1719                                 trace_probe_log_err(0, BAD_VAR);
1720                                 ret = -ENOENT;
1721                                 goto error;
1722                         }
1723                         /* Note: $argN starts from $arg1 */
1724                         ret = sprint_nth_btf_arg(n - 1, type, buf + used,
1725                                                  bufsize - used, ctx);
1726                         if (ret < 0)
1727                                 goto error;
1728                         new_argv[j++] = buf + used;
1729                         used += ret + 1;
1730                 } else
1731                         new_argv[j++] = argv[i];
1732         }
1733
1734         return new_argv;
1735
1736 error:
1737         kfree(new_argv);
1738         return ERR_PTR(ret);
1739 }
1740
1741 /* @buf: *buf must be equal to NULL. Caller must to free *buf */
1742 int traceprobe_expand_dentry_args(int argc, const char *argv[], char **buf)
1743 {
1744         int i, used, ret;
1745         const int bufsize = MAX_DENTRY_ARGS_LEN;
1746         char *tmpbuf = NULL;
1747
1748         if (*buf)
1749                 return -EINVAL;
1750
1751         used = 0;
1752         for (i = 0; i < argc; i++) {
1753                 char *tmp;
1754                 char *equal;
1755                 size_t arg_len;
1756
1757                 if (!glob_match("*:%p[dD]", argv[i]))
1758                         continue;
1759
1760                 if (!tmpbuf) {
1761                         tmpbuf = kmalloc(bufsize, GFP_KERNEL);
1762                         if (!tmpbuf)
1763                                 return -ENOMEM;
1764                 }
1765
1766                 tmp = kstrdup(argv[i], GFP_KERNEL);
1767                 if (!tmp)
1768                         goto nomem;
1769
1770                 equal = strchr(tmp, '=');
1771                 if (equal)
1772                         *equal = '\0';
1773                 arg_len = strlen(argv[i]);
1774                 tmp[arg_len - 4] = '\0';
1775                 if (argv[i][arg_len - 1] == 'd')
1776                         ret = snprintf(tmpbuf + used, bufsize - used,
1777                                        "%s%s+0x0(+0x%zx(%s)):string",
1778                                        equal ? tmp : "", equal ? "=" : "",
1779                                        offsetof(struct dentry, d_name.name),
1780                                        equal ? equal + 1 : tmp);
1781                 else
1782                         ret = snprintf(tmpbuf + used, bufsize - used,
1783                                        "%s%s+0x0(+0x%zx(+0x%zx(%s))):string",
1784                                        equal ? tmp : "", equal ? "=" : "",
1785                                        offsetof(struct dentry, d_name.name),
1786                                        offsetof(struct file, f_path.dentry),
1787                                        equal ? equal + 1 : tmp);
1788
1789                 kfree(tmp);
1790                 if (ret >= bufsize - used)
1791                         goto nomem;
1792                 argv[i] = tmpbuf + used;
1793                 used += ret + 1;
1794         }
1795
1796         *buf = tmpbuf;
1797         return 0;
1798 nomem:
1799         kfree(tmpbuf);
1800         return -ENOMEM;
1801 }
1802
1803 void traceprobe_finish_parse(struct traceprobe_parse_context *ctx)
1804 {
1805         clear_btf_context(ctx);
1806 }
1807
1808 int traceprobe_update_arg(struct probe_arg *arg)
1809 {
1810         struct fetch_insn *code = arg->code;
1811         long offset;
1812         char *tmp;
1813         char c;
1814         int ret = 0;
1815
1816         while (code && code->op != FETCH_OP_END) {
1817                 if (code->op == FETCH_NOP_SYMBOL) {
1818                         if (code[1].op != FETCH_OP_IMM)
1819                                 return -EINVAL;
1820
1821                         tmp = strpbrk(code->data, "+-");
1822                         if (tmp)
1823                                 c = *tmp;
1824                         ret = traceprobe_split_symbol_offset(code->data,
1825                                                              &offset);
1826                         if (ret)
1827                                 return ret;
1828
1829                         code[1].immediate =
1830                                 (unsigned long)kallsyms_lookup_name(code->data);
1831                         if (tmp)
1832                                 *tmp = c;
1833                         if (!code[1].immediate)
1834                                 return -ENOENT;
1835                         code[1].immediate += offset;
1836                 }
1837                 code++;
1838         }
1839         return 0;
1840 }
1841
1842 /* When len=0, we just calculate the needed length */
1843 #define LEN_OR_ZERO (len ? len - pos : 0)
1844 static int __set_print_fmt(struct trace_probe *tp, char *buf, int len,
1845                            enum probe_print_type ptype)
1846 {
1847         struct probe_arg *parg;
1848         int i, j;
1849         int pos = 0;
1850         const char *fmt, *arg;
1851
1852         switch (ptype) {
1853         case PROBE_PRINT_NORMAL:
1854                 fmt = "(%lx)";
1855                 arg = ", REC->" FIELD_STRING_IP;
1856                 break;
1857         case PROBE_PRINT_RETURN:
1858                 fmt = "(%lx <- %lx)";
1859                 arg = ", REC->" FIELD_STRING_FUNC ", REC->" FIELD_STRING_RETIP;
1860                 break;
1861         case PROBE_PRINT_EVENT:
1862                 fmt = "";
1863                 arg = "";
1864                 break;
1865         default:
1866                 WARN_ON_ONCE(1);
1867                 return 0;
1868         }
1869
1870         pos += snprintf(buf + pos, LEN_OR_ZERO, "\"%s", fmt);
1871
1872         for (i = 0; i < tp->nr_args; i++) {
1873                 parg = tp->args + i;
1874                 pos += snprintf(buf + pos, LEN_OR_ZERO, " %s=", parg->name);
1875                 if (parg->count) {
1876                         pos += snprintf(buf + pos, LEN_OR_ZERO, "{%s",
1877                                         parg->type->fmt);
1878                         for (j = 1; j < parg->count; j++)
1879                                 pos += snprintf(buf + pos, LEN_OR_ZERO, ",%s",
1880                                                 parg->type->fmt);
1881                         pos += snprintf(buf + pos, LEN_OR_ZERO, "}");
1882                 } else
1883                         pos += snprintf(buf + pos, LEN_OR_ZERO, "%s",
1884                                         parg->type->fmt);
1885         }
1886
1887         pos += snprintf(buf + pos, LEN_OR_ZERO, "\"%s", arg);
1888
1889         for (i = 0; i < tp->nr_args; i++) {
1890                 parg = tp->args + i;
1891                 if (parg->count) {
1892                         if (parg->type->is_string)
1893                                 fmt = ", __get_str(%s[%d])";
1894                         else
1895                                 fmt = ", REC->%s[%d]";
1896                         for (j = 0; j < parg->count; j++)
1897                                 pos += snprintf(buf + pos, LEN_OR_ZERO,
1898                                                 fmt, parg->name, j);
1899                 } else {
1900                         if (parg->type->is_string)
1901                                 fmt = ", __get_str(%s)";
1902                         else
1903                                 fmt = ", REC->%s";
1904                         pos += snprintf(buf + pos, LEN_OR_ZERO,
1905                                         fmt, parg->name);
1906                 }
1907         }
1908
1909         /* return the length of print_fmt */
1910         return pos;
1911 }
1912 #undef LEN_OR_ZERO
1913
1914 int traceprobe_set_print_fmt(struct trace_probe *tp, enum probe_print_type ptype)
1915 {
1916         struct trace_event_call *call = trace_probe_event_call(tp);
1917         int len;
1918         char *print_fmt;
1919
1920         /* First: called with 0 length to calculate the needed length */
1921         len = __set_print_fmt(tp, NULL, 0, ptype);
1922         print_fmt = kmalloc(len + 1, GFP_KERNEL);
1923         if (!print_fmt)
1924                 return -ENOMEM;
1925
1926         /* Second: actually write the @print_fmt */
1927         __set_print_fmt(tp, print_fmt, len + 1, ptype);
1928         call->print_fmt = print_fmt;
1929
1930         return 0;
1931 }
1932
1933 int traceprobe_define_arg_fields(struct trace_event_call *event_call,
1934                                  size_t offset, struct trace_probe *tp)
1935 {
1936         int ret, i;
1937
1938         /* Set argument names as fields */
1939         for (i = 0; i < tp->nr_args; i++) {
1940                 struct probe_arg *parg = &tp->args[i];
1941                 const char *fmt = parg->type->fmttype;
1942                 int size = parg->type->size;
1943
1944                 if (parg->fmt)
1945                         fmt = parg->fmt;
1946                 if (parg->count)
1947                         size *= parg->count;
1948                 ret = trace_define_field(event_call, fmt, parg->name,
1949                                          offset + parg->offset, size,
1950                                          parg->type->is_signed,
1951                                          FILTER_OTHER);
1952                 if (ret)
1953                         return ret;
1954         }
1955         return 0;
1956 }
1957
1958 static void trace_probe_event_free(struct trace_probe_event *tpe)
1959 {
1960         kfree(tpe->class.system);
1961         kfree(tpe->call.name);
1962         kfree(tpe->call.print_fmt);
1963         kfree(tpe);
1964 }
1965
1966 int trace_probe_append(struct trace_probe *tp, struct trace_probe *to)
1967 {
1968         if (trace_probe_has_sibling(tp))
1969                 return -EBUSY;
1970
1971         list_del_init(&tp->list);
1972         trace_probe_event_free(tp->event);
1973
1974         tp->event = to->event;
1975         list_add_tail(&tp->list, trace_probe_probe_list(to));
1976
1977         return 0;
1978 }
1979
1980 void trace_probe_unlink(struct trace_probe *tp)
1981 {
1982         list_del_init(&tp->list);
1983         if (list_empty(trace_probe_probe_list(tp)))
1984                 trace_probe_event_free(tp->event);
1985         tp->event = NULL;
1986 }
1987
1988 void trace_probe_cleanup(struct trace_probe *tp)
1989 {
1990         int i;
1991
1992         for (i = 0; i < tp->nr_args; i++)
1993                 traceprobe_free_probe_arg(&tp->args[i]);
1994
1995         if (tp->entry_arg) {
1996                 kfree(tp->entry_arg->code);
1997                 kfree(tp->entry_arg);
1998                 tp->entry_arg = NULL;
1999         }
2000
2001         if (tp->event)
2002                 trace_probe_unlink(tp);
2003 }
2004
2005 int trace_probe_init(struct trace_probe *tp, const char *event,
2006                      const char *group, bool alloc_filter, int nargs)
2007 {
2008         struct trace_event_call *call;
2009         size_t size = sizeof(struct trace_probe_event);
2010         int ret = 0;
2011
2012         if (!event || !group)
2013                 return -EINVAL;
2014
2015         if (alloc_filter)
2016                 size += sizeof(struct trace_uprobe_filter);
2017
2018         tp->event = kzalloc(size, GFP_KERNEL);
2019         if (!tp->event)
2020                 return -ENOMEM;
2021
2022         INIT_LIST_HEAD(&tp->event->files);
2023         INIT_LIST_HEAD(&tp->event->class.fields);
2024         INIT_LIST_HEAD(&tp->event->probes);
2025         INIT_LIST_HEAD(&tp->list);
2026         list_add(&tp->list, &tp->event->probes);
2027
2028         call = trace_probe_event_call(tp);
2029         call->class = &tp->event->class;
2030         call->name = kstrdup(event, GFP_KERNEL);
2031         if (!call->name) {
2032                 ret = -ENOMEM;
2033                 goto error;
2034         }
2035
2036         tp->event->class.system = kstrdup(group, GFP_KERNEL);
2037         if (!tp->event->class.system) {
2038                 ret = -ENOMEM;
2039                 goto error;
2040         }
2041
2042         tp->nr_args = nargs;
2043         /* Make sure pointers in args[] are NULL */
2044         if (nargs)
2045                 memset(tp->args, 0, sizeof(tp->args[0]) * nargs);
2046
2047         return 0;
2048
2049 error:
2050         trace_probe_cleanup(tp);
2051         return ret;
2052 }
2053
2054 static struct trace_event_call *
2055 find_trace_event_call(const char *system, const char *event_name)
2056 {
2057         struct trace_event_call *tp_event;
2058         const char *name;
2059
2060         list_for_each_entry(tp_event, &ftrace_events, list) {
2061                 if (!tp_event->class->system ||
2062                     strcmp(system, tp_event->class->system))
2063                         continue;
2064                 name = trace_event_name(tp_event);
2065                 if (!name || strcmp(event_name, name))
2066                         continue;
2067                 return tp_event;
2068         }
2069
2070         return NULL;
2071 }
2072
2073 int trace_probe_register_event_call(struct trace_probe *tp)
2074 {
2075         struct trace_event_call *call = trace_probe_event_call(tp);
2076         int ret;
2077
2078         lockdep_assert_held(&event_mutex);
2079
2080         if (find_trace_event_call(trace_probe_group_name(tp),
2081                                   trace_probe_name(tp)))
2082                 return -EEXIST;
2083
2084         ret = register_trace_event(&call->event);
2085         if (!ret)
2086                 return -ENODEV;
2087
2088         ret = trace_add_event_call(call);
2089         if (ret)
2090                 unregister_trace_event(&call->event);
2091
2092         return ret;
2093 }
2094
2095 int trace_probe_add_file(struct trace_probe *tp, struct trace_event_file *file)
2096 {
2097         struct event_file_link *link;
2098
2099         link = kmalloc(sizeof(*link), GFP_KERNEL);
2100         if (!link)
2101                 return -ENOMEM;
2102
2103         link->file = file;
2104         INIT_LIST_HEAD(&link->list);
2105         list_add_tail_rcu(&link->list, &tp->event->files);
2106         trace_probe_set_flag(tp, TP_FLAG_TRACE);
2107         return 0;
2108 }
2109
2110 struct event_file_link *trace_probe_get_file_link(struct trace_probe *tp,
2111                                                   struct trace_event_file *file)
2112 {
2113         struct event_file_link *link;
2114
2115         trace_probe_for_each_link(link, tp) {
2116                 if (link->file == file)
2117                         return link;
2118         }
2119
2120         return NULL;
2121 }
2122
2123 int trace_probe_remove_file(struct trace_probe *tp,
2124                             struct trace_event_file *file)
2125 {
2126         struct event_file_link *link;
2127
2128         link = trace_probe_get_file_link(tp, file);
2129         if (!link)
2130                 return -ENOENT;
2131
2132         list_del_rcu(&link->list);
2133         kvfree_rcu_mightsleep(link);
2134
2135         if (list_empty(&tp->event->files))
2136                 trace_probe_clear_flag(tp, TP_FLAG_TRACE);
2137
2138         return 0;
2139 }
2140
2141 /*
2142  * Return the smallest index of different type argument (start from 1).
2143  * If all argument types and name are same, return 0.
2144  */
2145 int trace_probe_compare_arg_type(struct trace_probe *a, struct trace_probe *b)
2146 {
2147         int i;
2148
2149         /* In case of more arguments */
2150         if (a->nr_args < b->nr_args)
2151                 return a->nr_args + 1;
2152         if (a->nr_args > b->nr_args)
2153                 return b->nr_args + 1;
2154
2155         for (i = 0; i < a->nr_args; i++) {
2156                 if ((b->nr_args <= i) ||
2157                     ((a->args[i].type != b->args[i].type) ||
2158                      (a->args[i].count != b->args[i].count) ||
2159                      strcmp(a->args[i].name, b->args[i].name)))
2160                         return i + 1;
2161         }
2162
2163         return 0;
2164 }
2165
2166 bool trace_probe_match_command_args(struct trace_probe *tp,
2167                                     int argc, const char **argv)
2168 {
2169         char buf[MAX_ARGSTR_LEN + 1];
2170         int i;
2171
2172         if (tp->nr_args < argc)
2173                 return false;
2174
2175         for (i = 0; i < argc; i++) {
2176                 snprintf(buf, sizeof(buf), "%s=%s",
2177                          tp->args[i].name, tp->args[i].comm);
2178                 if (strcmp(buf, argv[i]))
2179                         return false;
2180         }
2181         return true;
2182 }
2183
2184 int trace_probe_create(const char *raw_command, int (*createfn)(int, const char **))
2185 {
2186         int argc = 0, ret = 0;
2187         char **argv;
2188
2189         argv = argv_split(GFP_KERNEL, raw_command, &argc);
2190         if (!argv)
2191                 return -ENOMEM;
2192
2193         if (argc)
2194                 ret = createfn(argc, (const char **)argv);
2195
2196         argv_free(argv);
2197
2198         return ret;
2199 }
2200
2201 int trace_probe_print_args(struct trace_seq *s, struct probe_arg *args, int nr_args,
2202                  u8 *data, void *field)
2203 {
2204         void *p;
2205         int i, j;
2206
2207         for (i = 0; i < nr_args; i++) {
2208                 struct probe_arg *a = args + i;
2209
2210                 trace_seq_printf(s, " %s=", a->name);
2211                 if (likely(!a->count)) {
2212                         if (!a->type->print(s, data + a->offset, field))
2213                                 return -ENOMEM;
2214                         continue;
2215                 }
2216                 trace_seq_putc(s, '{');
2217                 p = data + a->offset;
2218                 for (j = 0; j < a->count; j++) {
2219                         if (!a->type->print(s, p, field))
2220                                 return -ENOMEM;
2221                         trace_seq_putc(s, j == a->count - 1 ? '}' : ',');
2222                         p += a->type->size;
2223                 }
2224         }
2225         return 0;
2226 }