200 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03# Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com>4 5. $(dirname $0)/functions.sh6 7MOD_LIVEPATCH1=test_klp_livepatch8MOD_LIVEPATCH2=test_klp_syscall9MOD_LIVEPATCH3=test_klp_callbacks_demo10MOD_REPLACE=test_klp_atomic_replace11 12setup_config13 14 15# - load a livepatch that modifies the output from /proc/cmdline and16# verify correct behavior17# - unload the livepatch and make sure the patch was removed18 19start_test "basic function patching"20 21load_lp $MOD_LIVEPATCH122 23if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH1: this has been live patched" ]] ; then24 echo -e "FAIL\n\n"25 die "livepatch kselftest(s) failed"26fi27 28disable_lp $MOD_LIVEPATCH129unload_lp $MOD_LIVEPATCH130 31if [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH1: this has been live patched" ]] ; then32 echo -e "FAIL\n\n"33 die "livepatch kselftest(s) failed"34fi35 36check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko37livepatch: enabling patch '$MOD_LIVEPATCH1'38livepatch: '$MOD_LIVEPATCH1': initializing patching transition39livepatch: '$MOD_LIVEPATCH1': starting patching transition40livepatch: '$MOD_LIVEPATCH1': completing patching transition41livepatch: '$MOD_LIVEPATCH1': patching complete42% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH1/enabled43livepatch: '$MOD_LIVEPATCH1': initializing unpatching transition44livepatch: '$MOD_LIVEPATCH1': starting unpatching transition45livepatch: '$MOD_LIVEPATCH1': completing unpatching transition46livepatch: '$MOD_LIVEPATCH1': unpatching complete47% rmmod $MOD_LIVEPATCH1"48 49 50# - load a livepatch that modifies the output from /proc/cmdline and51# verify correct behavior52# - load another livepatch and verify that both livepatches are active53# - unload the second livepatch and verify that the first is still active54# - unload the first livepatch and verify none are active55 56start_test "multiple livepatches"57 58load_lp $MOD_LIVEPATCH159 60grep 'live patched' /proc/cmdline > /dev/kmsg61grep 'live patched' /proc/meminfo > /dev/kmsg62 63load_lp $MOD_REPLACE replace=064 65grep 'live patched' /proc/cmdline > /dev/kmsg66grep 'live patched' /proc/meminfo > /dev/kmsg67 68disable_lp $MOD_REPLACE69unload_lp $MOD_REPLACE70 71grep 'live patched' /proc/cmdline > /dev/kmsg72grep 'live patched' /proc/meminfo > /dev/kmsg73 74disable_lp $MOD_LIVEPATCH175unload_lp $MOD_LIVEPATCH176 77grep 'live patched' /proc/cmdline > /dev/kmsg78grep 'live patched' /proc/meminfo > /dev/kmsg79 80check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko81livepatch: enabling patch '$MOD_LIVEPATCH1'82livepatch: '$MOD_LIVEPATCH1': initializing patching transition83livepatch: '$MOD_LIVEPATCH1': starting patching transition84livepatch: '$MOD_LIVEPATCH1': completing patching transition85livepatch: '$MOD_LIVEPATCH1': patching complete86$MOD_LIVEPATCH1: this has been live patched87% insmod test_modules/$MOD_REPLACE.ko replace=088livepatch: enabling patch '$MOD_REPLACE'89livepatch: '$MOD_REPLACE': initializing patching transition90livepatch: '$MOD_REPLACE': starting patching transition91livepatch: '$MOD_REPLACE': completing patching transition92livepatch: '$MOD_REPLACE': patching complete93$MOD_LIVEPATCH1: this has been live patched94$MOD_REPLACE: this has been live patched95% echo 0 > /sys/kernel/livepatch/$MOD_REPLACE/enabled96livepatch: '$MOD_REPLACE': initializing unpatching transition97livepatch: '$MOD_REPLACE': starting unpatching transition98livepatch: '$MOD_REPLACE': completing unpatching transition99livepatch: '$MOD_REPLACE': unpatching complete100% rmmod $MOD_REPLACE101$MOD_LIVEPATCH1: this has been live patched102% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH1/enabled103livepatch: '$MOD_LIVEPATCH1': initializing unpatching transition104livepatch: '$MOD_LIVEPATCH1': starting unpatching transition105livepatch: '$MOD_LIVEPATCH1': completing unpatching transition106livepatch: '$MOD_LIVEPATCH1': unpatching complete107% rmmod $MOD_LIVEPATCH1"108 109 110# - load a livepatch that modifies the output from /proc/cmdline and111# verify correct behavior112# - load two additional livepatches and check the number of livepatch modules113# applied114# - load an atomic replace livepatch and check that the other three modules were115# disabled116# - remove all livepatches besides the atomic replace one and verify that the117# atomic replace livepatch is still active118# - remove the atomic replace livepatch and verify that none are active119 120start_test "atomic replace livepatch"121 122load_lp $MOD_LIVEPATCH1123 124grep 'live patched' /proc/cmdline > /dev/kmsg125grep 'live patched' /proc/meminfo > /dev/kmsg126 127for mod in $MOD_LIVEPATCH2 $MOD_LIVEPATCH3; do128 load_lp "$mod"129done130 131mods=(/sys/kernel/livepatch/*)132nmods=${#mods[@]}133if [ "$nmods" -ne 3 ]; then134 die "Expecting three modules listed, found $nmods"135fi136 137load_lp $MOD_REPLACE replace=1138 139grep 'live patched' /proc/cmdline > /dev/kmsg140grep 'live patched' /proc/meminfo > /dev/kmsg141 142loop_until 'mods=(/sys/kernel/livepatch/*); nmods=${#mods[@]}; [[ "$nmods" -eq 1 ]]' ||143 die "Expecting only one moduled listed, found $nmods"144 145# These modules were disabled by the atomic replace146for mod in $MOD_LIVEPATCH3 $MOD_LIVEPATCH2 $MOD_LIVEPATCH1; do147 unload_lp "$mod"148done149 150grep 'live patched' /proc/cmdline > /dev/kmsg151grep 'live patched' /proc/meminfo > /dev/kmsg152 153disable_lp $MOD_REPLACE154unload_lp $MOD_REPLACE155 156grep 'live patched' /proc/cmdline > /dev/kmsg157grep 'live patched' /proc/meminfo > /dev/kmsg158 159check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko160livepatch: enabling patch '$MOD_LIVEPATCH1'161livepatch: '$MOD_LIVEPATCH1': initializing patching transition162livepatch: '$MOD_LIVEPATCH1': starting patching transition163livepatch: '$MOD_LIVEPATCH1': completing patching transition164livepatch: '$MOD_LIVEPATCH1': patching complete165$MOD_LIVEPATCH1: this has been live patched166% insmod test_modules/$MOD_LIVEPATCH2.ko167livepatch: enabling patch '$MOD_LIVEPATCH2'168livepatch: '$MOD_LIVEPATCH2': initializing patching transition169livepatch: '$MOD_LIVEPATCH2': starting patching transition170livepatch: '$MOD_LIVEPATCH2': completing patching transition171livepatch: '$MOD_LIVEPATCH2': patching complete172% insmod test_modules/$MOD_LIVEPATCH3.ko173livepatch: enabling patch '$MOD_LIVEPATCH3'174livepatch: '$MOD_LIVEPATCH3': initializing patching transition175$MOD_LIVEPATCH3: pre_patch_callback: vmlinux176livepatch: '$MOD_LIVEPATCH3': starting patching transition177livepatch: '$MOD_LIVEPATCH3': completing patching transition178$MOD_LIVEPATCH3: post_patch_callback: vmlinux179livepatch: '$MOD_LIVEPATCH3': patching complete180% insmod test_modules/$MOD_REPLACE.ko replace=1181livepatch: enabling patch '$MOD_REPLACE'182livepatch: '$MOD_REPLACE': initializing patching transition183livepatch: '$MOD_REPLACE': starting patching transition184livepatch: '$MOD_REPLACE': completing patching transition185livepatch: '$MOD_REPLACE': patching complete186$MOD_REPLACE: this has been live patched187% rmmod $MOD_LIVEPATCH3188% rmmod $MOD_LIVEPATCH2189% rmmod $MOD_LIVEPATCH1190$MOD_REPLACE: this has been live patched191% echo 0 > /sys/kernel/livepatch/$MOD_REPLACE/enabled192livepatch: '$MOD_REPLACE': initializing unpatching transition193livepatch: '$MOD_REPLACE': starting unpatching transition194livepatch: '$MOD_REPLACE': completing unpatching transition195livepatch: '$MOD_REPLACE': unpatching complete196% rmmod $MOD_REPLACE"197 198 199exit 0200