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