aboutsummaryrefslogtreecommitdiff
path: root/tests/functional/test_aarch64_kvm.py
blob: 9fb9286139f4468ac3832b4d026dfabec042b9ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env python3
#
# Functional test that runs subsets of kvm-unit-tests on Aarch64.
# These can run on TCG and any accelerator supporting nested
# virtualisation.
#
# Copyright (c) 2025 Linaro
#
# Author:
#  Alex Bennée <alex.bennee@linaro.org>
#
# SPDX-License-Identifier: GPL-2.0-or-later

from qemu_test import Asset
from qemu_test import exec_command_and_wait_for_pattern as ec_and_wait
from qemu_test.linuxkernel import LinuxKernelTest


class Aarch64VirtKVMTests(LinuxKernelTest):

    ASSET_KVM_TEST_KERNEL = Asset(
        'https://fileserver.linaro.org/s/HmjaxXXYHYSqbes/'
        'download?path=%2F&files='
        'image-with-kvm-tool-and-unit-tests.gz',
        '34de4aaea90db5da42729e7d28b77f392c37a2f4da859f889a5234aaf0970696')

    # make it easier to detect successful return to shell
    PS1 = 'RES=[$?] # '
    OK_CMD = 'RES=[0] # '

    # base of tests
    KUT_BASE = "/usr/share/kvm-unit-tests/"

    def _launch_guest(self, kvm_mode="nvhe"):

        self.set_machine('virt')
        kernel_path = self.ASSET_KVM_TEST_KERNEL.fetch()

        self.vm.set_console()
        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
                               f"console=ttyAMA0 kvm-arm.mode={kvm_mode}")

        self.vm.add_args("-cpu", "cortex-a72")
        self.vm.add_args("-machine", "virt,gic-version=3,virtualization=on",
                         '-kernel', kernel_path,
                         '-append', kernel_command_line)
        self.vm.add_args("-smp", "2", "-m", "320")

        self.vm.launch()

        self.wait_for_console_pattern('buildroot login:')
        ec_and_wait(self, 'root', '#')
        ec_and_wait(self, f"export PS1='{self.PS1}'", self.OK_CMD)

    # this is just a smoketest, we don't run all the tests in the image
    def _smoketest_kvm(self):
        ec_and_wait(self, f"{self.KUT_BASE}/selftest-setup", self.OK_CMD)
        ec_and_wait(self, f"{self.KUT_BASE}/selftest-smp", self.OK_CMD)
        ec_and_wait(self, f"{self.KUT_BASE}/selftest-vectors-kernel", self.OK_CMD)
        ec_and_wait(self, f"{self.KUT_BASE}/selftest-vectors-user", self.OK_CMD)

    def test_aarch64_nvhe_selftest(self):
        self._launch_guest("nvhe")
        self._smoketest_kvm()

    def test_aarch64_vhe_selftest(self):
        self._launch_guest("vhe")
        self._smoketest_kvm()

if __name__ == '__main__':
    LinuxKernelTest.main()