Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / tools / testing / selftests / livepatch / test-livepatch.sh
blob6673023d2b669b962db45294fdc25bc3c17baaa6
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com>
5 . $(dirname $0)/functions.sh
7 MOD_LIVEPATCH1=test_klp_livepatch
8 MOD_LIVEPATCH2=test_klp_syscall
9 MOD_LIVEPATCH3=test_klp_callbacks_demo
10 MOD_REPLACE=test_klp_atomic_replace
12 setup_config
15 # - load a livepatch that modifies the output from /proc/cmdline and
16 # verify correct behavior
17 # - unload the livepatch and make sure the patch was removed
19 start_test "basic function patching"
21 load_lp $MOD_LIVEPATCH1
23 if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH1: this has been live patched" ]] ; then
24 echo -e "FAIL\n\n"
25 die "livepatch kselftest(s) failed"
28 disable_lp $MOD_LIVEPATCH1
29 unload_lp $MOD_LIVEPATCH1
31 if [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH1: this has been live patched" ]] ; then
32 echo -e "FAIL\n\n"
33 die "livepatch kselftest(s) failed"
36 check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko
37 livepatch: enabling patch '$MOD_LIVEPATCH1'
38 livepatch: '$MOD_LIVEPATCH1': initializing patching transition
39 livepatch: '$MOD_LIVEPATCH1': starting patching transition
40 livepatch: '$MOD_LIVEPATCH1': completing patching transition
41 livepatch: '$MOD_LIVEPATCH1': patching complete
42 % echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH1/enabled
43 livepatch: '$MOD_LIVEPATCH1': initializing unpatching transition
44 livepatch: '$MOD_LIVEPATCH1': starting unpatching transition
45 livepatch: '$MOD_LIVEPATCH1': completing unpatching transition
46 livepatch: '$MOD_LIVEPATCH1': unpatching complete
47 % rmmod $MOD_LIVEPATCH1"
50 # - load a livepatch that modifies the output from /proc/cmdline and
51 # verify correct behavior
52 # - load another livepatch and verify that both livepatches are active
53 # - unload the second livepatch and verify that the first is still active
54 # - unload the first livepatch and verify none are active
56 start_test "multiple livepatches"
58 load_lp $MOD_LIVEPATCH1
60 grep 'live patched' /proc/cmdline > /dev/kmsg
61 grep 'live patched' /proc/meminfo > /dev/kmsg
63 load_lp $MOD_REPLACE replace=0
65 grep 'live patched' /proc/cmdline > /dev/kmsg
66 grep 'live patched' /proc/meminfo > /dev/kmsg
68 disable_lp $MOD_REPLACE
69 unload_lp $MOD_REPLACE
71 grep 'live patched' /proc/cmdline > /dev/kmsg
72 grep 'live patched' /proc/meminfo > /dev/kmsg
74 disable_lp $MOD_LIVEPATCH1
75 unload_lp $MOD_LIVEPATCH1
77 grep 'live patched' /proc/cmdline > /dev/kmsg
78 grep 'live patched' /proc/meminfo > /dev/kmsg
80 check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko
81 livepatch: enabling patch '$MOD_LIVEPATCH1'
82 livepatch: '$MOD_LIVEPATCH1': initializing patching transition
83 livepatch: '$MOD_LIVEPATCH1': starting patching transition
84 livepatch: '$MOD_LIVEPATCH1': completing patching transition
85 livepatch: '$MOD_LIVEPATCH1': patching complete
86 $MOD_LIVEPATCH1: this has been live patched
87 % insmod test_modules/$MOD_REPLACE.ko replace=0
88 livepatch: enabling patch '$MOD_REPLACE'
89 livepatch: '$MOD_REPLACE': initializing patching transition
90 livepatch: '$MOD_REPLACE': starting patching transition
91 livepatch: '$MOD_REPLACE': completing patching transition
92 livepatch: '$MOD_REPLACE': patching complete
93 $MOD_LIVEPATCH1: this has been live patched
94 $MOD_REPLACE: this has been live patched
95 % echo 0 > $SYSFS_KLP_DIR/$MOD_REPLACE/enabled
96 livepatch: '$MOD_REPLACE': initializing unpatching transition
97 livepatch: '$MOD_REPLACE': starting unpatching transition
98 livepatch: '$MOD_REPLACE': completing unpatching transition
99 livepatch: '$MOD_REPLACE': unpatching complete
100 % rmmod $MOD_REPLACE
101 $MOD_LIVEPATCH1: this has been live patched
102 % echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH1/enabled
103 livepatch: '$MOD_LIVEPATCH1': initializing unpatching transition
104 livepatch: '$MOD_LIVEPATCH1': starting unpatching transition
105 livepatch: '$MOD_LIVEPATCH1': completing unpatching transition
106 livepatch: '$MOD_LIVEPATCH1': unpatching complete
107 % rmmod $MOD_LIVEPATCH1"
110 # - load a livepatch that modifies the output from /proc/cmdline and
111 # verify correct behavior
112 # - load two additional livepatches and check the number of livepatch modules
113 # applied
114 # - load an atomic replace livepatch and check that the other three modules were
115 # disabled
116 # - remove all livepatches besides the atomic replace one and verify that the
117 # atomic replace livepatch is still active
118 # - remove the atomic replace livepatch and verify that none are active
120 start_test "atomic replace livepatch"
122 load_lp $MOD_LIVEPATCH1
124 grep 'live patched' /proc/cmdline > /dev/kmsg
125 grep 'live patched' /proc/meminfo > /dev/kmsg
127 for mod in $MOD_LIVEPATCH2 $MOD_LIVEPATCH3; do
128 load_lp "$mod"
129 done
131 mods=($SYSFS_KLP_DIR/*)
132 nmods=${#mods[@]}
133 if [ "$nmods" -ne 3 ]; then
134 die "Expecting three modules listed, found $nmods"
137 load_lp $MOD_REPLACE replace=1
139 grep 'live patched' /proc/cmdline > /dev/kmsg
140 grep 'live patched' /proc/meminfo > /dev/kmsg
142 loop_until 'mods=($SYSFS_KLP_DIR/*); nmods=${#mods[@]}; [[ "$nmods" -eq 1 ]]' ||
143 die "Expecting only one moduled listed, found $nmods"
145 # These modules were disabled by the atomic replace
146 for mod in $MOD_LIVEPATCH3 $MOD_LIVEPATCH2 $MOD_LIVEPATCH1; do
147 unload_lp "$mod"
148 done
150 grep 'live patched' /proc/cmdline > /dev/kmsg
151 grep 'live patched' /proc/meminfo > /dev/kmsg
153 disable_lp $MOD_REPLACE
154 unload_lp $MOD_REPLACE
156 grep 'live patched' /proc/cmdline > /dev/kmsg
157 grep 'live patched' /proc/meminfo > /dev/kmsg
159 check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko
160 livepatch: enabling patch '$MOD_LIVEPATCH1'
161 livepatch: '$MOD_LIVEPATCH1': initializing patching transition
162 livepatch: '$MOD_LIVEPATCH1': starting patching transition
163 livepatch: '$MOD_LIVEPATCH1': completing patching transition
164 livepatch: '$MOD_LIVEPATCH1': patching complete
165 $MOD_LIVEPATCH1: this has been live patched
166 % insmod test_modules/$MOD_LIVEPATCH2.ko
167 livepatch: enabling patch '$MOD_LIVEPATCH2'
168 livepatch: '$MOD_LIVEPATCH2': initializing patching transition
169 livepatch: '$MOD_LIVEPATCH2': starting patching transition
170 livepatch: '$MOD_LIVEPATCH2': completing patching transition
171 livepatch: '$MOD_LIVEPATCH2': patching complete
172 % insmod test_modules/$MOD_LIVEPATCH3.ko
173 livepatch: enabling patch '$MOD_LIVEPATCH3'
174 livepatch: '$MOD_LIVEPATCH3': initializing patching transition
175 $MOD_LIVEPATCH3: pre_patch_callback: vmlinux
176 livepatch: '$MOD_LIVEPATCH3': starting patching transition
177 livepatch: '$MOD_LIVEPATCH3': completing patching transition
178 $MOD_LIVEPATCH3: post_patch_callback: vmlinux
179 livepatch: '$MOD_LIVEPATCH3': patching complete
180 % insmod test_modules/$MOD_REPLACE.ko replace=1
181 livepatch: enabling patch '$MOD_REPLACE'
182 livepatch: '$MOD_REPLACE': initializing patching transition
183 livepatch: '$MOD_REPLACE': starting patching transition
184 livepatch: '$MOD_REPLACE': completing patching transition
185 livepatch: '$MOD_REPLACE': patching complete
186 $MOD_REPLACE: this has been live patched
187 % rmmod $MOD_LIVEPATCH3
188 % rmmod $MOD_LIVEPATCH2
189 % rmmod $MOD_LIVEPATCH1
190 $MOD_REPLACE: this has been live patched
191 % echo 0 > $SYSFS_KLP_DIR/$MOD_REPLACE/enabled
192 livepatch: '$MOD_REPLACE': initializing unpatching transition
193 livepatch: '$MOD_REPLACE': starting unpatching transition
194 livepatch: '$MOD_REPLACE': completing unpatching transition
195 livepatch: '$MOD_REPLACE': unpatching complete
196 % rmmod $MOD_REPLACE"
199 exit 0