#!/bin/sh # SPDX-License-Identifier: GPL-2.0 # description: Kprobe event argument syntax [ -f kprobe_events ] || exit_unsupported # this is configurable grep "x8/16/32/64" README > /dev/null || exit_unsupported # version issue 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 ;; *) 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" |