1*053f45beSAndroid Build Coastguard Worker#!/bin/bash 2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0 3*053f45beSAndroid Build Coastguard Worker# Copyright (C) 2018 Joe Lawrence <[email protected]> 4*053f45beSAndroid Build Coastguard Worker 5*053f45beSAndroid Build Coastguard Worker# Shell functions for the rest of the scripts. 6*053f45beSAndroid Build Coastguard Worker 7*053f45beSAndroid Build Coastguard WorkerMAX_RETRIES=600 8*053f45beSAndroid Build Coastguard WorkerRETRY_INTERVAL=".1" # seconds 9*053f45beSAndroid Build Coastguard WorkerKLP_SYSFS_DIR="/sys/kernel/livepatch" 10*053f45beSAndroid Build Coastguard Worker 11*053f45beSAndroid Build Coastguard Worker# Kselftest framework requirement - SKIP code is 4 12*053f45beSAndroid Build Coastguard Workerksft_skip=4 13*053f45beSAndroid Build Coastguard Worker 14*053f45beSAndroid Build Coastguard Worker# log(msg) - write message to kernel log 15*053f45beSAndroid Build Coastguard Worker# msg - insightful words 16*053f45beSAndroid Build Coastguard Workerfunction log() { 17*053f45beSAndroid Build Coastguard Worker echo "$1" > /dev/kmsg 18*053f45beSAndroid Build Coastguard Worker} 19*053f45beSAndroid Build Coastguard Worker 20*053f45beSAndroid Build Coastguard Worker# skip(msg) - testing can't proceed 21*053f45beSAndroid Build Coastguard Worker# msg - explanation 22*053f45beSAndroid Build Coastguard Workerfunction skip() { 23*053f45beSAndroid Build Coastguard Worker log "SKIP: $1" 24*053f45beSAndroid Build Coastguard Worker echo "SKIP: $1" >&2 25*053f45beSAndroid Build Coastguard Worker exit $ksft_skip 26*053f45beSAndroid Build Coastguard Worker} 27*053f45beSAndroid Build Coastguard Worker 28*053f45beSAndroid Build Coastguard Worker# root test 29*053f45beSAndroid Build Coastguard Workerfunction is_root() { 30*053f45beSAndroid Build Coastguard Worker uid=$(id -u) 31*053f45beSAndroid Build Coastguard Worker if [ $uid -ne 0 ]; then 32*053f45beSAndroid Build Coastguard Worker echo "skip all tests: must be run as root" >&2 33*053f45beSAndroid Build Coastguard Worker exit $ksft_skip 34*053f45beSAndroid Build Coastguard Worker fi 35*053f45beSAndroid Build Coastguard Worker} 36*053f45beSAndroid Build Coastguard Worker 37*053f45beSAndroid Build Coastguard Worker# die(msg) - game over, man 38*053f45beSAndroid Build Coastguard Worker# msg - dying words 39*053f45beSAndroid Build Coastguard Workerfunction die() { 40*053f45beSAndroid Build Coastguard Worker log "ERROR: $1" 41*053f45beSAndroid Build Coastguard Worker echo "ERROR: $1" >&2 42*053f45beSAndroid Build Coastguard Worker exit 1 43*053f45beSAndroid Build Coastguard Worker} 44*053f45beSAndroid Build Coastguard Worker 45*053f45beSAndroid Build Coastguard Worker# save existing dmesg so we can detect new content 46*053f45beSAndroid Build Coastguard Workerfunction save_dmesg() { 47*053f45beSAndroid Build Coastguard Worker SAVED_DMESG=$(mktemp --tmpdir -t klp-dmesg-XXXXXX) 48*053f45beSAndroid Build Coastguard Worker dmesg > "$SAVED_DMESG" 49*053f45beSAndroid Build Coastguard Worker} 50*053f45beSAndroid Build Coastguard Worker 51*053f45beSAndroid Build Coastguard Worker# cleanup temporary dmesg file from save_dmesg() 52*053f45beSAndroid Build Coastguard Workerfunction cleanup_dmesg_file() { 53*053f45beSAndroid Build Coastguard Worker rm -f "$SAVED_DMESG" 54*053f45beSAndroid Build Coastguard Worker} 55*053f45beSAndroid Build Coastguard Worker 56*053f45beSAndroid Build Coastguard Workerfunction push_config() { 57*053f45beSAndroid Build Coastguard Worker DYNAMIC_DEBUG=$(grep '^kernel/livepatch' /sys/kernel/debug/dynamic_debug/control | \ 58*053f45beSAndroid Build Coastguard Worker awk -F'[: ]' '{print "file " $1 " line " $2 " " $4}') 59*053f45beSAndroid Build Coastguard Worker FTRACE_ENABLED=$(sysctl --values kernel.ftrace_enabled) 60*053f45beSAndroid Build Coastguard Worker} 61*053f45beSAndroid Build Coastguard Worker 62*053f45beSAndroid Build Coastguard Workerfunction pop_config() { 63*053f45beSAndroid Build Coastguard Worker if [[ -n "$DYNAMIC_DEBUG" ]]; then 64*053f45beSAndroid Build Coastguard Worker echo -n "$DYNAMIC_DEBUG" > /sys/kernel/debug/dynamic_debug/control 65*053f45beSAndroid Build Coastguard Worker fi 66*053f45beSAndroid Build Coastguard Worker if [[ -n "$FTRACE_ENABLED" ]]; then 67*053f45beSAndroid Build Coastguard Worker sysctl kernel.ftrace_enabled="$FTRACE_ENABLED" &> /dev/null 68*053f45beSAndroid Build Coastguard Worker fi 69*053f45beSAndroid Build Coastguard Worker} 70*053f45beSAndroid Build Coastguard Worker 71*053f45beSAndroid Build Coastguard Workerfunction set_dynamic_debug() { 72*053f45beSAndroid Build Coastguard Worker cat <<-EOF > /sys/kernel/debug/dynamic_debug/control 73*053f45beSAndroid Build Coastguard Worker file kernel/livepatch/* +p 74*053f45beSAndroid Build Coastguard Worker func klp_try_switch_task -p 75*053f45beSAndroid Build Coastguard Worker EOF 76*053f45beSAndroid Build Coastguard Worker} 77*053f45beSAndroid Build Coastguard Worker 78*053f45beSAndroid Build Coastguard Workerfunction set_ftrace_enabled() { 79*053f45beSAndroid Build Coastguard Worker local can_fail=0 80*053f45beSAndroid Build Coastguard Worker if [[ "$1" == "--fail" ]] ; then 81*053f45beSAndroid Build Coastguard Worker can_fail=1 82*053f45beSAndroid Build Coastguard Worker shift 83*053f45beSAndroid Build Coastguard Worker fi 84*053f45beSAndroid Build Coastguard Worker 85*053f45beSAndroid Build Coastguard Worker local err=$(sysctl -q kernel.ftrace_enabled="$1" 2>&1) 86*053f45beSAndroid Build Coastguard Worker local result=$(sysctl --values kernel.ftrace_enabled) 87*053f45beSAndroid Build Coastguard Worker 88*053f45beSAndroid Build Coastguard Worker if [[ "$result" != "$1" ]] ; then 89*053f45beSAndroid Build Coastguard Worker if [[ $can_fail -eq 1 ]] ; then 90*053f45beSAndroid Build Coastguard Worker echo "livepatch: $err" | sed 's#/proc/sys/kernel/#kernel.#' > /dev/kmsg 91*053f45beSAndroid Build Coastguard Worker return 92*053f45beSAndroid Build Coastguard Worker fi 93*053f45beSAndroid Build Coastguard Worker 94*053f45beSAndroid Build Coastguard Worker skip "failed to set kernel.ftrace_enabled = $1" 95*053f45beSAndroid Build Coastguard Worker fi 96*053f45beSAndroid Build Coastguard Worker 97*053f45beSAndroid Build Coastguard Worker echo "livepatch: kernel.ftrace_enabled = $result" > /dev/kmsg 98*053f45beSAndroid Build Coastguard Worker} 99*053f45beSAndroid Build Coastguard Worker 100*053f45beSAndroid Build Coastguard Workerfunction cleanup() { 101*053f45beSAndroid Build Coastguard Worker pop_config 102*053f45beSAndroid Build Coastguard Worker cleanup_dmesg_file 103*053f45beSAndroid Build Coastguard Worker} 104*053f45beSAndroid Build Coastguard Worker 105*053f45beSAndroid Build Coastguard Worker# setup_config - save the current config and set a script exit trap that 106*053f45beSAndroid Build Coastguard Worker# restores the original config. Setup the dynamic debug 107*053f45beSAndroid Build Coastguard Worker# for verbose livepatching output and turn on 108*053f45beSAndroid Build Coastguard Worker# the ftrace_enabled sysctl. 109*053f45beSAndroid Build Coastguard Workerfunction setup_config() { 110*053f45beSAndroid Build Coastguard Worker is_root 111*053f45beSAndroid Build Coastguard Worker push_config 112*053f45beSAndroid Build Coastguard Worker set_dynamic_debug 113*053f45beSAndroid Build Coastguard Worker set_ftrace_enabled 1 114*053f45beSAndroid Build Coastguard Worker trap cleanup EXIT INT TERM HUP 115*053f45beSAndroid Build Coastguard Worker} 116*053f45beSAndroid Build Coastguard Worker 117*053f45beSAndroid Build Coastguard Worker# loop_until(cmd) - loop a command until it is successful or $MAX_RETRIES, 118*053f45beSAndroid Build Coastguard Worker# sleep $RETRY_INTERVAL between attempts 119*053f45beSAndroid Build Coastguard Worker# cmd - command and its arguments to run 120*053f45beSAndroid Build Coastguard Workerfunction loop_until() { 121*053f45beSAndroid Build Coastguard Worker local cmd="$*" 122*053f45beSAndroid Build Coastguard Worker local i=0 123*053f45beSAndroid Build Coastguard Worker while true; do 124*053f45beSAndroid Build Coastguard Worker eval "$cmd" && return 0 125*053f45beSAndroid Build Coastguard Worker [[ $((i++)) -eq $MAX_RETRIES ]] && return 1 126*053f45beSAndroid Build Coastguard Worker sleep $RETRY_INTERVAL 127*053f45beSAndroid Build Coastguard Worker done 128*053f45beSAndroid Build Coastguard Worker} 129*053f45beSAndroid Build Coastguard Worker 130*053f45beSAndroid Build Coastguard Workerfunction assert_mod() { 131*053f45beSAndroid Build Coastguard Worker local mod="$1" 132*053f45beSAndroid Build Coastguard Worker 133*053f45beSAndroid Build Coastguard Worker modprobe --dry-run "$mod" &>/dev/null 134*053f45beSAndroid Build Coastguard Worker} 135*053f45beSAndroid Build Coastguard Worker 136*053f45beSAndroid Build Coastguard Workerfunction is_livepatch_mod() { 137*053f45beSAndroid Build Coastguard Worker local mod="$1" 138*053f45beSAndroid Build Coastguard Worker 139*053f45beSAndroid Build Coastguard Worker if [[ $(modinfo "$mod" | awk '/^livepatch:/{print $NF}') == "Y" ]]; then 140*053f45beSAndroid Build Coastguard Worker return 0 141*053f45beSAndroid Build Coastguard Worker fi 142*053f45beSAndroid Build Coastguard Worker 143*053f45beSAndroid Build Coastguard Worker return 1 144*053f45beSAndroid Build Coastguard Worker} 145*053f45beSAndroid Build Coastguard Worker 146*053f45beSAndroid Build Coastguard Workerfunction __load_mod() { 147*053f45beSAndroid Build Coastguard Worker local mod="$1"; shift 148*053f45beSAndroid Build Coastguard Worker 149*053f45beSAndroid Build Coastguard Worker local msg="% modprobe $mod $*" 150*053f45beSAndroid Build Coastguard Worker log "${msg%% }" 151*053f45beSAndroid Build Coastguard Worker ret=$(modprobe "$mod" "$@" 2>&1) 152*053f45beSAndroid Build Coastguard Worker if [[ "$ret" != "" ]]; then 153*053f45beSAndroid Build Coastguard Worker die "$ret" 154*053f45beSAndroid Build Coastguard Worker fi 155*053f45beSAndroid Build Coastguard Worker 156*053f45beSAndroid Build Coastguard Worker # Wait for module in sysfs ... 157*053f45beSAndroid Build Coastguard Worker loop_until '[[ -e "/sys/module/$mod" ]]' || 158*053f45beSAndroid Build Coastguard Worker die "failed to load module $mod" 159*053f45beSAndroid Build Coastguard Worker} 160*053f45beSAndroid Build Coastguard Worker 161*053f45beSAndroid Build Coastguard Worker 162*053f45beSAndroid Build Coastguard Worker# load_mod(modname, params) - load a kernel module 163*053f45beSAndroid Build Coastguard Worker# modname - module name to load 164*053f45beSAndroid Build Coastguard Worker# params - module parameters to pass to modprobe 165*053f45beSAndroid Build Coastguard Workerfunction load_mod() { 166*053f45beSAndroid Build Coastguard Worker local mod="$1"; shift 167*053f45beSAndroid Build Coastguard Worker 168*053f45beSAndroid Build Coastguard Worker assert_mod "$mod" || 169*053f45beSAndroid Build Coastguard Worker skip "unable to load module ${mod}, verify CONFIG_TEST_LIVEPATCH=m and run self-tests as root" 170*053f45beSAndroid Build Coastguard Worker 171*053f45beSAndroid Build Coastguard Worker is_livepatch_mod "$mod" && 172*053f45beSAndroid Build Coastguard Worker die "use load_lp() to load the livepatch module $mod" 173*053f45beSAndroid Build Coastguard Worker 174*053f45beSAndroid Build Coastguard Worker __load_mod "$mod" "$@" 175*053f45beSAndroid Build Coastguard Worker} 176*053f45beSAndroid Build Coastguard Worker 177*053f45beSAndroid Build Coastguard Worker# load_lp_nowait(modname, params) - load a kernel module with a livepatch 178*053f45beSAndroid Build Coastguard Worker# but do not wait on until the transition finishes 179*053f45beSAndroid Build Coastguard Worker# modname - module name to load 180*053f45beSAndroid Build Coastguard Worker# params - module parameters to pass to modprobe 181*053f45beSAndroid Build Coastguard Workerfunction load_lp_nowait() { 182*053f45beSAndroid Build Coastguard Worker local mod="$1"; shift 183*053f45beSAndroid Build Coastguard Worker 184*053f45beSAndroid Build Coastguard Worker assert_mod "$mod" || 185*053f45beSAndroid Build Coastguard Worker skip "unable to load module ${mod}, verify CONFIG_TEST_LIVEPATCH=m and run self-tests as root" 186*053f45beSAndroid Build Coastguard Worker 187*053f45beSAndroid Build Coastguard Worker is_livepatch_mod "$mod" || 188*053f45beSAndroid Build Coastguard Worker die "module $mod is not a livepatch" 189*053f45beSAndroid Build Coastguard Worker 190*053f45beSAndroid Build Coastguard Worker __load_mod "$mod" "$@" 191*053f45beSAndroid Build Coastguard Worker 192*053f45beSAndroid Build Coastguard Worker # Wait for livepatch in sysfs ... 193*053f45beSAndroid Build Coastguard Worker loop_until '[[ -e "/sys/kernel/livepatch/$mod" ]]' || 194*053f45beSAndroid Build Coastguard Worker die "failed to load module $mod (sysfs)" 195*053f45beSAndroid Build Coastguard Worker} 196*053f45beSAndroid Build Coastguard Worker 197*053f45beSAndroid Build Coastguard Worker# load_lp(modname, params) - load a kernel module with a livepatch 198*053f45beSAndroid Build Coastguard Worker# modname - module name to load 199*053f45beSAndroid Build Coastguard Worker# params - module parameters to pass to modprobe 200*053f45beSAndroid Build Coastguard Workerfunction load_lp() { 201*053f45beSAndroid Build Coastguard Worker local mod="$1"; shift 202*053f45beSAndroid Build Coastguard Worker 203*053f45beSAndroid Build Coastguard Worker load_lp_nowait "$mod" "$@" 204*053f45beSAndroid Build Coastguard Worker 205*053f45beSAndroid Build Coastguard Worker # Wait until the transition finishes ... 206*053f45beSAndroid Build Coastguard Worker loop_until 'grep -q '^0$' /sys/kernel/livepatch/$mod/transition' || 207*053f45beSAndroid Build Coastguard Worker die "failed to complete transition" 208*053f45beSAndroid Build Coastguard Worker} 209*053f45beSAndroid Build Coastguard Worker 210*053f45beSAndroid Build Coastguard Worker# load_failing_mod(modname, params) - load a kernel module, expect to fail 211*053f45beSAndroid Build Coastguard Worker# modname - module name to load 212*053f45beSAndroid Build Coastguard Worker# params - module parameters to pass to modprobe 213*053f45beSAndroid Build Coastguard Workerfunction load_failing_mod() { 214*053f45beSAndroid Build Coastguard Worker local mod="$1"; shift 215*053f45beSAndroid Build Coastguard Worker 216*053f45beSAndroid Build Coastguard Worker local msg="% modprobe $mod $*" 217*053f45beSAndroid Build Coastguard Worker log "${msg%% }" 218*053f45beSAndroid Build Coastguard Worker ret=$(modprobe "$mod" "$@" 2>&1) 219*053f45beSAndroid Build Coastguard Worker if [[ "$ret" == "" ]]; then 220*053f45beSAndroid Build Coastguard Worker die "$mod unexpectedly loaded" 221*053f45beSAndroid Build Coastguard Worker fi 222*053f45beSAndroid Build Coastguard Worker log "$ret" 223*053f45beSAndroid Build Coastguard Worker} 224*053f45beSAndroid Build Coastguard Worker 225*053f45beSAndroid Build Coastguard Worker# unload_mod(modname) - unload a kernel module 226*053f45beSAndroid Build Coastguard Worker# modname - module name to unload 227*053f45beSAndroid Build Coastguard Workerfunction unload_mod() { 228*053f45beSAndroid Build Coastguard Worker local mod="$1" 229*053f45beSAndroid Build Coastguard Worker 230*053f45beSAndroid Build Coastguard Worker # Wait for module reference count to clear ... 231*053f45beSAndroid Build Coastguard Worker loop_until '[[ $(cat "/sys/module/$mod/refcnt") == "0" ]]' || 232*053f45beSAndroid Build Coastguard Worker die "failed to unload module $mod (refcnt)" 233*053f45beSAndroid Build Coastguard Worker 234*053f45beSAndroid Build Coastguard Worker log "% rmmod $mod" 235*053f45beSAndroid Build Coastguard Worker ret=$(rmmod "$mod" 2>&1) 236*053f45beSAndroid Build Coastguard Worker if [[ "$ret" != "" ]]; then 237*053f45beSAndroid Build Coastguard Worker die "$ret" 238*053f45beSAndroid Build Coastguard Worker fi 239*053f45beSAndroid Build Coastguard Worker 240*053f45beSAndroid Build Coastguard Worker # Wait for module in sysfs ... 241*053f45beSAndroid Build Coastguard Worker loop_until '[[ ! -e "/sys/module/$mod" ]]' || 242*053f45beSAndroid Build Coastguard Worker die "failed to unload module $mod (/sys/module)" 243*053f45beSAndroid Build Coastguard Worker} 244*053f45beSAndroid Build Coastguard Worker 245*053f45beSAndroid Build Coastguard Worker# unload_lp(modname) - unload a kernel module with a livepatch 246*053f45beSAndroid Build Coastguard Worker# modname - module name to unload 247*053f45beSAndroid Build Coastguard Workerfunction unload_lp() { 248*053f45beSAndroid Build Coastguard Worker unload_mod "$1" 249*053f45beSAndroid Build Coastguard Worker} 250*053f45beSAndroid Build Coastguard Worker 251*053f45beSAndroid Build Coastguard Worker# disable_lp(modname) - disable a livepatch 252*053f45beSAndroid Build Coastguard Worker# modname - module name to unload 253*053f45beSAndroid Build Coastguard Workerfunction disable_lp() { 254*053f45beSAndroid Build Coastguard Worker local mod="$1" 255*053f45beSAndroid Build Coastguard Worker 256*053f45beSAndroid Build Coastguard Worker log "% echo 0 > /sys/kernel/livepatch/$mod/enabled" 257*053f45beSAndroid Build Coastguard Worker echo 0 > /sys/kernel/livepatch/"$mod"/enabled 258*053f45beSAndroid Build Coastguard Worker 259*053f45beSAndroid Build Coastguard Worker # Wait until the transition finishes and the livepatch gets 260*053f45beSAndroid Build Coastguard Worker # removed from sysfs... 261*053f45beSAndroid Build Coastguard Worker loop_until '[[ ! -e "/sys/kernel/livepatch/$mod" ]]' || 262*053f45beSAndroid Build Coastguard Worker die "failed to disable livepatch $mod" 263*053f45beSAndroid Build Coastguard Worker} 264*053f45beSAndroid Build Coastguard Worker 265*053f45beSAndroid Build Coastguard Worker# set_pre_patch_ret(modname, pre_patch_ret) 266*053f45beSAndroid Build Coastguard Worker# modname - module name to set 267*053f45beSAndroid Build Coastguard Worker# pre_patch_ret - new pre_patch_ret value 268*053f45beSAndroid Build Coastguard Workerfunction set_pre_patch_ret { 269*053f45beSAndroid Build Coastguard Worker local mod="$1"; shift 270*053f45beSAndroid Build Coastguard Worker local ret="$1" 271*053f45beSAndroid Build Coastguard Worker 272*053f45beSAndroid Build Coastguard Worker log "% echo $ret > /sys/module/$mod/parameters/pre_patch_ret" 273*053f45beSAndroid Build Coastguard Worker echo "$ret" > /sys/module/"$mod"/parameters/pre_patch_ret 274*053f45beSAndroid Build Coastguard Worker 275*053f45beSAndroid Build Coastguard Worker # Wait for sysfs value to hold ... 276*053f45beSAndroid Build Coastguard Worker loop_until '[[ $(cat "/sys/module/$mod/parameters/pre_patch_ret") == "$ret" ]]' || 277*053f45beSAndroid Build Coastguard Worker die "failed to set pre_patch_ret parameter for $mod module" 278*053f45beSAndroid Build Coastguard Worker} 279*053f45beSAndroid Build Coastguard Worker 280*053f45beSAndroid Build Coastguard Workerfunction start_test { 281*053f45beSAndroid Build Coastguard Worker local test="$1" 282*053f45beSAndroid Build Coastguard Worker 283*053f45beSAndroid Build Coastguard Worker save_dmesg 284*053f45beSAndroid Build Coastguard Worker echo -n "TEST: $test ... " 285*053f45beSAndroid Build Coastguard Worker log "===== TEST: $test =====" 286*053f45beSAndroid Build Coastguard Worker} 287*053f45beSAndroid Build Coastguard Worker 288*053f45beSAndroid Build Coastguard Worker# check_result() - verify dmesg output 289*053f45beSAndroid Build Coastguard Worker# TODO - better filter, out of order msgs, etc? 290*053f45beSAndroid Build Coastguard Workerfunction check_result { 291*053f45beSAndroid Build Coastguard Worker local expect="$*" 292*053f45beSAndroid Build Coastguard Worker local result 293*053f45beSAndroid Build Coastguard Worker 294*053f45beSAndroid Build Coastguard Worker # Note: when comparing dmesg output, the kernel log timestamps 295*053f45beSAndroid Build Coastguard Worker # help differentiate repeated testing runs. Remove them with a 296*053f45beSAndroid Build Coastguard Worker # post-comparison sed filter. 297*053f45beSAndroid Build Coastguard Worker 298*053f45beSAndroid Build Coastguard Worker result=$(dmesg | comm --nocheck-order -13 "$SAVED_DMESG" - | \ 299*053f45beSAndroid Build Coastguard Worker grep -e 'livepatch:' -e 'test_klp' | \ 300*053f45beSAndroid Build Coastguard Worker grep -v '\(tainting\|taints\) kernel' | \ 301*053f45beSAndroid Build Coastguard Worker sed 's/^\[[ 0-9.]*\] //') 302*053f45beSAndroid Build Coastguard Worker 303*053f45beSAndroid Build Coastguard Worker if [[ "$expect" == "$result" ]] ; then 304*053f45beSAndroid Build Coastguard Worker echo "ok" 305*053f45beSAndroid Build Coastguard Worker else 306*053f45beSAndroid Build Coastguard Worker echo -e "not ok\n\n$(diff -upr --label expected --label result <(echo "$expect") <(echo "$result"))\n" 307*053f45beSAndroid Build Coastguard Worker die "livepatch kselftest(s) failed" 308*053f45beSAndroid Build Coastguard Worker fi 309*053f45beSAndroid Build Coastguard Worker 310*053f45beSAndroid Build Coastguard Worker cleanup_dmesg_file 311*053f45beSAndroid Build Coastguard Worker} 312*053f45beSAndroid Build Coastguard Worker 313*053f45beSAndroid Build Coastguard Worker# check_sysfs_rights(modname, rel_path, expected_rights) - check sysfs 314*053f45beSAndroid Build Coastguard Worker# path permissions 315*053f45beSAndroid Build Coastguard Worker# modname - livepatch module creating the sysfs interface 316*053f45beSAndroid Build Coastguard Worker# rel_path - relative path of the sysfs interface 317*053f45beSAndroid Build Coastguard Worker# expected_rights - expected access rights 318*053f45beSAndroid Build Coastguard Workerfunction check_sysfs_rights() { 319*053f45beSAndroid Build Coastguard Worker local mod="$1"; shift 320*053f45beSAndroid Build Coastguard Worker local rel_path="$1"; shift 321*053f45beSAndroid Build Coastguard Worker local expected_rights="$1"; shift 322*053f45beSAndroid Build Coastguard Worker 323*053f45beSAndroid Build Coastguard Worker local path="$KLP_SYSFS_DIR/$mod/$rel_path" 324*053f45beSAndroid Build Coastguard Worker local rights=$(/bin/stat --format '%A' "$path") 325*053f45beSAndroid Build Coastguard Worker if test "$rights" != "$expected_rights" ; then 326*053f45beSAndroid Build Coastguard Worker die "Unexpected access rights of $path: $expected_rights vs. $rights" 327*053f45beSAndroid Build Coastguard Worker fi 328*053f45beSAndroid Build Coastguard Worker} 329*053f45beSAndroid Build Coastguard Worker 330*053f45beSAndroid Build Coastguard Worker# check_sysfs_value(modname, rel_path, expected_value) - check sysfs value 331*053f45beSAndroid Build Coastguard Worker# modname - livepatch module creating the sysfs interface 332*053f45beSAndroid Build Coastguard Worker# rel_path - relative path of the sysfs interface 333*053f45beSAndroid Build Coastguard Worker# expected_value - expected value read from the file 334*053f45beSAndroid Build Coastguard Workerfunction check_sysfs_value() { 335*053f45beSAndroid Build Coastguard Worker local mod="$1"; shift 336*053f45beSAndroid Build Coastguard Worker local rel_path="$1"; shift 337*053f45beSAndroid Build Coastguard Worker local expected_value="$1"; shift 338*053f45beSAndroid Build Coastguard Worker 339*053f45beSAndroid Build Coastguard Worker local path="$KLP_SYSFS_DIR/$mod/$rel_path" 340*053f45beSAndroid Build Coastguard Worker local value=`cat $path` 341*053f45beSAndroid Build Coastguard Worker if test "$value" != "$expected_value" ; then 342*053f45beSAndroid Build Coastguard Worker die "Unexpected value in $path: $expected_value vs. $value" 343*053f45beSAndroid Build Coastguard Worker fi 344*053f45beSAndroid Build Coastguard Worker} 345