mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00

Unfortunately, this test had not been added to meson.build, so we did not notice a regression: Looking for 'Kernel panic - not syncing: VFS:' as the indication for the final boot state of the kernel was a bad idea since 'Kernel panic - not syncing' is the default failure message of the LinuxKernelTest class, and since we're now reading the console input byte by byte instead of linewise (see commitcdad03b74f
), the failure now triggers before we fully read the success string. Let's fix this by simply looking for the previous line in the console output instead. Also, replace the call to cancel() - this was only available in the Avocado framework. In the functional framework, we must use skipTest() instead. While we're at it, also fix the TODO here by looking for the exact error and only skip the test if the plugins are not available. Fixes:3abc545e66
("tests/functional: Convert the tcg_plugins test") Fixes:cdad03b74f
("tests/functional: rewrite console handling to be bytewise") Message-ID: <20250123083625.1498495-1-thuth@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
118 lines
3.8 KiB
Python
Executable file
118 lines
3.8 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
#
|
|
# TCG Plugins tests
|
|
#
|
|
# These are a little more involved than the basic tests run by check-tcg.
|
|
#
|
|
# Copyright (c) 2021 Linaro
|
|
#
|
|
# Author:
|
|
# Alex Bennée <alex.bennee@linaro.org>
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
import tempfile
|
|
import mmap
|
|
import re
|
|
|
|
from qemu.machine.machine import VMLaunchFailure
|
|
from qemu_test import LinuxKernelTest, Asset
|
|
|
|
|
|
class PluginKernelBase(LinuxKernelTest):
|
|
"""
|
|
Boots a Linux kernel with a TCG plugin enabled.
|
|
"""
|
|
|
|
timeout = 120
|
|
KERNEL_COMMON_COMMAND_LINE = 'printk.time=1 panic=-1 '
|
|
|
|
def run_vm(self, kernel_path, kernel_command_line,
|
|
plugin, plugin_log, console_pattern, args=None):
|
|
|
|
vm = self.get_vm()
|
|
vm.set_console()
|
|
vm.add_args('-kernel', kernel_path,
|
|
'-append', kernel_command_line,
|
|
'-plugin', plugin,
|
|
'-d', 'plugin',
|
|
'-D', plugin_log,
|
|
'-net', 'none',
|
|
'-no-reboot')
|
|
if args:
|
|
vm.add_args(*args)
|
|
|
|
try:
|
|
vm.launch()
|
|
except VMLaunchFailure as excp:
|
|
if "plugin interface not enabled in this build" in excp.output:
|
|
self.skipTest("TCG plugins not enabled")
|
|
else:
|
|
self.log.info(f"unhandled launch failure: {excp.output}")
|
|
raise excp
|
|
|
|
self.wait_for_console_pattern(console_pattern, vm)
|
|
# ensure logs are flushed
|
|
vm.shutdown()
|
|
|
|
|
|
class PluginKernelNormal(PluginKernelBase):
|
|
|
|
ASSET_KERNEL = Asset(
|
|
('https://storage.tuxboot.com/20230331/arm64/Image'),
|
|
'ce95a7101a5fecebe0fe630deee6bd97b32ba41bc8754090e9ad8961ea8674c7')
|
|
|
|
def test_aarch64_virt_insn(self):
|
|
self.set_machine('virt')
|
|
self.cpu='cortex-a53'
|
|
kernel_path = self.ASSET_KERNEL.fetch()
|
|
kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
|
|
'console=ttyAMA0')
|
|
console_pattern = 'Please append a correct "root=" boot option'
|
|
|
|
plugin_log = tempfile.NamedTemporaryFile(mode="r+t", prefix="plugin",
|
|
suffix=".log")
|
|
|
|
self.run_vm(kernel_path, kernel_command_line,
|
|
"tests/tcg/plugins/libinsn.so", plugin_log.name,
|
|
console_pattern)
|
|
|
|
with plugin_log as lf, \
|
|
mmap.mmap(lf.fileno(), 0, access=mmap.ACCESS_READ) as s:
|
|
|
|
m = re.search(br"insns: (?P<count>\d+)", s)
|
|
if "count" not in m.groupdict():
|
|
self.fail("Failed to find instruction count")
|
|
else:
|
|
count = int(m.group("count"))
|
|
self.log.info(f"Counted: {count} instructions")
|
|
|
|
|
|
def test_aarch64_virt_insn_icount(self):
|
|
self.set_machine('virt')
|
|
self.cpu='cortex-a53'
|
|
kernel_path = self.ASSET_KERNEL.fetch()
|
|
kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
|
|
'console=ttyAMA0')
|
|
console_pattern = 'Please append a correct "root=" boot option'
|
|
|
|
plugin_log = tempfile.NamedTemporaryFile(mode="r+t", prefix="plugin",
|
|
suffix=".log")
|
|
|
|
self.run_vm(kernel_path, kernel_command_line,
|
|
"tests/tcg/plugins/libinsn.so", plugin_log.name,
|
|
console_pattern,
|
|
args=('-icount', 'shift=1'))
|
|
|
|
with plugin_log as lf, \
|
|
mmap.mmap(lf.fileno(), 0, access=mmap.ACCESS_READ) as s:
|
|
|
|
m = re.search(br"insns: (?P<count>\d+)", s)
|
|
if "count" not in m.groupdict():
|
|
self.fail("Failed to find instruction count")
|
|
else:
|
|
count = int(m.group("count"))
|
|
self.log.info(f"Counted: {count} instructions")
|
|
|
|
if __name__ == '__main__':
|
|
LinuxKernelTest.main()
|