forked from luck/tmp_suning_uos_patched
linux-kselftest-5.6-rc1
This Kselftest update for Linux 5.6-rc1 consists of several fixes to framework and individual tests. In addition, it enables LKDTM tests adding lkdtm target to kselftest Makefile. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEPZKym/RZuOCGeA/kCwJExA0NQxwFAl4xpawACgkQCwJExA0N Qxx8GhAAqj9jXpFs4xqfOn2a3RUCZiH4u6pGE/YQaFLD42AZYRES7P9MjOd3prJN CKlyduMx4JzXubZ9guAKvFw4VAvptKvqjyavT0vBe8VYaXWENr5qAeNtojvv8AT+ twOH/atc37zj81xR/l9OOqIZIgLibDq9GZNTPxgDWdCdG25FY07hfDHjlvg5uVIv +PfF/N5/laMsrmdqUtujGuJt3n6VUatxN8zR67nJs7i1QaoFMbOCvPYVE4beNlE4 pvnTqnkN3dNeQUWA0Qf5E/SbCKA+4ULMhHNvBmifERYi5cCfm6tAIddFpRUNXDXf IHuJ2Rvm5r4lhcUShb38ky3wb3etYDWw4fDE8pNL8yr8fXmg9gmsHHfeR8s625Mn Ly3VfqlOhrDs0uOGzya0NpzZ7gpjfaryjObfQ2t6jlG5O1zt5UtXfA9PhLvwE3VC lg3rrY5UiSaWrqkS9yDlSpKZ8aYeLWhnFLCltmr3o46WaGKhk+1afYvQQOeuYANG QTYnBhnQWzxB4b2q5F3MinRggm5STcG8gAAcNo//yiGtCZTrdsFwvzWBPlYp1m2R 2LlboNYeVKGFXVMqNB0S8/zZaFFoWd3fu+CmhGo4Hy6JqCk3HCuYcORYHrJIlxkB KYm9b1A+sjcmSp80vlX+QK+fzQ03d2krcAqaKKuTjyYnxDxsJg4= =/7fF -----END PGP SIGNATURE----- Merge tag 'linux-kselftest-5.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest Pull Kselftest update from Shuah Khan: "This Kselftest update consists of several fixes to framework and individual tests. In addition, it enables LKDTM tests adding lkdtm target to kselftest Makefile" * tag 'linux-kselftest-5.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest: selftests/ftrace: fix glob selftest selftests: settings: tests can be in subsubdirs kselftest: Minimise dependency of get_size on C library interfaces selftests/livepatch: Remove unused local variable in set_ftrace_enabled() selftests/livepatch: Replace set_dynamic_debug() with setup_config() in README selftests/lkdtm: Add tests for LKDTM targets selftests: Uninitialized variable in test_cgcore_proc_migration() selftests: fix build behaviour on targets' failures
This commit is contained in:
commit
ce7ae9d9fe
|
@ -9656,6 +9656,7 @@ LINUX KERNEL DUMP TEST MODULE (LKDTM)
|
|||
M: Kees Cook <keescook@chromium.org>
|
||||
S: Maintained
|
||||
F: drivers/misc/lkdtm/*
|
||||
F: tools/testing/selftests/lkdtm/*
|
||||
|
||||
LINUX KERNEL MEMORY CONSISTENCY MODEL (LKMM)
|
||||
M: Alan Stern <stern@rowland.harvard.edu>
|
||||
|
|
|
@ -26,6 +26,7 @@ TARGETS += kexec
|
|||
TARGETS += kvm
|
||||
TARGETS += lib
|
||||
TARGETS += livepatch
|
||||
TARGETS += lkdtm
|
||||
TARGETS += membarrier
|
||||
TARGETS += memfd
|
||||
TARGETS += memory-hotplug
|
||||
|
@ -146,11 +147,13 @@ else
|
|||
endif
|
||||
|
||||
all: khdr
|
||||
@for TARGET in $(TARGETS); do \
|
||||
BUILD_TARGET=$$BUILD/$$TARGET; \
|
||||
mkdir $$BUILD_TARGET -p; \
|
||||
$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET;\
|
||||
done;
|
||||
@ret=1; \
|
||||
for TARGET in $(TARGETS); do \
|
||||
BUILD_TARGET=$$BUILD/$$TARGET; \
|
||||
mkdir $$BUILD_TARGET -p; \
|
||||
$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET; \
|
||||
ret=$$((ret * $$?)); \
|
||||
done; exit $$ret;
|
||||
|
||||
run_tests: all
|
||||
@for TARGET in $(TARGETS); do \
|
||||
|
@ -199,10 +202,12 @@ ifdef INSTALL_PATH
|
|||
install -m 744 kselftest/module.sh $(INSTALL_PATH)/kselftest/
|
||||
install -m 744 kselftest/runner.sh $(INSTALL_PATH)/kselftest/
|
||||
install -m 744 kselftest/prefix.pl $(INSTALL_PATH)/kselftest/
|
||||
@for TARGET in $(TARGETS); do \
|
||||
@ret=1; \
|
||||
for TARGET in $(TARGETS); do \
|
||||
BUILD_TARGET=$$BUILD/$$TARGET; \
|
||||
$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET INSTALL_PATH=$(INSTALL_PATH)/$$TARGET install; \
|
||||
done;
|
||||
ret=$$((ret * $$?)); \
|
||||
done; exit $$ret;
|
||||
|
||||
@# Ask all targets to emit their test scripts
|
||||
echo "#!/bin/sh" > $(ALL_SCRIPT)
|
||||
|
|
|
@ -369,7 +369,7 @@ static void *dummy_thread_fn(void *arg)
|
|||
static int test_cgcore_proc_migration(const char *root)
|
||||
{
|
||||
int ret = KSFT_FAIL;
|
||||
int t, c_threads, n_threads = 13;
|
||||
int t, c_threads = 0, n_threads = 13;
|
||||
char *src = NULL, *dst = NULL;
|
||||
pthread_t threads[n_threads];
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ ftrace_filter_check '*schedule*' '^.*schedule.*$'
|
|||
ftrace_filter_check 'schedule*' '^schedule.*$'
|
||||
|
||||
# filter by *mid*end
|
||||
ftrace_filter_check '*aw*lock' '.*aw.*lock$'
|
||||
ftrace_filter_check '*pin*lock' '.*pin.*lock$'
|
||||
|
||||
# filter by start*mid*
|
||||
ftrace_filter_check 'mutex*try*' '^mutex.*try.*'
|
||||
|
|
|
@ -91,7 +91,7 @@ run_one()
|
|||
run_many()
|
||||
{
|
||||
echo "TAP version 13"
|
||||
DIR=$(basename "$PWD")
|
||||
DIR="${PWD#${BASE_DIR}/}"
|
||||
test_num=0
|
||||
total=$(echo "$@" | wc -w)
|
||||
echo "1..$total"
|
||||
|
|
|
@ -35,7 +35,7 @@ Adding tests
|
|||
------------
|
||||
|
||||
See the common functions.sh file for the existing collection of utility
|
||||
functions, most importantly set_dynamic_debug() and check_result(). The
|
||||
functions, most importantly setup_config() and check_result(). The
|
||||
latter function greps the kernel's ring buffer for "livepatch:" and
|
||||
"test_klp" strings, so tests be sure to include one of those strings for
|
||||
result comparison. Other utility functions include general module
|
||||
|
|
|
@ -64,7 +64,6 @@ function set_dynamic_debug() {
|
|||
}
|
||||
|
||||
function set_ftrace_enabled() {
|
||||
local sysctl="$1"
|
||||
result=$(sysctl kernel.ftrace_enabled="$1" 2>&1 | paste --serial --delimiters=' ')
|
||||
echo "livepatch: $result" > /dev/kmsg
|
||||
}
|
||||
|
|
12
tools/testing/selftests/lkdtm/Makefile
Normal file
12
tools/testing/selftests/lkdtm/Makefile
Normal file
|
@ -0,0 +1,12 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Makefile for LKDTM regression tests
|
||||
|
||||
include ../lib.mk
|
||||
|
||||
# NOTE: $(OUTPUT) won't get default value if used before lib.mk
|
||||
TEST_FILES := tests.txt
|
||||
TEST_GEN_PROGS = $(patsubst %,$(OUTPUT)/%.sh,$(shell awk '{print $$1}' tests.txt | sed -e 's/\#//'))
|
||||
all: $(TEST_GEN_PROGS)
|
||||
|
||||
$(OUTPUT)/%: run.sh tests.txt
|
||||
install -m 0744 run.sh $@
|
1
tools/testing/selftests/lkdtm/config
Normal file
1
tools/testing/selftests/lkdtm/config
Normal file
|
@ -0,0 +1 @@
|
|||
CONFIG_LKDTM=y
|
92
tools/testing/selftests/lkdtm/run.sh
Executable file
92
tools/testing/selftests/lkdtm/run.sh
Executable file
|
@ -0,0 +1,92 @@
|
|||
#!/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
|
||||
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.
|
||||
line=$(egrep '^#?'"$test"'\b' tests.txt)
|
||||
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.
|
||||
if ! egrep -q '^'"$test"'$' "$TRIGGER" ; then
|
||||
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
|
||||
|
||||
# Clear out dmesg for output reporting
|
||||
dmesg -c >/dev/null
|
||||
|
||||
# Prepare log for report checking
|
||||
LOG=$(mktemp --tmpdir -t lkdtm-XXXXXX)
|
||||
cleanup() {
|
||||
rm -f "$LOG"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
# 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
|
||||
dmesg -c >"$LOG"
|
||||
cat "$LOG"
|
||||
# Check for expected output
|
||||
if egrep -qi "$expect" "$LOG" ; then
|
||||
echo "$test: saw '$expect': ok"
|
||||
exit 0
|
||||
else
|
||||
if egrep -qi XFAIL: "$LOG" ; then
|
||||
echo "$test: saw 'XFAIL': [SKIP]"
|
||||
exit $KSELFTEST_SKIP_TEST
|
||||
else
|
||||
echo "$test: missing '$expect': [FAIL]"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
71
tools/testing/selftests/lkdtm/tests.txt
Normal file
71
tools/testing/selftests/lkdtm/tests.txt
Normal file
|
@ -0,0 +1,71 @@
|
|||
#PANIC
|
||||
BUG kernel BUG at
|
||||
WARNING WARNING:
|
||||
WARNING_MESSAGE message trigger
|
||||
EXCEPTION
|
||||
#LOOP Hangs the system
|
||||
#EXHAUST_STACK Corrupts memory on failure
|
||||
#CORRUPT_STACK Crashes entire system on success
|
||||
#CORRUPT_STACK_STRONG Crashes entire system on success
|
||||
CORRUPT_LIST_ADD list_add corruption
|
||||
CORRUPT_LIST_DEL list_del corruption
|
||||
CORRUPT_USER_DS Invalid address limit on user-mode return
|
||||
STACK_GUARD_PAGE_LEADING
|
||||
STACK_GUARD_PAGE_TRAILING
|
||||
UNSET_SMEP CR4 bits went missing
|
||||
DOUBLE_FAULT
|
||||
UNALIGNED_LOAD_STORE_WRITE
|
||||
#OVERWRITE_ALLOCATION Corrupts memory on failure
|
||||
#WRITE_AFTER_FREE Corrupts memory on failure
|
||||
READ_AFTER_FREE
|
||||
#WRITE_BUDDY_AFTER_FREE Corrupts memory on failure
|
||||
READ_BUDDY_AFTER_FREE
|
||||
SLAB_FREE_DOUBLE
|
||||
SLAB_FREE_CROSS
|
||||
SLAB_FREE_PAGE
|
||||
#SOFTLOCKUP Hangs the system
|
||||
#HARDLOCKUP Hangs the system
|
||||
#SPINLOCKUP Hangs the system
|
||||
#HUNG_TASK Hangs the system
|
||||
EXEC_DATA
|
||||
EXEC_STACK
|
||||
EXEC_KMALLOC
|
||||
EXEC_VMALLOC
|
||||
EXEC_RODATA
|
||||
EXEC_USERSPACE
|
||||
EXEC_NULL
|
||||
ACCESS_USERSPACE
|
||||
ACCESS_NULL
|
||||
WRITE_RO
|
||||
WRITE_RO_AFTER_INIT
|
||||
WRITE_KERN
|
||||
REFCOUNT_INC_OVERFLOW
|
||||
REFCOUNT_ADD_OVERFLOW
|
||||
REFCOUNT_INC_NOT_ZERO_OVERFLOW
|
||||
REFCOUNT_ADD_NOT_ZERO_OVERFLOW
|
||||
REFCOUNT_DEC_ZERO
|
||||
REFCOUNT_DEC_NEGATIVE Negative detected: saturated
|
||||
REFCOUNT_DEC_AND_TEST_NEGATIVE Negative detected: saturated
|
||||
REFCOUNT_SUB_AND_TEST_NEGATIVE Negative detected: saturated
|
||||
REFCOUNT_INC_ZERO
|
||||
REFCOUNT_ADD_ZERO
|
||||
REFCOUNT_INC_SATURATED Saturation detected: still saturated
|
||||
REFCOUNT_DEC_SATURATED Saturation detected: still saturated
|
||||
REFCOUNT_ADD_SATURATED Saturation detected: still saturated
|
||||
REFCOUNT_INC_NOT_ZERO_SATURATED
|
||||
REFCOUNT_ADD_NOT_ZERO_SATURATED
|
||||
REFCOUNT_DEC_AND_TEST_SATURATED Saturation detected: still saturated
|
||||
REFCOUNT_SUB_AND_TEST_SATURATED Saturation detected: still saturated
|
||||
#REFCOUNT_TIMING timing only
|
||||
#ATOMIC_TIMING timing only
|
||||
USERCOPY_HEAP_SIZE_TO
|
||||
USERCOPY_HEAP_SIZE_FROM
|
||||
USERCOPY_HEAP_WHITELIST_TO
|
||||
USERCOPY_HEAP_WHITELIST_FROM
|
||||
USERCOPY_STACK_FRAME_TO
|
||||
USERCOPY_STACK_FRAME_FROM
|
||||
USERCOPY_STACK_BEYOND
|
||||
USERCOPY_KERNEL
|
||||
USERCOPY_KERNEL_DS
|
||||
STACKLEAK_ERASING OK: the rest of the thread stack is properly erased
|
||||
CFI_FORWARD_PROTO
|
|
@ -11,23 +11,35 @@
|
|||
* own execution. It also attempts to have as few dependencies
|
||||
* on kernel features as possible.
|
||||
*
|
||||
* It should be statically linked, with startup libs avoided.
|
||||
* It uses no library calls, and only the following 3 syscalls:
|
||||
* It should be statically linked, with startup libs avoided. It uses
|
||||
* no library calls except the syscall() function for the following 3
|
||||
* syscalls:
|
||||
* sysinfo(), write(), and _exit()
|
||||
*
|
||||
* For output, it avoids printf (which in some C libraries
|
||||
* has large external dependencies) by implementing it's own
|
||||
* number output and print routines, and using __builtin_strlen()
|
||||
*
|
||||
* The test may crash if any of the above syscalls fails because in some
|
||||
* libc implementations (e.g. the GNU C Library) errno is saved in
|
||||
* thread-local storage, which does not get initialized due to avoiding
|
||||
* startup libs.
|
||||
*/
|
||||
|
||||
#include <sys/sysinfo.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#define STDOUT_FILENO 1
|
||||
|
||||
static int print(const char *s)
|
||||
{
|
||||
return write(STDOUT_FILENO, s, __builtin_strlen(s));
|
||||
size_t len = 0;
|
||||
|
||||
while (s[len] != '\0')
|
||||
len++;
|
||||
|
||||
return syscall(SYS_write, STDOUT_FILENO, s, len);
|
||||
}
|
||||
|
||||
static inline char *num_to_str(unsigned long num, char *buf, int len)
|
||||
|
@ -79,12 +91,12 @@ void _start(void)
|
|||
print("TAP version 13\n");
|
||||
print("# Testing system size.\n");
|
||||
|
||||
ccode = sysinfo(&info);
|
||||
ccode = syscall(SYS_sysinfo, &info);
|
||||
if (ccode < 0) {
|
||||
print("not ok 1");
|
||||
print(test_name);
|
||||
print(" ---\n reason: \"could not get sysinfo\"\n ...\n");
|
||||
_exit(ccode);
|
||||
syscall(SYS_exit, ccode);
|
||||
}
|
||||
print("ok 1");
|
||||
print(test_name);
|
||||
|
@ -100,5 +112,5 @@ void _start(void)
|
|||
print(" ...\n");
|
||||
print("1..1\n");
|
||||
|
||||
_exit(0);
|
||||
syscall(SYS_exit, 0);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user