Something went wrong. Try again.
Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300#!/bin/bash# SPDX-License-Identifier: GPL-2.0# Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com>
. $(dirname $0)/functions.sh
MOD_LIVEPATCH1=test_klp_livepatchMOD_LIVEPATCH2=test_klp_syscallMOD_LIVEPATCH3=test_klp_callbacks_demoMOD_REPLACE=test_klp_atomic_replaceMOD_TARGET=test_klp_mod_targetMOD_TARGET_PATCH=test_klp_mod_patch
setup_config
# - load a livepatch that modifies the output from /proc/cmdline and# verify correct behavior# - unload the livepatch and make sure the patch was removed
start_test "basic function patching"
load_lp $MOD_LIVEPATCH1
if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH1: this has been live patched" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed"fi
disable_lp $MOD_LIVEPATCH1unload_lp $MOD_LIVEPATCH1
if [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH1: this has been live patched" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed"fi
check_result "% insmod test_modules/$MOD_LIVEPATCH1.kolivepatch: enabling patch '$MOD_LIVEPATCH1'livepatch: '$MOD_LIVEPATCH1': initializing patching transitionlivepatch: '$MOD_LIVEPATCH1': starting patching transitionlivepatch: '$MOD_LIVEPATCH1': completing patching transitionlivepatch: '$MOD_LIVEPATCH1': patching complete% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH1/enabledlivepatch: '$MOD_LIVEPATCH1': initializing unpatching transitionlivepatch: '$MOD_LIVEPATCH1': starting unpatching transitionlivepatch: '$MOD_LIVEPATCH1': completing unpatching transitionlivepatch: '$MOD_LIVEPATCH1': unpatching complete% rmmod $MOD_LIVEPATCH1"
# - load a livepatch that modifies the output from /proc/cmdline and# verify correct behavior# - load another livepatch and verify that both livepatches are active# - unload the second livepatch and verify that the first is still active# - unload the first livepatch and verify none are active
start_test "multiple livepatches"
load_lp $MOD_LIVEPATCH1
grep 'live patched' /proc/cmdline > /dev/kmsggrep 'live patched' /proc/meminfo > /dev/kmsg
load_lp $MOD_REPLACE replace=0
grep 'live patched' /proc/cmdline > /dev/kmsggrep 'live patched' /proc/meminfo > /dev/kmsg
disable_lp $MOD_REPLACEunload_lp $MOD_REPLACE
grep 'live patched' /proc/cmdline > /dev/kmsggrep 'live patched' /proc/meminfo > /dev/kmsg
disable_lp $MOD_LIVEPATCH1unload_lp $MOD_LIVEPATCH1
grep 'live patched' /proc/cmdline > /dev/kmsggrep 'live patched' /proc/meminfo > /dev/kmsg
check_result "% insmod test_modules/$MOD_LIVEPATCH1.kolivepatch: enabling patch '$MOD_LIVEPATCH1'livepatch: '$MOD_LIVEPATCH1': initializing patching transitionlivepatch: '$MOD_LIVEPATCH1': starting patching transitionlivepatch: '$MOD_LIVEPATCH1': completing patching transitionlivepatch: '$MOD_LIVEPATCH1': patching complete$MOD_LIVEPATCH1: this has been live patched% insmod test_modules/$MOD_REPLACE.ko replace=0livepatch: enabling patch '$MOD_REPLACE'livepatch: '$MOD_REPLACE': initializing patching transitionlivepatch: '$MOD_REPLACE': starting patching transitionlivepatch: '$MOD_REPLACE': completing patching transitionlivepatch: '$MOD_REPLACE': patching complete$MOD_LIVEPATCH1: this has been live patched$MOD_REPLACE: this has been live patched% echo 0 > $SYSFS_KLP_DIR/$MOD_REPLACE/enabledlivepatch: '$MOD_REPLACE': initializing unpatching transitionlivepatch: '$MOD_REPLACE': starting unpatching transitionlivepatch: '$MOD_REPLACE': completing unpatching transitionlivepatch: '$MOD_REPLACE': unpatching complete% rmmod $MOD_REPLACE$MOD_LIVEPATCH1: this has been live patched% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH1/enabledlivepatch: '$MOD_LIVEPATCH1': initializing unpatching transitionlivepatch: '$MOD_LIVEPATCH1': starting unpatching transitionlivepatch: '$MOD_LIVEPATCH1': completing unpatching transitionlivepatch: '$MOD_LIVEPATCH1': unpatching complete% rmmod $MOD_LIVEPATCH1"
# - load a livepatch that modifies the output from /proc/cmdline and# verify correct behavior# - load two additional livepatches and check the number of livepatch modules# applied# - load an atomic replace livepatch and check that the other three modules were# disabled# - remove all livepatches besides the atomic replace one and verify that the# atomic replace livepatch is still active# - remove the atomic replace livepatch and verify that none are active
start_test "atomic replace livepatch"
load_lp $MOD_LIVEPATCH1
grep 'live patched' /proc/cmdline > /dev/kmsggrep 'live patched' /proc/meminfo > /dev/kmsg
for mod in $MOD_LIVEPATCH2 $MOD_LIVEPATCH3; do load_lp "$mod"done
mods=($SYSFS_KLP_DIR/*)nmods=${#mods[@]}if [ "$nmods" -ne 3 ]; then die "Expecting three modules listed, found $nmods"fi
load_lp $MOD_REPLACE replace=1
grep 'live patched' /proc/cmdline > /dev/kmsggrep 'live patched' /proc/meminfo > /dev/kmsg
loop_until 'mods=($SYSFS_KLP_DIR/*); nmods=${#mods[@]}; [[ "$nmods" -eq 1 ]]' || die "Expecting only one moduled listed, found $nmods"
# These modules were disabled by the atomic replacefor mod in $MOD_LIVEPATCH3 $MOD_LIVEPATCH2 $MOD_LIVEPATCH1; do unload_lp "$mod"done
grep 'live patched' /proc/cmdline > /dev/kmsggrep 'live patched' /proc/meminfo > /dev/kmsg
disable_lp $MOD_REPLACEunload_lp $MOD_REPLACE
grep 'live patched' /proc/cmdline > /dev/kmsggrep 'live patched' /proc/meminfo > /dev/kmsg
check_result "% insmod test_modules/$MOD_LIVEPATCH1.kolivepatch: enabling patch '$MOD_LIVEPATCH1'livepatch: '$MOD_LIVEPATCH1': initializing patching transitionlivepatch: '$MOD_LIVEPATCH1': starting patching transitionlivepatch: '$MOD_LIVEPATCH1': completing patching transitionlivepatch: '$MOD_LIVEPATCH1': patching complete$MOD_LIVEPATCH1: this has been live patched% insmod test_modules/$MOD_LIVEPATCH2.kolivepatch: enabling patch '$MOD_LIVEPATCH2'livepatch: '$MOD_LIVEPATCH2': initializing patching transitionlivepatch: '$MOD_LIVEPATCH2': starting patching transitionlivepatch: '$MOD_LIVEPATCH2': completing patching transitionlivepatch: '$MOD_LIVEPATCH2': patching complete% insmod test_modules/$MOD_LIVEPATCH3.kolivepatch: enabling patch '$MOD_LIVEPATCH3'livepatch: '$MOD_LIVEPATCH3': initializing patching transition$MOD_LIVEPATCH3: pre_patch_callback: vmlinuxlivepatch: '$MOD_LIVEPATCH3': starting patching transitionlivepatch: '$MOD_LIVEPATCH3': completing patching transition$MOD_LIVEPATCH3: post_patch_callback: vmlinuxlivepatch: '$MOD_LIVEPATCH3': patching complete% insmod test_modules/$MOD_REPLACE.ko replace=1livepatch: enabling patch '$MOD_REPLACE'livepatch: '$MOD_REPLACE': initializing patching transitionlivepatch: '$MOD_REPLACE': starting patching transitionlivepatch: '$MOD_REPLACE': completing patching transitionlivepatch: '$MOD_REPLACE': patching complete$MOD_REPLACE: this has been live patched% rmmod $MOD_LIVEPATCH3% rmmod $MOD_LIVEPATCH2% rmmod $MOD_LIVEPATCH1$MOD_REPLACE: this has been live patched% echo 0 > $SYSFS_KLP_DIR/$MOD_REPLACE/enabledlivepatch: '$MOD_REPLACE': initializing unpatching transitionlivepatch: '$MOD_REPLACE': starting unpatching transitionlivepatch: '$MOD_REPLACE': completing unpatching transitionlivepatch: '$MOD_REPLACE': unpatching complete% rmmod $MOD_REPLACE"
# - load a target module that provides /proc/test_klp_mod_target with# original output# - load a livepatch that patches the target module's show function# - verify the proc entry returns livepatched output# - disable and unload the livepatch# - verify the proc entry returns original output again# - unload the target module
start_test "module function patching"
load_mod $MOD_TARGET
if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET: original output" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed"fi
load_lp $MOD_TARGET_PATCH
if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET_PATCH: this has been live patched" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed"fi
disable_lp $MOD_TARGET_PATCHunload_lp $MOD_TARGET_PATCH
if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET: original output" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed"fi
unload_mod $MOD_TARGET
check_result "% insmod test_modules/$MOD_TARGET.ko$MOD_TARGET: test_klp_mod_target_init% insmod test_modules/$MOD_TARGET_PATCH.kolivepatch: enabling patch '$MOD_TARGET_PATCH'livepatch: '$MOD_TARGET_PATCH': initializing patching transitionlivepatch: '$MOD_TARGET_PATCH': starting patching transitionlivepatch: '$MOD_TARGET_PATCH': completing patching transitionlivepatch: '$MOD_TARGET_PATCH': patching complete% echo 0 > $SYSFS_KLP_DIR/$MOD_TARGET_PATCH/enabledlivepatch: '$MOD_TARGET_PATCH': initializing unpatching transitionlivepatch: '$MOD_TARGET_PATCH': starting unpatching transitionlivepatch: '$MOD_TARGET_PATCH': completing unpatching transitionlivepatch: '$MOD_TARGET_PATCH': unpatching complete% rmmod $MOD_TARGET_PATCH% rmmod $MOD_TARGET$MOD_TARGET: test_klp_mod_target_exit"
# - load a livepatch that targets a not-yet-loaded module# - load the target module: klp_module_coming patches it immediately# - verify the proc entry returns livepatched output# - disable and unload the livepatch# - verify the proc entry returns original output again# - unload the target module
start_test "module function patching (livepatch first)"
load_lp $MOD_TARGET_PATCHload_mod $MOD_TARGET
if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET_PATCH: this has been live patched" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed"fi
disable_lp $MOD_TARGET_PATCHunload_lp $MOD_TARGET_PATCH
if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET: original output" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed"fi
unload_mod $MOD_TARGET
check_result "% insmod test_modules/$MOD_TARGET_PATCH.kolivepatch: enabling patch '$MOD_TARGET_PATCH'livepatch: '$MOD_TARGET_PATCH': initializing patching transitionlivepatch: '$MOD_TARGET_PATCH': starting patching transitionlivepatch: '$MOD_TARGET_PATCH': completing patching transitionlivepatch: '$MOD_TARGET_PATCH': patching complete% insmod test_modules/$MOD_TARGET.kolivepatch: applying patch '$MOD_TARGET_PATCH' to loading module '$MOD_TARGET'$MOD_TARGET: test_klp_mod_target_init% echo 0 > $SYSFS_KLP_DIR/$MOD_TARGET_PATCH/enabledlivepatch: '$MOD_TARGET_PATCH': initializing unpatching transitionlivepatch: '$MOD_TARGET_PATCH': starting unpatching transitionlivepatch: '$MOD_TARGET_PATCH': completing unpatching transitionlivepatch: '$MOD_TARGET_PATCH': unpatching complete% rmmod $MOD_TARGET_PATCH% rmmod $MOD_TARGET$MOD_TARGET: test_klp_mod_target_exit"
exit 0