GNU Linux-libre 4.19.295-gnu1
[releases.git] / tools / testing / selftests / ftrace / test.d / kprobe / kprobe_args_syntax.tc
1 #!/bin/sh
2 # SPDX-License-Identifier: GPL-2.0
3 # description: Kprobe event argument syntax
4
5 [ -f kprobe_events ] || exit_unsupported # this is configurable
6
7 grep "x8/16/32/64" README > /dev/null || exit_unsupported # version issue
8
9 echo 0 > events/enable
10 echo > kprobe_events
11
12 PROBEFUNC="vfs_read"
13 GOODREG=
14 BADREG=
15 GOODSYM="_sdata"
16 if ! grep -qw ${GOODSYM} /proc/kallsyms ; then
17   GOODSYM=$PROBEFUNC
18 fi
19 BADSYM="deaqswdefr"
20 SYMADDR=0x`grep -w ${GOODSYM} /proc/kallsyms | cut -f 1 -d " "`
21 GOODTYPE="x16"
22 BADTYPE="y16"
23
24 case `uname -m` in
25 x86_64|i[3456]86)
26   GOODREG=%ax
27   BADREG=%ex
28 ;;
29 aarch64)
30   GOODREG=%x0
31   BADREG=%ax
32 ;;
33 arm*)
34   GOODREG=%r0
35   BADREG=%ax
36 ;;
37 ppc*)
38   GOODREG=%r3
39   BADREG=%msr
40 ;;
41 *)
42   echo "Please implement other architecture here"
43   exit_untested
44 esac
45
46 test_goodarg() # Good-args
47 {
48   while [ "$1" ]; do
49     echo "p ${PROBEFUNC} $1" > kprobe_events
50     shift 1
51   done;
52 }
53
54 test_badarg() # Bad-args
55 {
56   while [ "$1" ]; do
57     ! echo "p ${PROBEFUNC} $1" > kprobe_events
58     shift 1
59   done;
60 }
61
62 echo > kprobe_events
63
64 : "Register access"
65 test_goodarg ${GOODREG}
66 test_badarg ${BADREG}
67
68 : "Symbol access"
69 test_goodarg "@${GOODSYM}" "@${SYMADDR}" "@${GOODSYM}+10" "@${GOODSYM}-10"
70 test_badarg "@" "@${BADSYM}" "@${GOODSYM}*10" "@${GOODSYM}/10" \
71             "@${GOODSYM}%10" "@${GOODSYM}&10" "@${GOODSYM}|10"
72
73 : "Stack access"
74 test_goodarg "\$stack" "\$stack0" "\$stack1"
75 test_badarg "\$stackp" "\$stack0+10" "\$stack1-10"
76
77 : "Retval access"
78 echo "r ${PROBEFUNC} \$retval" > kprobe_events
79 ! echo "p ${PROBEFUNC} \$retval" > kprobe_events
80
81 # $comm was introduced in 4.8, older kernels reject it.
82 if grep -A1 "fetcharg:" README | grep -q '\$comm' ; then
83 : "Comm access"
84 test_goodarg "\$comm"
85 fi
86
87 : "Indirect memory access"
88 test_goodarg "+0(${GOODREG})" "-0(${GOODREG})" "+10(\$stack)" \
89         "+0(\$stack1)" "+10(@${GOODSYM}-10)" "+0(+10(+20(\$stack)))"
90 test_badarg "+(${GOODREG})" "(${GOODREG}+10)" "-(${GOODREG})" "(${GOODREG})" \
91         "+10(\$comm)" "+0(${GOODREG})+10"
92
93 : "Name assignment"
94 test_goodarg "varname=${GOODREG}"
95 test_badarg "varname=varname2=${GOODREG}"
96
97 : "Type syntax"
98 test_goodarg "${GOODREG}:${GOODTYPE}"
99 test_badarg "${GOODREG}::${GOODTYPE}" "${GOODREG}:${BADTYPE}" \
100         "${GOODTYPE}:${GOODREG}"
101
102 : "Combination check"
103
104 test_goodarg "\$comm:string" "+0(\$stack):string"
105 test_badarg "\$comm:x64" "\$stack:string" "${GOODREG}:string"
106
107 echo > kprobe_events