227 lines
8.5 KiB
Bash
Executable File
227 lines
8.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (C) 2022 Song Liu <song@kernel.org>
|
|
|
|
. $(dirname $0)/functions.sh
|
|
|
|
MOD_LIVEPATCH=test_klp_livepatch
|
|
MOD_LIVEPATCH2=test_klp_callbacks_demo
|
|
MOD_LIVEPATCH3=test_klp_syscall
|
|
|
|
HAS_PATCH_ATTR=0
|
|
HAS_REPLACE_ATTR=0
|
|
HAS_STACK_ORDER_ATTR=0
|
|
|
|
setup_config
|
|
|
|
# - load a livepatch and verifies the sysfs entries work as expected
|
|
|
|
start_test "sysfs test"
|
|
|
|
load_lp $MOD_LIVEPATCH
|
|
|
|
check_sysfs_rights "$MOD_LIVEPATCH" "" "drwxr-xr-x"
|
|
check_sysfs_rights "$MOD_LIVEPATCH" "enabled" "-rw-r--r--"
|
|
check_sysfs_value "$MOD_LIVEPATCH" "enabled" "1"
|
|
check_sysfs_rights "$MOD_LIVEPATCH" "force" "--w-------"
|
|
check_sysfs_rights "$MOD_LIVEPATCH" "transition" "-r--r--r--"
|
|
check_sysfs_value "$MOD_LIVEPATCH" "transition" "0"
|
|
|
|
if does_sysfs_exist "$MOD_LIVEPATCH/vmlinux" "patched"; then
|
|
check_sysfs_rights "$MOD_LIVEPATCH" "vmlinux/patched" "-r--r--r--"
|
|
check_sysfs_value "$MOD_LIVEPATCH" "vmlinux/patched" "1"
|
|
HAS_PATCH_ATTR=1
|
|
fi
|
|
|
|
if does_sysfs_exist "$MOD_LIVEPATCH" "replace"; then
|
|
check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--"
|
|
HAS_REPLACE_ATTR=1
|
|
fi
|
|
|
|
if does_sysfs_exist "$MOD_LIVEPATCH" "stack_order"; then
|
|
check_sysfs_rights "$MOD_LIVEPATCH" "stack_order" "-r--r--r--"
|
|
check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1"
|
|
HAS_STACK_ORDER_ATTR=1
|
|
fi
|
|
|
|
disable_lp $MOD_LIVEPATCH
|
|
|
|
unload_lp $MOD_LIVEPATCH
|
|
|
|
check_result "% insmod test_modules/$MOD_LIVEPATCH.ko
|
|
livepatch: enabling patch '$MOD_LIVEPATCH'
|
|
livepatch: '$MOD_LIVEPATCH': initializing patching transition
|
|
livepatch: '$MOD_LIVEPATCH': starting patching transition
|
|
livepatch: '$MOD_LIVEPATCH': completing patching transition
|
|
livepatch: '$MOD_LIVEPATCH': patching complete
|
|
% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled
|
|
livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH': starting unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH': completing unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH': unpatching complete
|
|
% rmmod $MOD_LIVEPATCH"
|
|
|
|
if [[ "$HAS_PATCH_ATTR" == "1" ]]; then
|
|
start_test "sysfs test object/patched"
|
|
|
|
MOD_TARGET=test_klp_callbacks_mod
|
|
load_lp $MOD_LIVEPATCH2
|
|
|
|
# check the "patch" file changes as target module loads/unloads
|
|
check_sysfs_value "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "0"
|
|
load_mod $MOD_TARGET
|
|
check_sysfs_value "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "1"
|
|
unload_mod $MOD_TARGET
|
|
check_sysfs_value "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "0"
|
|
|
|
disable_lp $MOD_LIVEPATCH2
|
|
unload_lp $MOD_LIVEPATCH2
|
|
|
|
check_result "% insmod test_modules/$MOD_LIVEPATCH2.ko
|
|
livepatch: enabling patch '$MOD_LIVEPATCH2'
|
|
livepatch: '$MOD_LIVEPATCH2': initializing patching transition
|
|
$MOD_LIVEPATCH2: pre_patch_callback: vmlinux
|
|
livepatch: '$MOD_LIVEPATCH2': starting patching transition
|
|
livepatch: '$MOD_LIVEPATCH2': completing patching transition
|
|
$MOD_LIVEPATCH2: post_patch_callback: vmlinux
|
|
livepatch: '$MOD_LIVEPATCH2': patching complete
|
|
% insmod test_modules/$MOD_TARGET.ko
|
|
livepatch: applying patch '$MOD_LIVEPATCH2' to loading module '$MOD_TARGET'
|
|
$MOD_LIVEPATCH2: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
|
|
$MOD_LIVEPATCH2: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init
|
|
$MOD_TARGET: test_klp_callbacks_mod_init
|
|
% rmmod $MOD_TARGET
|
|
$MOD_TARGET: test_klp_callbacks_mod_exit
|
|
$MOD_LIVEPATCH2: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
|
|
livepatch: reverting patch '$MOD_LIVEPATCH2' on unloading module '$MOD_TARGET'
|
|
$MOD_LIVEPATCH2: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away
|
|
% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH2/enabled
|
|
livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition
|
|
$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux
|
|
livepatch: '$MOD_LIVEPATCH2': starting unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH2': completing unpatching transition
|
|
$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux
|
|
livepatch: '$MOD_LIVEPATCH2': unpatching complete
|
|
% rmmod $MOD_LIVEPATCH2"
|
|
fi
|
|
|
|
if [[ "$HAS_REPLACE_ATTR" == "1" ]]; then
|
|
start_test "sysfs test replace enabled"
|
|
|
|
MOD_ATOMIC_REPLACE=test_klp_atomic_replace
|
|
load_lp $MOD_ATOMIC_REPLACE replace=1
|
|
|
|
check_sysfs_rights "$MOD_ATOMIC_REPLACE" "replace" "-r--r--r--"
|
|
check_sysfs_value "$MOD_ATOMIC_REPLACE" "replace" "1"
|
|
|
|
disable_lp $MOD_ATOMIC_REPLACE
|
|
unload_lp $MOD_ATOMIC_REPLACE
|
|
|
|
check_result "% insmod test_modules/$MOD_ATOMIC_REPLACE.ko replace=1
|
|
livepatch: enabling patch '$MOD_ATOMIC_REPLACE'
|
|
livepatch: '$MOD_ATOMIC_REPLACE': initializing patching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': starting patching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': completing patching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': patching complete
|
|
% echo 0 > $SYSFS_KLP_DIR/$MOD_ATOMIC_REPLACE/enabled
|
|
livepatch: '$MOD_ATOMIC_REPLACE': initializing unpatching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': starting unpatching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': completing unpatching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': unpatching complete
|
|
% rmmod $MOD_ATOMIC_REPLACE"
|
|
|
|
start_test "sysfs test replace disabled"
|
|
|
|
load_lp $MOD_ATOMIC_REPLACE replace=0
|
|
|
|
check_sysfs_rights "$MOD_ATOMIC_REPLACE" "replace" "-r--r--r--"
|
|
check_sysfs_value "$MOD_ATOMIC_REPLACE" "replace" "0"
|
|
|
|
disable_lp $MOD_ATOMIC_REPLACE
|
|
unload_lp $MOD_ATOMIC_REPLACE
|
|
|
|
check_result "% insmod test_modules/$MOD_ATOMIC_REPLACE.ko replace=0
|
|
livepatch: enabling patch '$MOD_ATOMIC_REPLACE'
|
|
livepatch: '$MOD_ATOMIC_REPLACE': initializing patching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': starting patching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': completing patching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': patching complete
|
|
% echo 0 > $SYSFS_KLP_DIR/$MOD_ATOMIC_REPLACE/enabled
|
|
livepatch: '$MOD_ATOMIC_REPLACE': initializing unpatching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': starting unpatching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': completing unpatching transition
|
|
livepatch: '$MOD_ATOMIC_REPLACE': unpatching complete
|
|
% rmmod $MOD_ATOMIC_REPLACE"
|
|
fi
|
|
|
|
if [[ "$HAS_STACK_ORDER_ATTR" == "1" ]]; then
|
|
start_test "sysfs test stack_order value"
|
|
|
|
load_lp $MOD_LIVEPATCH
|
|
|
|
check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1"
|
|
|
|
load_lp $MOD_LIVEPATCH2
|
|
|
|
check_sysfs_value "$MOD_LIVEPATCH2" "stack_order" "2"
|
|
|
|
load_lp $MOD_LIVEPATCH3
|
|
|
|
check_sysfs_value "$MOD_LIVEPATCH3" "stack_order" "3"
|
|
|
|
disable_lp $MOD_LIVEPATCH2
|
|
unload_lp $MOD_LIVEPATCH2
|
|
|
|
check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1"
|
|
check_sysfs_value "$MOD_LIVEPATCH3" "stack_order" "2"
|
|
|
|
disable_lp $MOD_LIVEPATCH3
|
|
unload_lp $MOD_LIVEPATCH3
|
|
|
|
disable_lp $MOD_LIVEPATCH
|
|
unload_lp $MOD_LIVEPATCH
|
|
|
|
check_result "% insmod test_modules/$MOD_LIVEPATCH.ko
|
|
livepatch: enabling patch '$MOD_LIVEPATCH'
|
|
livepatch: '$MOD_LIVEPATCH': initializing patching transition
|
|
livepatch: '$MOD_LIVEPATCH': starting patching transition
|
|
livepatch: '$MOD_LIVEPATCH': completing patching transition
|
|
livepatch: '$MOD_LIVEPATCH': patching complete
|
|
% insmod test_modules/$MOD_LIVEPATCH2.ko
|
|
livepatch: enabling patch '$MOD_LIVEPATCH2'
|
|
livepatch: '$MOD_LIVEPATCH2': initializing patching transition
|
|
$MOD_LIVEPATCH2: pre_patch_callback: vmlinux
|
|
livepatch: '$MOD_LIVEPATCH2': starting patching transition
|
|
livepatch: '$MOD_LIVEPATCH2': completing patching transition
|
|
$MOD_LIVEPATCH2: post_patch_callback: vmlinux
|
|
livepatch: '$MOD_LIVEPATCH2': patching complete
|
|
% insmod test_modules/$MOD_LIVEPATCH3.ko
|
|
livepatch: enabling patch '$MOD_LIVEPATCH3'
|
|
livepatch: '$MOD_LIVEPATCH3': initializing patching transition
|
|
livepatch: '$MOD_LIVEPATCH3': starting patching transition
|
|
livepatch: '$MOD_LIVEPATCH3': completing patching transition
|
|
livepatch: '$MOD_LIVEPATCH3': patching complete
|
|
% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH2/enabled
|
|
livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition
|
|
$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux
|
|
livepatch: '$MOD_LIVEPATCH2': starting unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH2': completing unpatching transition
|
|
$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux
|
|
livepatch: '$MOD_LIVEPATCH2': unpatching complete
|
|
% rmmod $MOD_LIVEPATCH2
|
|
% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH3/enabled
|
|
livepatch: '$MOD_LIVEPATCH3': initializing unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH3': starting unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH3': completing unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH3': unpatching complete
|
|
% rmmod $MOD_LIVEPATCH3
|
|
% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled
|
|
livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH': starting unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH': completing unpatching transition
|
|
livepatch: '$MOD_LIVEPATCH': unpatching complete
|
|
% rmmod $MOD_LIVEPATCH"
|
|
fi
|
|
|
|
exit 0
|