145 lines · 4.9 KB · Shell
RawDownload
#!/bin/bash# SPDX-License-Identifier: GPL-2.0# Copyright (C) 2019 Joe Lawrence <joe.lawrence@redhat.com> . $(dirname $0)/functions.sh MOD_LIVEPATCH=test_klp_livepatch setup_config  # - turn ftrace_enabled OFF and verify livepatches can't load# - turn ftrace_enabled ON and verify livepatch can load# - verify that ftrace_enabled can't be turned OFF while a livepatch is loaded# (skipped on kernels where the sysctl is deprecated and always refuses 0) start_test "livepatch interaction with ftrace_enabled sysctl" if ftrace_disable_supported; then 	set_ftrace_enabled 0	load_failing_mod $MOD_LIVEPATCH 	set_ftrace_enabled 1	load_lp $MOD_LIVEPATCH	if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then		echo -e "FAIL\n\n"		die "livepatch kselftest(s) failed"	fi 	# Check that ftrace could not get disabled when a livepatch is enabled	set_ftrace_enabled --fail 0	if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then		echo -e "FAIL\n\n"		die "livepatch kselftest(s) failed"	fi	disable_lp $MOD_LIVEPATCH	unload_lp $MOD_LIVEPATCH 	check_result "livepatch: kernel.ftrace_enabled = 0% insmod test_modules/$MOD_LIVEPATCH.kolivepatch: enabling patch '$MOD_LIVEPATCH'livepatch: '$MOD_LIVEPATCH': initializing patching transitionlivepatch: failed to register ftrace handler for function 'cmdline_proc_show' (-16)livepatch: failed to patch object 'vmlinux'livepatch: failed to enable patch '$MOD_LIVEPATCH'livepatch: '$MOD_LIVEPATCH': canceling patching transition, going to unpatchlivepatch: '$MOD_LIVEPATCH': completing unpatching transitionlivepatch: '$MOD_LIVEPATCH': unpatching completeinsmod: ERROR: could not insert module test_modules/$MOD_LIVEPATCH.ko: Device or resource busylivepatch: kernel.ftrace_enabled = 1% insmod test_modules/$MOD_LIVEPATCH.kolivepatch: enabling patch '$MOD_LIVEPATCH'livepatch: '$MOD_LIVEPATCH': initializing patching transitionlivepatch: '$MOD_LIVEPATCH': starting patching transitionlivepatch: '$MOD_LIVEPATCH': completing patching transitionlivepatch: '$MOD_LIVEPATCH': patching completelivepatch: sysctl: setting key \"kernel.ftrace_enabled\": Device or resource busy% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabledlivepatch: '$MOD_LIVEPATCH': initializing unpatching transitionlivepatch: '$MOD_LIVEPATCH': starting unpatching transitionlivepatch: '$MOD_LIVEPATCH': completing unpatching transitionlivepatch: '$MOD_LIVEPATCH': unpatching complete% rmmod $MOD_LIVEPATCH" else 	set_ftrace_enabled --fail 0	check_result "livepatch: sysctl: setting key \"kernel.ftrace_enabled\": \Operation not supported" fi  # - verify livepatch can load# - check if traces have a patched function# - reset trace and unload livepatch start_test "trace livepatched function and check that the live patch remains in effect" FUNCTION_NAME="livepatch_cmdline_proc_show" load_lp $MOD_LIVEPATCHtrace_function "$FUNCTION_NAME" if [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH: this has been live patched" ]] ; then	log "livepatch: ok"fi check_traced_functions "$FUNCTION_NAME" disable_lp $MOD_LIVEPATCHunload_lp $MOD_LIVEPATCH check_result "% insmod test_modules/$MOD_LIVEPATCH.kolivepatch: enabling patch '$MOD_LIVEPATCH'livepatch: '$MOD_LIVEPATCH': initializing patching transitionlivepatch: '$MOD_LIVEPATCH': starting patching transitionlivepatch: '$MOD_LIVEPATCH': completing patching transitionlivepatch: '$MOD_LIVEPATCH': patching completelivepatch: ok% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabledlivepatch: '$MOD_LIVEPATCH': initializing unpatching transitionlivepatch: '$MOD_LIVEPATCH': starting unpatching transitionlivepatch: '$MOD_LIVEPATCH': completing unpatching transitionlivepatch: '$MOD_LIVEPATCH': unpatching complete% rmmod $MOD_LIVEPATCH"  # - trace a function# - verify livepatch can load targgeting on the same traced function# - check if the livepatch is in effect# - reset trace and unload livepatch start_test "livepatch a traced function and check that the live patch remains in effect" FUNCTION_NAME="cmdline_proc_show" trace_function "$FUNCTION_NAME"load_lp $MOD_LIVEPATCH if [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH: this has been live patched" ]] ; then	log "livepatch: ok"fi check_traced_functions "$FUNCTION_NAME" disable_lp $MOD_LIVEPATCHunload_lp $MOD_LIVEPATCH check_result "% insmod test_modules/$MOD_LIVEPATCH.kolivepatch: enabling patch '$MOD_LIVEPATCH'livepatch: '$MOD_LIVEPATCH': initializing patching transitionlivepatch: '$MOD_LIVEPATCH': starting patching transitionlivepatch: '$MOD_LIVEPATCH': completing patching transitionlivepatch: '$MOD_LIVEPATCH': patching completelivepatch: ok% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabledlivepatch: '$MOD_LIVEPATCH': initializing unpatching transitionlivepatch: '$MOD_LIVEPATCH': starting unpatching transitionlivepatch: '$MOD_LIVEPATCH': completing unpatching transitionlivepatch: '$MOD_LIVEPATCH': unpatching complete% rmmod $MOD_LIVEPATCH" exit 0