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