2020-01-09 21:02:06 -08:00
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# This reads tests.txt for the list of LKDTM tests to invoke. Any marked
# with a leading "#" are skipped. The rest of the line after the
# test name is either the text to look for in dmesg for a "success",
# or the rationale for why a test is marked to be skipped.
#
set -e
TRIGGER = /sys/kernel/debug/provoke-crash/DIRECT
2020-06-25 13:37:03 -07:00
CLEAR_ONCE = /sys/kernel/debug/clear_warn_once
2020-01-09 21:02:06 -08:00
KSELFTEST_SKIP_TEST = 4
# Verify we have LKDTM available in the kernel.
if [ ! -r $TRIGGER ] ; then
/sbin/modprobe -q lkdtm || true
if [ ! -r $TRIGGER ] ; then
echo " Cannot find $TRIGGER (missing CONFIG_LKDTM?) "
else
echo " Cannot write $TRIGGER (need to run as root?) "
fi
# Skip this test
exit $KSELFTEST_SKIP_TEST
fi
# Figure out which test to run from our script name.
test = $( basename $0 .sh)
# Look up details about the test from master list of LKDTM tests.
2020-05-08 16:53:56 +10:00
line = $( grep -E '^#?' " $test " '\b' tests.txt)
2020-01-09 21:02:06 -08:00
if [ -z " $line " ] ; then
echo " Skipped: missing test ' $test ' in tests.txt "
exit $KSELFTEST_SKIP_TEST
fi
# Check that the test is known to LKDTM.
2020-05-08 16:53:56 +10:00
if ! grep -E -q '^' " $test " '$' " $TRIGGER " ; then
2020-01-09 21:02:06 -08:00
echo " Skipped: test ' $test ' missing in $TRIGGER ! "
exit $KSELFTEST_SKIP_TEST
fi
# Extract notes/expected output from test list.
test = $( echo " $line " | cut -d" " -f1)
if echo " $line " | grep -q ' ' ; then
expect = $( echo " $line " | cut -d" " -f2-)
else
expect = ""
fi
# If the test is commented out, report a skip
if echo " $test " | grep -q '^#' ; then
test = $( echo " $test " | cut -c2-)
if [ -z " $expect " ] ; then
expect = "crashes entire system"
fi
echo " Skipping $test : $expect "
exit $KSELFTEST_SKIP_TEST
fi
# If no expected output given, assume an Oops with back trace is success.
2021-10-22 15:38:25 -07:00
repeat = 1
2020-01-09 21:02:06 -08:00
if [ -z " $expect " ] ; then
expect = "call trace:"
2021-10-22 15:38:25 -07:00
else
if echo " $expect " | grep -q '^repeat:' ; then
repeat = $( echo " $expect " | cut -d' ' -f1 | cut -d: -f2)
expect = $( echo " $expect " | cut -d' ' -f2-)
fi
2020-01-09 21:02:06 -08:00
fi
# Prepare log for report checking
2020-05-08 16:53:55 +10:00
LOG = $( mktemp --tmpdir -t lkdtm-log-XXXXXX)
DMESG = $( mktemp --tmpdir -t lkdtm-dmesg-XXXXXX)
2020-01-09 21:02:06 -08:00
cleanup( ) {
2020-05-08 16:53:55 +10:00
rm -f " $LOG " " $DMESG "
2020-01-09 21:02:06 -08:00
}
trap cleanup EXIT
2020-06-25 13:37:03 -07:00
# Reset WARN_ONCE counters so we trip it each time this runs.
if [ -w $CLEAR_ONCE ] ; then
echo 1 > $CLEAR_ONCE
fi
2020-05-08 16:53:55 +10:00
# Save existing dmesg so we can detect new content below
dmesg > " $DMESG "
2021-06-23 13:39:28 -07:00
# Since the kernel is likely killing the process writing to the trigger
# file, it must not be the script's shell itself. i.e. we cannot do:
# echo "$test" >"$TRIGGER"
# Instead, use "cat" to take the signal. Since the shell will yell about
# the signal that killed the subprocess, we must ignore the failure and
# continue. However we don't silence stderr since there might be other
# useful details reported there in the case of other unexpected conditions.
2021-10-22 15:38:25 -07:00
for i in $( seq 1 $repeat ) ; do
echo " $test " | cat >" $TRIGGER " || true
done
2020-01-09 21:02:06 -08:00
# Record and dump the results
2020-09-09 14:17:00 -07:00
dmesg | comm --nocheck-order -13 " $DMESG " - > " $LOG " || true
2020-05-08 16:53:55 +10:00
2020-01-09 21:02:06 -08:00
cat " $LOG "
# Check for expected output
2020-05-08 16:53:56 +10:00
if grep -E -qi " $expect " " $LOG " ; then
2020-01-09 21:02:06 -08:00
echo " $test : saw ' $expect ': ok "
exit 0
else
2020-05-08 16:53:56 +10:00
if grep -E -qi XFAIL: " $LOG " ; then
2020-01-09 21:02:06 -08:00
echo " $test : saw 'XFAIL': [SKIP] "
exit $KSELFTEST_SKIP_TEST
else
echo " $test : missing ' $expect ': [FAIL] "
exit 1
fi
fi