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.
if [ -z " $expect " ] ; then
expect = "call trace:"
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 "
2020-01-09 21:02:06 -08:00
# Most shells yell about signals and we're expecting the "cat" process
# to usually be killed by the kernel. So we have to run it in a sub-shell
# and silence errors.
( $SHELL -c 'cat <(echo ' " $test " ') >' " $TRIGGER " 2>/dev/null) || true
# Record and dump the results
2020-05-08 16:53:55 +10:00
dmesg | diff --changed-group-format= '%>' --unchanged-group-format= '' " $DMESG " - > " $LOG " || true
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