#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com>

# Shell functions for the rest of the scripts.

MAX_RETRIES=600
RETRY_INTERVAL=".1"	# seconds
SYSFS_KERNEL_DIR="/sys/kernel"
SYSFS_KLP_DIR="$SYSFS_KERNEL_DIR/livepatch"
SYSFS_DEBUG_DIR="$SYSFS_KERNEL_DIR/debug"
SYSFS_KPROBES_DIR="$SYSFS_DEBUG_DIR/kprobes"
if [[ -e /sys/kernel/tracing/trace ]]; then
	SYSFS_TRACING_DIR="$SYSFS_KERNEL_DIR/tracing"
else
	SYSFS_TRACING_DIR="$SYSFS_DEBUG_DIR/tracing"
fi

# Kselftest framework requirement - SKIP code is 4
ksft_skip=4

# log(msg) - write message to kernel log
#	msg - insightful words
function log() {
	echo "$1" > /dev/kmsg
}

# skip(msg) - testing can't proceed
#	msg - explanation
function skip() {
	log "SKIP: $1"
	echo "SKIP: $1" >&2
	exit $ksft_skip
}

# root test
function is_root() {
	uid=$(id -u)
	if [ $uid -ne 0 ]; then
		echo "skip all tests: must be run as root" >&2
		exit $ksft_skip
	fi
}

# Check if we can compile the modules before loading them
function has_kdir() {
	if [ -z "$KDIR" ]; then
		KDIR="/lib/modules/$(uname -r)/build"
	fi

	if [ ! -d "$KDIR" ]; then
		echo "skip all tests: KDIR ($KDIR) not available to compile modules."
		exit $ksft_skip
	fi
}

# die(msg) - game over, man
#	msg - dying words
function die() {
	log "ERROR: $1"
	echo "ERROR: $1" >&2
	exit 1
}

function push_config() {
	DYNAMIC_DEBUG=$(grep '^kernel/livepatch' "$SYSFS_DEBUG_DIR/dynamic_debug/control" | \
			awk -F'[: ]' '{print "file " $1 " line " $2 " " $4}')
	FTRACE_ENABLED=$(sysctl --values kernel.ftrace_enabled)
	KPROBE_ENABLED=$(cat "$SYSFS_KPROBES_DIR/enabled")
	TRACING_ON=$(cat "$SYSFS_TRACING_DIR/tracing_on")
	CURRENT_TRACER=$(cat "$SYSFS_TRACING_DIR/current_tracer")
	FTRACE_FILTER=$(cat "$SYSFS_TRACING_DIR/set_ftrace_filter")
}

function pop_config() {
	if [[ -n "$DYNAMIC_DEBUG" ]]; then
		echo -n "$DYNAMIC_DEBUG" > "$SYSFS_DEBUG_DIR/dynamic_debug/control"
	fi
	if [[ -n "$FTRACE_ENABLED" ]]; then
		sysctl kernel.ftrace_enabled="$FTRACE_ENABLED" &> /dev/null
	fi
	if [[ -n "$KPROBE_ENABLED" ]]; then
		echo "$KPROBE_ENABLED" > "$SYSFS_KPROBES_DIR/enabled"
	fi
	if [[ -n "$TRACING_ON" ]]; then
		echo "$TRACING_ON" > "$SYSFS_TRACING_DIR/tracing_on"
	fi
	if [[ -n "$CURRENT_TRACER" ]]; then
		echo "$CURRENT_TRACER" > "$SYSFS_TRACING_DIR/current_tracer"
	fi
	if [[ -n "$FTRACE_FILTER" ]]; then
		echo "$FTRACE_FILTER" \
			| sed -e "/#### all functions enabled ####/d" \
			> "$SYSFS_TRACING_DIR/set_ftrace_filter"
	fi
}

