1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com> 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun. $(dirname $0)/functions.sh 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunMOD_LIVEPATCH=test_klp_livepatch 8*4882a593SmuzhiyunMOD_REPLACE=test_klp_atomic_replace 9*4882a593Smuzhiyun 10*4882a593Smuzhiyunsetup_config 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun# - load a livepatch that modifies the output from /proc/cmdline and 14*4882a593Smuzhiyun# verify correct behavior 15*4882a593Smuzhiyun# - unload the livepatch and make sure the patch was removed 16*4882a593Smuzhiyun 17*4882a593Smuzhiyunstart_test "basic function patching" 18*4882a593Smuzhiyun 19*4882a593Smuzhiyunload_lp $MOD_LIVEPATCH 20*4882a593Smuzhiyun 21*4882a593Smuzhiyunif [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then 22*4882a593Smuzhiyun echo -e "FAIL\n\n" 23*4882a593Smuzhiyun die "livepatch kselftest(s) failed" 24*4882a593Smuzhiyunfi 25*4882a593Smuzhiyun 26*4882a593Smuzhiyundisable_lp $MOD_LIVEPATCH 27*4882a593Smuzhiyununload_lp $MOD_LIVEPATCH 28*4882a593Smuzhiyun 29*4882a593Smuzhiyunif [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH: this has been live patched" ]] ; then 30*4882a593Smuzhiyun echo -e "FAIL\n\n" 31*4882a593Smuzhiyun die "livepatch kselftest(s) failed" 32*4882a593Smuzhiyunfi 33*4882a593Smuzhiyun 34*4882a593Smuzhiyuncheck_result "% modprobe $MOD_LIVEPATCH 35*4882a593Smuzhiyunlivepatch: enabling patch '$MOD_LIVEPATCH' 36*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': initializing patching transition 37*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': starting patching transition 38*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': completing patching transition 39*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': patching complete 40*4882a593Smuzhiyun% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 41*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': initializing unpatching transition 42*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': starting unpatching transition 43*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': completing unpatching transition 44*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': unpatching complete 45*4882a593Smuzhiyun% rmmod $MOD_LIVEPATCH" 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun# - load a livepatch that modifies the output from /proc/cmdline and 49*4882a593Smuzhiyun# verify correct behavior 50*4882a593Smuzhiyun# - load another livepatch and verify that both livepatches are active 51*4882a593Smuzhiyun# - unload the second livepatch and verify that the first is still active 52*4882a593Smuzhiyun# - unload the first livepatch and verify none are active 53*4882a593Smuzhiyun 54*4882a593Smuzhiyunstart_test "multiple livepatches" 55*4882a593Smuzhiyun 56*4882a593Smuzhiyunload_lp $MOD_LIVEPATCH 57*4882a593Smuzhiyun 58*4882a593Smuzhiyungrep 'live patched' /proc/cmdline > /dev/kmsg 59*4882a593Smuzhiyungrep 'live patched' /proc/meminfo > /dev/kmsg 60*4882a593Smuzhiyun 61*4882a593Smuzhiyunload_lp $MOD_REPLACE replace=0 62*4882a593Smuzhiyun 63*4882a593Smuzhiyungrep 'live patched' /proc/cmdline > /dev/kmsg 64*4882a593Smuzhiyungrep 'live patched' /proc/meminfo > /dev/kmsg 65*4882a593Smuzhiyun 66*4882a593Smuzhiyundisable_lp $MOD_REPLACE 67*4882a593Smuzhiyununload_lp $MOD_REPLACE 68*4882a593Smuzhiyun 69*4882a593Smuzhiyungrep 'live patched' /proc/cmdline > /dev/kmsg 70*4882a593Smuzhiyungrep 'live patched' /proc/meminfo > /dev/kmsg 71*4882a593Smuzhiyun 72*4882a593Smuzhiyundisable_lp $MOD_LIVEPATCH 73*4882a593Smuzhiyununload_lp $MOD_LIVEPATCH 74*4882a593Smuzhiyun 75*4882a593Smuzhiyungrep 'live patched' /proc/cmdline > /dev/kmsg 76*4882a593Smuzhiyungrep 'live patched' /proc/meminfo > /dev/kmsg 77*4882a593Smuzhiyun 78*4882a593Smuzhiyuncheck_result "% modprobe $MOD_LIVEPATCH 79*4882a593Smuzhiyunlivepatch: enabling patch '$MOD_LIVEPATCH' 80*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': initializing patching transition 81*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': starting patching transition 82*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': completing patching transition 83*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': patching complete 84*4882a593Smuzhiyun$MOD_LIVEPATCH: this has been live patched 85*4882a593Smuzhiyun% modprobe $MOD_REPLACE replace=0 86*4882a593Smuzhiyunlivepatch: enabling patch '$MOD_REPLACE' 87*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': initializing patching transition 88*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': starting patching transition 89*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': completing patching transition 90*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': patching complete 91*4882a593Smuzhiyun$MOD_LIVEPATCH: this has been live patched 92*4882a593Smuzhiyun$MOD_REPLACE: this has been live patched 93*4882a593Smuzhiyun% echo 0 > /sys/kernel/livepatch/$MOD_REPLACE/enabled 94*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': initializing unpatching transition 95*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': starting unpatching transition 96*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': completing unpatching transition 97*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': unpatching complete 98*4882a593Smuzhiyun% rmmod $MOD_REPLACE 99*4882a593Smuzhiyun$MOD_LIVEPATCH: this has been live patched 100*4882a593Smuzhiyun% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 101*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': initializing unpatching transition 102*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': starting unpatching transition 103*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': completing unpatching transition 104*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': unpatching complete 105*4882a593Smuzhiyun% rmmod $MOD_LIVEPATCH" 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun# - load a livepatch that modifies the output from /proc/cmdline and 109*4882a593Smuzhiyun# verify correct behavior 110*4882a593Smuzhiyun# - load an atomic replace livepatch and verify that only the second is active 111*4882a593Smuzhiyun# - remove the first livepatch and verify that the atomic replace livepatch 112*4882a593Smuzhiyun# is still active 113*4882a593Smuzhiyun# - remove the atomic replace livepatch and verify that none are active 114*4882a593Smuzhiyun 115*4882a593Smuzhiyunstart_test "atomic replace livepatch" 116*4882a593Smuzhiyun 117*4882a593Smuzhiyunload_lp $MOD_LIVEPATCH 118*4882a593Smuzhiyun 119*4882a593Smuzhiyungrep 'live patched' /proc/cmdline > /dev/kmsg 120*4882a593Smuzhiyungrep 'live patched' /proc/meminfo > /dev/kmsg 121*4882a593Smuzhiyun 122*4882a593Smuzhiyunload_lp $MOD_REPLACE replace=1 123*4882a593Smuzhiyun 124*4882a593Smuzhiyungrep 'live patched' /proc/cmdline > /dev/kmsg 125*4882a593Smuzhiyungrep 'live patched' /proc/meminfo > /dev/kmsg 126*4882a593Smuzhiyun 127*4882a593Smuzhiyununload_lp $MOD_LIVEPATCH 128*4882a593Smuzhiyun 129*4882a593Smuzhiyungrep 'live patched' /proc/cmdline > /dev/kmsg 130*4882a593Smuzhiyungrep 'live patched' /proc/meminfo > /dev/kmsg 131*4882a593Smuzhiyun 132*4882a593Smuzhiyundisable_lp $MOD_REPLACE 133*4882a593Smuzhiyununload_lp $MOD_REPLACE 134*4882a593Smuzhiyun 135*4882a593Smuzhiyungrep 'live patched' /proc/cmdline > /dev/kmsg 136*4882a593Smuzhiyungrep 'live patched' /proc/meminfo > /dev/kmsg 137*4882a593Smuzhiyun 138*4882a593Smuzhiyuncheck_result "% modprobe $MOD_LIVEPATCH 139*4882a593Smuzhiyunlivepatch: enabling patch '$MOD_LIVEPATCH' 140*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': initializing patching transition 141*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': starting patching transition 142*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': completing patching transition 143*4882a593Smuzhiyunlivepatch: '$MOD_LIVEPATCH': patching complete 144*4882a593Smuzhiyun$MOD_LIVEPATCH: this has been live patched 145*4882a593Smuzhiyun% modprobe $MOD_REPLACE replace=1 146*4882a593Smuzhiyunlivepatch: enabling patch '$MOD_REPLACE' 147*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': initializing patching transition 148*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': starting patching transition 149*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': completing patching transition 150*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': patching complete 151*4882a593Smuzhiyun$MOD_REPLACE: this has been live patched 152*4882a593Smuzhiyun% rmmod $MOD_LIVEPATCH 153*4882a593Smuzhiyun$MOD_REPLACE: this has been live patched 154*4882a593Smuzhiyun% echo 0 > /sys/kernel/livepatch/$MOD_REPLACE/enabled 155*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': initializing unpatching transition 156*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': starting unpatching transition 157*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': completing unpatching transition 158*4882a593Smuzhiyunlivepatch: '$MOD_REPLACE': unpatching complete 159*4882a593Smuzhiyun% rmmod $MOD_REPLACE" 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun 162*4882a593Smuzhiyunexit 0 163