1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# Copyright (C) 2019 Joe Lawrence <joe.lawrence@redhat.com> 4 5. $(dirname $0)/functions.sh 6 7MOD_LIVEPATCH=test_klp_livepatch 8 9setup_config 10 11 12# - turn ftrace_enabled OFF and verify livepatches can't load 13# - turn ftrace_enabled ON and verify livepatch can load 14# - verify that ftrace_enabled can't be turned OFF while a livepatch is loaded 15# (skipped on kernels where the sysctl is deprecated and always refuses 0) 16 17start_test "livepatch interaction with ftrace_enabled sysctl" 18 19if ftrace_disable_supported; then 20 21 set_ftrace_enabled 0 22 load_failing_mod $MOD_LIVEPATCH 23 24 set_ftrace_enabled 1 25 load_lp $MOD_LIVEPATCH 26 if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then 27 echo -e "FAIL\n\n" 28 die "livepatch kselftest(s) failed" 29 fi 30 31 # Check that ftrace could not get disabled when a livepatch is enabled 32 set_ftrace_enabled --fail 0 33 if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then 34 echo -e "FAIL\n\n" 35 die "livepatch kselftest(s) failed" 36 fi 37 disable_lp $MOD_LIVEPATCH 38 unload_lp $MOD_LIVEPATCH 39 40 check_result "livepatch: kernel.ftrace_enabled = 0 41% insmod test_modules/$MOD_LIVEPATCH.ko 42livepatch: enabling patch '$MOD_LIVEPATCH' 43livepatch: '$MOD_LIVEPATCH': initializing patching transition 44livepatch: failed to register ftrace handler for function 'cmdline_proc_show' (-16) 45livepatch: failed to patch object 'vmlinux' 46livepatch: failed to enable patch '$MOD_LIVEPATCH' 47livepatch: '$MOD_LIVEPATCH': canceling patching transition, going to unpatch 48livepatch: '$MOD_LIVEPATCH': completing unpatching transition 49livepatch: '$MOD_LIVEPATCH': unpatching complete 50insmod: ERROR: could not insert module test_modules/$MOD_LIVEPATCH.ko: Device or resource busy 51livepatch: kernel.ftrace_enabled = 1 52% insmod test_modules/$MOD_LIVEPATCH.ko 53livepatch: enabling patch '$MOD_LIVEPATCH' 54livepatch: '$MOD_LIVEPATCH': initializing patching transition 55livepatch: '$MOD_LIVEPATCH': starting patching transition 56livepatch: '$MOD_LIVEPATCH': completing patching transition 57livepatch: '$MOD_LIVEPATCH': patching complete 58livepatch: sysctl: setting key \"kernel.ftrace_enabled\": Device or resource busy 59% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled 60livepatch: '$MOD_LIVEPATCH': initializing unpatching transition 61livepatch: '$MOD_LIVEPATCH': starting unpatching transition 62livepatch: '$MOD_LIVEPATCH': completing unpatching transition 63livepatch: '$MOD_LIVEPATCH': unpatching complete 64% rmmod $MOD_LIVEPATCH" 65 66else 67 68 set_ftrace_enabled --fail 0 69 check_result "livepatch: sysctl: setting key \"kernel.ftrace_enabled\": \ 70Operation not supported" 71 72fi 73 74 75# - verify livepatch can load 76# - check if traces have a patched function 77# - reset trace and unload livepatch 78 79start_test "trace livepatched function and check that the live patch remains in effect" 80 81FUNCTION_NAME="livepatch_cmdline_proc_show" 82 83load_lp $MOD_LIVEPATCH 84trace_function "$FUNCTION_NAME" 85 86if [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH: this has been live patched" ]] ; then 87 log "livepatch: ok" 88fi 89 90check_traced_functions "$FUNCTION_NAME" 91 92disable_lp $MOD_LIVEPATCH 93unload_lp $MOD_LIVEPATCH 94 95check_result "% insmod test_modules/$MOD_LIVEPATCH.ko 96livepatch: enabling patch '$MOD_LIVEPATCH' 97livepatch: '$MOD_LIVEPATCH': initializing patching transition 98livepatch: '$MOD_LIVEPATCH': starting patching transition 99livepatch: '$MOD_LIVEPATCH': completing patching transition 100livepatch: '$MOD_LIVEPATCH': patching complete 101livepatch: ok 102% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled 103livepatch: '$MOD_LIVEPATCH': initializing unpatching transition 104livepatch: '$MOD_LIVEPATCH': starting unpatching transition 105livepatch: '$MOD_LIVEPATCH': completing unpatching transition 106livepatch: '$MOD_LIVEPATCH': unpatching complete 107% rmmod $MOD_LIVEPATCH" 108 109 110# - trace a function 111# - verify livepatch can load targgeting on the same traced function 112# - check if the livepatch is in effect 113# - reset trace and unload livepatch 114 115start_test "livepatch a traced function and check that the live patch remains in effect" 116 117FUNCTION_NAME="cmdline_proc_show" 118 119trace_function "$FUNCTION_NAME" 120load_lp $MOD_LIVEPATCH 121 122if [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH: this has been live patched" ]] ; then 123 log "livepatch: ok" 124fi 125 126check_traced_functions "$FUNCTION_NAME" 127 128disable_lp $MOD_LIVEPATCH 129unload_lp $MOD_LIVEPATCH 130 131check_result "% insmod test_modules/$MOD_LIVEPATCH.ko 132livepatch: enabling patch '$MOD_LIVEPATCH' 133livepatch: '$MOD_LIVEPATCH': initializing patching transition 134livepatch: '$MOD_LIVEPATCH': starting patching transition 135livepatch: '$MOD_LIVEPATCH': completing patching transition 136livepatch: '$MOD_LIVEPATCH': patching complete 137livepatch: ok 138% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled 139livepatch: '$MOD_LIVEPATCH': initializing unpatching transition 140livepatch: '$MOD_LIVEPATCH': starting unpatching transition 141livepatch: '$MOD_LIVEPATCH': completing unpatching transition 142livepatch: '$MOD_LIVEPATCH': unpatching complete 143% rmmod $MOD_LIVEPATCH" 144 145exit 0 146