xref: /qemu/tests/functional/test_aarch64_tcg_plugins.py (revision 4c134d07b9e584d2713d7b5d0fb5fdb752ad120c)
1# TCG Plugins tests
2#
3# These are a little more involved than the basic tests run by check-tcg.
4#
5# Copyright (c) 2021 Linaro
6#
7# Author:
8#  Alex Bennée <alex.bennee@linaro.org>
9#
10# SPDX-License-Identifier: GPL-2.0-or-later
11
12import tempfile
13import mmap
14import re
15
16from boot_linux_console import LinuxKernelTest
17
18
19class PluginKernelBase(LinuxKernelTest):
20    """
21    Boots a Linux kernel with a TCG plugin enabled.
22    """
23
24    timeout = 120
25    KERNEL_COMMON_COMMAND_LINE = 'printk.time=1 panic=-1 '
26
27    def run_vm(self, kernel_path, kernel_command_line,
28               plugin, plugin_log, console_pattern, args):
29
30        vm = self.get_vm()
31        vm.set_console()
32        vm.add_args('-kernel', kernel_path,
33                    '-append', kernel_command_line,
34                    '-plugin', plugin,
35                    '-d', 'plugin',
36                    '-D', plugin_log,
37                    '-net', 'none',
38                    '-no-reboot')
39        if args:
40            vm.add_args(*args)
41
42        try:
43            vm.launch()
44        except:
45            # TODO: probably fails because plugins not enabled but we
46            # can't currently probe for the feature.
47            self.cancel("TCG Plugins not enabled?")
48
49        self.wait_for_console_pattern(console_pattern, vm)
50        # ensure logs are flushed
51        vm.shutdown()
52
53
54class PluginKernelNormal(PluginKernelBase):
55
56    def _grab_aarch64_kernel(self):
57        kernel_url = ('http://security.debian.org/'
58                      'debian-security/pool/updates/main/l/linux-signed-arm64/'
59                      'linux-image-4.19.0-12-arm64_4.19.152-1_arm64.deb')
60        kernel_sha1 = '2036c2792f80ac9c4ccaae742b2e0a28385b6010'
61        kernel_deb = self.fetch_asset(kernel_url, asset_hash=kernel_sha1)
62        kernel_path = self.extract_from_deb(kernel_deb,
63                                            "/boot/vmlinuz-4.19.0-12-arm64")
64        return kernel_path
65
66    def test_aarch64_virt_insn(self):
67        """
68        :avocado: tags=accel:tcg
69        :avocado: tags=arch:aarch64
70        :avocado: tags=machine:virt
71        :avocado: tags=cpu:cortex-a57
72        """
73        kernel_path = self._grab_aarch64_kernel()
74        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
75                               'console=ttyAMA0')
76        console_pattern = 'Kernel panic - not syncing: VFS:'
77
78        plugin_log = tempfile.NamedTemporaryFile(mode="r+t", prefix="plugin",
79                                                 suffix=".log")
80
81        self.run_vm(kernel_path, kernel_command_line,
82                    "tests/plugin/libinsn.so", plugin_log.name,
83                    console_pattern,
84                    args=('-cpu', 'cortex-a53'))
85
86        with plugin_log as lf, \
87             mmap.mmap(lf.fileno(), 0, access=mmap.ACCESS_READ) as s:
88
89            m = re.search(br"insns: (?P<count>\d+)", s)
90            if "count" not in m.groupdict():
91                self.fail("Failed to find instruction count")
92