Skip to content

Commit 8f122df

Browse files
committed
qemu: Add qemu-lkdtm test
1 parent 646b125 commit 8f122df

2 files changed

Lines changed: 85 additions & 3 deletions

File tree

lib/pexpect_utils.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,19 @@ def get_match(self, i=0):
6363
def matches(self):
6464
return self.child.match.groups()
6565

66-
def expect(self, patterns, timeout=-1):
66+
def expect(self, patterns, timeout=-1, bug_patterns=None):
6767
if type(patterns) is str:
6868
patterns = [patterns]
6969

70-
patterns.extend(self.bug_patterns)
70+
if bug_patterns is None:
71+
bug_patterns = self.bug_patterns
72+
73+
patterns.extend(bug_patterns)
74+
7175
idx = self.child.expect(patterns, timeout=timeout)
7276
logging.debug("Matched: '%s' %s", self.get_match(), self.matches())
7377

74-
if idx >= len(patterns) - len(self.bug_patterns):
78+
if idx >= len(patterns) - len(bug_patterns):
7579
self.drain_and_terminate(self.child, "Error: saw oops/warning etc. while expecting")
7680

7781
return idx

scripts/test/qemu-lkdtm

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#!/usr/bin/python3
2+
#
3+
4+
import os
5+
import sys
6+
import logging
7+
sys.path.append(f'{os.path.dirname(sys.argv[0])}/../../lib')
8+
9+
from qemu import QemuConfig, qemu_main, qemu_supports_p10, kvm_or_tcg
10+
from utils import setup_logging, test_harness
11+
12+
triggers = ['BUG', 'WARNING', 'WARNING_MESSAGE', 'EXCEPTION', 'ARRAY_BOUNDS',
13+
'CORRUPT_LIST_ADD', 'CORRUPT_LIST_DEL', 'REPORT_STACK_CANARY',
14+
'UNALIGNED_LOAD_STORE_WRITE', 'SLAB_LINEAR_OVERFLOW', 'VMALLOC_LINEAR_OVERFLOW',
15+
'READ_AFTER_FREE', 'READ_BUDDY_AFTER_FREE', 'SLAB_INIT_ON_ALLOC',
16+
'BUDDY_INIT_ON_ALLOC', 'SLAB_FREE_DOUBLE', 'SLAB_FREE_CROSS', 'SLAB_FREE_PAGE',
17+
'EXEC_DATA', 'EXEC_STACK', 'EXEC_KMALLOC', 'EXEC_VMALLOC', 'EXEC_RODATA',
18+
'EXEC_USERSPACE', 'EXEC_NULL', 'ACCESS_USERSPACE', 'ACCESS_NULL', 'WRITE_RO',
19+
'WRITE_RO_AFTER_INIT', 'WRITE_KERN', 'WRITE_OPD', 'REFCOUNT_INC_OVERFLOW',
20+
'REFCOUNT_ADD_OVERFLOW', 'REFCOUNT_INC_NOT_ZERO_OVERFLOW',
21+
'REFCOUNT_ADD_NOT_ZERO_OVERFLOW', 'REFCOUNT_DEC_ZERO', 'REFCOUNT_DEC_NEGATIVE',
22+
'REFCOUNT_DEC_AND_TEST_NEGATIVE', 'REFCOUNT_SUB_AND_TEST_NEGATIVE',
23+
'REFCOUNT_INC_ZERO', 'REFCOUNT_ADD_ZERO', 'REFCOUNT_INC_SATURATED',
24+
'REFCOUNT_DEC_SATURATED', 'REFCOUNT_ADD_SATURATED',
25+
'REFCOUNT_INC_NOT_ZERO_SATURATED', 'REFCOUNT_ADD_NOT_ZERO_SATURATED',
26+
'REFCOUNT_DEC_AND_TEST_SATURATED', 'REFCOUNT_SUB_AND_TEST_SATURATED',
27+
'USERCOPY_SLAB_SIZE_TO', 'USERCOPY_SLAB_SIZE_FROM', 'USERCOPY_SLAB_WHITELIST_TO',
28+
'USERCOPY_SLAB_WHITELIST_FROM', 'USERCOPY_STACK_FRAME_TO',
29+
'USERCOPY_STACK_FRAME_FROM', 'USERCOPY_STACK_BEYOND', 'USERCOPY_KERNEL',
30+
'FORTIFY_STRSCPY', 'FORTIFY_STR_OBJECT', 'FORTIFY_STR_MEMBER',
31+
'FORTIFY_MEM_OBJECT', 'FORTIFY_MEM_MEMBER',
32+
]
33+
34+
def test(name, cpu, machine):
35+
qconf = QemuConfig(machine)
36+
qconf.configure_from_env()
37+
qconf.net_tests = False
38+
qconf.mem = '2G'
39+
qconf.cpu = cpu
40+
qconf.accel = kvm_or_tcg(machine, cpu)
41+
42+
def test(p):
43+
p.cmd('mount -t debugfs none /sys/kernel/debug')
44+
45+
for trigger in triggers:
46+
p.send(f"sh -c 'echo {trigger} > /sys/kernel/debug/provoke-crash/DIRECT'")
47+
p.expect(p.prompt, bug_patterns=[])
48+
49+
qconf.callback = test
50+
qconf.apply_defaults()
51+
52+
if cpu.upper() == 'POWER10' and not qemu_supports_p10(qconf.qemu_path):
53+
return None
54+
55+
return qemu_main(qconf)
56+
57+
58+
def main(args):
59+
setup_logging()
60+
61+
if len(args) > 0:
62+
machine = args[0]
63+
else:
64+
machine = 'pseries'
65+
66+
if len(args) > 1:
67+
cpus = [args[1]]
68+
else:
69+
cpus = ['power8', 'power9', 'power10']
70+
71+
rc = True
72+
for cpu in cpus:
73+
rc &= test_harness(test, 'lkdtm', cpu=cpu, machine=machine)
74+
75+
return rc
76+
77+
78+
sys.exit(0 if main(sys.argv[1:]) else 1)

0 commit comments

Comments
 (0)