xref: /linux/tools/testing/selftests/livepatch/test-sysfs.sh (revision bba2c3615bd6cfee7456d1130f2e6b01b3f4e9ba)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3# Copyright (C) 2022 Song Liu <song@kernel.org>
4
5. $(dirname $0)/functions.sh
6
7MOD_LIVEPATCH=test_klp_livepatch
8MOD_LIVEPATCH2=test_klp_callbacks_demo
9MOD_LIVEPATCH3=test_klp_syscall
10
11HAS_PATCH_ATTR=0
12HAS_REPLACE_ATTR=0
13HAS_STACK_ORDER_ATTR=0
14
15setup_config
16
17# - load a livepatch and verifies the sysfs entries work as expected
18
19start_test "sysfs test"
20
21load_lp $MOD_LIVEPATCH
22
23check_sysfs_rights "$MOD_LIVEPATCH" "" "drwxr-xr-x"
24check_sysfs_rights "$MOD_LIVEPATCH" "enabled" "-rw-r--r--"
25check_sysfs_value  "$MOD_LIVEPATCH" "enabled" "1"
26check_sysfs_rights "$MOD_LIVEPATCH" "force" "--w-------"
27check_sysfs_rights "$MOD_LIVEPATCH" "transition" "-r--r--r--"
28check_sysfs_value  "$MOD_LIVEPATCH" "transition" "0"
29
30if does_sysfs_exist "$MOD_LIVEPATCH/vmlinux" "patched"; then
31	check_sysfs_rights "$MOD_LIVEPATCH" "vmlinux/patched" "-r--r--r--"
32	check_sysfs_value  "$MOD_LIVEPATCH" "vmlinux/patched" "1"
33	HAS_PATCH_ATTR=1
34fi
35
36if does_sysfs_exist "$MOD_LIVEPATCH" "replace"; then
37	check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--"
38	HAS_REPLACE_ATTR=1
39fi
40
41if does_sysfs_exist "$MOD_LIVEPATCH" "stack_order"; then
42	check_sysfs_rights "$MOD_LIVEPATCH" "stack_order" "-r--r--r--"
43	check_sysfs_value  "$MOD_LIVEPATCH" "stack_order" "1"
44	HAS_STACK_ORDER_ATTR=1
45fi
46
47disable_lp $MOD_LIVEPATCH
48
49unload_lp $MOD_LIVEPATCH
50
51check_result "% insmod test_modules/$MOD_LIVEPATCH.ko
52livepatch: enabling patch '$MOD_LIVEPATCH'
53livepatch: '$MOD_LIVEPATCH': initializing patching transition
54livepatch: '$MOD_LIVEPATCH': starting patching transition
55livepatch: '$MOD_LIVEPATCH': completing patching transition
56livepatch: '$MOD_LIVEPATCH': patching complete
57% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled
58livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
59livepatch: '$MOD_LIVEPATCH': starting unpatching transition
60livepatch: '$MOD_LIVEPATCH': completing unpatching transition
61livepatch: '$MOD_LIVEPATCH': unpatching complete
62% rmmod $MOD_LIVEPATCH"
63
64if [[ "$HAS_PATCH_ATTR" == "1" ]]; then
65	start_test "sysfs test object/patched"
66
67	MOD_TARGET=test_klp_callbacks_mod
68	load_lp $MOD_LIVEPATCH2
69
70	# check the "patch" file changes as target module loads/unloads
71	check_sysfs_value  "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "0"
72	load_mod $MOD_TARGET
73	check_sysfs_value  "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "1"
74	unload_mod $MOD_TARGET
75	check_sysfs_value  "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "0"
76
77	disable_lp $MOD_LIVEPATCH2
78	unload_lp $MOD_LIVEPATCH2
79
80	check_result "% insmod test_modules/$MOD_LIVEPATCH2.ko
81livepatch: enabling patch '$MOD_LIVEPATCH2'
82livepatch: '$MOD_LIVEPATCH2': initializing patching transition
83$MOD_LIVEPATCH2: pre_patch_callback: vmlinux
84livepatch: '$MOD_LIVEPATCH2': starting patching transition
85livepatch: '$MOD_LIVEPATCH2': completing patching transition
86$MOD_LIVEPATCH2: post_patch_callback: vmlinux
87livepatch: '$MOD_LIVEPATCH2': patching complete
88% insmod test_modules/$MOD_TARGET.ko
89livepatch: applying patch '$MOD_LIVEPATCH2' to loading module '$MOD_TARGET'
90$MOD_LIVEPATCH2: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
91$MOD_LIVEPATCH2: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
92$MOD_TARGET: test_klp_callbacks_mod_init
93% rmmod $MOD_TARGET
94$MOD_TARGET: test_klp_callbacks_mod_exit
95$MOD_LIVEPATCH2: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
96livepatch: reverting patch '$MOD_LIVEPATCH2' on unloading module '$MOD_TARGET'
97$MOD_LIVEPATCH2: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
98% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH2/enabled
99livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition
100$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux
101livepatch: '$MOD_LIVEPATCH2': starting unpatching transition
102livepatch: '$MOD_LIVEPATCH2': completing unpatching transition
103$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux
104livepatch: '$MOD_LIVEPATCH2': unpatching complete
105% rmmod $MOD_LIVEPATCH2"
106fi
107
108if [[ "$HAS_REPLACE_ATTR" == "1" ]]; then
109	start_test "sysfs test replace enabled"
110
111	MOD_ATOMIC_REPLACE=test_klp_atomic_replace
112	load_lp $MOD_ATOMIC_REPLACE replace=1
113
114	check_sysfs_rights "$MOD_ATOMIC_REPLACE" "replace" "-r--r--r--"
115	check_sysfs_value  "$MOD_ATOMIC_REPLACE" "replace" "1"
116
117	disable_lp $MOD_ATOMIC_REPLACE
118	unload_lp $MOD_ATOMIC_REPLACE
119
120	check_result "% insmod test_modules/$MOD_ATOMIC_REPLACE.ko replace=1
121livepatch: enabling patch '$MOD_ATOMIC_REPLACE'
122livepatch: '$MOD_ATOMIC_REPLACE': initializing patching transition
123livepatch: '$MOD_ATOMIC_REPLACE': starting patching transition
124livepatch: '$MOD_ATOMIC_REPLACE': completing patching transition
125livepatch: '$MOD_ATOMIC_REPLACE': patching complete
126% echo 0 > $SYSFS_KLP_DIR/$MOD_ATOMIC_REPLACE/enabled
127livepatch: '$MOD_ATOMIC_REPLACE': initializing unpatching transition
128livepatch: '$MOD_ATOMIC_REPLACE': starting unpatching transition
129livepatch: '$MOD_ATOMIC_REPLACE': completing unpatching transition
130livepatch: '$MOD_ATOMIC_REPLACE': unpatching complete
131% rmmod $MOD_ATOMIC_REPLACE"
132
133	start_test "sysfs test replace disabled"
134
135	load_lp $MOD_ATOMIC_REPLACE replace=0
136
137	check_sysfs_rights "$MOD_ATOMIC_REPLACE" "replace" "-r--r--r--"
138	check_sysfs_value  "$MOD_ATOMIC_REPLACE" "replace" "0"
139
140	disable_lp $MOD_ATOMIC_REPLACE
141	unload_lp $MOD_ATOMIC_REPLACE
142
143	check_result "% insmod test_modules/$MOD_ATOMIC_REPLACE.ko replace=0
144livepatch: enabling patch '$MOD_ATOMIC_REPLACE'
145livepatch: '$MOD_ATOMIC_REPLACE': initializing patching transition
146livepatch: '$MOD_ATOMIC_REPLACE': starting patching transition
147livepatch: '$MOD_ATOMIC_REPLACE': completing patching transition
148livepatch: '$MOD_ATOMIC_REPLACE': patching complete
149% echo 0 > $SYSFS_KLP_DIR/$MOD_ATOMIC_REPLACE/enabled
150livepatch: '$MOD_ATOMIC_REPLACE': initializing unpatching transition
151livepatch: '$MOD_ATOMIC_REPLACE': starting unpatching transition
152livepatch: '$MOD_ATOMIC_REPLACE': completing unpatching transition
153livepatch: '$MOD_ATOMIC_REPLACE': unpatching complete
154% rmmod $MOD_ATOMIC_REPLACE"
155fi
156
157if [[ "$HAS_STACK_ORDER_ATTR" == "1" ]]; then
158	start_test "sysfs test stack_order value"
159
160	load_lp $MOD_LIVEPATCH
161
162	check_sysfs_value  "$MOD_LIVEPATCH" "stack_order" "1"
163
164	load_lp $MOD_LIVEPATCH2
165
166	check_sysfs_value  "$MOD_LIVEPATCH2" "stack_order" "2"
167
168	load_lp $MOD_LIVEPATCH3
169
170	check_sysfs_value  "$MOD_LIVEPATCH3" "stack_order" "3"
171
172	disable_lp $MOD_LIVEPATCH2
173	unload_lp $MOD_LIVEPATCH2
174
175	check_sysfs_value  "$MOD_LIVEPATCH" "stack_order" "1"
176	check_sysfs_value  "$MOD_LIVEPATCH3" "stack_order" "2"
177
178	disable_lp $MOD_LIVEPATCH3
179	unload_lp $MOD_LIVEPATCH3
180
181	disable_lp $MOD_LIVEPATCH
182	unload_lp $MOD_LIVEPATCH
183
184	check_result "% insmod test_modules/$MOD_LIVEPATCH.ko
185livepatch: enabling patch '$MOD_LIVEPATCH'
186livepatch: '$MOD_LIVEPATCH': initializing patching transition
187livepatch: '$MOD_LIVEPATCH': starting patching transition
188livepatch: '$MOD_LIVEPATCH': completing patching transition
189livepatch: '$MOD_LIVEPATCH': patching complete
190% insmod test_modules/$MOD_LIVEPATCH2.ko
191livepatch: enabling patch '$MOD_LIVEPATCH2'
192livepatch: '$MOD_LIVEPATCH2': initializing patching transition
193$MOD_LIVEPATCH2: pre_patch_callback: vmlinux
194livepatch: '$MOD_LIVEPATCH2': starting patching transition
195livepatch: '$MOD_LIVEPATCH2': completing patching transition
196$MOD_LIVEPATCH2: post_patch_callback: vmlinux
197livepatch: '$MOD_LIVEPATCH2': patching complete
198% insmod test_modules/$MOD_LIVEPATCH3.ko
199livepatch: enabling patch '$MOD_LIVEPATCH3'
200livepatch: '$MOD_LIVEPATCH3': initializing patching transition
201livepatch: '$MOD_LIVEPATCH3': starting patching transition
202livepatch: '$MOD_LIVEPATCH3': completing patching transition
203livepatch: '$MOD_LIVEPATCH3': patching complete
204% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH2/enabled
205livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition
206$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux
207livepatch: '$MOD_LIVEPATCH2': starting unpatching transition
208livepatch: '$MOD_LIVEPATCH2': completing unpatching transition
209$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux
210livepatch: '$MOD_LIVEPATCH2': unpatching complete
211% rmmod $MOD_LIVEPATCH2
212% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH3/enabled
213livepatch: '$MOD_LIVEPATCH3': initializing unpatching transition
214livepatch: '$MOD_LIVEPATCH3': starting unpatching transition
215livepatch: '$MOD_LIVEPATCH3': completing unpatching transition
216livepatch: '$MOD_LIVEPATCH3': unpatching complete
217% rmmod $MOD_LIVEPATCH3
218% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled
219livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
220livepatch: '$MOD_LIVEPATCH': starting unpatching transition
221livepatch: '$MOD_LIVEPATCH': completing unpatching transition
222livepatch: '$MOD_LIVEPATCH': unpatching complete
223% rmmod $MOD_LIVEPATCH"
224fi
225
226exit 0
227