xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/livepatch/functions.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/bash
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker# Copyright (C) 2018 Joe Lawrence <[email protected]>
4*053f45beSAndroid Build Coastguard Worker
5*053f45beSAndroid Build Coastguard Worker# Shell functions for the rest of the scripts.
6*053f45beSAndroid Build Coastguard Worker
7*053f45beSAndroid Build Coastguard WorkerMAX_RETRIES=600
8*053f45beSAndroid Build Coastguard WorkerRETRY_INTERVAL=".1"	# seconds
9*053f45beSAndroid Build Coastguard WorkerKLP_SYSFS_DIR="/sys/kernel/livepatch"
10*053f45beSAndroid Build Coastguard Worker
11*053f45beSAndroid Build Coastguard Worker# Kselftest framework requirement - SKIP code is 4
12*053f45beSAndroid Build Coastguard Workerksft_skip=4
13*053f45beSAndroid Build Coastguard Worker
14*053f45beSAndroid Build Coastguard Worker# log(msg) - write message to kernel log
15*053f45beSAndroid Build Coastguard Worker#	msg - insightful words
16*053f45beSAndroid Build Coastguard Workerfunction log() {
17*053f45beSAndroid Build Coastguard Worker	echo "$1" > /dev/kmsg
18*053f45beSAndroid Build Coastguard Worker}
19*053f45beSAndroid Build Coastguard Worker
20*053f45beSAndroid Build Coastguard Worker# skip(msg) - testing can't proceed
21*053f45beSAndroid Build Coastguard Worker#	msg - explanation
22*053f45beSAndroid Build Coastguard Workerfunction skip() {
23*053f45beSAndroid Build Coastguard Worker	log "SKIP: $1"
24*053f45beSAndroid Build Coastguard Worker	echo "SKIP: $1" >&2
25*053f45beSAndroid Build Coastguard Worker	exit $ksft_skip
26*053f45beSAndroid Build Coastguard Worker}
27*053f45beSAndroid Build Coastguard Worker
28*053f45beSAndroid Build Coastguard Worker# root test
29*053f45beSAndroid Build Coastguard Workerfunction is_root() {
30*053f45beSAndroid Build Coastguard Worker	uid=$(id -u)
31*053f45beSAndroid Build Coastguard Worker	if [ $uid -ne 0 ]; then
32*053f45beSAndroid Build Coastguard Worker		echo "skip all tests: must be run as root" >&2
33*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
34*053f45beSAndroid Build Coastguard Worker	fi
35*053f45beSAndroid Build Coastguard Worker}
36*053f45beSAndroid Build Coastguard Worker
37*053f45beSAndroid Build Coastguard Worker# die(msg) - game over, man
38*053f45beSAndroid Build Coastguard Worker#	msg - dying words
39*053f45beSAndroid Build Coastguard Workerfunction die() {
40*053f45beSAndroid Build Coastguard Worker	log "ERROR: $1"
41*053f45beSAndroid Build Coastguard Worker	echo "ERROR: $1" >&2
42*053f45beSAndroid Build Coastguard Worker	exit 1
43*053f45beSAndroid Build Coastguard Worker}
44*053f45beSAndroid Build Coastguard Worker
45*053f45beSAndroid Build Coastguard Worker# save existing dmesg so we can detect new content
46*053f45beSAndroid Build Coastguard Workerfunction save_dmesg() {
47*053f45beSAndroid Build Coastguard Worker	SAVED_DMESG=$(mktemp --tmpdir -t klp-dmesg-XXXXXX)
48*053f45beSAndroid Build Coastguard Worker	dmesg > "$SAVED_DMESG"
49*053f45beSAndroid Build Coastguard Worker}
50*053f45beSAndroid Build Coastguard Worker
51*053f45beSAndroid Build Coastguard Worker# cleanup temporary dmesg file from save_dmesg()
52*053f45beSAndroid Build Coastguard Workerfunction cleanup_dmesg_file() {
53*053f45beSAndroid Build Coastguard Worker	rm -f "$SAVED_DMESG"
54*053f45beSAndroid Build Coastguard Worker}
55*053f45beSAndroid Build Coastguard Worker
56*053f45beSAndroid Build Coastguard Workerfunction push_config() {
57*053f45beSAndroid Build Coastguard Worker	DYNAMIC_DEBUG=$(grep '^kernel/livepatch' /sys/kernel/debug/dynamic_debug/control | \
58*053f45beSAndroid Build Coastguard Worker			awk -F'[: ]' '{print "file " $1 " line " $2 " " $4}')
59*053f45beSAndroid Build Coastguard Worker	FTRACE_ENABLED=$(sysctl --values kernel.ftrace_enabled)
60*053f45beSAndroid Build Coastguard Worker}
61*053f45beSAndroid Build Coastguard Worker
62*053f45beSAndroid Build Coastguard Workerfunction pop_config() {
63*053f45beSAndroid Build Coastguard Worker	if [[ -n "$DYNAMIC_DEBUG" ]]; then
64*053f45beSAndroid Build Coastguard Worker		echo -n "$DYNAMIC_DEBUG" > /sys/kernel/debug/dynamic_debug/control
65*053f45beSAndroid Build Coastguard Worker	fi
66*053f45beSAndroid Build Coastguard Worker	if [[ -n "$FTRACE_ENABLED" ]]; then
67*053f45beSAndroid Build Coastguard Worker		sysctl kernel.ftrace_enabled="$FTRACE_ENABLED" &> /dev/null
68*053f45beSAndroid Build Coastguard Worker	fi
69*053f45beSAndroid Build Coastguard Worker}
70*053f45beSAndroid Build Coastguard Worker
71*053f45beSAndroid Build Coastguard Workerfunction set_dynamic_debug() {
72*053f45beSAndroid Build Coastguard Worker        cat <<-EOF > /sys/kernel/debug/dynamic_debug/control
73*053f45beSAndroid Build Coastguard Worker		file kernel/livepatch/* +p
74*053f45beSAndroid Build Coastguard Worker		func klp_try_switch_task -p
75*053f45beSAndroid Build Coastguard Worker		EOF
76*053f45beSAndroid Build Coastguard Worker}
77*053f45beSAndroid Build Coastguard Worker
78*053f45beSAndroid Build Coastguard Workerfunction set_ftrace_enabled() {
79*053f45beSAndroid Build Coastguard Worker	local can_fail=0
80*053f45beSAndroid Build Coastguard Worker	if [[ "$1" == "--fail" ]] ; then
81*053f45beSAndroid Build Coastguard Worker		can_fail=1
82*053f45beSAndroid Build Coastguard Worker		shift
83*053f45beSAndroid Build Coastguard Worker	fi
84*053f45beSAndroid Build Coastguard Worker
85*053f45beSAndroid Build Coastguard Worker	local err=$(sysctl -q kernel.ftrace_enabled="$1" 2>&1)
86*053f45beSAndroid Build Coastguard Worker	local result=$(sysctl --values kernel.ftrace_enabled)
87*053f45beSAndroid Build Coastguard Worker
88*053f45beSAndroid Build Coastguard Worker	if [[ "$result" != "$1" ]] ; then
89*053f45beSAndroid Build Coastguard Worker		if [[ $can_fail -eq 1 ]] ; then
90*053f45beSAndroid Build Coastguard Worker			echo "livepatch: $err" | sed 's#/proc/sys/kernel/#kernel.#' > /dev/kmsg
91*053f45beSAndroid Build Coastguard Worker			return
92*053f45beSAndroid Build Coastguard Worker		fi
93*053f45beSAndroid Build Coastguard Worker
94*053f45beSAndroid Build Coastguard Worker		skip "failed to set kernel.ftrace_enabled = $1"
95*053f45beSAndroid Build Coastguard Worker	fi
96*053f45beSAndroid Build Coastguard Worker
97*053f45beSAndroid Build Coastguard Worker	echo "livepatch: kernel.ftrace_enabled = $result" > /dev/kmsg
98*053f45beSAndroid Build Coastguard Worker}
99*053f45beSAndroid Build Coastguard Worker
100*053f45beSAndroid Build Coastguard Workerfunction cleanup() {
101*053f45beSAndroid Build Coastguard Worker	pop_config
102*053f45beSAndroid Build Coastguard Worker	cleanup_dmesg_file
103*053f45beSAndroid Build Coastguard Worker}
104*053f45beSAndroid Build Coastguard Worker
105*053f45beSAndroid Build Coastguard Worker# setup_config - save the current config and set a script exit trap that
106*053f45beSAndroid Build Coastguard Worker#		 restores the original config.  Setup the dynamic debug
107*053f45beSAndroid Build Coastguard Worker#		 for verbose livepatching output and turn on
108*053f45beSAndroid Build Coastguard Worker#		 the ftrace_enabled sysctl.
109*053f45beSAndroid Build Coastguard Workerfunction setup_config() {
110*053f45beSAndroid Build Coastguard Worker	is_root
111*053f45beSAndroid Build Coastguard Worker	push_config
112*053f45beSAndroid Build Coastguard Worker	set_dynamic_debug
113*053f45beSAndroid Build Coastguard Worker	set_ftrace_enabled 1
114*053f45beSAndroid Build Coastguard Worker	trap cleanup EXIT INT TERM HUP
115*053f45beSAndroid Build Coastguard Worker}
116*053f45beSAndroid Build Coastguard Worker
117*053f45beSAndroid Build Coastguard Worker# loop_until(cmd) - loop a command until it is successful or $MAX_RETRIES,
118*053f45beSAndroid Build Coastguard Worker#		    sleep $RETRY_INTERVAL between attempts
119*053f45beSAndroid Build Coastguard Worker#	cmd - command and its arguments to run
120*053f45beSAndroid Build Coastguard Workerfunction loop_until() {
121*053f45beSAndroid Build Coastguard Worker	local cmd="$*"
122*053f45beSAndroid Build Coastguard Worker	local i=0
123*053f45beSAndroid Build Coastguard Worker	while true; do
124*053f45beSAndroid Build Coastguard Worker		eval "$cmd" && return 0
125*053f45beSAndroid Build Coastguard Worker		[[ $((i++)) -eq $MAX_RETRIES ]] && return 1
126*053f45beSAndroid Build Coastguard Worker		sleep $RETRY_INTERVAL
127*053f45beSAndroid Build Coastguard Worker	done
128*053f45beSAndroid Build Coastguard Worker}
129*053f45beSAndroid Build Coastguard Worker
130*053f45beSAndroid Build Coastguard Workerfunction assert_mod() {
131*053f45beSAndroid Build Coastguard Worker	local mod="$1"
132*053f45beSAndroid Build Coastguard Worker
133*053f45beSAndroid Build Coastguard Worker	modprobe --dry-run "$mod" &>/dev/null
134*053f45beSAndroid Build Coastguard Worker}
135*053f45beSAndroid Build Coastguard Worker
136*053f45beSAndroid Build Coastguard Workerfunction is_livepatch_mod() {
137*053f45beSAndroid Build Coastguard Worker	local mod="$1"
138*053f45beSAndroid Build Coastguard Worker
139*053f45beSAndroid Build Coastguard Worker	if [[ $(modinfo "$mod" | awk '/^livepatch:/{print $NF}') == "Y" ]]; then
140*053f45beSAndroid Build Coastguard Worker		return 0
141*053f45beSAndroid Build Coastguard Worker	fi
142*053f45beSAndroid Build Coastguard Worker
143*053f45beSAndroid Build Coastguard Worker	return 1
144*053f45beSAndroid Build Coastguard Worker}
145*053f45beSAndroid Build Coastguard Worker
146*053f45beSAndroid Build Coastguard Workerfunction __load_mod() {
147*053f45beSAndroid Build Coastguard Worker	local mod="$1"; shift
148*053f45beSAndroid Build Coastguard Worker
149*053f45beSAndroid Build Coastguard Worker	local msg="% modprobe $mod $*"
150*053f45beSAndroid Build Coastguard Worker	log "${msg%% }"
151*053f45beSAndroid Build Coastguard Worker	ret=$(modprobe "$mod" "$@" 2>&1)
152*053f45beSAndroid Build Coastguard Worker	if [[ "$ret" != "" ]]; then
153*053f45beSAndroid Build Coastguard Worker		die "$ret"
154*053f45beSAndroid Build Coastguard Worker	fi
155*053f45beSAndroid Build Coastguard Worker
156*053f45beSAndroid Build Coastguard Worker	# Wait for module in sysfs ...
157*053f45beSAndroid Build Coastguard Worker	loop_until '[[ -e "/sys/module/$mod" ]]' ||
158*053f45beSAndroid Build Coastguard Worker		die "failed to load module $mod"
159*053f45beSAndroid Build Coastguard Worker}
160*053f45beSAndroid Build Coastguard Worker
161*053f45beSAndroid Build Coastguard Worker
162*053f45beSAndroid Build Coastguard Worker# load_mod(modname, params) - load a kernel module
163*053f45beSAndroid Build Coastguard Worker#	modname - module name to load
164*053f45beSAndroid Build Coastguard Worker#	params  - module parameters to pass to modprobe
165*053f45beSAndroid Build Coastguard Workerfunction load_mod() {
166*053f45beSAndroid Build Coastguard Worker	local mod="$1"; shift
167*053f45beSAndroid Build Coastguard Worker
168*053f45beSAndroid Build Coastguard Worker	assert_mod "$mod" ||
169*053f45beSAndroid Build Coastguard Worker		skip "unable to load module ${mod}, verify CONFIG_TEST_LIVEPATCH=m and run self-tests as root"
170*053f45beSAndroid Build Coastguard Worker
171*053f45beSAndroid Build Coastguard Worker	is_livepatch_mod "$mod" &&
172*053f45beSAndroid Build Coastguard Worker		die "use load_lp() to load the livepatch module $mod"
173*053f45beSAndroid Build Coastguard Worker
174*053f45beSAndroid Build Coastguard Worker	__load_mod "$mod" "$@"
175*053f45beSAndroid Build Coastguard Worker}
176*053f45beSAndroid Build Coastguard Worker
177*053f45beSAndroid Build Coastguard Worker# load_lp_nowait(modname, params) - load a kernel module with a livepatch
178*053f45beSAndroid Build Coastguard Worker#			but do not wait on until the transition finishes
179*053f45beSAndroid Build Coastguard Worker#	modname - module name to load
180*053f45beSAndroid Build Coastguard Worker#	params  - module parameters to pass to modprobe
181*053f45beSAndroid Build Coastguard Workerfunction load_lp_nowait() {
182*053f45beSAndroid Build Coastguard Worker	local mod="$1"; shift
183*053f45beSAndroid Build Coastguard Worker
184*053f45beSAndroid Build Coastguard Worker	assert_mod "$mod" ||
185*053f45beSAndroid Build Coastguard Worker		skip "unable to load module ${mod}, verify CONFIG_TEST_LIVEPATCH=m and run self-tests as root"
186*053f45beSAndroid Build Coastguard Worker
187*053f45beSAndroid Build Coastguard Worker	is_livepatch_mod "$mod" ||
188*053f45beSAndroid Build Coastguard Worker		die "module $mod is not a livepatch"
189*053f45beSAndroid Build Coastguard Worker
190*053f45beSAndroid Build Coastguard Worker	__load_mod "$mod" "$@"
191*053f45beSAndroid Build Coastguard Worker
192*053f45beSAndroid Build Coastguard Worker	# Wait for livepatch in sysfs ...
193*053f45beSAndroid Build Coastguard Worker	loop_until '[[ -e "/sys/kernel/livepatch/$mod" ]]' ||
194*053f45beSAndroid Build Coastguard Worker		die "failed to load module $mod (sysfs)"
195*053f45beSAndroid Build Coastguard Worker}
196*053f45beSAndroid Build Coastguard Worker
197*053f45beSAndroid Build Coastguard Worker# load_lp(modname, params) - load a kernel module with a livepatch
198*053f45beSAndroid Build Coastguard Worker#	modname - module name to load
199*053f45beSAndroid Build Coastguard Worker#	params  - module parameters to pass to modprobe
200*053f45beSAndroid Build Coastguard Workerfunction load_lp() {
201*053f45beSAndroid Build Coastguard Worker	local mod="$1"; shift
202*053f45beSAndroid Build Coastguard Worker
203*053f45beSAndroid Build Coastguard Worker	load_lp_nowait "$mod" "$@"
204*053f45beSAndroid Build Coastguard Worker
205*053f45beSAndroid Build Coastguard Worker	# Wait until the transition finishes ...
206*053f45beSAndroid Build Coastguard Worker	loop_until 'grep -q '^0$' /sys/kernel/livepatch/$mod/transition' ||
207*053f45beSAndroid Build Coastguard Worker		die "failed to complete transition"
208*053f45beSAndroid Build Coastguard Worker}
209*053f45beSAndroid Build Coastguard Worker
210*053f45beSAndroid Build Coastguard Worker# load_failing_mod(modname, params) - load a kernel module, expect to fail
211*053f45beSAndroid Build Coastguard Worker#	modname - module name to load
212*053f45beSAndroid Build Coastguard Worker#	params  - module parameters to pass to modprobe
213*053f45beSAndroid Build Coastguard Workerfunction load_failing_mod() {
214*053f45beSAndroid Build Coastguard Worker	local mod="$1"; shift
215*053f45beSAndroid Build Coastguard Worker
216*053f45beSAndroid Build Coastguard Worker	local msg="% modprobe $mod $*"
217*053f45beSAndroid Build Coastguard Worker	log "${msg%% }"
218*053f45beSAndroid Build Coastguard Worker	ret=$(modprobe "$mod" "$@" 2>&1)
219*053f45beSAndroid Build Coastguard Worker	if [[ "$ret" == "" ]]; then
220*053f45beSAndroid Build Coastguard Worker		die "$mod unexpectedly loaded"
221*053f45beSAndroid Build Coastguard Worker	fi
222*053f45beSAndroid Build Coastguard Worker	log "$ret"
223*053f45beSAndroid Build Coastguard Worker}
224*053f45beSAndroid Build Coastguard Worker
225*053f45beSAndroid Build Coastguard Worker# unload_mod(modname) - unload a kernel module
226*053f45beSAndroid Build Coastguard Worker#	modname - module name to unload
227*053f45beSAndroid Build Coastguard Workerfunction unload_mod() {
228*053f45beSAndroid Build Coastguard Worker	local mod="$1"
229*053f45beSAndroid Build Coastguard Worker
230*053f45beSAndroid Build Coastguard Worker	# Wait for module reference count to clear ...
231*053f45beSAndroid Build Coastguard Worker	loop_until '[[ $(cat "/sys/module/$mod/refcnt") == "0" ]]' ||
232*053f45beSAndroid Build Coastguard Worker		die "failed to unload module $mod (refcnt)"
233*053f45beSAndroid Build Coastguard Worker
234*053f45beSAndroid Build Coastguard Worker	log "% rmmod $mod"
235*053f45beSAndroid Build Coastguard Worker	ret=$(rmmod "$mod" 2>&1)
236*053f45beSAndroid Build Coastguard Worker	if [[ "$ret" != "" ]]; then
237*053f45beSAndroid Build Coastguard Worker		die "$ret"
238*053f45beSAndroid Build Coastguard Worker	fi
239*053f45beSAndroid Build Coastguard Worker
240*053f45beSAndroid Build Coastguard Worker	# Wait for module in sysfs ...
241*053f45beSAndroid Build Coastguard Worker	loop_until '[[ ! -e "/sys/module/$mod" ]]' ||
242*053f45beSAndroid Build Coastguard Worker		die "failed to unload module $mod (/sys/module)"
243*053f45beSAndroid Build Coastguard Worker}
244*053f45beSAndroid Build Coastguard Worker
245*053f45beSAndroid Build Coastguard Worker# unload_lp(modname) - unload a kernel module with a livepatch
246*053f45beSAndroid Build Coastguard Worker#	modname - module name to unload
247*053f45beSAndroid Build Coastguard Workerfunction unload_lp() {
248*053f45beSAndroid Build Coastguard Worker	unload_mod "$1"
249*053f45beSAndroid Build Coastguard Worker}
250*053f45beSAndroid Build Coastguard Worker
251*053f45beSAndroid Build Coastguard Worker# disable_lp(modname) - disable a livepatch
252*053f45beSAndroid Build Coastguard Worker#	modname - module name to unload
253*053f45beSAndroid Build Coastguard Workerfunction disable_lp() {
254*053f45beSAndroid Build Coastguard Worker	local mod="$1"
255*053f45beSAndroid Build Coastguard Worker
256*053f45beSAndroid Build Coastguard Worker	log "% echo 0 > /sys/kernel/livepatch/$mod/enabled"
257*053f45beSAndroid Build Coastguard Worker	echo 0 > /sys/kernel/livepatch/"$mod"/enabled
258*053f45beSAndroid Build Coastguard Worker
259*053f45beSAndroid Build Coastguard Worker	# Wait until the transition finishes and the livepatch gets
260*053f45beSAndroid Build Coastguard Worker	# removed from sysfs...
261*053f45beSAndroid Build Coastguard Worker	loop_until '[[ ! -e "/sys/kernel/livepatch/$mod" ]]' ||
262*053f45beSAndroid Build Coastguard Worker		die "failed to disable livepatch $mod"
263*053f45beSAndroid Build Coastguard Worker}
264*053f45beSAndroid Build Coastguard Worker
265*053f45beSAndroid Build Coastguard Worker# set_pre_patch_ret(modname, pre_patch_ret)
266*053f45beSAndroid Build Coastguard Worker#	modname - module name to set
267*053f45beSAndroid Build Coastguard Worker#	pre_patch_ret - new pre_patch_ret value
268*053f45beSAndroid Build Coastguard Workerfunction set_pre_patch_ret {
269*053f45beSAndroid Build Coastguard Worker	local mod="$1"; shift
270*053f45beSAndroid Build Coastguard Worker	local ret="$1"
271*053f45beSAndroid Build Coastguard Worker
272*053f45beSAndroid Build Coastguard Worker	log "% echo $ret > /sys/module/$mod/parameters/pre_patch_ret"
273*053f45beSAndroid Build Coastguard Worker	echo "$ret" > /sys/module/"$mod"/parameters/pre_patch_ret
274*053f45beSAndroid Build Coastguard Worker
275*053f45beSAndroid Build Coastguard Worker	# Wait for sysfs value to hold ...
276*053f45beSAndroid Build Coastguard Worker	loop_until '[[ $(cat "/sys/module/$mod/parameters/pre_patch_ret") == "$ret" ]]' ||
277*053f45beSAndroid Build Coastguard Worker		die "failed to set pre_patch_ret parameter for $mod module"
278*053f45beSAndroid Build Coastguard Worker}
279*053f45beSAndroid Build Coastguard Worker
280*053f45beSAndroid Build Coastguard Workerfunction start_test {
281*053f45beSAndroid Build Coastguard Worker	local test="$1"
282*053f45beSAndroid Build Coastguard Worker
283*053f45beSAndroid Build Coastguard Worker	save_dmesg
284*053f45beSAndroid Build Coastguard Worker	echo -n "TEST: $test ... "
285*053f45beSAndroid Build Coastguard Worker	log "===== TEST: $test ====="
286*053f45beSAndroid Build Coastguard Worker}
287*053f45beSAndroid Build Coastguard Worker
288*053f45beSAndroid Build Coastguard Worker# check_result() - verify dmesg output
289*053f45beSAndroid Build Coastguard Worker#	TODO - better filter, out of order msgs, etc?
290*053f45beSAndroid Build Coastguard Workerfunction check_result {
291*053f45beSAndroid Build Coastguard Worker	local expect="$*"
292*053f45beSAndroid Build Coastguard Worker	local result
293*053f45beSAndroid Build Coastguard Worker
294*053f45beSAndroid Build Coastguard Worker	# Note: when comparing dmesg output, the kernel log timestamps
295*053f45beSAndroid Build Coastguard Worker	# help differentiate repeated testing runs.  Remove them with a
296*053f45beSAndroid Build Coastguard Worker	# post-comparison sed filter.
297*053f45beSAndroid Build Coastguard Worker
298*053f45beSAndroid Build Coastguard Worker	result=$(dmesg | comm --nocheck-order -13 "$SAVED_DMESG" - | \
299*053f45beSAndroid Build Coastguard Worker		 grep -e 'livepatch:' -e 'test_klp' | \
300*053f45beSAndroid Build Coastguard Worker		 grep -v '\(tainting\|taints\) kernel' | \
301*053f45beSAndroid Build Coastguard Worker		 sed 's/^\[[ 0-9.]*\] //')
302*053f45beSAndroid Build Coastguard Worker
303*053f45beSAndroid Build Coastguard Worker	if [[ "$expect" == "$result" ]] ; then
304*053f45beSAndroid Build Coastguard Worker		echo "ok"
305*053f45beSAndroid Build Coastguard Worker	else
306*053f45beSAndroid Build Coastguard Worker		echo -e "not ok\n\n$(diff -upr --label expected --label result <(echo "$expect") <(echo "$result"))\n"
307*053f45beSAndroid Build Coastguard Worker		die "livepatch kselftest(s) failed"
308*053f45beSAndroid Build Coastguard Worker	fi
309*053f45beSAndroid Build Coastguard Worker
310*053f45beSAndroid Build Coastguard Worker	cleanup_dmesg_file
311*053f45beSAndroid Build Coastguard Worker}
312*053f45beSAndroid Build Coastguard Worker
313*053f45beSAndroid Build Coastguard Worker# check_sysfs_rights(modname, rel_path, expected_rights) - check sysfs
314*053f45beSAndroid Build Coastguard Worker# path permissions
315*053f45beSAndroid Build Coastguard Worker#	modname - livepatch module creating the sysfs interface
316*053f45beSAndroid Build Coastguard Worker#	rel_path - relative path of the sysfs interface
317*053f45beSAndroid Build Coastguard Worker#	expected_rights - expected access rights
318*053f45beSAndroid Build Coastguard Workerfunction check_sysfs_rights() {
319*053f45beSAndroid Build Coastguard Worker	local mod="$1"; shift
320*053f45beSAndroid Build Coastguard Worker	local rel_path="$1"; shift
321*053f45beSAndroid Build Coastguard Worker	local expected_rights="$1"; shift
322*053f45beSAndroid Build Coastguard Worker
323*053f45beSAndroid Build Coastguard Worker	local path="$KLP_SYSFS_DIR/$mod/$rel_path"
324*053f45beSAndroid Build Coastguard Worker	local rights=$(/bin/stat --format '%A' "$path")
325*053f45beSAndroid Build Coastguard Worker	if test "$rights" != "$expected_rights" ; then
326*053f45beSAndroid Build Coastguard Worker		die "Unexpected access rights of $path: $expected_rights vs. $rights"
327*053f45beSAndroid Build Coastguard Worker	fi
328*053f45beSAndroid Build Coastguard Worker}
329*053f45beSAndroid Build Coastguard Worker
330*053f45beSAndroid Build Coastguard Worker# check_sysfs_value(modname, rel_path, expected_value) - check sysfs value
331*053f45beSAndroid Build Coastguard Worker#	modname - livepatch module creating the sysfs interface
332*053f45beSAndroid Build Coastguard Worker#	rel_path - relative path of the sysfs interface
333*053f45beSAndroid Build Coastguard Worker#	expected_value - expected value read from the file
334*053f45beSAndroid Build Coastguard Workerfunction check_sysfs_value() {
335*053f45beSAndroid Build Coastguard Worker	local mod="$1"; shift
336*053f45beSAndroid Build Coastguard Worker	local rel_path="$1"; shift
337*053f45beSAndroid Build Coastguard Worker	local expected_value="$1"; shift
338*053f45beSAndroid Build Coastguard Worker
339*053f45beSAndroid Build Coastguard Worker	local path="$KLP_SYSFS_DIR/$mod/$rel_path"
340*053f45beSAndroid Build Coastguard Worker	local value=`cat $path`
341*053f45beSAndroid Build Coastguard Worker	if test "$value" != "$expected_value" ; then
342*053f45beSAndroid Build Coastguard Worker		die "Unexpected value in $path: $expected_value vs. $value"
343*053f45beSAndroid Build Coastguard Worker	fi
344*053f45beSAndroid Build Coastguard Worker}
345