Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/sh
0002 # SPDX-License-Identifier: GPL-2.0
0003 # description: Kprobe event argument syntax
0004 # requires: kprobe_events "x8/16/32/64":README
0005 
0006 PROBEFUNC="vfs_read"
0007 GOODREG=
0008 BADREG=
0009 GOODSYM="_sdata"
0010 if ! grep -qw ${GOODSYM} /proc/kallsyms ; then
0011   GOODSYM=$PROBEFUNC
0012 fi
0013 BADSYM="deaqswdefr"
0014 SYMADDR=0x`grep -w ${GOODSYM} /proc/kallsyms | cut -f 1 -d " "`
0015 GOODTYPE="x16"
0016 BADTYPE="y16"
0017 
0018 case `uname -m` in
0019 x86_64|i[3456]86)
0020   GOODREG=%ax
0021   BADREG=%ex
0022 ;;
0023 aarch64)
0024   GOODREG=%x0
0025   BADREG=%ax
0026 ;;
0027 arm*)
0028   GOODREG=%r0
0029   BADREG=%ax
0030 ;;
0031 ppc*)
0032   GOODREG=%r3
0033   BADREG=%msr
0034 ;;
0035 s390*)
0036   GOODREG=%r2
0037   BADREG=%s2
0038 ;;
0039 mips*)
0040   GOODREG=%r4
0041   BADREG=%r12
0042 ;;
0043 *)
0044   echo "Please implement other architecture here"
0045   exit_untested
0046 esac
0047 
0048 test_goodarg() # Good-args
0049 {
0050   while [ "$1" ]; do
0051     echo "p ${PROBEFUNC} $1" > kprobe_events
0052     shift 1
0053   done;
0054 }
0055 
0056 test_badarg() # Bad-args
0057 {
0058   while [ "$1" ]; do
0059     ! echo "p ${PROBEFUNC} $1" > kprobe_events
0060     shift 1
0061   done;
0062 }
0063 
0064 echo > kprobe_events
0065 
0066 : "Register access"
0067 test_goodarg ${GOODREG}
0068 test_badarg ${BADREG}
0069 
0070 : "Symbol access"
0071 test_goodarg "@${GOODSYM}" "@${SYMADDR}" "@${GOODSYM}+10" "@${GOODSYM}-10"
0072 test_badarg "@" "@${BADSYM}" "@${GOODSYM}*10" "@${GOODSYM}/10" \
0073             "@${GOODSYM}%10" "@${GOODSYM}&10" "@${GOODSYM}|10"
0074 
0075 : "Stack access"
0076 test_goodarg "\$stack" "\$stack0" "\$stack1"
0077 test_badarg "\$stackp" "\$stack0+10" "\$stack1-10"
0078 
0079 : "Retval access"
0080 echo "r ${PROBEFUNC} \$retval" > kprobe_events
0081 ! echo "p ${PROBEFUNC} \$retval" > kprobe_events
0082 
0083 # $comm was introduced in 4.8, older kernels reject it.
0084 if grep -A1 "fetcharg:" README | grep -q '\$comm' ; then
0085 : "Comm access"
0086 test_goodarg "\$comm"
0087 fi
0088 
0089 : "Indirect memory access"
0090 test_goodarg "+0(${GOODREG})" "-0(${GOODREG})" "+10(\$stack)" \
0091         "+0(\$stack1)" "+10(@${GOODSYM}-10)" "+0(+10(+20(\$stack)))"
0092 test_badarg "+(${GOODREG})" "(${GOODREG}+10)" "-(${GOODREG})" "(${GOODREG})" \
0093         "+10(\$comm)" "+0(${GOODREG})+10"
0094 
0095 : "Name assignment"
0096 test_goodarg "varname=${GOODREG}"
0097 test_badarg "varname=varname2=${GOODREG}"
0098 
0099 : "Type syntax"
0100 test_goodarg "${GOODREG}:${GOODTYPE}"
0101 test_badarg "${GOODREG}::${GOODTYPE}" "${GOODREG}:${BADTYPE}" \
0102         "${GOODTYPE}:${GOODREG}"
0103 
0104 : "Combination check"
0105 
0106 test_goodarg "\$comm:string" "+0(\$stack):string"
0107 test_badarg "\$comm:x64" "\$stack:string" "${GOODREG}:string"