1a2818ee4SJoe Lawrence#!/bin/bash
2a2818ee4SJoe Lawrence# SPDX-License-Identifier: GPL-2.0
3a2818ee4SJoe Lawrence# Copyright (C) 2018 Joe Lawrence <[email protected]>
4a2818ee4SJoe Lawrence
5a2818ee4SJoe Lawrence. $(dirname $0)/functions.sh
6a2818ee4SJoe Lawrence
761894818SMarcos Paulo de SouzaMOD_LIVEPATCH1=test_klp_livepatch
861894818SMarcos Paulo de SouzaMOD_LIVEPATCH2=test_klp_syscall
961894818SMarcos Paulo de SouzaMOD_LIVEPATCH3=test_klp_callbacks_demo
10a2818ee4SJoe LawrenceMOD_REPLACE=test_klp_atomic_replace
11a2818ee4SJoe Lawrence
1235c9e74cSJoe Lawrencesetup_config
13a2818ee4SJoe Lawrence
14a2818ee4SJoe Lawrence
15a2818ee4SJoe Lawrence# - load a livepatch that modifies the output from /proc/cmdline and
16a2818ee4SJoe Lawrence#   verify correct behavior
17a2818ee4SJoe Lawrence# - unload the livepatch and make sure the patch was removed
18a2818ee4SJoe Lawrence
192eeb0d45SJoe Lawrencestart_test "basic function patching"
20a2818ee4SJoe Lawrence
2161894818SMarcos Paulo de Souzaload_lp $MOD_LIVEPATCH1
22a2818ee4SJoe Lawrence
2361894818SMarcos Paulo de Souzaif [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH1: this has been live patched" ]] ; then
24a2818ee4SJoe Lawrence	echo -e "FAIL\n\n"
25a2818ee4SJoe Lawrence	die "livepatch kselftest(s) failed"
26a2818ee4SJoe Lawrencefi
27a2818ee4SJoe Lawrence
2861894818SMarcos Paulo de Souzadisable_lp $MOD_LIVEPATCH1
2961894818SMarcos Paulo de Souzaunload_lp $MOD_LIVEPATCH1
30a2818ee4SJoe Lawrence
3161894818SMarcos Paulo de Souzaif [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH1: this has been live patched" ]] ; then
32a2818ee4SJoe Lawrence	echo -e "FAIL\n\n"
33a2818ee4SJoe Lawrence	die "livepatch kselftest(s) failed"
34a2818ee4SJoe Lawrencefi
35a2818ee4SJoe Lawrence
3661894818SMarcos Paulo de Souzacheck_result "% insmod test_modules/$MOD_LIVEPATCH1.ko
3761894818SMarcos Paulo de Souzalivepatch: enabling patch '$MOD_LIVEPATCH1'
3861894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': initializing patching transition
3961894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': starting patching transition
4061894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': completing patching transition
4161894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': patching complete
42*637c7309SMichael Vetter% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH1/enabled
4361894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': initializing unpatching transition
4461894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': starting unpatching transition
4561894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': completing unpatching transition
4661894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': unpatching complete
4761894818SMarcos Paulo de Souza% rmmod $MOD_LIVEPATCH1"
48a2818ee4SJoe Lawrence
49a2818ee4SJoe Lawrence
50a2818ee4SJoe Lawrence# - load a livepatch that modifies the output from /proc/cmdline and
51a2818ee4SJoe Lawrence#   verify correct behavior
52a2818ee4SJoe Lawrence# - load another livepatch and verify that both livepatches are active
53a2818ee4SJoe Lawrence# - unload the second livepatch and verify that the first is still active
54a2818ee4SJoe Lawrence# - unload the first livepatch and verify none are active
55a2818ee4SJoe Lawrence
562eeb0d45SJoe Lawrencestart_test "multiple livepatches"
57a2818ee4SJoe Lawrence
5861894818SMarcos Paulo de Souzaload_lp $MOD_LIVEPATCH1
59a2818ee4SJoe Lawrence
60a2818ee4SJoe Lawrencegrep 'live patched' /proc/cmdline > /dev/kmsg
61a2818ee4SJoe Lawrencegrep 'live patched' /proc/meminfo > /dev/kmsg
62a2818ee4SJoe Lawrence
63a2818ee4SJoe Lawrenceload_lp $MOD_REPLACE replace=0
64a2818ee4SJoe Lawrence
65a2818ee4SJoe Lawrencegrep 'live patched' /proc/cmdline > /dev/kmsg
66a2818ee4SJoe Lawrencegrep 'live patched' /proc/meminfo > /dev/kmsg
67a2818ee4SJoe Lawrence
68a2818ee4SJoe Lawrencedisable_lp $MOD_REPLACE
69a2818ee4SJoe Lawrenceunload_lp $MOD_REPLACE
70a2818ee4SJoe Lawrence
71a2818ee4SJoe Lawrencegrep 'live patched' /proc/cmdline > /dev/kmsg
72a2818ee4SJoe Lawrencegrep 'live patched' /proc/meminfo > /dev/kmsg
73a2818ee4SJoe Lawrence
7461894818SMarcos Paulo de Souzadisable_lp $MOD_LIVEPATCH1
7561894818SMarcos Paulo de Souzaunload_lp $MOD_LIVEPATCH1
76a2818ee4SJoe Lawrence
77a2818ee4SJoe Lawrencegrep 'live patched' /proc/cmdline > /dev/kmsg
78a2818ee4SJoe Lawrencegrep 'live patched' /proc/meminfo > /dev/kmsg
79a2818ee4SJoe Lawrence
8061894818SMarcos Paulo de Souzacheck_result "% insmod test_modules/$MOD_LIVEPATCH1.ko
8161894818SMarcos Paulo de Souzalivepatch: enabling patch '$MOD_LIVEPATCH1'
8261894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': initializing patching transition
8361894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': starting patching transition
8461894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': completing patching transition
8561894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': patching complete
8661894818SMarcos Paulo de Souza$MOD_LIVEPATCH1: this has been live patched
87c4bbe83dSMarcos Paulo de Souza% insmod test_modules/$MOD_REPLACE.ko replace=0
88a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_REPLACE'
89a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': initializing patching transition
90a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': starting patching transition
91a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': completing patching transition
92a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': patching complete
9361894818SMarcos Paulo de Souza$MOD_LIVEPATCH1: this has been live patched
94a2818ee4SJoe Lawrence$MOD_REPLACE: this has been live patched
95*637c7309SMichael Vetter% echo 0 > $SYSFS_KLP_DIR/$MOD_REPLACE/enabled
96a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': initializing unpatching transition
97a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': starting unpatching transition
98a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': completing unpatching transition
99a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': unpatching complete
100a2818ee4SJoe Lawrence% rmmod $MOD_REPLACE
10161894818SMarcos Paulo de Souza$MOD_LIVEPATCH1: this has been live patched
102*637c7309SMichael Vetter% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH1/enabled
10361894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': initializing unpatching transition
10461894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': starting unpatching transition
10561894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': completing unpatching transition
10661894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': unpatching complete
10761894818SMarcos Paulo de Souza% rmmod $MOD_LIVEPATCH1"
108a2818ee4SJoe Lawrence
109a2818ee4SJoe Lawrence
110a2818ee4SJoe Lawrence# - load a livepatch that modifies the output from /proc/cmdline and
111a2818ee4SJoe Lawrence#   verify correct behavior
11261894818SMarcos Paulo de Souza# - load two additional livepatches and check the number of livepatch modules
11361894818SMarcos Paulo de Souza#   applied
11461894818SMarcos Paulo de Souza# - load an atomic replace livepatch and check that the other three modules were
11561894818SMarcos Paulo de Souza#   disabled
11661894818SMarcos Paulo de Souza# - remove all livepatches besides the atomic replace one and verify that the
11761894818SMarcos Paulo de Souza#   atomic replace livepatch is still active
118a2818ee4SJoe Lawrence# - remove the atomic replace livepatch and verify that none are active
119a2818ee4SJoe Lawrence
1202eeb0d45SJoe Lawrencestart_test "atomic replace livepatch"
121a2818ee4SJoe Lawrence
12261894818SMarcos Paulo de Souzaload_lp $MOD_LIVEPATCH1
123a2818ee4SJoe Lawrence
124a2818ee4SJoe Lawrencegrep 'live patched' /proc/cmdline > /dev/kmsg
125a2818ee4SJoe Lawrencegrep 'live patched' /proc/meminfo > /dev/kmsg
126a2818ee4SJoe Lawrence
12761894818SMarcos Paulo de Souzafor mod in $MOD_LIVEPATCH2 $MOD_LIVEPATCH3; do
12861894818SMarcos Paulo de Souza	load_lp "$mod"
12961894818SMarcos Paulo de Souzadone
13061894818SMarcos Paulo de Souza
131*637c7309SMichael Vettermods=($SYSFS_KLP_DIR/*)
13261894818SMarcos Paulo de Souzanmods=${#mods[@]}
13361894818SMarcos Paulo de Souzaif [ "$nmods" -ne 3 ]; then
13461894818SMarcos Paulo de Souza	die "Expecting three modules listed, found $nmods"
13561894818SMarcos Paulo de Souzafi
13661894818SMarcos Paulo de Souza
137a2818ee4SJoe Lawrenceload_lp $MOD_REPLACE replace=1
138a2818ee4SJoe Lawrence
139a2818ee4SJoe Lawrencegrep 'live patched' /proc/cmdline > /dev/kmsg
140a2818ee4SJoe Lawrencegrep 'live patched' /proc/meminfo > /dev/kmsg
141a2818ee4SJoe Lawrence
142*637c7309SMichael Vetterloop_until 'mods=($SYSFS_KLP_DIR/*); nmods=${#mods[@]}; [[ "$nmods" -eq 1 ]]' ||
14361894818SMarcos Paulo de Souza        die "Expecting only one moduled listed, found $nmods"
14461894818SMarcos Paulo de Souza
14561894818SMarcos Paulo de Souza# These modules were disabled by the atomic replace
14661894818SMarcos Paulo de Souzafor mod in $MOD_LIVEPATCH3 $MOD_LIVEPATCH2 $MOD_LIVEPATCH1; do
14761894818SMarcos Paulo de Souza	unload_lp "$mod"
14861894818SMarcos Paulo de Souzadone
149a2818ee4SJoe Lawrence
150a2818ee4SJoe Lawrencegrep 'live patched' /proc/cmdline > /dev/kmsg
151a2818ee4SJoe Lawrencegrep 'live patched' /proc/meminfo > /dev/kmsg
152a2818ee4SJoe Lawrence
153a2818ee4SJoe Lawrencedisable_lp $MOD_REPLACE
154a2818ee4SJoe Lawrenceunload_lp $MOD_REPLACE
155a2818ee4SJoe Lawrence
156a2818ee4SJoe Lawrencegrep 'live patched' /proc/cmdline > /dev/kmsg
157a2818ee4SJoe Lawrencegrep 'live patched' /proc/meminfo > /dev/kmsg
158a2818ee4SJoe Lawrence
15961894818SMarcos Paulo de Souzacheck_result "% insmod test_modules/$MOD_LIVEPATCH1.ko
16061894818SMarcos Paulo de Souzalivepatch: enabling patch '$MOD_LIVEPATCH1'
16161894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': initializing patching transition
16261894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': starting patching transition
16361894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': completing patching transition
16461894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH1': patching complete
16561894818SMarcos Paulo de Souza$MOD_LIVEPATCH1: this has been live patched
16661894818SMarcos Paulo de Souza% insmod test_modules/$MOD_LIVEPATCH2.ko
16761894818SMarcos Paulo de Souzalivepatch: enabling patch '$MOD_LIVEPATCH2'
16861894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH2': initializing patching transition
16961894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH2': starting patching transition
17061894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH2': completing patching transition
17161894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH2': patching complete
17261894818SMarcos Paulo de Souza% insmod test_modules/$MOD_LIVEPATCH3.ko
17361894818SMarcos Paulo de Souzalivepatch: enabling patch '$MOD_LIVEPATCH3'
17461894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH3': initializing patching transition
17561894818SMarcos Paulo de Souza$MOD_LIVEPATCH3: pre_patch_callback: vmlinux
17661894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH3': starting patching transition
17761894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH3': completing patching transition
17861894818SMarcos Paulo de Souza$MOD_LIVEPATCH3: post_patch_callback: vmlinux
17961894818SMarcos Paulo de Souzalivepatch: '$MOD_LIVEPATCH3': patching complete
180c4bbe83dSMarcos Paulo de Souza% insmod test_modules/$MOD_REPLACE.ko replace=1
181a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_REPLACE'
182a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': initializing patching transition
183a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': starting patching transition
184a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': completing patching transition
185a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': patching complete
186a2818ee4SJoe Lawrence$MOD_REPLACE: this has been live patched
18761894818SMarcos Paulo de Souza% rmmod $MOD_LIVEPATCH3
18861894818SMarcos Paulo de Souza% rmmod $MOD_LIVEPATCH2
18961894818SMarcos Paulo de Souza% rmmod $MOD_LIVEPATCH1
190a2818ee4SJoe Lawrence$MOD_REPLACE: this has been live patched
191*637c7309SMichael Vetter% echo 0 > $SYSFS_KLP_DIR/$MOD_REPLACE/enabled
192a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': initializing unpatching transition
193a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': starting unpatching transition
194a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': completing unpatching transition
195a2818ee4SJoe Lawrencelivepatch: '$MOD_REPLACE': unpatching complete
196a2818ee4SJoe Lawrence% rmmod $MOD_REPLACE"
197a2818ee4SJoe Lawrence
198a2818ee4SJoe Lawrence
199a2818ee4SJoe Lawrenceexit 0
200