133549Sjkh#!/bin/sh
233549Sjkh# SPDX-License-Identifier: GPL-2.0
3330449Seadler# description: Kprobe event parser error log check
4330449Seadler# requires: kprobe_events error_log
5330449Seadler
62892Sdfrcheck_error() { # command-with-error-pos-by-^
72892Sdfr    ftrace_errlog_check 'trace_kprobe' "$1" 'kprobe_events'
82892Sdfr}
92892Sdfr
102892Sdfrif grep -q 'r\[maxactive\]' README; then
112892Sdfrcheck_error 'p^100 vfs_read'		# BAD_MAXACT_TYPE
122892Sdfrcheck_error 'r^1a111 vfs_read'		# BAD_MAXACT
132892Sdfrcheck_error 'r^100000 vfs_read'		# MAXACT_TOO_BIG
142892Sdfrfi
152892Sdfr
162892Sdfrcheck_error 'p ^non_exist_func'		# BAD_PROBE_ADDR (enoent)
172892Sdfrcheck_error 'p ^hoge-fuga'		# BAD_PROBE_ADDR (bad syntax)
182892Sdfrcheck_error 'p ^hoge+1000-1000'		# BAD_PROBE_ADDR (bad syntax)
192892Sdfrcheck_error 'r ^vfs_read+10'		# BAD_RETPROBE
202892Sdfrcheck_error 'p:^/bar vfs_read'		# NO_GROUP_NAME
212892Sdfrcheck_error 'p:^12345678901234567890123456789012345678901234567890123456789012345/bar vfs_read'	# GROUP_TOO_LONG
222892Sdfr
232892Sdfrcheck_error 'p:^foo.1/bar vfs_read'	# BAD_GROUP_NAME
242892Sdfrcheck_error 'p:^ vfs_read'		# NO_EVENT_NAME
252892Sdfrcheck_error 'p:foo/^12345678901234567890123456789012345678901234567890123456789012345 vfs_read'	# EVENT_TOO_LONG
262892Sdfrcheck_error 'p:foo/^bar.1 vfs_read'	# BAD_EVENT_NAME
272892Sdfr
282892Sdfrcheck_error 'p vfs_read ^$retval'	# RETVAL_ON_PROBE
292892Sdfrcheck_error 'p vfs_read ^$stack10000'	# BAD_STACK_NUM
302892Sdfr
312892Sdfrif grep -q '$arg<N>' README; then
322892Sdfrcheck_error 'p vfs_read ^$arg10000'	# BAD_ARG_NUM
332892Sdfrfi
342892Sdfr
352892Sdfrcheck_error 'p vfs_read ^$none_var'	# BAD_VAR
3615771Swollman
3750476Spetercheck_error 'p vfs_read ^%none_reg'	# BAD_REG_NAME
382892Sdfrcheck_error 'p vfs_read ^@12345678abcde'	# BAD_MEM_ADDR
392892Sdfrcheck_error 'p vfs_read ^@+10'		# FILE_ON_KPROBE
402892Sdfr
412892Sdfrgrep -q "imm-value" README && \
422892Sdfrcheck_error 'p vfs_read arg1=\^x'	# BAD_IMM
43120492Sfjoegrep -q "imm-string" README && \
44121363Strhodescheck_error 'p vfs_read arg1=\"abcd^'	# IMMSTR_NO_CLOSE
45121429Strhodes
4623335Sbdecheck_error 'p vfs_read ^+0@0)'		# DEREF_NEED_BRACE
472892Sdfrcheck_error 'p vfs_read ^+0ab1(@0)'	# BAD_DEREF_OFFS
482892Sdfrcheck_error 'p vfs_read +0(+0(@0^)'	# DEREF_OPEN_BRACE
49340953Seugen
502892Sdfrif grep -A1 "fetcharg:" README | grep -q '\$comm' ; then
5133761Sachecheck_error 'p vfs_read +0(^$comm)'	# COMM_CANT_DEREF
522892Sdfrfi
532892Sdfr
5455613Sachecheck_error 'p vfs_read ^&1'		# BAD_FETCH_ARG
5555613Sache
562892Sdfr
572892Sdfr# We've introduced this limitation with array support
5815771Swollmanif grep -q ' <type>\\\[<array-size>\\\]' README; then
592892Sdfrcheck_error 'p vfs_read +0(^+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(@0))))))))))))))'	# TOO_MANY_OPS?
60121429Strhodescheck_error 'p vfs_read +0(@11):u8[10^'		# ARRAY_NO_CLOSE
612892Sdfrcheck_error 'p vfs_read +0(@11):u8[10]^a'	# BAD_ARRAY_SUFFIX
622892Sdfrcheck_error 'p vfs_read +0(@11):u8[^10a]'	# BAD_ARRAY_NUM
6392882Simpcheck_error 'p vfs_read +0(@11):u8[^256]'	# ARRAY_TOO_BIG
6492882Simpfi
6592882Simp
6692882Simpcheck_error 'p vfs_read @11:^unknown_type'	# BAD_TYPE
67152809Savatarcheck_error 'p vfs_read $stack0:^string'	# BAD_STRING
682892Sdfrcheck_error 'p vfs_read @11:^b10@a/16'		# BAD_BITFIELD
692892Sdfr
70121373Strhodescheck_error 'p vfs_read ^arg123456789012345678901234567890=@11'	# ARG_NAME_TOO_LOG
712892Sdfrcheck_error 'p vfs_read ^=@11'			# NO_ARG_NAME
72152416Smaximcheck_error 'p vfs_read ^var.1=@11'		# BAD_ARG_NAME
73152416Smaximcheck_error 'p vfs_read var1=@11 ^var1=@12'	# USED_ARG_NAME
742892Sdfrcheck_error 'p vfs_read ^+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(@1234))))))'	# ARG_TOO_LONG
75247856Sjkimcheck_error 'p vfs_read arg1=^'			# NO_ARG_BODY
76120492Sfjoe
77152362Srodrigc# instruction boundary check is valid on x86 (at this moment)
78166326Srodrigccase $(uname -m) in
79152362Srodrigc  x86_64|i[3456]86)
80152362Srodrigc    echo 'p vfs_read' > kprobe_events
81152362Srodrigc    if grep -q FTRACE ../kprobes/list ; then
82152362Srodrigc	check_error 'p ^vfs_read+3'		# BAD_INSN_BNDRY (only if function-tracer is enabled)
83152362Srodrigc    fi
842892Sdfr    ;;
85247856Sjkimesac
862892Sdfr
87152731Savatar# multiprobe errors
882892Sdfrif grep -q "Create/append/" README && grep -q "imm-value" README; then
8933549Sjkhecho "p:kprobes/testevent $FUNCTION_FORK" > kprobe_events
90152362Srodrigccheck_error '^r:kprobes/testevent do_exit'	# DIFF_PROBE_TYPE
9133549Sjkh
9233549Sjkh# Explicitly use printf "%s" to not interpret \1
93152362Srodrigcprintf "%s" "p:kprobes/testevent $FUNCTION_FORK abcd=\\1" > kprobe_events
9433549Sjkhcheck_error "p:kprobes/testevent $FUNCTION_FORK ^bcd=\\1"	# DIFF_ARG_TYPE
9533549Sjkhcheck_error "p:kprobes/testevent $FUNCTION_FORK ^abcd=\\1:u8"	# DIFF_ARG_TYPE
96152731Savatarcheck_error "p:kprobes/testevent $FUNCTION_FORK ^abcd=\\\"foo\"" # DIFF_ARG_TYPE
9733549Sjkhcheck_error "^p:kprobes/testevent $FUNCTION_FORK abcd=\\1"	# SAME_PROBE
982892Sdfrfi
99152362Srodrigc
1002892Sdfr# %return suffix errors
1012892Sdfrif grep -q "place (kretprobe): .*%return.*" README; then
1022892Sdfrcheck_error 'p vfs_read^%hoge'		# BAD_ADDR_SUFFIX
103152362Srodrigccheck_error 'p ^vfs_read+10%return'	# BAD_RETPROBE
1042892Sdfrfi
1052892Sdfr
1062892Sdfr# BTF arguments errors
107152362Srodrigcif grep -q "<argname>" README; then
1082892Sdfrcheck_error 'p vfs_read args=^$arg*'		# BAD_VAR_ARGS
1092892Sdfrcheck_error 'p vfs_read +0(^$arg*)'		# BAD_VAR_ARGS
110118837Strhodescheck_error 'p vfs_read $arg* ^$arg*'		# DOUBLE_ARGS
111152362Srodrigcif !grep -q 'kernel return probes support:' README; then
112118837Strhodescheck_error 'r vfs_read ^$arg*'			# NOFENTRY_ARGS
113118837Strhodesfi
114152362Srodrigccheck_error 'p vfs_read+8 ^$arg*'		# NOFENTRY_ARGS
115152362Srodrigccheck_error 'p vfs_read ^hoge'			# NO_BTFARG
116120492Sfjoecheck_error 'p kfree ^$arg10'			# NO_BTFARG (exceed the number of parameters)
117120492Sfjoecheck_error 'r kfree ^$retval'			# NO_RETVAL
118120492Sfjoeelse
119120492Sfjoecheck_error 'p vfs_read ^$arg*'			# NOSUP_BTFARG
120120492Sfjoefi
121152362Srodrigc
122152362Srodrigcexit 0
123152974Savatar