116 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/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
 | |
| ;;
 | |
| mips*)
 | |
|   GOODREG=%r4
 | |
|   BADREG=%r12
 | |
| ;;
 | |
| loongarch*)
 | |
|   GOODREG=%r4
 | |
|   BADREG=%r12
 | |
| ;;
 | |
| riscv*)
 | |
|   GOODREG=%a0
 | |
|   BADREG=%a8
 | |
| ;;
 | |
| *)
 | |
|   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"
 |