xref: /linux/kernel/trace/trace_probe.c (revision 6439079365dcb33c6701f5f0e480ac2c17312b6b)
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 
17 #include "trace_btf.h"
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 
PRINT_TYPE_FUNC_NAME(symbol)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 */
PRINT_TYPE_FUNC_NAME(string)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 
find_fetch_type(const char * type,unsigned long flags)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 extern struct mutex dyn_event_ops_mutex;
158 
trace_probe_log_init(const char * subsystem,int argc,const char ** argv)159 const char *trace_probe_log_init(const char *subsystem, int argc, const char **argv)
160 {
161 	lockdep_assert_held(&dyn_event_ops_mutex);
162 
163 	trace_probe_log.subsystem = subsystem;
164 	trace_probe_log.argc = argc;
165 	trace_probe_log.argv = argv;
166 	trace_probe_log.index = 0;
167 	return subsystem;
168 }
169 
trace_probe_log_clear(void)170 void trace_probe_log_clear(void)
171 {
172 	lockdep_assert_held(&dyn_event_ops_mutex);
173 
174 	memset(&trace_probe_log, 0, sizeof(trace_probe_log));
175 }
176 
trace_probe_log_set_index(int index)177 void trace_probe_log_set_index(int index)
178 {
179 	lockdep_assert_held(&dyn_event_ops_mutex);
180 
181 	trace_probe_log.index = index;
182 }
183 
__trace_probe_log_err(int offset,int err_type)184 void __trace_probe_log_err(int offset, int err_type)
185 {
186 	char *command, *p;
187 	int i, len = 0, pos = 0;
188 
189 	lockdep_assert_held(&dyn_event_ops_mutex);
190 
191 	if (!trace_probe_log.argv || !trace_probe_log.argc)
192 		return;
193 
194 	/* Recalculate the length and allocate buffer */
195 	for (i = 0; i < trace_probe_log.argc; i++) {
196 		if (i == trace_probe_log.index)
197 			pos = len;
198 		len += strlen(trace_probe_log.argv[i]) + 1;
199 	}
200 	command = kzalloc(len, GFP_KERNEL);
201 	if (!command)
202 		return;
203 
204 	if (trace_probe_log.index >= trace_probe_log.argc) {
205 		/**
206 		 * Set the error position is next to the last arg + space.
207 		 * Note that len includes the terminal null and the cursor
208 		 * appears at pos + 1.
209 		 */
210 		pos = len;
211 		offset = 0;
212 	}
213 
214 	/* And make a command string from argv array */
215 	p = command;
216 	for (i = 0; i < trace_probe_log.argc; i++) {
217 		len = strlen(trace_probe_log.argv[i]);
218 		memcpy(p, trace_probe_log.argv[i], len);
219 		p[len] = ' ';
220 		p += len + 1;
221 	}
222 	*(p - 1) = '\0';
223 
224 	tracing_log_err(NULL, trace_probe_log.subsystem, command,
225 			trace_probe_err_text, err_type, pos + offset);
226 
227 	kfree(command);
228 }
229 
230 /* Split symbol and offset. */
traceprobe_split_symbol_offset(char * symbol,long * offset)231 int traceprobe_split_symbol_offset(char *symbol, long *offset)
232 {
233 	char *tmp;
234 	int ret;
235 
236 	if (!offset)
237 		return -EINVAL;
238 
239 	tmp = strpbrk(symbol, "+-");
240 	if (tmp) {
241 		ret = kstrtol(tmp, 0, offset);
242 		if (ret)
243 			return ret;
244 		*tmp = '\0';
245 	} else
246 		*offset = 0;
247 
248 	return 0;
249 }
250 
251 /**
252  * traceprobe_parse_event_name() - Parse a string into group and event names
253  * @pevent: A pointer to the string to be parsed.
254  * @pgroup: A pointer to the group name.
255  * @buf:    A buffer to store the parsed group name.
256  * @offset: The offset of the string in the original user command, for logging.
257  *
258  * This parses a string with the format `[GROUP/][EVENT]` or `[GROUP.][EVENT]`
259  * (either GROUP or EVENT or both must be specified).
260  * Since the parsed group name is stored in @buf, the caller must ensure @buf
261  * is at least MAX_EVENT_NAME_LEN bytes.
262  *
263  * Return: 0 on success, or -EINVAL on failure.
264  *
265  * If success, *@pevent is updated to point to the event name part of the
266  * original string, or NULL if there is no event name.
267  * Also, *@pgroup is updated to point to the parsed group which is stored
268  * in @buf, or NULL if there is no group name.
269  */
traceprobe_parse_event_name(const char ** pevent,const char ** pgroup,char * buf,int offset)270 int traceprobe_parse_event_name(const char **pevent, const char **pgroup,
271 				char *buf, int offset)
272 {
273 	const char *slash, *event = *pevent;
274 	int len;
275 
276 	slash = strchr(event, '/');
277 	if (!slash)
278 		slash = strchr(event, '.');
279 
280 	if (slash) {
281 		if (slash == event) {
282 			trace_probe_log_err(offset, NO_GROUP_NAME);
283 			return -EINVAL;
284 		}
285 		if (slash - event + 1 > MAX_EVENT_NAME_LEN) {
286 			trace_probe_log_err(offset, GROUP_TOO_LONG);
287 			return -EINVAL;
288 		}
289 		strscpy(buf, event, slash - event + 1);
290 		if (!is_good_system_name(buf)) {
291 			trace_probe_log_err(offset, BAD_GROUP_NAME);
292 			return -EINVAL;
293 		}
294 		*pgroup = buf;
295 		*pevent = slash + 1;
296 		offset += slash - event + 1;
297 		event = *pevent;
298 	}
299 	len = strlen(event);
300 	if (len == 0) {
301 		if (slash) {
302 			*pevent = NULL;
303 			return 0;
304 		}
305 		trace_probe_log_err(offset, NO_EVENT_NAME);
306 		return -EINVAL;
307 	} else if (len >= MAX_EVENT_NAME_LEN) {
308 		trace_probe_log_err(offset, EVENT_TOO_LONG);
309 		return -EINVAL;
310 	}
311 	if (!is_good_name(event)) {
312 		trace_probe_log_err(offset, BAD_EVENT_NAME);
313 		return -EINVAL;
314 	}
315 	return 0;
316 }
317 
parse_trace_event_arg(char * arg,struct fetch_insn * code,struct traceprobe_parse_context * ctx)318 static int parse_trace_event_arg(char *arg, struct fetch_insn *code,
319 				 struct traceprobe_parse_context *ctx)
320 {
321 	struct ftrace_event_field *field;
322 	struct list_head *head;
323 
324 	head = trace_get_fields(ctx->event);
325 	list_for_each_entry(field, head, link) {
326 		if (!strcmp(arg, field->name)) {
327 			code->op = FETCH_OP_TP_ARG;
328 			code->data = field;
329 			return 0;
330 		}
331 	}
332 	return -ENOENT;
333 }
334 
parse_trace_event(char * arg,struct fetch_insn * code,struct traceprobe_parse_context * ctx)335 static int parse_trace_event(char *arg, struct fetch_insn *code,
336 			     struct traceprobe_parse_context *ctx)
337 {
338 	int ret;
339 
340 	if (code->data)
341 		return -EFAULT;
342 	ret = parse_trace_event_arg(arg, code, ctx);
343 	if (!ret)
344 		return 0;
345 	return -EINVAL;
346 }
347 
348 /* this_cpu_* parser */
349 #define THIS_CPU_PTR_PREFIX "this_cpu_ptr("
350 #define THIS_CPU_READ_PREFIX "this_cpu_read("
351 #define THIS_CPU_PTR_LEN (sizeof(THIS_CPU_PTR_PREFIX) - 1)
352 #define THIS_CPU_READ_LEN (sizeof(THIS_CPU_READ_PREFIX) - 1)
353 
354 static int
355 parse_probe_arg(char *arg, const struct fetch_type *type,
356 		struct fetch_insn **pcode, struct fetch_insn *end,
357 		struct traceprobe_parse_context *ctx);
358 
parse_this_cpu(char * arg,struct traceprobe_parse_context * ctx)359 static int parse_this_cpu(char *arg, struct traceprobe_parse_context *ctx)
360 {
361 	bool is_read = false;
362 	char *tmp;
363 
364 	/*
365 	 * This is only for kernel probes, excluding eprobe, because per-cpu
366 	 * pointer should not be recorded by events.
367 	 */
368 	if (!(ctx->flags & TPARG_FL_KERNEL) ||
369 	    (ctx->flags & TPARG_FL_TEVENT)) {
370 		trace_probe_log_err(ctx->offset, NOSUP_PERCPU);
371 		return -EINVAL;
372 	}
373 	if (str_has_prefix(arg, THIS_CPU_PTR_PREFIX)) {
374 		arg += THIS_CPU_PTR_LEN;
375 		ctx->offset += THIS_CPU_PTR_LEN;
376 	} else if (str_has_prefix(arg, THIS_CPU_READ_PREFIX)) {
377 		arg += THIS_CPU_READ_LEN;
378 		ctx->offset += THIS_CPU_READ_LEN;
379 		is_read = true;
380 	} else {
381 		trace_probe_log_err(ctx->offset, BAD_FETCH_ARG);
382 		return -EINVAL;
383 	}
384 
385 	tmp = strrchr(arg, ')');
386 	if (!tmp) {
387 		trace_probe_log_err(ctx->offset + strlen(arg),
388 					DEREF_OPEN_BRACE);
389 		return -EINVAL;
390 	}
391 	*tmp = '\0';
392 
393 	ctx->stack[ctx->depth].type = STATE_DEREF;
394 	ctx->stack[ctx->depth].deref.deref = FETCH_OP_CPU_PTR;
395 	ctx->stack[ctx->depth].deref.offset = 0;
396 	ctx->stack[ctx->depth].deref.cur_offs = ctx->offset;
397 	ctx->stack[ctx->depth].deref.inner_arg = arg;
398 	ctx->stack[ctx->depth].deref.is_cpu_read = is_read;
399 	return 0;
400 }
401 
402 #ifdef CONFIG_PROBE_EVENTS_BTF_ARGS
403 
btf_type_int(const struct btf_type * t)404 static u32 btf_type_int(const struct btf_type *t)
405 {
406 	return *(u32 *)(t + 1);
407 }
408 
btf_type_is_char_ptr(struct btf * btf,const struct btf_type * type)409 static bool btf_type_is_char_ptr(struct btf *btf, const struct btf_type *type)
410 {
411 	const struct btf_type *real_type;
412 	u32 intdata;
413 
414 	real_type = btf_type_skip_modifiers(btf, type->type, NULL);
415 	if (!real_type)
416 		return false;
417 
418 	if (BTF_INFO_KIND(real_type->info) != BTF_KIND_INT)
419 		return false;
420 
421 	intdata = btf_type_int(real_type);
422 	return !(BTF_INT_ENCODING(intdata) & BTF_INT_SIGNED)
423 		&& BTF_INT_BITS(intdata) == 8;
424 }
425 
btf_type_is_char_array(struct btf * btf,const struct btf_type * type)426 static bool btf_type_is_char_array(struct btf *btf, const struct btf_type *type)
427 {
428 	const struct btf_type *real_type;
429 	const struct btf_array *array;
430 	u32 intdata;
431 
432 	if (BTF_INFO_KIND(type->info) != BTF_KIND_ARRAY)
433 		return false;
434 
435 	array = (const struct btf_array *)(type + 1);
436 
437 	real_type = btf_type_skip_modifiers(btf, array->type, NULL);
438 
439 	intdata = btf_type_int(real_type);
440 	return !(BTF_INT_ENCODING(intdata) & BTF_INT_SIGNED)
441 		&& BTF_INT_BITS(intdata) == 8;
442 }
443 
ctx_btf(struct traceprobe_parse_context * ctx)444 static struct btf *ctx_btf(struct traceprobe_parse_context *ctx)
445 {
446 	return ctx->struct_btf ? : ctx->btf;
447 }
448 
check_prepare_btf_string_fetch(char * typename,struct fetch_insn ** pcode,struct traceprobe_parse_context * ctx)449 static int check_prepare_btf_string_fetch(char *typename,
450 				struct fetch_insn **pcode,
451 				struct traceprobe_parse_context *ctx)
452 {
453 	struct btf *btf = ctx_btf(ctx);
454 
455 	if (!btf || !ctx->last_type)
456 		return 0;
457 
458 	/* char [] does not need any change. */
459 	if (btf_type_is_char_array(btf, ctx->last_type))
460 		return 0;
461 
462 	/* char * requires dereference the pointer. */
463 	if (btf_type_is_char_ptr(btf, ctx->last_type)) {
464 		struct fetch_insn *code = *pcode + 1;
465 
466 		if (code->op == FETCH_OP_END) {
467 			trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
468 			return -E2BIG;
469 		}
470 		if (typename[0] == 'u')
471 			code->op = FETCH_OP_UDEREF;
472 		else
473 			code->op = FETCH_OP_DEREF;
474 		code->offset = 0;
475 		*pcode = code;
476 		return 0;
477 	}
478 	/* Other types are not available for string */
479 	trace_probe_log_err(ctx->offset, BAD_TYPE4STR);
480 	return -EINVAL;
481 }
482 
fetch_type_from_btf_type(struct btf * btf,const struct btf_type * type,struct traceprobe_parse_context * ctx)483 static const char *fetch_type_from_btf_type(struct btf *btf,
484 					const struct btf_type *type,
485 					struct traceprobe_parse_context *ctx)
486 {
487 	u32 intdata;
488 
489 	/* TODO: const char * could be converted as a string */
490 	switch (BTF_INFO_KIND(type->info)) {
491 	case BTF_KIND_ENUM:
492 		/* enum is "int", so convert to "s32" */
493 		return "s32";
494 	case BTF_KIND_ENUM64:
495 		return "s64";
496 	case BTF_KIND_PTR:
497 		/* pointer will be converted to "x??" */
498 		return IS_ENABLED(CONFIG_64BIT) ? "x64" : "x32";
499 	case BTF_KIND_INT:
500 		intdata = btf_type_int(type);
501 		if (BTF_INT_ENCODING(intdata) & BTF_INT_SIGNED) {
502 			switch (BTF_INT_BITS(intdata)) {
503 			case 8:
504 				return "s8";
505 			case 16:
506 				return "s16";
507 			case 32:
508 				return "s32";
509 			case 64:
510 				return "s64";
511 			}
512 		} else {	/* unsigned */
513 			switch (BTF_INT_BITS(intdata)) {
514 			case 8:
515 				return "u8";
516 			case 16:
517 				return "u16";
518 			case 32:
519 				return "u32";
520 			case 64:
521 				return "u64";
522 			}
523 			/* bitfield, size is encoded in the type */
524 			ctx->last_bitsize = BTF_INT_BITS(intdata);
525 			ctx->last_bitoffs += BTF_INT_OFFSET(intdata);
526 			return "u64";
527 		}
528 	}
529 	/* TODO: support other types */
530 
531 	return NULL;
532 }
533 
query_btf_context(struct traceprobe_parse_context * ctx)534 static int query_btf_context(struct traceprobe_parse_context *ctx)
535 {
536 	const struct btf_param *param;
537 	const struct btf_type *type;
538 	struct btf *btf;
539 	s32 nr;
540 
541 	if (ctx->btf)
542 		return 0;
543 
544 	if (!ctx->funcname)
545 		return -EINVAL;
546 
547 	type = btf_find_func_proto(ctx->funcname, &btf);
548 	if (!type)
549 		return -ENOENT;
550 
551 	ctx->btf = btf;
552 	ctx->proto = type;
553 
554 	/* ctx->params is optional, since func(void) will not have params. */
555 	nr = 0;
556 	param = btf_get_func_param(type, &nr);
557 	if (!IS_ERR_OR_NULL(param)) {
558 		/* Hide the first 'data' argument of tracepoint */
559 		if (ctx->flags & TPARG_FL_TPOINT) {
560 			nr--;
561 			param++;
562 		}
563 	}
564 
565 	if (nr > 0) {
566 		ctx->nr_params = nr;
567 		ctx->params = param;
568 	} else {
569 		ctx->nr_params = 0;
570 		ctx->params = NULL;
571 	}
572 
573 	return 0;
574 }
575 
clear_struct_btf(struct traceprobe_parse_context * ctx)576 static void clear_struct_btf(struct traceprobe_parse_context *ctx)
577 {
578 	if (ctx->struct_btf) {
579 		btf_put(ctx->struct_btf);
580 		ctx->struct_btf = NULL;
581 		ctx->last_struct = NULL;
582 	}
583 }
584 
clear_btf_context(struct traceprobe_parse_context * ctx)585 static void clear_btf_context(struct traceprobe_parse_context *ctx)
586 {
587 	if (ctx->btf) {
588 		btf_put(ctx->btf);
589 		ctx->btf = NULL;
590 		ctx->proto = NULL;
591 		ctx->params = NULL;
592 		ctx->nr_params = 0;
593 	}
594 }
595 
596 /* Return 1 if the field separator is arrow operator ('->') */
split_next_field(char * varname,char ** next_field,struct traceprobe_parse_context * ctx)597 static int split_next_field(char *varname, char **next_field,
598 			    struct traceprobe_parse_context *ctx)
599 {
600 	char *field;
601 	int ret = 0;
602 
603 	field = strpbrk(varname, ".-");
604 	if (field) {
605 		if (field[0] == '-' && field[1] == '>') {
606 			field[0] = '\0';
607 			field += 2;
608 			ret = 1;
609 		} else if (field[0] == '.') {
610 			field[0] = '\0';
611 			field += 1;
612 		} else {
613 			trace_probe_log_err(ctx->offset + field - varname, BAD_HYPHEN);
614 			return -EINVAL;
615 		}
616 		*next_field = field;
617 	}
618 
619 	return ret;
620 }
621 
622 /* Inner loop for solving dot operator ('.'). Return bit-offset of the given field */
get_bitoffset_of_field(char ** pfieldname,const struct btf_type ** ptype,struct traceprobe_parse_context * ctx)623 static int get_bitoffset_of_field(char **pfieldname, const struct btf_type **ptype,
624 				  struct traceprobe_parse_context *ctx)
625 {
626 	const struct btf_type *type = *ptype;
627 	const struct btf_member *field;
628 	struct btf *btf = ctx_btf(ctx);
629 	char *fieldname = *pfieldname;
630 	int bitoffs = 0;
631 	u32 anon_offs;
632 	char *next;
633 	int is_ptr;
634 
635 	do {
636 		next = NULL;
637 		is_ptr = split_next_field(fieldname, &next, ctx);
638 		if (is_ptr < 0)
639 			return is_ptr;
640 
641 		anon_offs = 0;
642 		field = btf_find_struct_member(btf, type, fieldname,
643 						&anon_offs);
644 		if (IS_ERR(field)) {
645 			trace_probe_log_err(ctx->offset, BAD_BTF_TID);
646 			return PTR_ERR(field);
647 		}
648 		if (!field) {
649 			trace_probe_log_err(ctx->offset, NO_BTF_FIELD);
650 			return -ENOENT;
651 		}
652 		/* Add anonymous structure/union offset */
653 		bitoffs += anon_offs;
654 
655 		/* Accumulate the bit-offsets of the dot-connected fields */
656 		if (btf_type_kflag(type)) {
657 			bitoffs += BTF_MEMBER_BIT_OFFSET(field->offset);
658 			ctx->last_bitsize = BTF_MEMBER_BITFIELD_SIZE(field->offset);
659 		} else {
660 			bitoffs += field->offset;
661 			ctx->last_bitsize = 0;
662 		}
663 
664 			type = btf_type_skip_modifiers(btf, field->type, NULL);
665 			if (!type) {
666 				trace_probe_log_err(ctx->offset, BAD_BTF_TID);
667 				return -EINVAL;
668 			}
669 
670 		if (next)
671 			ctx->offset += next - fieldname;
672 		fieldname = next;
673 	} while (!is_ptr && fieldname);
674 
675 	*pfieldname = fieldname;
676 	*ptype = type;
677 
678 	return bitoffs;
679 }
680 /*
681  * Parse the field of data structure. The @type must be a pointer type
682  * pointing the target data structure type.
683  */
parse_btf_field(char * fieldname,const struct btf_type * type,struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)684 static int parse_btf_field(char *fieldname, const struct btf_type *type,
685 			   struct fetch_insn **pcode, struct fetch_insn *end,
686 			   struct traceprobe_parse_context *ctx)
687 {
688 	struct fetch_insn *code = *pcode;
689 	struct btf *btf = ctx_btf(ctx);
690 	bool is_first_field = true;
691 	int bitoffs;
692 
693 	do {
694 		/* For the first field of typecast, @type will be the target structure type. */
695 		if (!(is_first_field && ctx->struct_btf)) {
696 			/* Outer loop for solving arrow operator ('->') */
697 			if (BTF_INFO_KIND(type->info) != BTF_KIND_PTR) {
698 				trace_probe_log_err(ctx->offset, NO_PTR_STRCT);
699 				return -EINVAL;
700 			}
701 
702 			/* Convert a struct pointer type to a struct type */
703 			type = btf_type_skip_modifiers(btf, type->type, NULL);
704 			if (!type) {
705 				trace_probe_log_err(ctx->offset, BAD_BTF_TID);
706 				return -EINVAL;
707 			}
708 		}
709 
710 		bitoffs = get_bitoffset_of_field(&fieldname, &type, ctx);
711 		if (bitoffs < 0)
712 			return bitoffs;
713 		if (++code == end) {
714 			trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
715 			return -EINVAL;
716 		}
717 		code->op = FETCH_OP_DEREF;	/* TODO: user deref support */
718 		code->offset = bitoffs / 8;
719 		if (is_first_field && ctx->struct_btf) {
720 			/* The first field can be typecasted with field option. */
721 			code->offset -= ctx->prefix_byteoffs;
722 		}
723 		*pcode = code;
724 
725 		ctx->last_bitoffs = bitoffs % 8;
726 		ctx->last_type = type;
727 		is_first_field = false;
728 	} while (fieldname);
729 
730 	return 0;
731 }
732 
733 static int __store_entry_arg(struct trace_probe *tp, int argnum);
734 
parse_btf_arg(char * varname,struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)735 static int parse_btf_arg(char *varname,
736 			 struct fetch_insn **pcode, struct fetch_insn *end,
737 			 struct traceprobe_parse_context *ctx)
738 {
739 	struct fetch_insn *code = *pcode;
740 	const struct btf_param *params;
741 	const struct btf_type *type;
742 	char *field = NULL;
743 	int i, is_ptr, ret;
744 	u32 tid;
745 
746 	/* Note: field is not separated at this point, so check prefix. */
747 	if (!str_has_prefix(varname, "$current") &&
748 	    !ctx->funcname && !(ctx->flags & TPARG_FL_TEVENT))
749 		return -EINVAL;
750 
751 	is_ptr = split_next_field(varname, &field, ctx);
752 	if (is_ptr < 0)
753 		return is_ptr;
754 	if (!is_ptr && field) {
755 		/* dot-connected field on an argument is not supported. */
756 		trace_probe_log_err(ctx->offset + field - varname,
757 				    NOSUP_DAT_ARG);
758 		return -EOPNOTSUPP;
759 	}
760 
761 	if (!strcmp(varname, "$current")) {
762 		code->op = FETCH_OP_CURRENT;
763 		/* If no typecast is specified for $current, use task_struct by default */
764 		ret = bpf_find_btf_id("task_struct", BTF_KIND_STRUCT, &ctx->struct_btf);
765 		if (ret < 0) {
766 			trace_probe_log_err(ctx->offset, NO_BTF_ENTRY);
767 			return -ENOENT;
768 		}
769 		tid = (u32)ret;
770 		type = ctx->last_struct =
771 			btf_type_skip_modifiers(ctx->struct_btf, tid, NULL);
772 		goto found_type;
773 	}
774 
775 	if (ctx->flags & TPARG_FL_RETURN && !strcmp(varname, "$retval")) {
776 		code->op = FETCH_OP_RETVAL;
777 		/* Check whether the function return type is not void, even with typecast. */
778 		if (query_btf_context(ctx) == 0) {
779 			if (ctx->proto->type == 0) {
780 				trace_probe_log_err(ctx->offset, NO_RETVAL);
781 				return -ENOENT;
782 			}
783 			tid = ctx->proto->type;
784 			goto found;
785 		}
786 		if (field) {
787 			trace_probe_log_err(ctx->offset + field - varname,
788 					    NO_BTF_ENTRY);
789 			return -ENOENT;
790 		}
791 		return 0;
792 	}
793 
794 	if (!ctx->btf) {
795 		ret = query_btf_context(ctx);
796 		if (ret < 0 || ctx->nr_params == 0) {
797 			trace_probe_log_err(ctx->offset, NO_BTF_ENTRY);
798 			return -ENOENT;
799 		}
800 	}
801 	params = ctx->params;
802 
803 	for (i = 0; i < ctx->nr_params; i++) {
804 		const char *name = btf_name_by_offset(ctx->btf, params[i].name_off);
805 
806 		if (name && !strcmp(name, varname)) {
807 			if (tparg_is_function_entry(ctx->flags)) {
808 				code->op = FETCH_OP_ARG;
809 				if (ctx->flags & TPARG_FL_TPOINT)
810 					code->param = i + 1;
811 				else
812 					code->param = i;
813 			} else if (tparg_is_function_return(ctx->flags)) {
814 				code->op = FETCH_OP_EDATA;
815 				ret = __store_entry_arg(ctx->tp, i);
816 				if (ret < 0) {
817 					/* internal error */
818 					return ret;
819 				}
820 				code->offset = ret;
821 			}
822 			tid = params[i].type;
823 			goto found;
824 		}
825 	}
826 	trace_probe_log_err(ctx->offset, NO_BTFARG);
827 	return -ENOENT;
828 
829 found:
830 	type = btf_type_skip_modifiers(ctx->btf, tid, NULL);
831 found_type:
832 	if (!type) {
833 		trace_probe_log_err(ctx->offset, BAD_BTF_TID);
834 		return -EINVAL;
835 	}
836 	/* Initialize the last type information */
837 	ctx->last_type = type;
838 	ctx->last_bitoffs = 0;
839 	ctx->last_bitsize = 0;
840 	if (field) {
841 		ctx->offset += field - varname;
842 		return parse_btf_field(field, type, pcode, end, ctx);
843 	}
844 	return 0;
845 }
846 
find_fetch_type_from_btf_type(struct traceprobe_parse_context * ctx)847 static const struct fetch_type *find_fetch_type_from_btf_type(
848 					struct traceprobe_parse_context *ctx)
849 {
850 	struct btf *btf = ctx_btf(ctx);
851 	const char *typestr = NULL;
852 
853 	if (btf && ctx->last_type)
854 		typestr = fetch_type_from_btf_type(btf, ctx->last_type, ctx);
855 
856 	return find_fetch_type(typestr, ctx->flags);
857 }
858 
parse_btf_bitfield(struct fetch_insn ** pcode,struct traceprobe_parse_context * ctx)859 static int parse_btf_bitfield(struct fetch_insn **pcode,
860 			      struct traceprobe_parse_context *ctx)
861 {
862 	struct fetch_insn *code = *pcode;
863 
864 	if ((ctx->last_bitsize % 8 == 0) && ctx->last_bitoffs == 0)
865 		return 0;
866 
867 	code++;
868 	if (code->op != FETCH_OP_NOP) {
869 		trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
870 		return -EINVAL;
871 	}
872 	*pcode = code;
873 
874 	code->op = FETCH_OP_MOD_BF;
875 	code->lshift = 64 - (ctx->last_bitsize + ctx->last_bitoffs);
876 	code->rshift = 64 - ctx->last_bitsize;
877 	code->basesize = 64 / 8;
878 	return 0;
879 }
880 
query_btf_struct(const char * sname,struct traceprobe_parse_context * ctx)881 static int query_btf_struct(const char *sname, struct traceprobe_parse_context *ctx)
882 {
883 	struct btf *btf = NULL;
884 	int id;
885 
886 	/* A struct_btf should only be used by a single argument */
887 	if (WARN_ON_ONCE(ctx->struct_btf)) {
888 		btf_put(ctx->struct_btf);
889 		ctx->struct_btf = NULL;
890 	}
891 
892 	id = bpf_find_btf_id(sname, BTF_KIND_STRUCT, &btf);
893 	if (id < 0)
894 		return id;
895 	ctx->struct_btf = btf;
896 	ctx->last_struct = btf_type_by_id(ctx->struct_btf, id);
897 	return 0;
898 }
899 
parse_btf_casttype(char * casttype,struct traceprobe_parse_context * ctx)900 static int parse_btf_casttype(char *casttype, struct traceprobe_parse_context *ctx)
901 {
902 	char *field;
903 	int ret;
904 
905 	/* Field option - evaluated later. */
906 	field = strchr(casttype, ',');
907 	if (field)
908 		*field++ = '\0';
909 
910 	ret = query_btf_struct(casttype, ctx);
911 	if (ret < 0) {
912 		trace_probe_log_err(ctx->offset, NO_PTR_STRCT);
913 		return -EINVAL;
914 	}
915 
916 	if (field) {
917 		struct btf_type *type = (struct btf_type *)ctx->last_struct;
918 
919 		ctx->offset += field - casttype;
920 		ret = get_bitoffset_of_field(&field, &ctx->last_struct, ctx);
921 		if (ret < 0)
922 			return ret;
923 		if (ret % 8) {
924 			trace_probe_log_err(ctx->offset, TYPECAST_NOT_ALIGNED);
925 			return -EINVAL;
926 		}
927 		if (field != NULL) {
928 			/* this means @field skips an arrow operator ("->"). */
929 			trace_probe_log_err(ctx->offset - 2, TYPECAST_BAD_ARROW);
930 			return -EINVAL;
931 		}
932 		ctx->prefix_byteoffs = ret / 8;
933 		/* Restore the original struct type (overwritten by get_bitoffset_of_field) */
934 		ctx->last_struct = type;
935 	}
936 
937 	return ret;
938 }
939 
940 /* Find the matching closing parenthesis for a given opening parenthesis. */
find_matched_close_paren(char * s)941 static char *find_matched_close_paren(char *s)
942 {
943 	char *p = s;
944 	int count = 0;
945 
946 	while (*p) {
947 		if (*p == '(')
948 			count++;
949 		else if (*p == ')') {
950 			if (--count == 0)
951 				return p;
952 		}
953 		p++;
954 	}
955 	return NULL;
956 }
957 
handle_typecast(char * arg,struct traceprobe_parse_context * ctx)958 static int handle_typecast(char *arg, struct traceprobe_parse_context *ctx)
959 {
960 	int orig_offset = ctx->offset;
961 	char *close;
962 	char *tmp;
963 	char *fieldname;
964 
965 	if (!(tparg_is_event_probe(ctx->flags) ||
966 	      tparg_is_function_entry(ctx->flags) ||
967 	      tparg_is_function_return(ctx->flags))) {
968 		trace_probe_log_err(ctx->offset, NOSUP_BTFARG);
969 		return -EOPNOTSUPP;
970 	}
971 
972 	/*
973 	 * Always consider the token after typecast as a nested call
974 	 * For example: (STRUCT)VAR->FIELD and (STRUCT)(VAR)->FIELD are same.
975 	 * VAR is solved in the nested call.
976 	 */
977 	tmp = strchr(arg, ')');
978 	if (!tmp) {
979 		trace_probe_log_err(ctx->offset + strlen(arg),
980 				    DEREF_OPEN_BRACE);
981 		return -EINVAL;
982 	}
983 	*tmp++ = '\0';
984 
985 	ctx->offset += tmp - arg;
986 	if (*tmp == '(') {
987 		close = find_matched_close_paren(tmp);
988 
989 		if (!close) {
990 			trace_probe_log_err(ctx->offset, DEREF_OPEN_BRACE);
991 			return -EINVAL;
992 		}
993 		/* We expect a field access for typecast */
994 		if (close[1] != '-' || close[2] != '>') {
995 			trace_probe_log_err(ctx->offset + close - tmp + 1,
996 					    TYPECAST_REQ_FIELD);
997 			return -EINVAL;
998 		}
999 		/* Skip '(' */
1000 		ctx->offset += 1;
1001 		tmp++;
1002 	} else if (*tmp == '+' || *tmp == '-' ||
1003 		   str_has_prefix(tmp, THIS_CPU_PTR_PREFIX) ||
1004 		   str_has_prefix(tmp, THIS_CPU_READ_PREFIX)) {
1005 		/* Dereference can have another field access inside it. */
1006 		char *open = strchr(tmp + 1, '(');
1007 
1008 		if (!open) {
1009 			trace_probe_log_err(ctx->offset,
1010 					    DEREF_NEED_BRACE);
1011 			return -EINVAL;
1012 		}
1013 		close = find_matched_close_paren(open);
1014 		if (!close) {
1015 			trace_probe_log_err(ctx->offset + strlen(tmp),
1016 					    DEREF_OPEN_BRACE);
1017 			return -EINVAL;
1018 		}
1019 		close++;
1020 		/* We expect a field access for typecast */
1021 		if (close[0] != '-' || close[1] != '>') {
1022 			trace_probe_log_err(ctx->offset + close - tmp,
1023 					    TYPECAST_REQ_FIELD);
1024 			return -EINVAL;
1025 		}
1026 	} else {
1027 		if (tmp[0] == '@') {
1028 			/* @sym+offset is not allowed without parenthesized */
1029 			close = strpbrk(tmp, "+-");
1030 			if (close && isdigit(close[1])) {
1031 				trace_probe_log_err(ctx->offset,
1032 						    TYPECAST_SYM_OFFSET);
1033 				return -EINVAL;
1034 			}
1035 		}
1036 		/* Inner variable name */
1037 		close = strchr(tmp, '-');
1038 		if (!close || close[1] != '>') {
1039 			trace_probe_log_err(ctx->offset + strlen(tmp),
1040 					    TYPECAST_REQ_FIELD);
1041 			return -EINVAL;
1042 		}
1043 	}
1044 	*close = '\0';
1045 
1046 	/* Let fieldname point the field name. */
1047 	if (close[1] == '-')
1048 		fieldname = close + 3; /* Skip "->" after closing parenthesis */
1049 	else
1050 		fieldname = close + 2; /* Skip ">" after inner variable name */
1051 
1052 	ctx->stack[ctx->depth].type = STATE_TYPECAST;
1053 	ctx->stack[ctx->depth].typecast.casttype = arg + 1;
1054 	ctx->stack[ctx->depth].typecast.fieldname = fieldname;
1055 	ctx->stack[ctx->depth].typecast.orig_offset = orig_offset;
1056 	ctx->stack[ctx->depth].typecast.field_offset_diff = fieldname - arg;
1057 	ctx->stack[ctx->depth].typecast.inner_arg = tmp;
1058 	return 0;
1059 }
1060 
1061 #else /* !CONFIG_PROBE_EVENTS_BTF_ARGS */
1062 
clear_struct_btf(struct traceprobe_parse_context * ctx)1063 static void clear_struct_btf(struct traceprobe_parse_context *ctx)
1064 {
1065 	ctx->struct_btf = NULL;
1066 }
1067 
clear_btf_context(struct traceprobe_parse_context * ctx)1068 static void clear_btf_context(struct traceprobe_parse_context *ctx)
1069 {
1070 	ctx->btf = NULL;
1071 }
1072 
query_btf_context(struct traceprobe_parse_context * ctx)1073 static int query_btf_context(struct traceprobe_parse_context *ctx)
1074 {
1075 	return -EOPNOTSUPP;
1076 }
1077 
parse_btf_arg(char * varname,struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)1078 static int parse_btf_arg(char *varname,
1079 			 struct fetch_insn **pcode, struct fetch_insn *end,
1080 			 struct traceprobe_parse_context *ctx)
1081 {
1082 	trace_probe_log_err(ctx->offset, NOSUP_BTFARG);
1083 	return -EOPNOTSUPP;
1084 }
1085 
parse_btf_bitfield(struct fetch_insn ** pcode,struct traceprobe_parse_context * ctx)1086 static int parse_btf_bitfield(struct fetch_insn **pcode,
1087 			      struct traceprobe_parse_context *ctx)
1088 {
1089 	trace_probe_log_err(ctx->offset, NOSUP_BTFARG);
1090 	return -EOPNOTSUPP;
1091 }
1092 
1093 #define find_fetch_type_from_btf_type(ctx)		\
1094 	find_fetch_type(NULL, ctx->flags)
1095 
check_prepare_btf_string_fetch(char * typename,struct fetch_insn ** pcode,struct traceprobe_parse_context * ctx)1096 static int check_prepare_btf_string_fetch(char *typename,
1097 				struct fetch_insn **pcode,
1098 				struct traceprobe_parse_context *ctx)
1099 {
1100 	return 0;
1101 }
1102 
parse_btf_casttype(char * casttype,struct traceprobe_parse_context * ctx)1103 static int parse_btf_casttype(char *casttype,
1104 			      struct traceprobe_parse_context *ctx)
1105 {
1106 	return -EOPNOTSUPP;
1107 }
1108 
parse_btf_field(char * fieldname,const struct btf_type * type,struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)1109 static int parse_btf_field(char *fieldname, const struct btf_type *type,
1110 			   struct fetch_insn **pcode, struct fetch_insn *end,
1111 			   struct traceprobe_parse_context *ctx)
1112 {
1113 	return -EOPNOTSUPP;
1114 }
1115 
handle_typecast(char * arg,struct traceprobe_parse_context * ctx)1116 static int handle_typecast(char *arg, struct traceprobe_parse_context *ctx)
1117 {
1118 	trace_probe_log_err(ctx->offset, NOSUP_BTFARG);
1119 	return -EOPNOTSUPP;
1120 }
1121 
1122 #endif /* CONFIG_PROBE_EVENTS_BTF_ARGS */
1123 
1124 #ifdef CONFIG_HAVE_FUNCTION_ARG_ACCESS_API
1125 
store_entry_arg_at(struct fetch_insn * code,int argnum,int offset)1126 static void store_entry_arg_at(struct fetch_insn *code, int argnum, int offset)
1127 {
1128 	code[0].op = FETCH_OP_ARG;
1129 	code[0].param = argnum;
1130 	code[1].op = FETCH_OP_ST_EDATA;
1131 	code[1].offset = offset;
1132 }
1133 
get_entry_arg_max_offset(struct probe_entry_arg * earg)1134 static int get_entry_arg_max_offset(struct probe_entry_arg *earg)
1135 {
1136 	int i, max_offset = 0;
1137 
1138 	/*
1139 	 * earg->code[] array has an operation sequence which is run in
1140 	 * the entry handler.
1141 	 * The sequence stopped by FETCH_OP_END and each data stored in
1142 	 * the entry data buffer by FETCH_OP_ST_EDATA. The FETCH_OP_ST_EDATA
1143 	 * stores the data at the data buffer + its offset, and all data are
1144 	 * "unsigned long" size. The offset must be increased when a data is
1145 	 * stored. Thus we need to find the last FETCH_OP_ST_EDATA in the
1146 	 * code array.
1147 	 */
1148 	for (i = 0; i < earg->size - 1 && earg->code[i].op != FETCH_OP_END; i++) {
1149 		if (earg->code[i].op == FETCH_OP_ST_EDATA)
1150 			if (earg->code[i].offset > max_offset)
1151 				max_offset = earg->code[i].offset;
1152 	}
1153 	return max_offset;
1154 }
1155 
1156 /*
1157  * Add the entry code to store the 'argnum'th parameter and return the offset
1158  * in the entry data buffer where the data will be stored.
1159  */
__store_entry_arg(struct trace_probe * tp,int argnum)1160 static int __store_entry_arg(struct trace_probe *tp, int argnum)
1161 {
1162 	struct probe_entry_arg *earg = tp->entry_arg;
1163 	int i, offset, last_offset = 0;
1164 
1165 	if (!earg) {
1166 		earg = kzalloc_flex(*earg, code, 2 * tp->nr_args + 1);
1167 		if (!earg)
1168 			return -ENOMEM;
1169 		earg->size = 2 * tp->nr_args + 1;
1170 		/* Fill the code buffer with 'end' to simplify it */
1171 		for (i = 0; i < earg->size; i++)
1172 			earg->code[i].op = FETCH_OP_END;
1173 		tp->entry_arg = earg;
1174 		store_entry_arg_at(earg->code, argnum, 0);
1175 		return 0;
1176 	}
1177 
1178 	/*
1179 	 * NOTE: if anyone change the following rule, please rewrite this.
1180 	 * The entry code array is filled with the pair of
1181 	 *
1182 	 * [FETCH_OP_ARG(argnum)]
1183 	 * [FETCH_OP_ST_EDATA(offset of entry data buffer)]
1184 	 *
1185 	 * and the rest of entries are filled with [FETCH_OP_END].
1186 	 * The offset should be incremented, thus the last pair should
1187 	 * have the largest offset.
1188 	 */
1189 
1190 	/* Search the offset for the sprcified argnum. */
1191 	for (i = 0; i < earg->size - 1 && earg->code[i].op != FETCH_OP_END; i += 2) {
1192 		if (WARN_ON_ONCE(earg->code[i].op != FETCH_OP_ARG))
1193 			return -EINVAL;
1194 
1195 		if (earg->code[i].param != argnum)
1196 			continue;
1197 
1198 		if (WARN_ON_ONCE(earg->code[i + 1].op != FETCH_OP_ST_EDATA))
1199 			return -EINVAL;
1200 
1201 		return earg->code[i + 1].offset;
1202 	}
1203 	/* Not found, append new entry if possible. */
1204 	if (i >= earg->size - 1)
1205 		return -ENOSPC;
1206 
1207 	/* The last entry must have the largest offset. */
1208 	if (i != 0) {
1209 		if (WARN_ON_ONCE(earg->code[i - 1].op != FETCH_OP_ST_EDATA))
1210 			return -EINVAL;
1211 		last_offset = earg->code[i - 1].offset;
1212 	}
1213 
1214 	offset = last_offset + sizeof(unsigned long);
1215 	store_entry_arg_at(&earg->code[i], argnum, offset);
1216 	return offset;
1217 }
1218 
traceprobe_get_entry_data_size(struct trace_probe * tp)1219 int traceprobe_get_entry_data_size(struct trace_probe *tp)
1220 {
1221 	struct probe_entry_arg *earg = tp->entry_arg;
1222 
1223 	if (!earg)
1224 		return 0;
1225 
1226 	return get_entry_arg_max_offset(earg) + sizeof(unsigned long);
1227 }
1228 
store_trace_entry_data(void * edata,struct trace_probe * tp,struct pt_regs * regs)1229 void store_trace_entry_data(void *edata, struct trace_probe *tp, struct pt_regs *regs)
1230 {
1231 	struct probe_entry_arg *earg = tp->entry_arg;
1232 	unsigned long val = 0;
1233 	int i;
1234 
1235 	if (!earg)
1236 		return;
1237 
1238 	for (i = 0; i < earg->size; i++) {
1239 		struct fetch_insn *code = &earg->code[i];
1240 
1241 		switch (code->op) {
1242 		case FETCH_OP_ARG:
1243 			val = regs_get_kernel_argument(regs, code->param);
1244 			break;
1245 		case FETCH_OP_ST_EDATA:
1246 			*(unsigned long *)((u8 *)edata + code->offset) = val;
1247 			break;
1248 		case FETCH_OP_END:
1249 			goto end;
1250 		default:
1251 			break;
1252 		}
1253 	}
1254 end:
1255 	return;
1256 }
NOKPROBE_SYMBOL(store_trace_entry_data)1257 NOKPROBE_SYMBOL(store_trace_entry_data)
1258 #endif
1259 
1260 #define PARAM_MAX_STACK (THREAD_SIZE / sizeof(unsigned long))
1261 
1262 static int parse_probe_var_retval(char *orig_arg,
1263 				  struct fetch_insn **pcode,
1264 				  struct fetch_insn *end,
1265 				  struct traceprobe_parse_context *ctx)
1266 {
1267 	struct fetch_insn *code = *pcode;
1268 
1269 	if (!(ctx->flags & TPARG_FL_RETURN)) {
1270 		trace_probe_log_err(ctx->offset, RETVAL_ON_PROBE);
1271 		return -EINVAL;
1272 	}
1273 	if (!(ctx->flags & TPARG_FL_KERNEL) ||
1274 	    !IS_ENABLED(CONFIG_PROBE_EVENTS_BTF_ARGS)) {
1275 		code->op = FETCH_OP_RETVAL;
1276 		return 0;
1277 	}
1278 	return parse_btf_arg(orig_arg, pcode, end, ctx);
1279 }
1280 
parse_probe_var_stack(char * arg,int len,struct fetch_insn * code,struct traceprobe_parse_context * ctx)1281 static int parse_probe_var_stack(char *arg, int len, struct fetch_insn *code,
1282 				 struct traceprobe_parse_context *ctx)
1283 {
1284 	unsigned long param;
1285 	int ret;
1286 
1287 	if (arg[len] == '\0') {
1288 		code->op = FETCH_OP_STACKP;
1289 		return 0;
1290 	}
1291 
1292 	if (isdigit(arg[len])) {
1293 		ret = kstrtoul(arg + len, 10, &param);
1294 		if (ret) {
1295 			trace_probe_log_err(ctx->offset, BAD_VAR);
1296 			return ret;
1297 		}
1298 
1299 		if ((ctx->flags & TPARG_FL_KERNEL) &&
1300 		    param > PARAM_MAX_STACK) {
1301 			trace_probe_log_err(ctx->offset, BAD_STACK_NUM);
1302 			return -EINVAL;
1303 		}
1304 		code->op = FETCH_OP_STACK;
1305 		code->param = (unsigned int)param;
1306 		return 0;
1307 	}
1308 
1309 	trace_probe_log_err(ctx->offset, BAD_VAR);
1310 	return -EINVAL;
1311 }
1312 
parse_probe_var_current(char * orig_arg,char * arg,struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)1313 static int parse_probe_var_current(char *orig_arg, char *arg,
1314 				   struct fetch_insn **pcode,
1315 				   struct fetch_insn *end,
1316 				   struct traceprobe_parse_context *ctx)
1317 {
1318 	struct fetch_insn *code = *pcode;
1319 
1320 	/* $current is only supported by kernel probe. */
1321 	if (!(ctx->flags & TPARG_FL_KERNEL)) {
1322 		trace_probe_log_err(ctx->offset, BAD_VAR);
1323 		return -EINVAL;
1324 	}
1325 	arg += strlen("current");
1326 	if (*arg == '-' && IS_ENABLED(CONFIG_PROBE_EVENTS_BTF_ARGS))
1327 		return parse_btf_arg(orig_arg, pcode, end, ctx);
1328 
1329 	if (*arg != '\0') {
1330 		trace_probe_log_err(ctx->offset, BAD_VAR);
1331 		return -EINVAL;
1332 	}
1333 
1334 	code->op = FETCH_OP_CURRENT;
1335 	return 0;
1336 }
1337 
1338 #ifdef CONFIG_HAVE_FUNCTION_ARG_ACCESS_API
parse_probe_var_arg(char * arg,int len,struct fetch_insn * code,struct traceprobe_parse_context * ctx)1339 static int parse_probe_var_arg(char *arg, int len, struct fetch_insn *code,
1340 			       struct traceprobe_parse_context *ctx)
1341 {
1342 	unsigned long param;
1343 	int ret;
1344 
1345 	ret = kstrtoul(arg + len, 10, &param);
1346 	if (ret) {
1347 		trace_probe_log_err(ctx->offset, BAD_VAR);
1348 		return ret;
1349 	}
1350 
1351 	if (!param || param > PARAM_MAX_STACK) {
1352 		trace_probe_log_err(ctx->offset, BAD_ARG_NUM);
1353 		return -EINVAL;
1354 	}
1355 	param--; /* argN starts from 1, but internal arg[N] starts from 0 */
1356 
1357 	if (tparg_is_function_entry(ctx->flags)) {
1358 		code->op = FETCH_OP_ARG;
1359 		code->param = (unsigned int)param;
1360 		/*
1361 		 * The tracepoint probe will probe a stub function, and the
1362 		 * first parameter of the stub is a dummy and should be ignored.
1363 		 */
1364 		if (ctx->flags & TPARG_FL_TPOINT)
1365 			code->param++;
1366 	} else if (tparg_is_function_return(ctx->flags)) {
1367 		/* function entry argument access from return probe */
1368 		ret = __store_entry_arg(ctx->tp, param);
1369 		if (ret < 0)	/* This error should be an internal error */
1370 			return ret;
1371 
1372 		code->op = FETCH_OP_EDATA;
1373 		code->offset = ret;
1374 	} else {
1375 		trace_probe_log_err(ctx->offset, NOFENTRY_ARGS);
1376 		return -EINVAL;
1377 	}
1378 	return 0;
1379 }
1380 #else
parse_probe_var_arg(char * arg,int len,struct fetch_insn * code,struct traceprobe_parse_context * ctx)1381 static int parse_probe_var_arg(char *arg, int len, struct fetch_insn *code,
1382 			       struct traceprobe_parse_context *ctx)
1383 {
1384 	trace_probe_log_err(ctx->offset, BAD_VAR);
1385 	return -EINVAL;
1386 }
1387 #endif
1388 
1389 /* Parse $vars. @orig_arg points '$', which syncs to @ctx->offset */
parse_probe_vars(char * orig_arg,const struct fetch_type * t,struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)1390 static int parse_probe_vars(char *orig_arg, const struct fetch_type *t,
1391 			    struct fetch_insn **pcode,
1392 			    struct fetch_insn *end,
1393 			    struct traceprobe_parse_context *ctx)
1394 {
1395 	struct fetch_insn *code = *pcode;
1396 	char *arg = orig_arg + 1;
1397 	int len, ret;
1398 
1399 	if (ctx->flags & TPARG_FL_TEVENT) {
1400 		ret = parse_trace_event(arg, code, ctx);
1401 		if (!ret)
1402 			return 0;
1403 	}
1404 
1405 	if (strcmp(arg, "comm") == 0 || strcmp(arg, "COMM") == 0) {
1406 		code->op = FETCH_OP_COMM;
1407 		return 0;
1408 	}
1409 
1410 	/* eprobe only support event fields or '$comm'. */
1411 	if (ctx->flags & TPARG_FL_TEVENT)
1412 		goto inval;
1413 
1414 	if (str_has_prefix(arg, "retval"))
1415 		return parse_probe_var_retval(orig_arg, pcode, end, ctx);
1416 
1417 	len = str_has_prefix(arg, "stack");
1418 	if (len)
1419 		return parse_probe_var_stack(arg, len, code, ctx);
1420 
1421 	/* $current returns the address of the current task_struct. */
1422 	if (str_has_prefix(arg, "current"))
1423 		return parse_probe_var_current(orig_arg, arg, pcode, end, ctx);
1424 
1425 	len = str_has_prefix(arg, "arg");
1426 	if (len)
1427 		return parse_probe_var_arg(arg, len, code, ctx);
1428 
1429 inval:
1430 	trace_probe_log_err(ctx->offset, BAD_VAR);
1431 	return -EINVAL;
1432 }
1433 
str_to_immediate(char * str,unsigned long * imm)1434 static int str_to_immediate(char *str, unsigned long *imm)
1435 {
1436 	if (isdigit(str[0]))
1437 		return kstrtoul(str, 0, imm);
1438 	else if (str[0] == '-')
1439 		return kstrtol(str, 0, (long *)imm);
1440 	else if (str[0] == '+')
1441 		return kstrtol(str + 1, 0, (long *)imm);
1442 	return -EINVAL;
1443 }
1444 
__parse_imm_string(char * str,char ** pbuf,int offs)1445 static int __parse_imm_string(char *str, char **pbuf, int offs)
1446 {
1447 	size_t len = strlen(str);
1448 
1449 	if (!len || str[len - 1] != '"') {
1450 		trace_probe_log_err(offs + len, IMMSTR_NO_CLOSE);
1451 		return -EINVAL;
1452 	}
1453 	*pbuf = kstrndup(str, len - 1, GFP_KERNEL);
1454 	if (!*pbuf)
1455 		return -ENOMEM;
1456 	return 0;
1457 }
1458 
parse_probe_arg_register(char * arg,struct fetch_insn * code,struct traceprobe_parse_context * ctx)1459 static int parse_probe_arg_register(char *arg, struct fetch_insn *code,
1460 				    struct traceprobe_parse_context *ctx)
1461 {
1462 	int ret;
1463 
1464 	if (ctx->flags & (TPARG_FL_TEVENT | TPARG_FL_FPROBE)) {
1465 		/* eprobe and fprobe do not handle registers */
1466 		trace_probe_log_err(ctx->offset, BAD_VAR);
1467 		return -EINVAL;
1468 	}
1469 	ret = regs_query_register_offset(arg + 1);
1470 	if (ret >= 0) {
1471 		code->op = FETCH_OP_REG;
1472 		code->param = (unsigned int)ret;
1473 		return 0;
1474 	}
1475 	trace_probe_log_err(ctx->offset, BAD_REG_NAME);
1476 	return -EINVAL;
1477 }
1478 
parse_probe_arg_mem_symbol(char * arg,struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)1479 static int parse_probe_arg_mem_symbol(char *arg, struct fetch_insn **pcode,
1480 				      struct fetch_insn *end,
1481 				      struct traceprobe_parse_context *ctx)
1482 {
1483 	struct fetch_insn *code = *pcode;
1484 	unsigned long param;
1485 	long offset = 0;
1486 	int ret;
1487 
1488 	if (isdigit(arg[1])) {
1489 		ret = kstrtoul(arg + 1, 0, &param);
1490 		if (ret) {
1491 			trace_probe_log_err(ctx->offset, BAD_MEM_ADDR);
1492 			return ret;
1493 		}
1494 		/* load address */
1495 		code->op = FETCH_OP_IMM;
1496 		code->immediate = param;
1497 	} else if (arg[1] == '+') {
1498 		/* Kernel probes do not support file offsets */
1499 		if (ctx->flags & TPARG_FL_KERNEL) {
1500 			trace_probe_log_err(ctx->offset, FILE_ON_KPROBE);
1501 			return -EINVAL;
1502 		}
1503 		ret = kstrtol(arg + 2, 0, &offset);
1504 		if (ret) {
1505 			trace_probe_log_err(ctx->offset, BAD_FILE_OFFS);
1506 			return ret;
1507 		}
1508 
1509 		code->op = FETCH_OP_FOFFS;
1510 		code->immediate = (unsigned long)offset;
1511 		offset = 0;
1512 	} else {
1513 		/* uprobes don't support symbols */
1514 		if (!(ctx->flags & TPARG_FL_KERNEL)) {
1515 			trace_probe_log_err(ctx->offset, SYM_ON_UPROBE);
1516 			return -EINVAL;
1517 		}
1518 		/* Preserve symbol for updating */
1519 		code->op = FETCH_NOP_SYMBOL;
1520 		code->data = kstrdup(arg + 1, GFP_KERNEL);
1521 		if (!code->data)
1522 			return -ENOMEM;
1523 		if (++code == end) {
1524 			trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1525 			return -EINVAL;
1526 		}
1527 		code->op = FETCH_OP_IMM;
1528 		code->immediate = 0;
1529 	}
1530 	/* These are fetching from memory */
1531 	if (++code == end) {
1532 		trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1533 		return -EINVAL;
1534 	}
1535 	*pcode = code;
1536 	code->op = FETCH_OP_DEREF;
1537 	code->offset = offset;
1538 	return 0;
1539 }
1540 
parse_probe_arg_deref(char * arg,struct traceprobe_parse_context * ctx)1541 static int parse_probe_arg_deref(char *arg, struct traceprobe_parse_context *ctx)
1542 {
1543 	int deref = FETCH_OP_DEREF;
1544 	long offset = 0;
1545 	char *tmp;
1546 	int ret;
1547 
1548 	if (arg[1] == 'u') {
1549 		deref = FETCH_OP_UDEREF;
1550 		arg[1] = arg[0];
1551 		arg++;
1552 	}
1553 	if (arg[0] == '+')
1554 		arg++;	/* Skip '+', because kstrtol() rejects it. */
1555 	tmp = strchr(arg, '(');
1556 	if (!tmp) {
1557 		trace_probe_log_err(ctx->offset, DEREF_NEED_BRACE);
1558 		return -EINVAL;
1559 	}
1560 	*tmp = '\0';
1561 	ret = kstrtol(arg, 0, &offset);
1562 	if (ret) {
1563 		trace_probe_log_err(ctx->offset, BAD_DEREF_OFFS);
1564 		return ret;
1565 	}
1566 	ctx->offset += (tmp + 1 - arg) + (arg[0] != '-' ? 1 : 0);
1567 	arg = tmp + 1;
1568 
1569 	tmp = strrchr(arg, ')');
1570 	if (!tmp) {
1571 		trace_probe_log_err(ctx->offset + strlen(arg),
1572 					DEREF_OPEN_BRACE);
1573 		return -EINVAL;
1574 	}
1575 	*tmp = '\0';
1576 
1577 	ctx->stack[ctx->depth].type = STATE_DEREF;
1578 	ctx->stack[ctx->depth].deref.deref = deref;
1579 	ctx->stack[ctx->depth].deref.offset = offset;
1580 	ctx->stack[ctx->depth].deref.cur_offs = ctx->offset;
1581 	ctx->stack[ctx->depth].deref.inner_arg = arg;
1582 	ctx->stack[ctx->depth].deref.is_cpu_read = false;
1583 	return 0;
1584 }
1585 
parse_probe_arg_imm(char * arg,struct fetch_insn * code,struct traceprobe_parse_context * ctx)1586 static int parse_probe_arg_imm(char *arg, struct fetch_insn *code,
1587 			       struct traceprobe_parse_context *ctx)
1588 {
1589 	char *tmp;
1590 	int ret;
1591 
1592 	if (arg[1] == '"') {	/* Immediate string */
1593 		ret = __parse_imm_string(arg + 2, &tmp, ctx->offset + 2);
1594 		if (ret)
1595 			return ret;
1596 		code->op = FETCH_OP_IMMSTR;
1597 		code->data = tmp;
1598 	} else {
1599 		ret = str_to_immediate(arg + 1, &code->immediate);
1600 		if (ret) {
1601 			trace_probe_log_err(ctx->offset + 1, BAD_IMM);
1602 			return ret;
1603 		}
1604 		code->op = FETCH_OP_IMM;
1605 	}
1606 	return 0;
1607 }
1608 
parse_probe_arg_default(char * arg,struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)1609 static int parse_probe_arg_default(char *arg, struct fetch_insn **pcode,
1610 				   struct fetch_insn *end,
1611 				   struct traceprobe_parse_context *ctx)
1612 {
1613 	int ret;
1614 
1615 	if (isalpha(arg[0]) || arg[0] == '_') {
1616 		/* BTF variable or event field */
1617 		if (ctx->flags & TPARG_FL_TEVENT) {
1618 			ret = parse_trace_event(arg, *pcode, ctx);
1619 			if (ret < 0) {
1620 				trace_probe_log_err(ctx->offset, NO_EVENT_FIELD);
1621 				return -EINVAL;
1622 			}
1623 			return 0;
1624 		}
1625 		if (!tparg_is_function_entry(ctx->flags) &&
1626 		    !tparg_is_function_return(ctx->flags)) {
1627 			trace_probe_log_err(ctx->offset, NOSUP_BTFARG);
1628 			return -EINVAL;
1629 		}
1630 		return parse_btf_arg(arg, pcode, end, ctx);
1631 	}
1632 
1633 	return 0;
1634 }
1635 
parse_probe_arg_nested(char ** parg,struct traceprobe_parse_context * ctx)1636 static int parse_probe_arg_nested(char **parg, struct traceprobe_parse_context *ctx)
1637 {
1638 	char *arg = *parg;
1639 	int ret;
1640 
1641 	while (true) {
1642 		/* Determine if this is a nested argument */
1643 		if (arg[0] != '+' && arg[0] != '-' && arg[0] != '(' &&
1644 		    !str_has_prefix(arg, THIS_CPU_PTR_PREFIX) &&
1645 		    !str_has_prefix(arg, THIS_CPU_READ_PREFIX))
1646 			break;
1647 
1648 		/* If nested, check the maximum depth limit */
1649 		if (ctx->depth >= TRACEPROBE_MAX_NESTED_LEVEL) {
1650 			trace_probe_log_err(ctx->offset, TOO_MANY_NESTED);
1651 			return -E2BIG;
1652 		}
1653 
1654 		/* Perform the actual parsing subroutine calls */
1655 		switch (arg[0]) {
1656 		case '+':
1657 		case '-':
1658 			ret = parse_probe_arg_deref(arg, ctx);
1659 			if (ret)
1660 				return ret;
1661 			arg = ctx->stack[ctx->depth].deref.inner_arg;
1662 			break;
1663 		case '(':
1664 			ret = handle_typecast(arg, ctx);
1665 			if (ret)
1666 				return ret;
1667 			arg = ctx->stack[ctx->depth].typecast.inner_arg;
1668 			break;
1669 		default:
1670 			ret = parse_this_cpu(arg, ctx);
1671 			if (ret)
1672 				return ret;
1673 			arg = ctx->stack[ctx->depth].deref.inner_arg;
1674 			break;
1675 		}
1676 		ctx->depth++;
1677 	}
1678 
1679 	*parg = arg;
1680 	return 0;
1681 }
1682 
parse_probe_arg_leaf(char * arg,const struct fetch_type * type,struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)1683 static int parse_probe_arg_leaf(char *arg, const struct fetch_type *type,
1684 				struct fetch_insn **pcode, struct fetch_insn *end,
1685 				struct traceprobe_parse_context *ctx)
1686 {
1687 	struct fetch_insn *code = *pcode;
1688 	int ret;
1689 
1690 	switch (arg[0]) {
1691 	case '$':
1692 		ret = parse_probe_vars(arg, type, pcode, end, ctx);
1693 		break;
1694 	case '%':	/* named register */
1695 		ret = parse_probe_arg_register(arg, code, ctx);
1696 		break;
1697 	case '@':	/* memory, file-offset or symbol */
1698 		ret = parse_probe_arg_mem_symbol(arg, pcode, end, ctx);
1699 		break;
1700 	case '\\':	/* Immediate value */
1701 		ret = parse_probe_arg_imm(arg, code, ctx);
1702 		break;
1703 	default:
1704 		ret = parse_probe_arg_default(arg, pcode, end, ctx);
1705 		break;
1706 	}
1707 
1708 	if (ret)
1709 		return ret;
1710 
1711 	if (code->op == FETCH_OP_NOP) {
1712 		/* Parsed, but do not find fetch method */
1713 		trace_probe_log_err(ctx->offset, BAD_FETCH_ARG);
1714 		return -EINVAL;
1715 	}
1716 
1717 	return 0;
1718 }
1719 
unwind_parse_states(struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)1720 static int unwind_parse_states(struct fetch_insn **pcode, struct fetch_insn *end,
1721 			       struct traceprobe_parse_context *ctx)
1722 {
1723 	struct parse_state *state;
1724 	struct fetch_insn *code;
1725 	int ret;
1726 
1727 	while (ctx->depth > 0) {
1728 		ctx->depth--;
1729 		state = &ctx->stack[ctx->depth];
1730 
1731 		if (state->type == STATE_DEREF) {
1732 			code = *pcode;
1733 			ctx->offset = state->deref.cur_offs;
1734 			if (code->op == FETCH_OP_COMM || code->op == FETCH_OP_IMMSTR) {
1735 				trace_probe_log_err(ctx->offset, COMM_CANT_DEREF);
1736 				return -EINVAL;
1737 			}
1738 
1739 			if (!(state->deref.deref == FETCH_OP_CPU_PTR &&
1740 			      *state->deref.inner_arg == '@')) {
1741 				code++;
1742 				if (code == end) {
1743 					trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1744 					return -EINVAL;
1745 				}
1746 			}
1747 			*pcode = code;
1748 
1749 			code->op = state->deref.deref;
1750 			code->offset = state->deref.offset;
1751 			ctx->last_type = NULL;
1752 
1753 			if (state->deref.is_cpu_read) {
1754 				code = *pcode;
1755 				code++;
1756 				if (code == end) {
1757 					trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1758 					return -EINVAL;
1759 				}
1760 				code->op = FETCH_OP_DEREF;
1761 				code->offset = 0;
1762 				*pcode = code;
1763 			}
1764 		} else if (state->type == STATE_TYPECAST) {
1765 			clear_struct_btf(ctx);
1766 
1767 			/* resolve the typecast struct name */
1768 			ctx->offset = state->typecast.orig_offset + 1; /* for the '(' */
1769 			ret = parse_btf_casttype(state->typecast.casttype, ctx);
1770 			if (ret < 0)
1771 				return ret;
1772 
1773 			ctx->offset = state->typecast.orig_offset +
1774 				      state->typecast.field_offset_diff;
1775 			ret = parse_btf_field(state->typecast.fieldname,
1776 					      ctx->last_struct, pcode,
1777 					      end, ctx);
1778 			ctx->prefix_byteoffs = 0;
1779 			if (ret < 0)
1780 				return ret;
1781 		}
1782 	}
1783 
1784 	return 0;
1785 }
1786 
1787 /* Loop-based (non-recursive) argument parser */
1788 static int
parse_probe_arg(char * arg,const struct fetch_type * type,struct fetch_insn ** pcode,struct fetch_insn * end,struct traceprobe_parse_context * ctx)1789 parse_probe_arg(char *arg, const struct fetch_type *type,
1790 		struct fetch_insn **pcode, struct fetch_insn *end,
1791 		struct traceprobe_parse_context *ctx)
1792 {
1793 	int ret;
1794 
1795 	ctx->depth = 0;
1796 
1797 	ret = parse_probe_arg_nested(&arg, ctx);
1798 	if (ret)
1799 		return ret;
1800 
1801 	ret = parse_probe_arg_leaf(arg, type, pcode, end, ctx);
1802 	if (ret)
1803 		return ret;
1804 
1805 	return unwind_parse_states(pcode, end, ctx);
1806 }
1807 
1808 /* Bitfield type needs to be parsed into a fetch function */
__parse_bitfield_probe_arg(const char * bf,const struct fetch_type * t,struct fetch_insn ** pcode)1809 static int __parse_bitfield_probe_arg(const char *bf,
1810 				      const struct fetch_type *t,
1811 				      struct fetch_insn **pcode)
1812 {
1813 	struct fetch_insn *code = *pcode;
1814 	unsigned long bw, bo;
1815 	char *tail;
1816 
1817 	if (*bf != 'b')
1818 		return 0;
1819 
1820 	bw = simple_strtoul(bf + 1, &tail, 0);	/* Use simple one */
1821 
1822 	if (bw == 0 || *tail != '@')
1823 		return -EINVAL;
1824 
1825 	bf = tail + 1;
1826 	bo = simple_strtoul(bf, &tail, 0);
1827 
1828 	if (tail == bf || *tail != '/')
1829 		return -EINVAL;
1830 	code++;
1831 	if (code->op != FETCH_OP_NOP)
1832 		return -EINVAL;
1833 	*pcode = code;
1834 
1835 	code->op = FETCH_OP_MOD_BF;
1836 	code->lshift = BYTES_TO_BITS(t->size) - (bw + bo);
1837 	code->rshift = BYTES_TO_BITS(t->size) - bw;
1838 	code->basesize = t->size;
1839 
1840 	return (BYTES_TO_BITS(t->size) < (bw + bo)) ? -EINVAL : 0;
1841 }
1842 
1843 /* Split type part from @arg and return it. */
parse_probe_arg_type(char * arg,struct probe_arg * parg,struct traceprobe_parse_context * ctx)1844 static char *parse_probe_arg_type(char *arg, struct probe_arg *parg,
1845 				  struct traceprobe_parse_context *ctx)
1846 {
1847 	char *t = NULL, *t2, *t3;
1848 	int offs;
1849 
1850 	t = strchr(arg, ':');
1851 	if (t) {
1852 		*t++ = '\0';
1853 		t2 = strchr(t, '[');
1854 		if (t2) {
1855 			*t2++ = '\0';
1856 			t3 = strchr(t2, ']');
1857 			if (!t3) {
1858 				offs = t2 + strlen(t2) - arg;
1859 
1860 				trace_probe_log_err(ctx->offset + offs,
1861 						    ARRAY_NO_CLOSE);
1862 				return ERR_PTR(-EINVAL);
1863 			} else if (t3[1] != '\0') {
1864 				trace_probe_log_err(ctx->offset + t3 + 1 - arg,
1865 						    BAD_ARRAY_SUFFIX);
1866 				return ERR_PTR(-EINVAL);
1867 			}
1868 			*t3 = '\0';
1869 			if (kstrtouint(t2, 0, &parg->count) || !parg->count) {
1870 				trace_probe_log_err(ctx->offset + t2 - arg,
1871 						    BAD_ARRAY_NUM);
1872 				return ERR_PTR(-EINVAL);
1873 			}
1874 			if (parg->count > MAX_ARRAY_LEN) {
1875 				trace_probe_log_err(ctx->offset + t2 - arg,
1876 						    ARRAY_TOO_BIG);
1877 				return ERR_PTR(-EINVAL);
1878 			}
1879 		}
1880 	}
1881 	offs = t ? t - arg : 0;
1882 
1883 	/*
1884 	 * Since $comm and immediate string can not be dereferenced,
1885 	 * we can find those by strcmp. But ignore for eprobes.
1886 	 */
1887 	if (!(ctx->flags & TPARG_FL_TEVENT) &&
1888 	    (strcmp(arg, "$comm") == 0 || strcmp(arg, "$COMM") == 0 ||
1889 	     strncmp(arg, "\\\"", 2) == 0)) {
1890 		/* The type of $comm must be "string", and not an array type. */
1891 		if (parg->count || (t && strcmp(t, "string"))) {
1892 			trace_probe_log_err(ctx->offset + offs, NEED_STRING_TYPE);
1893 			return ERR_PTR(-EINVAL);
1894 		}
1895 		parg->type = find_fetch_type("string", ctx->flags);
1896 	} else
1897 		parg->type = find_fetch_type(t, ctx->flags);
1898 
1899 	if (!parg->type) {
1900 		trace_probe_log_err(ctx->offset + offs, BAD_TYPE);
1901 		return ERR_PTR(-EINVAL);
1902 	}
1903 
1904 	return t;
1905 }
1906 
1907 /* After parsing, adjust the fetch_insn according to the probe_arg */
finalize_fetch_insn(struct fetch_insn * code,struct probe_arg * parg,char * type,int type_offset,struct traceprobe_parse_context * ctx)1908 static int finalize_fetch_insn(struct fetch_insn *code,
1909 			       struct probe_arg *parg,
1910 			       char *type,
1911 			       int type_offset,
1912 			       struct traceprobe_parse_context *ctx)
1913 {
1914 	struct fetch_insn *scode;
1915 	int ret;
1916 
1917 	/* Store operation */
1918 	if (parg->type->is_string) {
1919 		/* Check bad combination of the type and the last fetch_insn. */
1920 		if (!strcmp(parg->type->name, "symstr")) {
1921 			if (code->op != FETCH_OP_REG && code->op != FETCH_OP_STACK &&
1922 			    code->op != FETCH_OP_RETVAL && code->op != FETCH_OP_ARG &&
1923 			    code->op != FETCH_OP_DEREF && code->op != FETCH_OP_TP_ARG) {
1924 				trace_probe_log_err(ctx->offset + type_offset,
1925 						    BAD_SYMSTRING);
1926 				return -EINVAL;
1927 			}
1928 		} else {
1929 			if (code->op != FETCH_OP_DEREF && code->op != FETCH_OP_UDEREF &&
1930 			    code->op != FETCH_OP_IMM && code->op != FETCH_OP_COMM &&
1931 			    code->op != FETCH_OP_IMMSTR && code->op != FETCH_OP_TP_ARG) {
1932 				trace_probe_log_err(ctx->offset + type_offset,
1933 						    BAD_STRING);
1934 				return -EINVAL;
1935 			}
1936 		}
1937 
1938 		if (!strcmp(parg->type->name, "symstr") ||
1939 		    (code->op == FETCH_OP_IMM || code->op == FETCH_OP_COMM ||
1940 		     code->op == FETCH_OP_IMMSTR) || code->op == FETCH_OP_TP_ARG ||
1941 		     parg->count) {
1942 			/*
1943 			 * IMM, DATA and COMM is pointing actual address, those
1944 			 * must be kept, and if parg->count != 0, this is an
1945 			 * array of string pointers instead of string address
1946 			 * itself.
1947 			 * For the symstr, it doesn't need to dereference, thus
1948 			 * it just get the value.
1949 			 */
1950 			code++;
1951 			if (code->op != FETCH_OP_NOP) {
1952 				trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1953 				return -EINVAL;
1954 			}
1955 		}
1956 
1957 		/* If op == DEREF, replace it with STRING */
1958 		if (!strcmp(parg->type->name, "ustring") ||
1959 		    code->op == FETCH_OP_UDEREF)
1960 			code->op = FETCH_OP_ST_USTRING;
1961 		else if (!strcmp(parg->type->name, "symstr"))
1962 			code->op = FETCH_OP_ST_SYMSTR;
1963 		else
1964 			code->op = FETCH_OP_ST_STRING;
1965 		code->size = parg->type->size;
1966 		parg->dynamic = true;
1967 	} else if (code->op == FETCH_OP_DEREF) {
1968 		code->op = FETCH_OP_ST_MEM;
1969 		code->size = parg->type->size;
1970 	} else if (code->op == FETCH_OP_UDEREF) {
1971 		code->op = FETCH_OP_ST_UMEM;
1972 		code->size = parg->type->size;
1973 	} else {
1974 		code++;
1975 		if (code->op != FETCH_OP_NOP) {
1976 			trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
1977 			return -E2BIG;
1978 		}
1979 		code->op = FETCH_OP_ST_RAW;
1980 		code->size = parg->type->size;
1981 	}
1982 
1983 	/* Save storing fetch_insn. */
1984 	scode = code;
1985 
1986 	/* Modify operation */
1987 	if (type != NULL) {
1988 		/* Bitfield needs a special fetch_insn. */
1989 		ret = __parse_bitfield_probe_arg(type, parg->type, &code);
1990 		if (ret) {
1991 			trace_probe_log_err(ctx->offset + type_offset, BAD_BITFIELD);
1992 			return ret;
1993 		}
1994 	} else if (IS_ENABLED(CONFIG_PROBE_EVENTS_BTF_ARGS) &&
1995 		   ctx->last_type) {
1996 		/* If user not specified the type, try parsing BTF bitfield. */
1997 		ret = parse_btf_bitfield(&code, ctx);
1998 		if (ret)
1999 			return ret;
2000 	}
2001 
2002 	/* Loop(Array) operation */
2003 	if (parg->count) {
2004 		if (scode->op != FETCH_OP_ST_MEM &&
2005 		    scode->op != FETCH_OP_ST_STRING &&
2006 		    scode->op != FETCH_OP_ST_USTRING) {
2007 			trace_probe_log_err(ctx->offset + type_offset, BAD_STRING);
2008 			return -EINVAL;
2009 		}
2010 		code++;
2011 		if (code->op != FETCH_OP_NOP) {
2012 			trace_probe_log_err(ctx->offset, TOO_MANY_OPS);
2013 			return -E2BIG;
2014 		}
2015 		code->op = FETCH_OP_LP_ARRAY;
2016 		code->param = parg->count;
2017 	}
2018 
2019 	/* Finalize the fetch_insn array. */
2020 	code++;
2021 	code->op = FETCH_OP_END;
2022 
2023 	return 0;
2024 }
2025 
2026 /* String length checking wrapper */
traceprobe_parse_probe_arg_body(const char * argv,ssize_t * size,struct probe_arg * parg,struct traceprobe_parse_context * ctx)2027 static int traceprobe_parse_probe_arg_body(const char *argv, ssize_t *size,
2028 					   struct probe_arg *parg,
2029 					   struct traceprobe_parse_context *ctx)
2030 {
2031 	struct fetch_insn *code, *tmp = NULL;
2032 	char *type, *arg __free(kfree) = NULL;
2033 	int ret, len;
2034 
2035 	len = strlen(argv);
2036 	if (len > MAX_ARGSTR_LEN) {
2037 		trace_probe_log_err(ctx->offset, ARG_TOO_LONG);
2038 		return -E2BIG;
2039 	} else if (len == 0) {
2040 		trace_probe_log_err(ctx->offset, NO_ARG_BODY);
2041 		return -EINVAL;
2042 	}
2043 
2044 	arg = kstrdup(argv, GFP_KERNEL);
2045 	if (!arg)
2046 		return -ENOMEM;
2047 
2048 	parg->comm = kstrdup(arg, GFP_KERNEL);
2049 	if (!parg->comm)
2050 		return -ENOMEM;
2051 
2052 	type = parse_probe_arg_type(arg, parg, ctx);
2053 	if (IS_ERR(type))
2054 		return PTR_ERR(type);
2055 
2056 	code = tmp = kzalloc_objs(*code, FETCH_INSN_MAX);
2057 	if (!code)
2058 		return -ENOMEM;
2059 	code[FETCH_INSN_MAX - 1].op = FETCH_OP_END;
2060 
2061 	ctx->last_type = NULL;
2062 	ret = parse_probe_arg(arg, parg->type, &code, &code[FETCH_INSN_MAX - 1],
2063 			      ctx);
2064 	if (ret < 0)
2065 		goto fail;
2066 	/* Update storing type if BTF is available */
2067 	if (IS_ENABLED(CONFIG_PROBE_EVENTS_BTF_ARGS) &&
2068 	    ctx->last_type) {
2069 		if (!type) {
2070 			parg->type = find_fetch_type_from_btf_type(ctx);
2071 		} else if (strstr(type, "string")) {
2072 			ret = check_prepare_btf_string_fetch(type, &code, ctx);
2073 			if (ret)
2074 				goto fail;
2075 		}
2076 	}
2077 	parg->offset = *size;
2078 	*size += parg->type->size * (parg->count ?: 1);
2079 
2080 	if (*size > MAX_PROBE_EVENT_SIZE) {
2081 		ret = -E2BIG;
2082 		trace_probe_log_err(ctx->offset, EVENT_TOO_BIG);
2083 		goto fail;
2084 	}
2085 
2086 	if (parg->count) {
2087 		len = strlen(parg->type->fmttype) + 6;
2088 		parg->fmt = kmalloc(len, GFP_KERNEL);
2089 		if (!parg->fmt) {
2090 			ret = -ENOMEM;
2091 			goto fail;
2092 		}
2093 		snprintf(parg->fmt, len, "%s[%d]", parg->type->fmttype,
2094 			 parg->count);
2095 	}
2096 
2097 	ret = finalize_fetch_insn(code, parg, type, type ? type - arg : 0, ctx);
2098 	if (ret < 0)
2099 		goto fail;
2100 
2101 	for (; code < tmp + FETCH_INSN_MAX; code++)
2102 		if (code->op == FETCH_OP_END)
2103 			break;
2104 	/* Shrink down the code buffer */
2105 	parg->code = kzalloc_objs(*code, code - tmp + 1);
2106 	if (!parg->code)
2107 		ret = -ENOMEM;
2108 	else
2109 		memcpy(parg->code, tmp, sizeof(*code) * (code - tmp + 1));
2110 
2111 fail:
2112 	if (ret < 0) {
2113 		for (code = tmp; code < tmp + FETCH_INSN_MAX; code++)
2114 			if (code->op == FETCH_NOP_SYMBOL ||
2115 			    code->op == FETCH_OP_IMMSTR)
2116 				kfree(code->data);
2117 	}
2118 	kfree(tmp);
2119 
2120 	/* struct_btf should not be passed to other arguments */
2121 	clear_struct_btf(ctx);
2122 
2123 	return ret;
2124 }
2125 
2126 /* Return 1 if name is reserved or already used by another argument */
traceprobe_conflict_field_name(const char * name,struct probe_arg * args,int narg)2127 static int traceprobe_conflict_field_name(const char *name,
2128 					  struct probe_arg *args, int narg)
2129 {
2130 	int i;
2131 
2132 	for (i = 0; i < ARRAY_SIZE(reserved_field_names); i++)
2133 		if (strcmp(reserved_field_names[i], name) == 0)
2134 			return 1;
2135 
2136 	for (i = 0; i < narg; i++)
2137 		if (strcmp(args[i].name, name) == 0)
2138 			return 1;
2139 
2140 	return 0;
2141 }
2142 
generate_probe_arg_name(const char * arg,int idx)2143 static char *generate_probe_arg_name(const char *arg, int idx)
2144 {
2145 	char *name = NULL;
2146 	const char *end;
2147 
2148 	/*
2149 	 * If argument name is omitted, try arg as a name (BTF variable)
2150 	 * or "argN".
2151 	 */
2152 	if (IS_ENABLED(CONFIG_PROBE_EVENTS_BTF_ARGS)) {
2153 		end = strchr(arg, ':');
2154 		if (!end)
2155 			end = arg + strlen(arg);
2156 
2157 		name = kmemdup_nul(arg, end - arg, GFP_KERNEL);
2158 		if (!name || !is_good_name(name)) {
2159 			kfree(name);
2160 			name = NULL;
2161 		}
2162 	}
2163 
2164 	if (!name)
2165 		name = kasprintf(GFP_KERNEL, "arg%d", idx + 1);
2166 
2167 	return name;
2168 }
2169 
traceprobe_parse_probe_arg(struct trace_probe * tp,int i,const char * arg,struct traceprobe_parse_context * ctx)2170 int traceprobe_parse_probe_arg(struct trace_probe *tp, int i, const char *arg,
2171 			       struct traceprobe_parse_context *ctx)
2172 {
2173 	struct probe_arg *parg = &tp->args[i];
2174 	const char *body;
2175 
2176 	ctx->tp = tp;
2177 	body = strchr(arg, '=');
2178 	if (body) {
2179 		if (body - arg > MAX_ARG_NAME_LEN) {
2180 			trace_probe_log_err(0, ARG_NAME_TOO_LONG);
2181 			return -EINVAL;
2182 		} else if (body == arg) {
2183 			trace_probe_log_err(0, NO_ARG_NAME);
2184 			return -EINVAL;
2185 		}
2186 		parg->name = kmemdup_nul(arg, body - arg, GFP_KERNEL);
2187 		body++;
2188 	} else {
2189 		parg->name = generate_probe_arg_name(arg, i);
2190 		body = arg;
2191 	}
2192 	if (!parg->name)
2193 		return -ENOMEM;
2194 
2195 	if (!is_good_name(parg->name)) {
2196 		trace_probe_log_err(0, BAD_ARG_NAME);
2197 		return -EINVAL;
2198 	}
2199 	if (traceprobe_conflict_field_name(parg->name, tp->args, i)) {
2200 		trace_probe_log_err(0, USED_ARG_NAME);
2201 		return -EINVAL;
2202 	}
2203 	ctx->offset = body - arg;
2204 	/* Parse fetch argument */
2205 	return traceprobe_parse_probe_arg_body(body, &tp->size, parg, ctx);
2206 }
2207 
traceprobe_free_probe_arg(struct probe_arg * arg)2208 void traceprobe_free_probe_arg(struct probe_arg *arg)
2209 {
2210 	struct fetch_insn *code = arg->code;
2211 
2212 	while (code && code->op != FETCH_OP_END) {
2213 		if (code->op == FETCH_NOP_SYMBOL ||
2214 		    code->op == FETCH_OP_IMMSTR)
2215 			kfree(code->data);
2216 		code++;
2217 	}
2218 	kfree(arg->code);
2219 	kfree(arg->name);
2220 	kfree(arg->comm);
2221 	kfree(arg->fmt);
2222 }
2223 
argv_has_var_arg(int argc,const char * argv[],int * args_idx,struct traceprobe_parse_context * ctx)2224 static int argv_has_var_arg(int argc, const char *argv[], int *args_idx,
2225 			    struct traceprobe_parse_context *ctx)
2226 {
2227 	int i, found = 0;
2228 
2229 	for (i = 0; i < argc; i++)
2230 		if (str_has_prefix(argv[i], "$arg")) {
2231 			trace_probe_log_set_index(i + 2);
2232 
2233 			if (!tparg_is_function_entry(ctx->flags) &&
2234 			    !tparg_is_function_return(ctx->flags)) {
2235 				trace_probe_log_err(0, NOFENTRY_ARGS);
2236 				return -EINVAL;
2237 			}
2238 
2239 			if (isdigit(argv[i][4])) {
2240 				found = 1;
2241 				continue;
2242 			}
2243 
2244 			if (argv[i][4] != '*') {
2245 				trace_probe_log_err(0, BAD_VAR);
2246 				return -EINVAL;
2247 			}
2248 
2249 			if (*args_idx >= 0 && *args_idx < argc) {
2250 				trace_probe_log_err(0, DOUBLE_ARGS);
2251 				return -EINVAL;
2252 			}
2253 			found = 1;
2254 			*args_idx = i;
2255 		}
2256 
2257 	return found;
2258 }
2259 
sprint_nth_btf_arg(int idx,const char * type,char * buf,int bufsize,struct traceprobe_parse_context * ctx)2260 static int sprint_nth_btf_arg(int idx, const char *type,
2261 			      char *buf, int bufsize,
2262 			      struct traceprobe_parse_context *ctx)
2263 {
2264 	const char *name;
2265 	int ret;
2266 
2267 	if (idx >= ctx->nr_params) {
2268 		trace_probe_log_err(0, NO_BTFARG);
2269 		return -ENOENT;
2270 	}
2271 	name = btf_name_by_offset(ctx->btf, ctx->params[idx].name_off);
2272 	if (!name) {
2273 		trace_probe_log_err(0, NO_BTF_ENTRY);
2274 		return -ENOENT;
2275 	}
2276 	ret = snprintf(buf, bufsize, "%s%s", name, type);
2277 	if (ret >= bufsize) {
2278 		trace_probe_log_err(0, ARGS_2LONG);
2279 		return -E2BIG;
2280 	}
2281 	return ret;
2282 }
2283 
2284 /* Return new_argv which must be freed after use */
traceprobe_expand_meta_args(int argc,const char * argv[],int * new_argc,char * buf,int bufsize,struct traceprobe_parse_context * ctx)2285 const char **traceprobe_expand_meta_args(int argc, const char *argv[],
2286 					 int *new_argc, char *buf, int bufsize,
2287 					 struct traceprobe_parse_context *ctx)
2288 {
2289 	const struct btf_param *params = NULL;
2290 	int i, j, n, used, ret, args_idx = -1;
2291 	const char **new_argv __free(kfree) = NULL;
2292 
2293 	ret = argv_has_var_arg(argc, argv, &args_idx, ctx);
2294 	if (ret < 0)
2295 		return ERR_PTR(ret);
2296 
2297 	if (!ret) {
2298 		*new_argc = argc;
2299 		return NULL;
2300 	}
2301 
2302 	ret = query_btf_context(ctx);
2303 	if (ret < 0 || ctx->nr_params == 0) {
2304 		if (args_idx != -1) {
2305 			/* $arg* requires BTF info */
2306 			trace_probe_log_err(0, NOSUP_BTFARG);
2307 			return (const char **)params;
2308 		}
2309 		*new_argc = argc;
2310 		return NULL;
2311 	}
2312 
2313 	if (args_idx >= 0)
2314 		*new_argc = argc + ctx->nr_params - 1;
2315 	else
2316 		*new_argc = argc;
2317 
2318 	new_argv = kcalloc(*new_argc, sizeof(char *), GFP_KERNEL);
2319 	if (!new_argv)
2320 		return ERR_PTR(-ENOMEM);
2321 
2322 	used = 0;
2323 	for (i = 0, j = 0; i < argc; i++) {
2324 		trace_probe_log_set_index(i + 2);
2325 		if (i == args_idx) {
2326 			for (n = 0; n < ctx->nr_params; n++) {
2327 				ret = sprint_nth_btf_arg(n, "", buf + used,
2328 							 bufsize - used, ctx);
2329 				if (ret < 0)
2330 					return ERR_PTR(ret);
2331 
2332 				new_argv[j++] = buf + used;
2333 				used += ret + 1;
2334 			}
2335 			continue;
2336 		}
2337 
2338 		if (str_has_prefix(argv[i], "$arg")) {
2339 			char *type = NULL;
2340 
2341 			n = simple_strtoul(argv[i] + 4, &type, 10);
2342 			if (type && !(*type == ':' || *type == '\0')) {
2343 				trace_probe_log_err(0, BAD_VAR);
2344 				return ERR_PTR(-ENOENT);
2345 			}
2346 			/* Note: $argN starts from $arg1, so $arg0 is invalid. */
2347 			if (n == 0) {
2348 				trace_probe_log_err(0, BAD_ARG_NUM);
2349 				return ERR_PTR(-EINVAL);
2350 			}
2351 			ret = sprint_nth_btf_arg(n - 1, type, buf + used,
2352 						 bufsize - used, ctx);
2353 			if (ret < 0)
2354 				return ERR_PTR(ret);
2355 			new_argv[j++] = buf + used;
2356 			used += ret + 1;
2357 		} else
2358 			new_argv[j++] = argv[i];
2359 	}
2360 
2361 	return_ptr(new_argv);
2362 }
2363 
2364 /* @buf: *buf must be equal to NULL. Caller must to free *buf */
traceprobe_expand_dentry_args(int argc,const char * argv[],char ** buf)2365 int traceprobe_expand_dentry_args(int argc, const char *argv[], char **buf)
2366 {
2367 	int i, used, ret;
2368 	const int bufsize = MAX_DENTRY_ARGS_LEN;
2369 	char *tmpbuf __free(kfree) = NULL;
2370 
2371 	if (*buf)
2372 		return -EINVAL;
2373 
2374 	used = 0;
2375 	for (i = 0; i < argc; i++) {
2376 		char *tmp __free(kfree) = NULL;
2377 		char *equal;
2378 		size_t arg_len;
2379 
2380 		if (!glob_match("*:%p[dD]", argv[i]))
2381 			continue;
2382 
2383 		if (!tmpbuf) {
2384 			tmpbuf = kmalloc(bufsize, GFP_KERNEL);
2385 			if (!tmpbuf)
2386 				return -ENOMEM;
2387 		}
2388 
2389 		tmp = kstrdup(argv[i], GFP_KERNEL);
2390 		if (!tmp)
2391 			return -ENOMEM;
2392 
2393 		equal = strchr(tmp, '=');
2394 		if (equal)
2395 			*equal = '\0';
2396 		arg_len = strlen(argv[i]);
2397 		tmp[arg_len - 4] = '\0';
2398 		if (argv[i][arg_len - 1] == 'd')
2399 			ret = snprintf(tmpbuf + used, bufsize - used,
2400 				       "%s%s+0x0(+0x%zx(%s)):string",
2401 				       equal ? tmp : "", equal ? "=" : "",
2402 				       offsetof(struct dentry, d_name.name),
2403 				       equal ? equal + 1 : tmp);
2404 		else
2405 			ret = snprintf(tmpbuf + used, bufsize - used,
2406 				       "%s%s+0x0(+0x%zx(+0x%zx(%s))):string",
2407 				       equal ? tmp : "", equal ? "=" : "",
2408 				       offsetof(struct dentry, d_name.name),
2409 				       offsetof(struct file, f_path.dentry),
2410 				       equal ? equal + 1 : tmp);
2411 
2412 		if (ret >= bufsize - used)
2413 			return -ENOMEM;
2414 		argv[i] = tmpbuf + used;
2415 		used += ret + 1;
2416 	}
2417 
2418 	*buf = no_free_ptr(tmpbuf);
2419 	return 0;
2420 }
2421 
traceprobe_finish_parse(struct traceprobe_parse_context * ctx)2422 void traceprobe_finish_parse(struct traceprobe_parse_context *ctx)
2423 {
2424 	clear_btf_context(ctx);
2425 }
2426 
traceprobe_update_arg(struct probe_arg * arg)2427 int traceprobe_update_arg(struct probe_arg *arg)
2428 {
2429 	struct fetch_insn *code = arg->code;
2430 	long offset;
2431 	char *tmp;
2432 	char c;
2433 	int ret = 0;
2434 
2435 	while (code && code->op != FETCH_OP_END) {
2436 		if (code->op == FETCH_NOP_SYMBOL) {
2437 			if (code[1].op != FETCH_OP_IMM)
2438 				return -EINVAL;
2439 
2440 			tmp = strpbrk(code->data, "+-");
2441 			if (tmp)
2442 				c = *tmp;
2443 			ret = traceprobe_split_symbol_offset(code->data,
2444 							     &offset);
2445 			if (ret)
2446 				return ret;
2447 
2448 			code[1].immediate =
2449 				(unsigned long)kallsyms_lookup_name(code->data);
2450 			if (tmp)
2451 				*tmp = c;
2452 			if (!code[1].immediate)
2453 				return -ENOENT;
2454 			code[1].immediate += offset;
2455 		}
2456 		code++;
2457 	}
2458 	return 0;
2459 }
2460 
2461 /* When len=0, we just calculate the needed length */
2462 #define LEN_OR_ZERO (len > pos ? len - pos : 0)
__set_print_fmt(struct trace_probe * tp,char * buf,int len,enum probe_print_type ptype)2463 static int __set_print_fmt(struct trace_probe *tp, char *buf, int len,
2464 			   enum probe_print_type ptype)
2465 {
2466 	struct probe_arg *parg;
2467 	int i, j;
2468 	int pos = 0;
2469 	const char *fmt, *arg;
2470 
2471 	switch (ptype) {
2472 	case PROBE_PRINT_NORMAL:
2473 		fmt = "(%lx)";
2474 		arg = ", REC->" FIELD_STRING_IP;
2475 		break;
2476 	case PROBE_PRINT_RETURN:
2477 		fmt = "(%lx <- %lx)";
2478 		arg = ", REC->" FIELD_STRING_FUNC ", REC->" FIELD_STRING_RETIP;
2479 		break;
2480 	case PROBE_PRINT_EVENT:
2481 		fmt = "";
2482 		arg = "";
2483 		break;
2484 	default:
2485 		WARN_ON_ONCE(1);
2486 		return 0;
2487 	}
2488 
2489 	pos += snprintf(buf + pos, LEN_OR_ZERO, "\"%s", fmt);
2490 
2491 	for (i = 0; i < tp->nr_args; i++) {
2492 		parg = tp->args + i;
2493 		pos += snprintf(buf + pos, LEN_OR_ZERO, " %s=", parg->name);
2494 		if (parg->count) {
2495 			pos += snprintf(buf + pos, LEN_OR_ZERO, "{%s",
2496 					parg->type->fmt);
2497 			for (j = 1; j < parg->count; j++)
2498 				pos += snprintf(buf + pos, LEN_OR_ZERO, ",%s",
2499 						parg->type->fmt);
2500 			pos += snprintf(buf + pos, LEN_OR_ZERO, "}");
2501 		} else
2502 			pos += snprintf(buf + pos, LEN_OR_ZERO, "%s",
2503 					parg->type->fmt);
2504 	}
2505 
2506 	pos += snprintf(buf + pos, LEN_OR_ZERO, "\"%s", arg);
2507 
2508 	for (i = 0; i < tp->nr_args; i++) {
2509 		parg = tp->args + i;
2510 		if (parg->count) {
2511 			if (parg->type->is_string)
2512 				fmt = ", __get_str(%s[%d])";
2513 			else
2514 				fmt = ", REC->%s[%d]";
2515 			for (j = 0; j < parg->count; j++)
2516 				pos += snprintf(buf + pos, LEN_OR_ZERO,
2517 						fmt, parg->name, j);
2518 		} else {
2519 			if (parg->type->is_string)
2520 				fmt = ", __get_str(%s)";
2521 			else
2522 				fmt = ", REC->%s";
2523 			pos += snprintf(buf + pos, LEN_OR_ZERO,
2524 					fmt, parg->name);
2525 		}
2526 	}
2527 
2528 	/* return the length of print_fmt */
2529 	return pos;
2530 }
2531 #undef LEN_OR_ZERO
2532 
traceprobe_set_print_fmt(struct trace_probe * tp,enum probe_print_type ptype)2533 int traceprobe_set_print_fmt(struct trace_probe *tp, enum probe_print_type ptype)
2534 {
2535 	struct trace_event_call *call = trace_probe_event_call(tp);
2536 	int len;
2537 	char *print_fmt;
2538 
2539 	/* First: called with 0 length to calculate the needed length */
2540 	len = __set_print_fmt(tp, NULL, 0, ptype);
2541 	print_fmt = kmalloc(len + 1, GFP_KERNEL);
2542 	if (!print_fmt)
2543 		return -ENOMEM;
2544 
2545 	/* Second: actually write the @print_fmt */
2546 	__set_print_fmt(tp, print_fmt, len + 1, ptype);
2547 	call->print_fmt = print_fmt;
2548 
2549 	return 0;
2550 }
2551 
traceprobe_define_arg_fields(struct trace_event_call * event_call,size_t offset,struct trace_probe * tp)2552 int traceprobe_define_arg_fields(struct trace_event_call *event_call,
2553 				 size_t offset, struct trace_probe *tp)
2554 {
2555 	int ret, i;
2556 
2557 	/* Set argument names as fields */
2558 	for (i = 0; i < tp->nr_args; i++) {
2559 		struct probe_arg *parg = &tp->args[i];
2560 		const char *fmt = parg->type->fmttype;
2561 		int size = parg->type->size;
2562 
2563 		if (parg->fmt)
2564 			fmt = parg->fmt;
2565 		if (parg->count)
2566 			size *= parg->count;
2567 		ret = trace_define_field(event_call, fmt, parg->name,
2568 					 offset + parg->offset, size,
2569 					 parg->type->is_signed,
2570 					 FILTER_OTHER);
2571 		if (ret)
2572 			return ret;
2573 	}
2574 	return 0;
2575 }
2576 
trace_probe_event_free(struct trace_probe_event * tpe)2577 static void trace_probe_event_free(struct trace_probe_event *tpe)
2578 {
2579 	kfree(tpe->class.system);
2580 	kfree(tpe->call.name);
2581 	kfree(tpe->call.print_fmt);
2582 	kfree(tpe);
2583 }
2584 
trace_probe_append(struct trace_probe * tp,struct trace_probe * to)2585 int trace_probe_append(struct trace_probe *tp, struct trace_probe *to)
2586 {
2587 	if (trace_probe_has_sibling(tp))
2588 		return -EBUSY;
2589 
2590 	list_del_init(&tp->list);
2591 	trace_probe_event_free(tp->event);
2592 
2593 	tp->event = to->event;
2594 	list_add_tail(&tp->list, trace_probe_probe_list(to));
2595 
2596 	return 0;
2597 }
2598 
trace_probe_unlink(struct trace_probe * tp)2599 void trace_probe_unlink(struct trace_probe *tp)
2600 {
2601 	list_del_init(&tp->list);
2602 	if (list_empty(trace_probe_probe_list(tp)))
2603 		trace_probe_event_free(tp->event);
2604 	tp->event = NULL;
2605 }
2606 
trace_probe_cleanup(struct trace_probe * tp)2607 void trace_probe_cleanup(struct trace_probe *tp)
2608 {
2609 	int i;
2610 
2611 	for (i = 0; i < tp->nr_args; i++)
2612 		traceprobe_free_probe_arg(&tp->args[i]);
2613 
2614 	if (tp->entry_arg) {
2615 		kfree(tp->entry_arg);
2616 		tp->entry_arg = NULL;
2617 	}
2618 
2619 	if (tp->event)
2620 		trace_probe_unlink(tp);
2621 }
2622 
trace_probe_init(struct trace_probe * tp,const char * event,const char * group,bool alloc_filter,int nargs)2623 int trace_probe_init(struct trace_probe *tp, const char *event,
2624 		     const char *group, bool alloc_filter, int nargs)
2625 {
2626 	struct trace_event_call *call;
2627 	size_t size = sizeof(struct trace_probe_event);
2628 	int ret = 0;
2629 
2630 	if (!event || !group)
2631 		return -EINVAL;
2632 
2633 	if (alloc_filter)
2634 		size += sizeof(struct trace_uprobe_filter);
2635 
2636 	tp->event = kzalloc(size, GFP_KERNEL);
2637 	if (!tp->event)
2638 		return -ENOMEM;
2639 
2640 	INIT_LIST_HEAD(&tp->event->files);
2641 	INIT_LIST_HEAD(&tp->event->class.fields);
2642 	INIT_LIST_HEAD(&tp->event->probes);
2643 	INIT_LIST_HEAD(&tp->list);
2644 	list_add(&tp->list, &tp->event->probes);
2645 
2646 	call = trace_probe_event_call(tp);
2647 	call->class = &tp->event->class;
2648 	call->name = kstrdup(event, GFP_KERNEL);
2649 	if (!call->name) {
2650 		ret = -ENOMEM;
2651 		goto error;
2652 	}
2653 
2654 	tp->event->class.system = kstrdup(group, GFP_KERNEL);
2655 	if (!tp->event->class.system) {
2656 		ret = -ENOMEM;
2657 		goto error;
2658 	}
2659 
2660 	tp->nr_args = nargs;
2661 	/* Make sure pointers in args[] are NULL */
2662 	if (nargs)
2663 		memset(tp->args, 0, sizeof(tp->args[0]) * nargs);
2664 
2665 	return 0;
2666 
2667 error:
2668 	trace_probe_cleanup(tp);
2669 	return ret;
2670 }
2671 
2672 static struct trace_event_call *
find_trace_event_call(const char * system,const char * event_name)2673 find_trace_event_call(const char *system, const char *event_name)
2674 {
2675 	struct trace_event_call *tp_event;
2676 	const char *name;
2677 
2678 	list_for_each_entry(tp_event, &ftrace_events, list) {
2679 		if (!tp_event->class->system ||
2680 		    strcmp(system, tp_event->class->system))
2681 			continue;
2682 		name = trace_event_name(tp_event);
2683 		if (!name || strcmp(event_name, name))
2684 			continue;
2685 		return tp_event;
2686 	}
2687 
2688 	return NULL;
2689 }
2690 
trace_probe_register_event_call(struct trace_probe * tp)2691 int trace_probe_register_event_call(struct trace_probe *tp)
2692 {
2693 	struct trace_event_call *call = trace_probe_event_call(tp);
2694 	int ret;
2695 
2696 	lockdep_assert_held(&event_mutex);
2697 
2698 	if (find_trace_event_call(trace_probe_group_name(tp),
2699 				  trace_probe_name(tp)))
2700 		return -EEXIST;
2701 
2702 	ret = register_trace_event(&call->event);
2703 	if (!ret)
2704 		return -ENODEV;
2705 
2706 	ret = trace_add_event_call(call);
2707 	if (ret)
2708 		unregister_trace_event(&call->event);
2709 
2710 	return ret;
2711 }
2712 
trace_probe_add_file(struct trace_probe * tp,struct trace_event_file * file)2713 int trace_probe_add_file(struct trace_probe *tp, struct trace_event_file *file)
2714 {
2715 	struct event_file_link *link;
2716 
2717 	link = kmalloc_obj(*link);
2718 	if (!link)
2719 		return -ENOMEM;
2720 
2721 	link->file = file;
2722 	INIT_LIST_HEAD(&link->list);
2723 	list_add_tail_rcu(&link->list, &tp->event->files);
2724 	trace_probe_set_flag(tp, TP_FLAG_TRACE);
2725 	return 0;
2726 }
2727 
trace_probe_get_file_link(struct trace_probe * tp,struct trace_event_file * file)2728 struct event_file_link *trace_probe_get_file_link(struct trace_probe *tp,
2729 						  struct trace_event_file *file)
2730 {
2731 	struct event_file_link *link;
2732 
2733 	trace_probe_for_each_link(link, tp) {
2734 		if (link->file == file)
2735 			return link;
2736 	}
2737 
2738 	return NULL;
2739 }
2740 
trace_probe_remove_file(struct trace_probe * tp,struct trace_event_file * file)2741 int trace_probe_remove_file(struct trace_probe *tp,
2742 			    struct trace_event_file *file)
2743 {
2744 	struct event_file_link *link;
2745 
2746 	link = trace_probe_get_file_link(tp, file);
2747 	if (!link)
2748 		return -ENOENT;
2749 
2750 	list_del_rcu(&link->list);
2751 	kvfree_rcu_mightsleep(link);
2752 
2753 	if (list_empty(&tp->event->files))
2754 		trace_probe_clear_flag(tp, TP_FLAG_TRACE);
2755 
2756 	return 0;
2757 }
2758 
2759 /*
2760  * Return the smallest index of different type argument (start from 1).
2761  * If all argument types and name are same, return 0.
2762  */
trace_probe_compare_arg_type(struct trace_probe * a,struct trace_probe * b)2763 int trace_probe_compare_arg_type(struct trace_probe *a, struct trace_probe *b)
2764 {
2765 	int i;
2766 
2767 	/* In case of more arguments */
2768 	if (a->nr_args < b->nr_args)
2769 		return a->nr_args + 1;
2770 	if (a->nr_args > b->nr_args)
2771 		return b->nr_args + 1;
2772 
2773 	for (i = 0; i < a->nr_args; i++) {
2774 		if ((a->args[i].type != b->args[i].type) ||
2775 		    (a->args[i].count != b->args[i].count) ||
2776 		    strcmp(a->args[i].name, b->args[i].name))
2777 			return i + 1;
2778 	}
2779 
2780 	return 0;
2781 }
2782 
trace_probe_match_command_args(struct trace_probe * tp,int argc,const char ** argv)2783 bool trace_probe_match_command_args(struct trace_probe *tp,
2784 				    int argc, const char **argv)
2785 {
2786 	int i;
2787 
2788 	if (tp->nr_args < argc)
2789 		return false;
2790 
2791 	for (i = 0; i < argc; i++) {
2792 		int len = strlen(tp->args[i].name);
2793 
2794 		if (strncmp(argv[i], tp->args[i].name, len) ||
2795 		    argv[i][len] != '=' ||
2796 		    strcmp(argv[i] + len + 1, tp->args[i].comm))
2797 			return false;
2798 	}
2799 	return true;
2800 }
2801 
trace_probe_create(const char * raw_command,int (* createfn)(int,const char **))2802 int trace_probe_create(const char *raw_command, int (*createfn)(int, const char **))
2803 {
2804 	int argc = 0, ret = 0;
2805 	char **argv;
2806 
2807 	argv = argv_split(GFP_KERNEL, raw_command, &argc);
2808 	if (!argv)
2809 		return -ENOMEM;
2810 
2811 	if (argc)
2812 		ret = createfn(argc, (const char **)argv);
2813 
2814 	argv_free(argv);
2815 
2816 	return ret;
2817 }
2818 
trace_probe_print_args(struct trace_seq * s,struct probe_arg * args,int nr_args,u8 * data,void * field)2819 int trace_probe_print_args(struct trace_seq *s, struct probe_arg *args, int nr_args,
2820 		 u8 *data, void *field)
2821 {
2822 	void *p;
2823 	int i, j;
2824 
2825 	for (i = 0; i < nr_args; i++) {
2826 		struct probe_arg *a = args + i;
2827 
2828 		trace_seq_printf(s, " %s=", a->name);
2829 		if (likely(!a->count)) {
2830 			if (!a->type->print(s, data + a->offset, field))
2831 				return -ENOMEM;
2832 			continue;
2833 		}
2834 		trace_seq_putc(s, '{');
2835 		p = data + a->offset;
2836 		for (j = 0; j < a->count; j++) {
2837 			if (!a->type->print(s, p, field))
2838 				return -ENOMEM;
2839 			trace_seq_putc(s, j == a->count - 1 ? '}' : ',');
2840 			p += a->type->size;
2841 		}
2842 	}
2843 	return 0;
2844 }
2845 
2846 #ifdef CONFIG_PROBE_EVENTS_DUMP_FETCHARG
2847 
2848 struct fetch_op_decode {
2849 	const char *name;
2850 	void (*decode)(struct seq_file *m, struct fetch_insn *insn);
2851 };
2852 
2853 static const struct fetch_op_decode fetch_op_decode[];
2854 
fetcharg_decode_none(struct seq_file * m,struct fetch_insn * insn)2855 static void fetcharg_decode_none(struct seq_file *m, struct fetch_insn *insn)
2856 {
2857 	seq_puts(m, fetch_op_decode[insn->op].name);
2858 }
2859 
fetcharg_decode_param(struct seq_file * m,struct fetch_insn * insn)2860 static void fetcharg_decode_param(struct seq_file *m, struct fetch_insn *insn)
2861 {
2862 	seq_printf(m, "%s(%u)", fetch_op_decode[insn->op].name, insn->param);
2863 }
2864 
fetcharg_decode_imm(struct seq_file * m,struct fetch_insn * insn)2865 static void fetcharg_decode_imm(struct seq_file *m, struct fetch_insn *insn)
2866 {
2867 	seq_printf(m, "%s(0x%lx)", fetch_op_decode[insn->op].name, insn->immediate);
2868 }
2869 
fetcharg_decode_string(struct seq_file * m,struct fetch_insn * insn)2870 static void fetcharg_decode_string(struct seq_file *m, struct fetch_insn *insn)
2871 {
2872 	seq_printf(m, "%s(%s)", fetch_op_decode[insn->op].name, (char *)insn->data);
2873 }
2874 
fetcharg_decode_symbol(struct seq_file * m,struct fetch_insn * insn)2875 static void fetcharg_decode_symbol(struct seq_file *m, struct fetch_insn *insn)
2876 {
2877 	seq_printf(m, "%s(%s)", fetch_op_decode[insn->op].name, (char *)insn->data);
2878 }
2879 
fetcharg_decode_offset(struct seq_file * m,struct fetch_insn * insn)2880 static void fetcharg_decode_offset(struct seq_file *m, struct fetch_insn *insn)
2881 {
2882 	seq_printf(m, "%s(offset=%d)", fetch_op_decode[insn->op].name, insn->offset);
2883 }
2884 
fetcharg_decode_store(struct seq_file * m,struct fetch_insn * insn)2885 static void fetcharg_decode_store(struct seq_file *m, struct fetch_insn *insn)
2886 {
2887 	if (insn->op == FETCH_OP_ST_RAW)
2888 		seq_printf(m, "%s(size=%u)", fetch_op_decode[insn->op].name, insn->size);
2889 	else
2890 		seq_printf(m, "%s(offset=%d,size=%u)", fetch_op_decode[insn->op].name,
2891 			  insn->offset, insn->size);
2892 }
2893 
fetcharg_decode_bf(struct seq_file * m,struct fetch_insn * insn)2894 static void fetcharg_decode_bf(struct seq_file *m, struct fetch_insn *insn)
2895 {
2896 	seq_printf(m, "%s(basesize=%u,lshift=%u,rshift=%u)",
2897 		   fetch_op_decode[insn->op].name, insn->basesize, insn->lshift, insn->rshift);
2898 }
2899 
fetcharg_decode_tp_arg(struct seq_file * m,struct fetch_insn * insn)2900 static void fetcharg_decode_tp_arg(struct seq_file *m, struct fetch_insn *insn)
2901 {
2902 	struct ftrace_event_field *field = insn->data;
2903 
2904 	seq_printf(m, "%s(%s)", fetch_op_decode[insn->op].name, field->name);
2905 }
2906 
2907 #define FETCH_OP(opname, decode_fn) \
2908 	[FETCH_OP_##opname] = { .name = #opname, .decode = fetcharg_decode_##decode_fn }
2909 
2910 static const struct fetch_op_decode fetch_op_decode[] = FETCH_OP_LIST;
2911 #undef FETCH_OP
2912 
trace_probe_dump_arg(struct seq_file * m,struct probe_arg * parg)2913 static void trace_probe_dump_arg(struct seq_file *m, struct probe_arg *parg)
2914 {
2915 	int i;
2916 
2917 	seq_printf(m, "#  %s: ", parg->name);
2918 	for (i = 0; i < FETCH_INSN_MAX; i++) {
2919 		struct fetch_insn *insn = parg->code + i;
2920 
2921 		if (insn->op >= ARRAY_SIZE(fetch_op_decode) || !fetch_op_decode[insn->op].decode)
2922 			seq_printf(m, "unknown(%d)", insn->op);
2923 		else
2924 			fetch_op_decode[insn->op].decode(m, insn);
2925 
2926 		if (insn->op == FETCH_OP_END)
2927 			break;
2928 		seq_puts(m, " -> ");
2929 	}
2930 	seq_putc(m, '\n');
2931 }
2932 
trace_probe_dump_args(struct seq_file * m,struct trace_probe * tp)2933 void trace_probe_dump_args(struct seq_file *m, struct trace_probe *tp)
2934 {
2935 	int i;
2936 
2937 	for (i = 0; i < tp->nr_args; i++)
2938 		trace_probe_dump_arg(m, &tp->args[i]);
2939 }
2940 #endif /* CONFIG_PROBE_EVENTS_DUMP_FETCHARG */
2941