1a2818ee4SJoe Lawrence#!/bin/bash
2a2818ee4SJoe Lawrence# SPDX-License-Identifier: GPL-2.0
3a2818ee4SJoe Lawrence# Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com>
4a2818ee4SJoe Lawrence
5a2818ee4SJoe Lawrence. $(dirname $0)/functions.sh
6a2818ee4SJoe Lawrence
7a2818ee4SJoe LawrenceMOD_LIVEPATCH=test_klp_callbacks_demo
8a2818ee4SJoe LawrenceMOD_LIVEPATCH2=test_klp_callbacks_demo2
9a2818ee4SJoe LawrenceMOD_TARGET=test_klp_callbacks_mod
10a2818ee4SJoe LawrenceMOD_TARGET_BUSY=test_klp_callbacks_busy
11a2818ee4SJoe Lawrence
12a2818ee4SJoe Lawrenceset_dynamic_debug
13a2818ee4SJoe Lawrence
14a2818ee4SJoe Lawrence
15a2818ee4SJoe Lawrence# TEST: target module before livepatch
16a2818ee4SJoe Lawrence#
17a2818ee4SJoe Lawrence# Test a combination of loading a kernel module and a livepatch that
18a2818ee4SJoe Lawrence# patches a function in the first module.  Load the target module
19a2818ee4SJoe Lawrence# before the livepatch module.  Unload them in the same order.
20a2818ee4SJoe Lawrence#
21a2818ee4SJoe Lawrence# - On livepatch enable, before the livepatch transition starts,
22a2818ee4SJoe Lawrence#   pre-patch callbacks are executed for vmlinux and $MOD_TARGET (those
23a2818ee4SJoe Lawrence#   klp_objects currently loaded).  After klp_objects are patched
24a2818ee4SJoe Lawrence#   according to the klp_patch, their post-patch callbacks run and the
25a2818ee4SJoe Lawrence#   transition completes.
26a2818ee4SJoe Lawrence#
27a2818ee4SJoe Lawrence# - Similarly, on livepatch disable, pre-patch callbacks run before the
28a2818ee4SJoe Lawrence#   unpatching transition starts.  klp_objects are reverted, post-patch
29a2818ee4SJoe Lawrence#   callbacks execute and the transition completes.
30a2818ee4SJoe Lawrence
31a2818ee4SJoe Lawrenceecho -n "TEST: target module before livepatch ... "
32a2818ee4SJoe Lawrencedmesg -C
33a2818ee4SJoe Lawrence
34a2818ee4SJoe Lawrenceload_mod $MOD_TARGET
35a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH
36a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH
37a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH
38a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET
39a2818ee4SJoe Lawrence
40a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_TARGET
41a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init
42a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH
43a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
44a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
45a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux
46a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state
47a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition
48a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition
49a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux
50a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state
51a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete
52a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
53a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition
54a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux
55a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state
56a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition
57a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition
58a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux
59a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state
60a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete
61a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH
62a2818ee4SJoe Lawrence% rmmod $MOD_TARGET
63a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit"
64a2818ee4SJoe Lawrence
65a2818ee4SJoe Lawrence
66a2818ee4SJoe Lawrence# TEST: module_coming notifier
67a2818ee4SJoe Lawrence#
68a2818ee4SJoe Lawrence# This test is similar to the previous test, but (un)load the livepatch
69a2818ee4SJoe Lawrence# module before the target kernel module.  This tests the livepatch
70a2818ee4SJoe Lawrence# core's module_coming handler.
71a2818ee4SJoe Lawrence#
72a2818ee4SJoe Lawrence# - On livepatch enable, only pre/post-patch callbacks are executed for
73a2818ee4SJoe Lawrence#   currently loaded klp_objects, in this case, vmlinux.
74a2818ee4SJoe Lawrence#
75a2818ee4SJoe Lawrence# - When a targeted module is subsequently loaded, only its
76a2818ee4SJoe Lawrence#   pre/post-patch callbacks are executed.
77a2818ee4SJoe Lawrence#
78a2818ee4SJoe Lawrence# - On livepatch disable, all currently loaded klp_objects' (vmlinux and
79a2818ee4SJoe Lawrence#   $MOD_TARGET) pre/post-unpatch callbacks are executed.
80a2818ee4SJoe Lawrence
81a2818ee4SJoe Lawrenceecho -n "TEST: module_coming notifier ... "
82a2818ee4SJoe Lawrencedmesg -C
83a2818ee4SJoe Lawrence
84a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH
85a2818ee4SJoe Lawrenceload_mod $MOD_TARGET
86a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH
87a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH
88a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET
89a2818ee4SJoe Lawrence
90a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH
91a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
92a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
93a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux
94a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition
95a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition
96a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux
97a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete
98a2818ee4SJoe Lawrence% modprobe $MOD_TARGET
99a2818ee4SJoe Lawrencelivepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET'
100a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
101a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
102a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init
103a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
104a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition
105a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux
106a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state
107a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition
108a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition
109a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux
110a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state
111a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete
112a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH
113a2818ee4SJoe Lawrence% rmmod $MOD_TARGET
114a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit"
115a2818ee4SJoe Lawrence
116a2818ee4SJoe Lawrence
117a2818ee4SJoe Lawrence# TEST: module_going notifier
118a2818ee4SJoe Lawrence#
119a2818ee4SJoe Lawrence# Test loading the livepatch after a targeted kernel module, then unload
120a2818ee4SJoe Lawrence# the kernel module before disabling the livepatch.  This tests the
121a2818ee4SJoe Lawrence# livepatch core's module_going handler.
122a2818ee4SJoe Lawrence#
123a2818ee4SJoe Lawrence# - First load a target module, then the livepatch.
124a2818ee4SJoe Lawrence#
125a2818ee4SJoe Lawrence# - When a target module is unloaded, the livepatch is only reverted
126a2818ee4SJoe Lawrence#   from that klp_object ($MOD_TARGET).  As such, only its pre and
127a2818ee4SJoe Lawrence#   post-unpatch callbacks are executed when this occurs.
128a2818ee4SJoe Lawrence#
129a2818ee4SJoe Lawrence# - When the livepatch is disabled, pre and post-unpatch callbacks are
130a2818ee4SJoe Lawrence#   run for the remaining klp_object, vmlinux.
131a2818ee4SJoe Lawrence
132a2818ee4SJoe Lawrenceecho -n "TEST: module_going notifier ... "
133a2818ee4SJoe Lawrencedmesg -C
134a2818ee4SJoe Lawrence
135a2818ee4SJoe Lawrenceload_mod $MOD_TARGET
136a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH
137a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET
138a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH
139a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH
140a2818ee4SJoe Lawrence
141a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_TARGET
142a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init
143a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH
144a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
145a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
146a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux
147a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state
148a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition
149a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition
150a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux
151a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state
152a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete
153a2818ee4SJoe Lawrence% rmmod $MOD_TARGET
154a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit
155a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
156a2818ee4SJoe Lawrencelivepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET'
157a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
158a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
159a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition
160a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux
161a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition
162a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition
163a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux
164a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete
165a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH"
166a2818ee4SJoe Lawrence
167a2818ee4SJoe Lawrence
168a2818ee4SJoe Lawrence# TEST: module_coming and module_going notifiers
169a2818ee4SJoe Lawrence#
170a2818ee4SJoe Lawrence# This test is similar to the previous test, however the livepatch is
171a2818ee4SJoe Lawrence# loaded first.  This tests the livepatch core's module_coming and
172a2818ee4SJoe Lawrence# module_going handlers.
173a2818ee4SJoe Lawrence#
174a2818ee4SJoe Lawrence# - First load the livepatch.
175a2818ee4SJoe Lawrence#
176a2818ee4SJoe Lawrence# - When a targeted kernel module is subsequently loaded, only its
177a2818ee4SJoe Lawrence#   pre/post-patch callbacks are executed.
178a2818ee4SJoe Lawrence#
179a2818ee4SJoe Lawrence# - When the target module is unloaded, the livepatch is only reverted
180a2818ee4SJoe Lawrence#   from the $MOD_TARGET klp_object.  As such, only pre and
181a2818ee4SJoe Lawrence#   post-unpatch callbacks are executed when this occurs.
182a2818ee4SJoe Lawrence
183a2818ee4SJoe Lawrenceecho -n "TEST: module_coming and module_going notifiers ... "
184a2818ee4SJoe Lawrencedmesg -C
185a2818ee4SJoe Lawrence
186a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH
187a2818ee4SJoe Lawrenceload_mod $MOD_TARGET
188a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET
189a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH
190a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH
191a2818ee4SJoe Lawrence
192a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH
193a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
194a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
195a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux
196a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition
197a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition
198a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux
199a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete
200a2818ee4SJoe Lawrence% modprobe $MOD_TARGET
201a2818ee4SJoe Lawrencelivepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET'
202a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
203a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
204a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init
205a2818ee4SJoe Lawrence% rmmod $MOD_TARGET
206a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit
207a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
208a2818ee4SJoe Lawrencelivepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET'
209a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
210a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
211a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition
212a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux
213a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition
214a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition
215a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux
216a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete
217a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH"
218a2818ee4SJoe Lawrence
219a2818ee4SJoe Lawrence
220a2818ee4SJoe Lawrence# TEST: target module not present
221a2818ee4SJoe Lawrence#
222a2818ee4SJoe Lawrence# A simple test of loading a livepatch without one of its patch target
223a2818ee4SJoe Lawrence# klp_objects ever loaded ($MOD_TARGET).
224a2818ee4SJoe Lawrence#
225a2818ee4SJoe Lawrence# - Load the livepatch.
226a2818ee4SJoe Lawrence#
227a2818ee4SJoe Lawrence# - As expected, only pre/post-(un)patch handlers are executed for
228a2818ee4SJoe Lawrence#   vmlinux.
229a2818ee4SJoe Lawrence
230a2818ee4SJoe Lawrenceecho -n "TEST: target module not present ... "
231a2818ee4SJoe Lawrencedmesg -C
232a2818ee4SJoe Lawrence
233a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH
234a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH
235a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH
236a2818ee4SJoe Lawrence
237a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH
238a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
239a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
240a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux
241a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition
242a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition
243a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux
244a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete
245a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
246a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition
247a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux
248a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition
249a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition
250a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux
251a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete
252a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH"
253a2818ee4SJoe Lawrence
254a2818ee4SJoe Lawrence
255a2818ee4SJoe Lawrence# TEST: pre-patch callback -ENODEV
256a2818ee4SJoe Lawrence#
257a2818ee4SJoe Lawrence# Test a scenario where a vmlinux pre-patch callback returns a non-zero
258a2818ee4SJoe Lawrence# status (ie, failure).
259a2818ee4SJoe Lawrence#
260a2818ee4SJoe Lawrence# - First load a target module.
261a2818ee4SJoe Lawrence#
262a2818ee4SJoe Lawrence# - Load the livepatch module, setting its 'pre_patch_ret' value to -19
263a2818ee4SJoe Lawrence#   (-ENODEV).  When its vmlinux pre-patch callback executes, this
264a2818ee4SJoe Lawrence#   status code will propagate back to the module-loading subsystem.
265a2818ee4SJoe Lawrence#   The result is that the insmod command refuses to load the livepatch
266a2818ee4SJoe Lawrence#   module.
267a2818ee4SJoe Lawrence
268a2818ee4SJoe Lawrenceecho -n "TEST: pre-patch callback -ENODEV ... "
269a2818ee4SJoe Lawrencedmesg -C
270a2818ee4SJoe Lawrence
271a2818ee4SJoe Lawrenceload_mod $MOD_TARGET
272a2818ee4SJoe Lawrenceload_failing_mod $MOD_LIVEPATCH pre_patch_ret=-19
273a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET
274a2818ee4SJoe Lawrence
275a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_TARGET
276a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init
277a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH pre_patch_ret=-19
278a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
279a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
280a2818ee4SJoe Lawrencetest_klp_callbacks_demo: pre_patch_callback: vmlinux
281a2818ee4SJoe Lawrencelivepatch: pre-patch callback failed for object 'vmlinux'
282a2818ee4SJoe Lawrencelivepatch: failed to enable patch '$MOD_LIVEPATCH'
283a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': canceling patching transition, going to unpatch
284a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition
285a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete
286a2818ee4SJoe Lawrencemodprobe: ERROR: could not insert '$MOD_LIVEPATCH': No such device
287a2818ee4SJoe Lawrence% rmmod $MOD_TARGET
288a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit"
289a2818ee4SJoe Lawrence
290a2818ee4SJoe Lawrence
291a2818ee4SJoe Lawrence# TEST: module_coming + pre-patch callback -ENODEV
292a2818ee4SJoe Lawrence#
293a2818ee4SJoe Lawrence# Similar to the previous test, setup a livepatch such that its vmlinux
294a2818ee4SJoe Lawrence# pre-patch callback returns success.  However, when a targeted kernel
295a2818ee4SJoe Lawrence# module is later loaded, have the livepatch return a failing status
296a2818ee4SJoe Lawrence# code.
297a2818ee4SJoe Lawrence#
298a2818ee4SJoe Lawrence# - Load the livepatch, vmlinux pre-patch callback succeeds.
299a2818ee4SJoe Lawrence#
300a2818ee4SJoe Lawrence# - Set a trap so subsequent pre-patch callbacks to this livepatch will
301a2818ee4SJoe Lawrence#   return -ENODEV.
302a2818ee4SJoe Lawrence#
303a2818ee4SJoe Lawrence# - The livepatch pre-patch callback for subsequently loaded target
304a2818ee4SJoe Lawrence#   modules will return failure, so the module loader refuses to load
305a2818ee4SJoe Lawrence#   the kernel module.  No post-patch or pre/post-unpatch callbacks are
306a2818ee4SJoe Lawrence#   executed for this klp_object.
307a2818ee4SJoe Lawrence#
308a2818ee4SJoe Lawrence# - Pre/post-unpatch callbacks are run for the vmlinux klp_object.
309a2818ee4SJoe Lawrence
310a2818ee4SJoe Lawrenceecho -n "TEST: module_coming + pre-patch callback -ENODEV ... "
311a2818ee4SJoe Lawrencedmesg -C
312a2818ee4SJoe Lawrence
313a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH
314a2818ee4SJoe Lawrenceset_pre_patch_ret $MOD_LIVEPATCH -19
315a2818ee4SJoe Lawrenceload_failing_mod $MOD_TARGET
316a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH
317a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH
318a2818ee4SJoe Lawrence
319a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH
320a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
321a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
322a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux
323a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition
324a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition
325a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux
326a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete
327a2818ee4SJoe Lawrence% echo -19 > /sys/module/$MOD_LIVEPATCH/parameters/pre_patch_ret
328a2818ee4SJoe Lawrence% modprobe $MOD_TARGET
329a2818ee4SJoe Lawrencelivepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET'
330a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
331a2818ee4SJoe Lawrencelivepatch: pre-patch callback failed for object '$MOD_TARGET'
332a2818ee4SJoe Lawrencelivepatch: patch '$MOD_LIVEPATCH' failed for module '$MOD_TARGET', refusing to load module '$MOD_TARGET'
333a2818ee4SJoe Lawrencemodprobe: ERROR: could not insert '$MOD_TARGET': No such device
334a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
335a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition
336a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux
337a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition
338a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition
339a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux
340a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete
341a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH"
342a2818ee4SJoe Lawrence
343a2818ee4SJoe Lawrence
344a2818ee4SJoe Lawrence# TEST: multiple target modules
345a2818ee4SJoe Lawrence#
346a2818ee4SJoe Lawrence# Test loading multiple targeted kernel modules.  This test-case is
347a2818ee4SJoe Lawrence# mainly for comparing with the next test-case.
348a2818ee4SJoe Lawrence#
349a2818ee4SJoe Lawrence# - Load a target "busy" kernel module which kicks off a worker function
350a2818ee4SJoe Lawrence#   that immediately exits.
351a2818ee4SJoe Lawrence#
352a2818ee4SJoe Lawrence# - Proceed with loading the livepatch and another ordinary target
353a2818ee4SJoe Lawrence#   module.  Post-patch callbacks are executed and the transition
354a2818ee4SJoe Lawrence#   completes quickly.
355a2818ee4SJoe Lawrence
356a2818ee4SJoe Lawrenceecho -n "TEST: multiple target modules ... "
357a2818ee4SJoe Lawrencedmesg -C
358a2818ee4SJoe Lawrence
359a2818ee4SJoe Lawrenceload_mod $MOD_TARGET_BUSY sleep_secs=0
360a2818ee4SJoe Lawrence# give $MOD_TARGET_BUSY::busymod_work_func() a chance to run
361a2818ee4SJoe Lawrencesleep 5
362a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH
363a2818ee4SJoe Lawrenceload_mod $MOD_TARGET
364a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET
365a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH
366a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH
367a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET_BUSY
368a2818ee4SJoe Lawrence
369a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_TARGET_BUSY sleep_secs=0
370a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_init
371a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: busymod_work_func, sleeping 0 seconds ...
372a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: busymod_work_func exit
373a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH
374a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
375a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
376a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux
377a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state
378a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition
379a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition
380a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux
381a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state
382a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete
383a2818ee4SJoe Lawrence% modprobe $MOD_TARGET
384a2818ee4SJoe Lawrencelivepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET'
385a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
386a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
387a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init
388a2818ee4SJoe Lawrence% rmmod $MOD_TARGET
389a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit
390a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
391a2818ee4SJoe Lawrencelivepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET'
392a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
393a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
394a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition
395a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux
396a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state
397a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition
398a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition
399a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux
400a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state
401a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete
402a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH
403a2818ee4SJoe Lawrence% rmmod $MOD_TARGET_BUSY
404a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_exit"
405a2818ee4SJoe Lawrence
406a2818ee4SJoe Lawrence
407a2818ee4SJoe Lawrence
408a2818ee4SJoe Lawrence# TEST: busy target module
409a2818ee4SJoe Lawrence#
410a2818ee4SJoe Lawrence# A similar test as the previous one, but force the "busy" kernel module
411a2818ee4SJoe Lawrence# to do longer work.
412a2818ee4SJoe Lawrence#
413a2818ee4SJoe Lawrence# The livepatching core will refuse to patch a task that is currently
414a2818ee4SJoe Lawrence# executing a to-be-patched function -- the consistency model stalls the
415a2818ee4SJoe Lawrence# current patch transition until this safety-check is met.  Test a
416a2818ee4SJoe Lawrence# scenario where one of a livepatch's target klp_objects sits on such a
417a2818ee4SJoe Lawrence# function for a long time.  Meanwhile, load and unload other target
418a2818ee4SJoe Lawrence# kernel modules while the livepatch transition is in progress.
419a2818ee4SJoe Lawrence#
420a2818ee4SJoe Lawrence# - Load the "busy" kernel module, this time make it do 10 seconds worth
421a2818ee4SJoe Lawrence#   of work.
422a2818ee4SJoe Lawrence#
423a2818ee4SJoe Lawrence# - Meanwhile, the livepatch is loaded.  Notice that the patch
424a2818ee4SJoe Lawrence#   transition does not complete as the targeted "busy" module is
425a2818ee4SJoe Lawrence#   sitting on a to-be-patched function.
426a2818ee4SJoe Lawrence#
427a2818ee4SJoe Lawrence# - Load a second target module (this one is an ordinary idle kernel
428a2818ee4SJoe Lawrence#   module).  Note that *no* post-patch callbacks will be executed while
429a2818ee4SJoe Lawrence#   the livepatch is still in transition.
430a2818ee4SJoe Lawrence#
431a2818ee4SJoe Lawrence# - Request an unload of the simple kernel module.  The patch is still
432a2818ee4SJoe Lawrence#   transitioning, so its pre-unpatch callbacks are skipped.
433a2818ee4SJoe Lawrence#
434a2818ee4SJoe Lawrence# - Finally the livepatch is disabled.  Since none of the patch's
435a2818ee4SJoe Lawrence#   klp_object's post-patch callbacks executed, the remaining
436a2818ee4SJoe Lawrence#   klp_object's pre-unpatch callbacks are skipped.
437a2818ee4SJoe Lawrence
438a2818ee4SJoe Lawrenceecho -n "TEST: busy target module ... "
439a2818ee4SJoe Lawrencedmesg -C
440a2818ee4SJoe Lawrence
441a2818ee4SJoe Lawrenceload_mod $MOD_TARGET_BUSY sleep_secs=10
442a2818ee4SJoe Lawrenceload_lp_nowait $MOD_LIVEPATCH
443a2818ee4SJoe Lawrence# Don't wait for transition, load $MOD_TARGET while the transition
444a2818ee4SJoe Lawrence# is still stalled in $MOD_TARGET_BUSY::busymod_work_func()
445a2818ee4SJoe Lawrencesleep 5
446a2818ee4SJoe Lawrenceload_mod $MOD_TARGET
447a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET
448a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH
449a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH
450a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET_BUSY
451a2818ee4SJoe Lawrence
452a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_TARGET_BUSY sleep_secs=10
453a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_init
454a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: busymod_work_func, sleeping 10 seconds ...
455a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH
456a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
457a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
458a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux
459a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state
460a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition
461a2818ee4SJoe Lawrence% modprobe $MOD_TARGET
462a2818ee4SJoe Lawrencelivepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET'
463a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
464a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init
465a2818ee4SJoe Lawrence% rmmod $MOD_TARGET
466a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit
467a2818ee4SJoe Lawrencelivepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET'
468a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
469a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
470a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': reversing transition from patching to unpatching
471a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition
472a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition
473a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux
474a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state
475a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete
476a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH
477a2818ee4SJoe Lawrence% rmmod $MOD_TARGET_BUSY
478a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: busymod_work_func exit
479a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_exit"
480a2818ee4SJoe Lawrence
481a2818ee4SJoe Lawrence
482a2818ee4SJoe Lawrence# TEST: multiple livepatches
483a2818ee4SJoe Lawrence#
484a2818ee4SJoe Lawrence# Test loading multiple livepatches.  This test-case is mainly for comparing
485a2818ee4SJoe Lawrence# with the next test-case.
486a2818ee4SJoe Lawrence#
487a2818ee4SJoe Lawrence# - Load and unload two livepatches, pre and post (un)patch callbacks
488a2818ee4SJoe Lawrence#   execute as each patch progresses through its (un)patching
489a2818ee4SJoe Lawrence#   transition.
490a2818ee4SJoe Lawrence
491a2818ee4SJoe Lawrenceecho -n "TEST: multiple livepatches ... "
492a2818ee4SJoe Lawrencedmesg -C
493a2818ee4SJoe Lawrence
494a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH
495a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH2
496a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH2
497a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH
498a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH2
499a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH
500a2818ee4SJoe Lawrence
501a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH
502a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
503a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
504a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux
505a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition
506a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition
507a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux
508a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete
509a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH2
510a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH2'
511a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': initializing patching transition
512a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: pre_patch_callback: vmlinux
513a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': starting patching transition
514a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': completing patching transition
515a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: post_patch_callback: vmlinux
516a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': patching complete
517a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled
518a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': initializing unpatching transition
519a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux
520a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': starting unpatching transition
521a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': completing unpatching transition
522a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux
523a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': unpatching complete
524a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
525a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition
526a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux
527a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition
528a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition
529a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux
530a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete
531a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH2
532a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH"
533a2818ee4SJoe Lawrence
534a2818ee4SJoe Lawrence
535a2818ee4SJoe Lawrence# TEST: atomic replace
536a2818ee4SJoe Lawrence#
537a2818ee4SJoe Lawrence# Load multiple livepatches, but the second as an 'atomic-replace'
538a2818ee4SJoe Lawrence# patch.  When the latter loads, the original livepatch should be
539a2818ee4SJoe Lawrence# disabled and *none* of its pre/post-unpatch callbacks executed.  On
540a2818ee4SJoe Lawrence# the other hand, when the atomic-replace livepatch is disabled, its
541a2818ee4SJoe Lawrence# pre/post-unpatch callbacks *should* be executed.
542a2818ee4SJoe Lawrence#
543a2818ee4SJoe Lawrence# - Load and unload two livepatches, the second of which has its
544a2818ee4SJoe Lawrence#   .replace flag set true.
545a2818ee4SJoe Lawrence#
546a2818ee4SJoe Lawrence# - Pre and post patch callbacks are executed for both livepatches.
547a2818ee4SJoe Lawrence#
548a2818ee4SJoe Lawrence# - Once the atomic replace module is loaded, only its pre and post
549a2818ee4SJoe Lawrence#   unpatch callbacks are executed.
550a2818ee4SJoe Lawrence
551a2818ee4SJoe Lawrenceecho -n "TEST: atomic replace ... "
552a2818ee4SJoe Lawrencedmesg -C
553a2818ee4SJoe Lawrence
554a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH
555a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH2 replace=1
556a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH2
557a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH2
558a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH
559a2818ee4SJoe Lawrence
560a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH
561a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH'
562a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition
563a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux
564a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition
565a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition
566a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux
567a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete
568a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH2 replace=1
569a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH2'
570a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': initializing patching transition
571a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: pre_patch_callback: vmlinux
572a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': starting patching transition
573a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': completing patching transition
574a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: post_patch_callback: vmlinux
575a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': patching complete
576a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled
577a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': initializing unpatching transition
578a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux
579a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': starting unpatching transition
580a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': completing unpatching transition
581a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux
582a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': unpatching complete
583a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH2
584a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH"
585a2818ee4SJoe Lawrence
586a2818ee4SJoe Lawrence
587a2818ee4SJoe Lawrenceexit 0
588