aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_probe.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace_probe.c')
-rw-r--r--kernel/trace/trace_probe.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c
index 8e526b9286e9..daa9980153af 100644
--- a/kernel/trace/trace_probe.c
+++ b/kernel/trace/trace_probe.c
@@ -550,7 +550,7 @@ static int parse_probe_vars(char *arg, const struct fetch_type *t,
550 550
551/* Recursive argument parser */ 551/* Recursive argument parser */
552static int parse_probe_arg(char *arg, const struct fetch_type *t, 552static int parse_probe_arg(char *arg, const struct fetch_type *t,
553 struct fetch_param *f, bool is_return) 553 struct fetch_param *f, bool is_return, bool is_kprobe)
554{ 554{
555 unsigned long param; 555 unsigned long param;
556 long offset; 556 long offset;
@@ -558,6 +558,11 @@ static int parse_probe_arg(char *arg, const struct fetch_type *t,
558 int ret; 558 int ret;
559 559
560 ret = 0; 560 ret = 0;
561
562 /* Until uprobe_events supports only reg arguments */
563 if (!is_kprobe && arg[0] != '%')
564 return -EINVAL;
565
561 switch (arg[0]) { 566 switch (arg[0]) {
562 case '$': 567 case '$':
563 ret = parse_probe_vars(arg + 1, t, f, is_return); 568 ret = parse_probe_vars(arg + 1, t, f, is_return);
@@ -619,7 +624,8 @@ static int parse_probe_arg(char *arg, const struct fetch_type *t,
619 return -ENOMEM; 624 return -ENOMEM;
620 625
621 dprm->offset = offset; 626 dprm->offset = offset;
622 ret = parse_probe_arg(arg, t2, &dprm->orig, is_return); 627 ret = parse_probe_arg(arg, t2, &dprm->orig, is_return,
628 is_kprobe);
623 if (ret) 629 if (ret)
624 kfree(dprm); 630 kfree(dprm);
625 else { 631 else {
@@ -677,7 +683,7 @@ static int __parse_bitfield_probe_arg(const char *bf,
677 683
678/* String length checking wrapper */ 684/* String length checking wrapper */
679int traceprobe_parse_probe_arg(char *arg, ssize_t *size, 685int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
680 struct probe_arg *parg, bool is_return) 686 struct probe_arg *parg, bool is_return, bool is_kprobe)
681{ 687{
682 const char *t; 688 const char *t;
683 int ret; 689 int ret;
@@ -703,7 +709,7 @@ int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
703 } 709 }
704 parg->offset = *size; 710 parg->offset = *size;
705 *size += parg->type->size; 711 *size += parg->type->size;
706 ret = parse_probe_arg(arg, parg->type, &parg->fetch, is_return); 712 ret = parse_probe_arg(arg, parg->type, &parg->fetch, is_return, is_kprobe);
707 713
708 if (ret >= 0 && t != NULL) 714 if (ret >= 0 && t != NULL)
709 ret = __parse_bitfield_probe_arg(t, parg->type, &parg->fetch); 715 ret = __parse_bitfield_probe_arg(t, parg->type, &parg->fetch);