function set_dynamic_debug() {
        cat <<-EOF > "$SYSFS_DEBUG_DIR/dynamic_debug/control"
		file kernel/livepatch/* +p
		func klp_try_switch_task -p
		EOF
}

function set_ftrace_enabled() {
	local can_fail=0
	if [[ "$1" == "--fail" ]] ; then
		can_fail=1
		shift
	fi

	local err=$(sysctl -q kernel.ftrace_enabled="$1" 2>&1)
	local result=$(sysctl --values kernel.ftrace_enabled)

	if [[ "$result" != "$1" ]] ; then
		if [[ $can_fail -eq 1 ]] ; then
			echo "livepatch: $err" | sed 's#/proc/sys/kernel/#kernel.#' > /dev/kmsg
			return
		fi

		skip "failed to set kernel.ftrace_enabled = $1"
	fi

	echo "livepatch: kernel.ftrace_enabled = $result" > /dev/kmsg
}

function cleanup() {
	pop_config
}

# setup_config - save the current config and set a script exit trap that
#		 restores the original config.  Setup the dynamic debug
#		 for verbose livepatching output and turn on
#		 the ftrace_enabled sysctl.
function setup_config() {
	is_root
	has_kdir
	push_config
	set_dynamic_debug
	set_ftrace_enabled 1
	trap cleanup EXIT INT TERM HUP
}

# loop_until(cmd) - loop a command until it is successful or $MAX_RETRIES,
#		    sleep $RETRY_INTERVAL between attempts
#	cmd - command and its arguments to run
function loop_until() {
	local cmd="$*"
	local i=0
	while true; do
		eval "$cmd" && return 0
		[[ $((i++)) -eq $MAX_RETRIES ]] && return 1
		sleep $RETRY_INTERVAL
	done
}

function is_livepatch_mod() {
	local mod="$1"

	if [[ ! -f "test_modules/$mod.ko" ]]; then
		die "Can't find \"test_modules/$mod.ko\", try \"make\""
	fi

	if [[ $(modinfo "test_modules/$mod.ko" | awk '/^livepatch:/{print $NF}') == "Y" ]]; then
		return 0
	fi

	return 1
}

function __load_mod() {
	local mod="$1"; shift

	local msg="% insmod test_modules/$mod.ko $*"
	log "${msg%% }"
	ret=$(insmod "test_modules/$mod.ko" "$@" 2>&1)
	if [[ "$ret" != "" ]]; then
		die "$ret"
	fi

	# Wait for module in sysfs ...
	loop_until '[[ -e "/sys/module/$mod" ]]' ||
		die "failed to load module $mod"
}


# load_mod(modname, params) - load a kernel module
#	modname - module name to load
#	params  - module parameters to pass to insmod
function load_mod() {
	local mod="$1"; shift

	is_livepatch_mod "$mod" &&
		die "use load_lp() to load the livepatch module $mod"

	__load_mod "$mod" "$@"
}

# load_lp_nowait(modname, params) - load a kernel module with a livepatch
#			but do not wait on until the transition finishes
#	modname - module name to load
#	params  - module parameters to pass to insmod
function load_lp_nowait() {
	local mod="$1"; shift

	is_livepatch_mod "$mod" ||
		die "module $mod is not a livepatch"

	__load_mod "$mod" "$@"

	# Wait for livepatch in sysfs ...
	loop_until '[[ -e "$SYSFS_KLP_DIR/$mod" ]]' ||
		die "failed to load module $mod (sysfs)"
}

# load_lp(modname, params) - load a kernel module with a livepatch
#	modname - module name to load
#	params  - module parameters to pass to insmod
function load_lp() {
	local mod="$1"; shift

	load_lp_nowait "$mod" "$@"

	# Wait until the transition finishes ...
	loop_until 'grep -q '^0$' $SYSFS_KLP_DIR/$mod/transition' ||
		die "failed to complete transition"
}

# load_failing_mod(modname, params) - load a kernel module, expect to fail
#	modname - module name to load
#	params  - module parameters to pass to insmod
function load_failing_mod() {
	local mod="$1"; shift

	local msg="% insmod test_modules/$mod.ko $*"
	log "${msg%% }"
	ret=$(insmod "test_modules/$mod.ko" "$@" 2>&1)
	if [[ "$ret" == "" ]]; then
		die "$mod unexpectedly loaded"
	fi
	log "$ret"
}

# unload_mod(modname) - unload a kernel module
#	modname - module name to unload
function unload_mod() {
	local mod="$1"

	# Wait for module reference count to clear ...
	loop_until '[[ $(cat "/sys/module/$mod/refcnt") == "0" ]]' ||
		die "failed to unload module $mod (refcnt)"

	log "% rmmod $mod"
	ret=$(rmmod "$mod" 2>&1)
	if [[ "$ret" != "" ]]; then
		die "$ret"
	fi

	# Wait for module in sysfs ...
	loop_until '[[ ! -e "/sys/module/$mod" ]]' ||
		die "failed to unload module $mod (/sys/module)"
}

# unload_lp(modname) - unload a kernel module with a livepatch
#	modname - module name to unload
function unload_lp() {
	unload_mod "$1"
}

# disable_lp(modname) - disable a livepatch
#	modname - module name to unload
function disable_lp() {
	local mod="$1"

	log "% echo 0 > $SYSFS_KLP_DIR/$mod/enabled"
	echo 0 > "$SYSFS_KLP_DIR/$mod/enabled"

	# Wait until the transition finishes and the livepatch gets
	# removed from sysfs...
	loop_until '[[ ! -e "$SYSFS_KLP_DIR/$mod" ]]' ||
		die "failed to disable livepatch $mod"
}

# set_pre_patch_ret(modname, pre_patch_ret)
#	modname - module name to set
#	pre_patch_ret - new pre_patch_ret value
function set_pre_patch_ret {
	local mod="$1"; shift
	local ret="$1"

	log "% echo $ret > /sys/module/$mod/parameters/pre_patch_ret"
	echo "$ret" > /sys/module/"$mod"/parameters/pre_patch_ret

	# Wait for sysfs value to hold ...
	loop_until '[[ $(cat "/sys/module/$mod/parameters/pre_patch_ret") == "$ret" ]]' ||
		die "failed to set pre_patch_ret parameter for $mod module"
}

function start_test {
	local test="$1"

	# Dump something unique into the dmesg log, then stash the entry
	# in LAST_DMESG.  The check_result() function will use it to
	# find new kernel messages since the test started.
	local last_dmesg_msg="livepatch kselftest timestamp: $(date --rfc-3339=ns)"
	log "$last_dmesg_msg"
	loop_until 'dmesg | grep -q "$last_dmesg_msg"' ||
		die "buffer busy? can't find canary dmesg message: $last_dmesg_msg"
	LAST_DMESG=$(dmesg | grep "$last_dmesg_msg")

	echo -n "TEST: $test ... "
	log "===== TEST: $test ====="
}

# check_result() - verify dmesg output
#	TODO - better filter, out of order msgs, etc?
function check_result {
	local expect="$*"
	local result

	# Test results include any new dmesg entry since LAST_DMESG, then:
	# - include lines matching keywords
	# - exclude lines matching keywords
	# - filter out dmesg timestamp prefixes
	result=$(dmesg | awk -v last_dmesg="$LAST_DMESG" 'p; $0 == last_dmesg { p=1 }' | \
		 grep -e 'livepatch:' -e 'test_klp' | \
		 grep -v '\(tainting\|taints\) kernel' | \
		 sed 's/^\[[ 0-9.]*\] //' | \
		 sed 's/^\[[ ]*[CT][0-9]*\] //')

	if [[ "$expect" == "$result" ]] ; then
		echo "ok"
	elif [[ "$result" == "" ]] ; then
		echo -e "not ok\n\nbuffer overrun? can't find canary dmesg entry: $LAST_DMESG\n"
		die "livepatch kselftest(s) failed"
	else
		echo -e "not ok\n\n$(diff -upr --label expected --label result <(echo "$expect") <(echo "$result"))\n"
		die "livepatch kselftest(s) failed"
	fi
}

# check_sysfs_rights(modname, rel_path, expected_rights) - check sysfs
# path permissions
#	modname - livepatch module creating the sysfs interface
#	rel_path - relative path of the sysfs interface
#	expected_rights - expected access rights
function check_sysfs_rights() {
	local mod="$1"; shift
	local rel_path="$1"; shift
	local expected_rights="$1"; shift

	local path="$SYSFS_KLP_DIR/$mod/$rel_path"
	local rights=$(/bin/stat --format '%A' "$path")
	if test "$rights" != "$expected_rights" ; then
		die "Unexpected access rights of $path: $expected_rights vs. $rights"
	fi
}

# check_sysfs_value(modname, rel_path, expected_value) - check sysfs value
#	modname - livepatch module creating the sysfs interface
#	rel_path - relative path of the sysfs interface
#	expected_value - expected value read from the file
function check_sysfs_value() {
	local mod="$1"; shift
	local rel_path="$1"; shift
	local expected_value="$1"; shift

	local path="$SYSFS_KLP_DIR/$mod/$rel_path"
	local value=`cat $path`
	if test "$value" != "$expected_value" ; then
		die "Unexpected value in $path: $expected_value vs. $value"
	fi
}

# cleanup_tracing() - stop and clean up function tracing
function cleanup_tracing() {
	echo 0 > "$SYSFS_TRACING_DIR/tracing_on"
	echo "" > "$SYSFS_TRACING_DIR/set_ftrace_filter"
	echo "nop" > "$SYSFS_TRACING_DIR/current_tracer"
	echo "" > "$SYSFS_TRACING_DIR/trace"
}

# trace_function(function) - start tracing of a function
#	function - to be traced function
function trace_function() {
	local function="$1"; shift

	cleanup_tracing

	echo "function" > "$SYSFS_TRACING_DIR/current_tracer"
	echo "$function" > "$SYSFS_TRACING_DIR/set_ftrace_filter"
	echo 1 > "$SYSFS_TRACING_DIR/tracing_on"
}

# check_traced_functions(functions...) - check whether each function appeared in the trace log
#	functions - list of functions to be checked
function check_traced_functions() {
	local function

	for function in "$@"; do
		if ! grep -Fwq "$function" "$SYSFS_TRACING_DIR/trace" ; then
			die "Function ($function) did not appear in the trace"
		fi
	done

	cleanup_tracing
}
