xref: /openbmc/qemu/tests/functional/test_aarch64_kvm.py (revision 0633dcb9579ef701724afa9060870a7ed6ec47fe)
1#!/usr/bin/env python3
2#
3# Functional test that runs subsets of kvm-unit-tests on Aarch64.
4# These can run on TCG and any accelerator supporting nested
5# virtualisation.
6#
7# Copyright (c) 2025 Linaro
8#
9# Author:
10#  Alex Bennée <alex.bennee@linaro.org>
11#
12# SPDX-License-Identifier: GPL-2.0-or-later
13
14from qemu_test import Asset
15from qemu_test import exec_command_and_wait_for_pattern as ec_and_wait
16from qemu_test.linuxkernel import LinuxKernelTest
17
18
19class Aarch64VirtKVMTests(LinuxKernelTest):
20
21    ASSET_KVM_TEST_KERNEL = Asset(
22        'https://share.linaro.org/downloadFile?id=Bs8Eb2Wb7yWtkTA',
23        '34de4aaea90db5da42729e7d28b77f392c37a2f4da859f889a5234aaf0970696')
24
25    # make it easier to detect successful return to shell
26    PS1 = 'RES=[$?] # '
27    OK_CMD = 'RES=[0] # '
28
29    # base of tests
30    KUT_BASE = "/usr/share/kvm-unit-tests/"
31
32    def _launch_guest(self, kvm_mode="nvhe"):
33
34        self.set_machine('virt')
35        kernel_path = self.ASSET_KVM_TEST_KERNEL.fetch()
36
37        self.vm.set_console()
38        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
39                               f"console=ttyAMA0 kvm-arm.mode={kvm_mode}")
40
41        self.vm.add_args("-cpu", "cortex-a72")
42        self.vm.add_args("-machine", "virt,gic-version=3,virtualization=on",
43                         '-kernel', kernel_path,
44                         '-append', kernel_command_line)
45        self.vm.add_args("-smp", "2", "-m", "320")
46
47        self.vm.launch()
48
49        self.wait_for_console_pattern('buildroot login:')
50        ec_and_wait(self, 'root', '#')
51        ec_and_wait(self, f"export PS1='{self.PS1}'", self.OK_CMD)
52
53    # this is just a smoketest, we don't run all the tests in the image
54    def _smoketest_kvm(self):
55        ec_and_wait(self, f"{self.KUT_BASE}/selftest-setup", self.OK_CMD)
56        ec_and_wait(self, f"{self.KUT_BASE}/selftest-smp", self.OK_CMD)
57        ec_and_wait(self, f"{self.KUT_BASE}/selftest-vectors-kernel", self.OK_CMD)
58        ec_and_wait(self, f"{self.KUT_BASE}/selftest-vectors-user", self.OK_CMD)
59
60    def test_aarch64_nvhe_selftest(self):
61        self._launch_guest("nvhe")
62        self._smoketest_kvm()
63
64    def test_aarch64_vhe_selftest(self):
65        self._launch_guest("vhe")
66        self._smoketest_kvm()
67
68if __name__ == '__main__':
69    LinuxKernelTest.main()
70