livepatch: Selftests of the API for tracking system state changes
[platform/kernel/linux-rpi.git] / tools / testing / selftests / livepatch / test-state.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2019 SUSE
4
5 . $(dirname $0)/functions.sh
6
7 MOD_LIVEPATCH=test_klp_state
8 MOD_LIVEPATCH2=test_klp_state2
9 MOD_LIVEPATCH3=test_klp_state3
10
11 set_dynamic_debug
12
13
14 # TEST: Loading and removing a module that modifies the system state
15
16 echo -n "TEST: system state modification ... "
17 dmesg -C
18
19 load_lp $MOD_LIVEPATCH
20 disable_lp $MOD_LIVEPATCH
21 unload_lp $MOD_LIVEPATCH
22
23 check_result "% modprobe $MOD_LIVEPATCH
24 livepatch: enabling patch '$MOD_LIVEPATCH'
25 livepatch: '$MOD_LIVEPATCH': initializing patching transition
26 $MOD_LIVEPATCH: pre_patch_callback: vmlinux
27 $MOD_LIVEPATCH: allocate_loglevel_state: allocating space to store console_loglevel
28 livepatch: '$MOD_LIVEPATCH': starting patching transition
29 livepatch: '$MOD_LIVEPATCH': completing patching transition
30 $MOD_LIVEPATCH: post_patch_callback: vmlinux
31 $MOD_LIVEPATCH: fix_console_loglevel: fixing console_loglevel
32 livepatch: '$MOD_LIVEPATCH': patching complete
33 % echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
34 livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
35 $MOD_LIVEPATCH: pre_unpatch_callback: vmlinux
36 $MOD_LIVEPATCH: restore_console_loglevel: restoring console_loglevel
37 livepatch: '$MOD_LIVEPATCH': starting unpatching transition
38 livepatch: '$MOD_LIVEPATCH': completing unpatching transition
39 $MOD_LIVEPATCH: post_unpatch_callback: vmlinux
40 $MOD_LIVEPATCH: free_loglevel_state: freeing space for the stored console_loglevel
41 livepatch: '$MOD_LIVEPATCH': unpatching complete
42 % rmmod $MOD_LIVEPATCH"
43
44
45 # TEST: Take over system state change by a cumulative patch
46
47 echo -n "TEST: taking over system state modification ... "
48 dmesg -C
49
50 load_lp $MOD_LIVEPATCH
51 load_lp $MOD_LIVEPATCH2
52 unload_lp $MOD_LIVEPATCH
53 disable_lp $MOD_LIVEPATCH2
54 unload_lp $MOD_LIVEPATCH2
55
56 check_result "% modprobe $MOD_LIVEPATCH
57 livepatch: enabling patch '$MOD_LIVEPATCH'
58 livepatch: '$MOD_LIVEPATCH': initializing patching transition
59 $MOD_LIVEPATCH: pre_patch_callback: vmlinux
60 $MOD_LIVEPATCH: allocate_loglevel_state: allocating space to store console_loglevel
61 livepatch: '$MOD_LIVEPATCH': starting patching transition
62 livepatch: '$MOD_LIVEPATCH': completing patching transition
63 $MOD_LIVEPATCH: post_patch_callback: vmlinux
64 $MOD_LIVEPATCH: fix_console_loglevel: fixing console_loglevel
65 livepatch: '$MOD_LIVEPATCH': patching complete
66 % modprobe $MOD_LIVEPATCH2
67 livepatch: enabling patch '$MOD_LIVEPATCH2'
68 livepatch: '$MOD_LIVEPATCH2': initializing patching transition
69 $MOD_LIVEPATCH2: pre_patch_callback: vmlinux
70 $MOD_LIVEPATCH2: allocate_loglevel_state: space to store console_loglevel already allocated
71 livepatch: '$MOD_LIVEPATCH2': starting patching transition
72 livepatch: '$MOD_LIVEPATCH2': completing patching transition
73 $MOD_LIVEPATCH2: post_patch_callback: vmlinux
74 $MOD_LIVEPATCH2: fix_console_loglevel: taking over the console_loglevel change
75 livepatch: '$MOD_LIVEPATCH2': patching complete
76 % rmmod $MOD_LIVEPATCH
77 % echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled
78 livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition
79 $MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux
80 $MOD_LIVEPATCH2: restore_console_loglevel: restoring console_loglevel
81 livepatch: '$MOD_LIVEPATCH2': starting unpatching transition
82 livepatch: '$MOD_LIVEPATCH2': completing unpatching transition
83 $MOD_LIVEPATCH2: post_unpatch_callback: vmlinux
84 $MOD_LIVEPATCH2: free_loglevel_state: freeing space for the stored console_loglevel
85 livepatch: '$MOD_LIVEPATCH2': unpatching complete
86 % rmmod $MOD_LIVEPATCH2"
87
88
89 # TEST: Take over system state change by a cumulative patch
90
91 echo -n "TEST: compatible cumulative livepatches ... "
92 dmesg -C
93
94 load_lp $MOD_LIVEPATCH2
95 load_lp $MOD_LIVEPATCH3
96 unload_lp $MOD_LIVEPATCH2
97 load_lp $MOD_LIVEPATCH2
98 disable_lp $MOD_LIVEPATCH2
99 unload_lp $MOD_LIVEPATCH2
100 unload_lp $MOD_LIVEPATCH3
101
102 check_result "% modprobe $MOD_LIVEPATCH2
103 livepatch: enabling patch '$MOD_LIVEPATCH2'
104 livepatch: '$MOD_LIVEPATCH2': initializing patching transition
105 $MOD_LIVEPATCH2: pre_patch_callback: vmlinux
106 $MOD_LIVEPATCH2: allocate_loglevel_state: allocating space to store console_loglevel
107 livepatch: '$MOD_LIVEPATCH2': starting patching transition
108 livepatch: '$MOD_LIVEPATCH2': completing patching transition
109 $MOD_LIVEPATCH2: post_patch_callback: vmlinux
110 $MOD_LIVEPATCH2: fix_console_loglevel: fixing console_loglevel
111 livepatch: '$MOD_LIVEPATCH2': patching complete
112 % modprobe $MOD_LIVEPATCH3
113 livepatch: enabling patch '$MOD_LIVEPATCH3'
114 livepatch: '$MOD_LIVEPATCH3': initializing patching transition
115 $MOD_LIVEPATCH3: pre_patch_callback: vmlinux
116 $MOD_LIVEPATCH3: allocate_loglevel_state: space to store console_loglevel already allocated
117 livepatch: '$MOD_LIVEPATCH3': starting patching transition
118 livepatch: '$MOD_LIVEPATCH3': completing patching transition
119 $MOD_LIVEPATCH3: post_patch_callback: vmlinux
120 $MOD_LIVEPATCH3: fix_console_loglevel: taking over the console_loglevel change
121 livepatch: '$MOD_LIVEPATCH3': patching complete
122 % rmmod $MOD_LIVEPATCH2
123 % modprobe $MOD_LIVEPATCH2
124 livepatch: enabling patch '$MOD_LIVEPATCH2'
125 livepatch: '$MOD_LIVEPATCH2': initializing patching transition
126 $MOD_LIVEPATCH2: pre_patch_callback: vmlinux
127 $MOD_LIVEPATCH2: allocate_loglevel_state: space to store console_loglevel already allocated
128 livepatch: '$MOD_LIVEPATCH2': starting patching transition
129 livepatch: '$MOD_LIVEPATCH2': completing patching transition
130 $MOD_LIVEPATCH2: post_patch_callback: vmlinux
131 $MOD_LIVEPATCH2: fix_console_loglevel: taking over the console_loglevel change
132 livepatch: '$MOD_LIVEPATCH2': patching complete
133 % echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled
134 livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition
135 $MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux
136 $MOD_LIVEPATCH2: restore_console_loglevel: restoring console_loglevel
137 livepatch: '$MOD_LIVEPATCH2': starting unpatching transition
138 livepatch: '$MOD_LIVEPATCH2': completing unpatching transition
139 $MOD_LIVEPATCH2: post_unpatch_callback: vmlinux
140 $MOD_LIVEPATCH2: free_loglevel_state: freeing space for the stored console_loglevel
141 livepatch: '$MOD_LIVEPATCH2': unpatching complete
142 % rmmod $MOD_LIVEPATCH2
143 % rmmod $MOD_LIVEPATCH3"
144
145
146 # TEST: Failure caused by incompatible cumulative livepatches
147
148 echo -n "TEST: incompatible cumulative livepatches ... "
149 dmesg -C
150
151 load_lp $MOD_LIVEPATCH2
152 load_failing_mod $MOD_LIVEPATCH
153 disable_lp $MOD_LIVEPATCH2
154 unload_lp $MOD_LIVEPATCH2
155
156 check_result "% modprobe $MOD_LIVEPATCH2
157 livepatch: enabling patch '$MOD_LIVEPATCH2'
158 livepatch: '$MOD_LIVEPATCH2': initializing patching transition
159 $MOD_LIVEPATCH2: pre_patch_callback: vmlinux
160 $MOD_LIVEPATCH2: allocate_loglevel_state: allocating space to store console_loglevel
161 livepatch: '$MOD_LIVEPATCH2': starting patching transition
162 livepatch: '$MOD_LIVEPATCH2': completing patching transition
163 $MOD_LIVEPATCH2: post_patch_callback: vmlinux
164 $MOD_LIVEPATCH2: fix_console_loglevel: fixing console_loglevel
165 livepatch: '$MOD_LIVEPATCH2': patching complete
166 % modprobe $MOD_LIVEPATCH
167 livepatch: Livepatch patch ($MOD_LIVEPATCH) is not compatible with the already installed livepatches.
168 modprobe: ERROR: could not insert '$MOD_LIVEPATCH': Invalid argument
169 % echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled
170 livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition
171 $MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux
172 $MOD_LIVEPATCH2: restore_console_loglevel: restoring console_loglevel
173 livepatch: '$MOD_LIVEPATCH2': starting unpatching transition
174 livepatch: '$MOD_LIVEPATCH2': completing unpatching transition
175 $MOD_LIVEPATCH2: post_unpatch_callback: vmlinux
176 $MOD_LIVEPATCH2: free_loglevel_state: freeing space for the stored console_loglevel
177 livepatch: '$MOD_LIVEPATCH2': unpatching complete
178 % rmmod $MOD_LIVEPATCH2"
179
180 exit 0