1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# Copyright (C) 2022 Song Liu <song@kernel.org> 4 5. $(dirname $0)/functions.sh 6 7MOD_LIVEPATCH=test_klp_livepatch 8MOD_LIVEPATCH2=test_klp_callbacks_demo 9MOD_LIVEPATCH3=test_klp_syscall 10 11HAS_PATCH_ATTR=0 12HAS_REPLACE_ATTR=0 13HAS_STACK_ORDER_ATTR=0 14 15setup_config 16 17# - load a livepatch and verifies the sysfs entries work as expected 18 19start_test "sysfs test" 20 21load_lp $MOD_LIVEPATCH 22 23check_sysfs_rights "$MOD_LIVEPATCH" "" "drwxr-xr-x" 24check_sysfs_rights "$MOD_LIVEPATCH" "enabled" "-rw-r--r--" 25check_sysfs_value "$MOD_LIVEPATCH" "enabled" "1" 26check_sysfs_rights "$MOD_LIVEPATCH" "force" "--w-------" 27check_sysfs_rights "$MOD_LIVEPATCH" "transition" "-r--r--r--" 28check_sysfs_value "$MOD_LIVEPATCH" "transition" "0" 29 30if does_sysfs_exist "$MOD_LIVEPATCH/vmlinux" "patched"; then 31 check_sysfs_rights "$MOD_LIVEPATCH" "vmlinux/patched" "-r--r--r--" 32 check_sysfs_value "$MOD_LIVEPATCH" "vmlinux/patched" "1" 33 HAS_PATCH_ATTR=1 34fi 35 36if does_sysfs_exist "$MOD_LIVEPATCH" "replace"; then 37 check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--" 38 HAS_REPLACE_ATTR=1 39fi 40 41if does_sysfs_exist "$MOD_LIVEPATCH" "stack_order"; then 42 check_sysfs_rights "$MOD_LIVEPATCH" "stack_order" "-r--r--r--" 43 check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" 44 HAS_STACK_ORDER_ATTR=1 45fi 46 47disable_lp $MOD_LIVEPATCH 48 49unload_lp $MOD_LIVEPATCH 50 51check_result "% insmod test_modules/$MOD_LIVEPATCH.ko 52livepatch: enabling patch '$MOD_LIVEPATCH' 53livepatch: '$MOD_LIVEPATCH': initializing patching transition 54livepatch: '$MOD_LIVEPATCH': starting patching transition 55livepatch: '$MOD_LIVEPATCH': completing patching transition 56livepatch: '$MOD_LIVEPATCH': patching complete 57% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled 58livepatch: '$MOD_LIVEPATCH': initializing unpatching transition 59livepatch: '$MOD_LIVEPATCH': starting unpatching transition 60livepatch: '$MOD_LIVEPATCH': completing unpatching transition 61livepatch: '$MOD_LIVEPATCH': unpatching complete 62% rmmod $MOD_LIVEPATCH" 63 64if [[ "$HAS_PATCH_ATTR" == "1" ]]; then 65 start_test "sysfs test object/patched" 66 67 MOD_TARGET=test_klp_callbacks_mod 68 load_lp $MOD_LIVEPATCH2 69 70 # check the "patch" file changes as target module loads/unloads 71 check_sysfs_value "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "0" 72 load_mod $MOD_TARGET 73 check_sysfs_value "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "1" 74 unload_mod $MOD_TARGET 75 check_sysfs_value "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "0" 76 77 disable_lp $MOD_LIVEPATCH2 78 unload_lp $MOD_LIVEPATCH2 79 80 check_result "% insmod test_modules/$MOD_LIVEPATCH2.ko 81livepatch: enabling patch '$MOD_LIVEPATCH2' 82livepatch: '$MOD_LIVEPATCH2': initializing patching transition 83$MOD_LIVEPATCH2: pre_patch_callback: vmlinux 84livepatch: '$MOD_LIVEPATCH2': starting patching transition 85livepatch: '$MOD_LIVEPATCH2': completing patching transition 86$MOD_LIVEPATCH2: post_patch_callback: vmlinux 87livepatch: '$MOD_LIVEPATCH2': patching complete 88% insmod test_modules/$MOD_TARGET.ko 89livepatch: applying patch '$MOD_LIVEPATCH2' to loading module '$MOD_TARGET' 90$MOD_LIVEPATCH2: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init 91$MOD_LIVEPATCH2: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init 92$MOD_TARGET: test_klp_callbacks_mod_init 93% rmmod $MOD_TARGET 94$MOD_TARGET: test_klp_callbacks_mod_exit 95$MOD_LIVEPATCH2: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away 96livepatch: reverting patch '$MOD_LIVEPATCH2' on unloading module '$MOD_TARGET' 97$MOD_LIVEPATCH2: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away 98% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH2/enabled 99livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition 100$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux 101livepatch: '$MOD_LIVEPATCH2': starting unpatching transition 102livepatch: '$MOD_LIVEPATCH2': completing unpatching transition 103$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux 104livepatch: '$MOD_LIVEPATCH2': unpatching complete 105% rmmod $MOD_LIVEPATCH2" 106fi 107 108if [[ "$HAS_REPLACE_ATTR" == "1" ]]; then 109 start_test "sysfs test replace enabled" 110 111 MOD_ATOMIC_REPLACE=test_klp_atomic_replace 112 load_lp $MOD_ATOMIC_REPLACE replace=1 113 114 check_sysfs_rights "$MOD_ATOMIC_REPLACE" "replace" "-r--r--r--" 115 check_sysfs_value "$MOD_ATOMIC_REPLACE" "replace" "1" 116 117 disable_lp $MOD_ATOMIC_REPLACE 118 unload_lp $MOD_ATOMIC_REPLACE 119 120 check_result "% insmod test_modules/$MOD_ATOMIC_REPLACE.ko replace=1 121livepatch: enabling patch '$MOD_ATOMIC_REPLACE' 122livepatch: '$MOD_ATOMIC_REPLACE': initializing patching transition 123livepatch: '$MOD_ATOMIC_REPLACE': starting patching transition 124livepatch: '$MOD_ATOMIC_REPLACE': completing patching transition 125livepatch: '$MOD_ATOMIC_REPLACE': patching complete 126% echo 0 > $SYSFS_KLP_DIR/$MOD_ATOMIC_REPLACE/enabled 127livepatch: '$MOD_ATOMIC_REPLACE': initializing unpatching transition 128livepatch: '$MOD_ATOMIC_REPLACE': starting unpatching transition 129livepatch: '$MOD_ATOMIC_REPLACE': completing unpatching transition 130livepatch: '$MOD_ATOMIC_REPLACE': unpatching complete 131% rmmod $MOD_ATOMIC_REPLACE" 132 133 start_test "sysfs test replace disabled" 134 135 load_lp $MOD_ATOMIC_REPLACE replace=0 136 137 check_sysfs_rights "$MOD_ATOMIC_REPLACE" "replace" "-r--r--r--" 138 check_sysfs_value "$MOD_ATOMIC_REPLACE" "replace" "0" 139 140 disable_lp $MOD_ATOMIC_REPLACE 141 unload_lp $MOD_ATOMIC_REPLACE 142 143 check_result "% insmod test_modules/$MOD_ATOMIC_REPLACE.ko replace=0 144livepatch: enabling patch '$MOD_ATOMIC_REPLACE' 145livepatch: '$MOD_ATOMIC_REPLACE': initializing patching transition 146livepatch: '$MOD_ATOMIC_REPLACE': starting patching transition 147livepatch: '$MOD_ATOMIC_REPLACE': completing patching transition 148livepatch: '$MOD_ATOMIC_REPLACE': patching complete 149% echo 0 > $SYSFS_KLP_DIR/$MOD_ATOMIC_REPLACE/enabled 150livepatch: '$MOD_ATOMIC_REPLACE': initializing unpatching transition 151livepatch: '$MOD_ATOMIC_REPLACE': starting unpatching transition 152livepatch: '$MOD_ATOMIC_REPLACE': completing unpatching transition 153livepatch: '$MOD_ATOMIC_REPLACE': unpatching complete 154% rmmod $MOD_ATOMIC_REPLACE" 155fi 156 157if [[ "$HAS_STACK_ORDER_ATTR" == "1" ]]; then 158 start_test "sysfs test stack_order value" 159 160 load_lp $MOD_LIVEPATCH 161 162 check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" 163 164 load_lp $MOD_LIVEPATCH2 165 166 check_sysfs_value "$MOD_LIVEPATCH2" "stack_order" "2" 167 168 load_lp $MOD_LIVEPATCH3 169 170 check_sysfs_value "$MOD_LIVEPATCH3" "stack_order" "3" 171 172 disable_lp $MOD_LIVEPATCH2 173 unload_lp $MOD_LIVEPATCH2 174 175 check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" 176 check_sysfs_value "$MOD_LIVEPATCH3" "stack_order" "2" 177 178 disable_lp $MOD_LIVEPATCH3 179 unload_lp $MOD_LIVEPATCH3 180 181 disable_lp $MOD_LIVEPATCH 182 unload_lp $MOD_LIVEPATCH 183 184 check_result "% insmod test_modules/$MOD_LIVEPATCH.ko 185livepatch: enabling patch '$MOD_LIVEPATCH' 186livepatch: '$MOD_LIVEPATCH': initializing patching transition 187livepatch: '$MOD_LIVEPATCH': starting patching transition 188livepatch: '$MOD_LIVEPATCH': completing patching transition 189livepatch: '$MOD_LIVEPATCH': patching complete 190% insmod test_modules/$MOD_LIVEPATCH2.ko 191livepatch: enabling patch '$MOD_LIVEPATCH2' 192livepatch: '$MOD_LIVEPATCH2': initializing patching transition 193$MOD_LIVEPATCH2: pre_patch_callback: vmlinux 194livepatch: '$MOD_LIVEPATCH2': starting patching transition 195livepatch: '$MOD_LIVEPATCH2': completing patching transition 196$MOD_LIVEPATCH2: post_patch_callback: vmlinux 197livepatch: '$MOD_LIVEPATCH2': patching complete 198% insmod test_modules/$MOD_LIVEPATCH3.ko 199livepatch: enabling patch '$MOD_LIVEPATCH3' 200livepatch: '$MOD_LIVEPATCH3': initializing patching transition 201livepatch: '$MOD_LIVEPATCH3': starting patching transition 202livepatch: '$MOD_LIVEPATCH3': completing patching transition 203livepatch: '$MOD_LIVEPATCH3': patching complete 204% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH2/enabled 205livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition 206$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux 207livepatch: '$MOD_LIVEPATCH2': starting unpatching transition 208livepatch: '$MOD_LIVEPATCH2': completing unpatching transition 209$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux 210livepatch: '$MOD_LIVEPATCH2': unpatching complete 211% rmmod $MOD_LIVEPATCH2 212% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH3/enabled 213livepatch: '$MOD_LIVEPATCH3': initializing unpatching transition 214livepatch: '$MOD_LIVEPATCH3': starting unpatching transition 215livepatch: '$MOD_LIVEPATCH3': completing unpatching transition 216livepatch: '$MOD_LIVEPATCH3': unpatching complete 217% rmmod $MOD_LIVEPATCH3 218% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled 219livepatch: '$MOD_LIVEPATCH': initializing unpatching transition 220livepatch: '$MOD_LIVEPATCH': starting unpatching transition 221livepatch: '$MOD_LIVEPATCH': completing unpatching transition 222livepatch: '$MOD_LIVEPATCH': unpatching complete 223% rmmod $MOD_LIVEPATCH" 224fi 225 226exit 0 227