| #!/bin/sh |
| # SPDX-License-Identifier: GPL-2.0 |
| # description: Kprobe event argument syntax |
| # requires: kprobe_events "x8/16/32/64":README |
| |
| PROBEFUNC="vfs_read" |
| GOODREG= |
| BADREG= |
| GOODSYM="_sdata" |
| if ! grep -qw ${GOODSYM} /proc/kallsyms ; then |
| GOODSYM=$PROBEFUNC |
| fi |
| BADSYM="deaqswdefr" |
| SYMADDR=0x`grep -w ${GOODSYM} /proc/kallsyms | cut -f 1 -d " "` |
| GOODTYPE="x16" |
| BADTYPE="y16" |
| |
| case `uname -m` in |
| x86_64|i[3456]86) |
| GOODREG=%ax |
| BADREG=%ex |
| ;; |
| aarch64) |
| GOODREG=%x0 |
| BADREG=%ax |
| ;; |
| arm*) |
| GOODREG=%r0 |
| BADREG=%ax |
| ;; |
| ppc*) |
| GOODREG=%r3 |
| BADREG=%msr |
| ;; |
| s390*) |
| GOODREG=%r2 |
| BADREG=%s2 |
| ;; |
| *) |
| echo "Please implement other architecture here" |
| exit_untested |
| esac |
| |
| test_goodarg() # Good-args |
| { |
| while [ "$1" ]; do |
| echo "p ${PROBEFUNC} $1" > kprobe_events |
| shift 1 |
| done; |
| } |
| |
| test_badarg() # Bad-args |
| { |
| while [ "$1" ]; do |
| ! echo "p ${PROBEFUNC} $1" > kprobe_events |
| shift 1 |
| done; |
| } |
| |
| echo > kprobe_events |
| |
| : "Register access" |
| test_goodarg ${GOODREG} |
| test_badarg ${BADREG} |
| |
| : "Symbol access" |
| test_goodarg "@${GOODSYM}" "@${SYMADDR}" "@${GOODSYM}+10" "@${GOODSYM}-10" |
| test_badarg "@" "@${BADSYM}" "@${GOODSYM}*10" "@${GOODSYM}/10" \ |
| "@${GOODSYM}%10" "@${GOODSYM}&10" "@${GOODSYM}|10" |
| |
| : "Stack access" |
| test_goodarg "\$stack" "\$stack0" "\$stack1" |
| test_badarg "\$stackp" "\$stack0+10" "\$stack1-10" |
| |
| : "Retval access" |
| echo "r ${PROBEFUNC} \$retval" > kprobe_events |
| ! echo "p ${PROBEFUNC} \$retval" > kprobe_events |
| |
| # $comm was introduced in 4.8, older kernels reject it. |
| if grep -A1 "fetcharg:" README | grep -q '\$comm' ; then |
| : "Comm access" |
| test_goodarg "\$comm" |
| fi |
| |
| : "Indirect memory access" |
| test_goodarg "+0(${GOODREG})" "-0(${GOODREG})" "+10(\$stack)" \ |
| "+0(\$stack1)" "+10(@${GOODSYM}-10)" "+0(+10(+20(\$stack)))" |
| test_badarg "+(${GOODREG})" "(${GOODREG}+10)" "-(${GOODREG})" "(${GOODREG})" \ |
| "+10(\$comm)" "+0(${GOODREG})+10" |
| |
| : "Name assignment" |
| test_goodarg "varname=${GOODREG}" |
| test_badarg "varname=varname2=${GOODREG}" |
| |
| : "Type syntax" |
| test_goodarg "${GOODREG}:${GOODTYPE}" |
| test_badarg "${GOODREG}::${GOODTYPE}" "${GOODREG}:${BADTYPE}" \ |
| "${GOODTYPE}:${GOODREG}" |
| |
| : "Combination check" |
| |
| test_goodarg "\$comm:string" "+0(\$stack):string" |
| test_badarg "\$comm:x64" "\$stack:string" "${GOODREG}:string" |