On Mon, Jul 21, 2025 at 6:34 PM Alex Bennée <alex.ben...@linaro.org> wrote:
>
> This is a simple test case that runs an image with kvmtool and
> kvm-unit-tests which can validate virtualisation works. This is useful
> for exercising TCG but can also be applied to any nested virt setup
> which is why it doesn't specify an accelerator.
>
> Signed-off-by: Alex Bennée <alex.ben...@linaro.org>
> Cc: Philippe Mathieu-Daudé <phi...@linaro.org>
> Cc: Mark Burton <mbur...@qti.qualcomm.com>
> ---
>  tests/functional/meson.build         |  1 +
>  tests/functional/test_aarch64_kvm.py | 83 ++++++++++++++++++++++++++++
>  2 files changed, 84 insertions(+)
>  create mode 100755 tests/functional/test_aarch64_kvm.py
>
> diff --git a/tests/functional/meson.build b/tests/functional/meson.build
> index 8bebcd4d94e..ecf965adc6c 100644
> --- a/tests/functional/meson.build
> +++ b/tests/functional/meson.build
> @@ -89,6 +89,7 @@ tests_aarch64_system_thorough = [
>    'aarch64_device_passthrough',
>    'aarch64_hotplug_pci',
>    'aarch64_imx8mp_evk',
> +  'aarch64_kvm',
>    'aarch64_raspi3',
>    'aarch64_raspi4',
>    'aarch64_replay',
> diff --git a/tests/functional/test_aarch64_kvm.py 
> b/tests/functional/test_aarch64_kvm.py
> new file mode 100755
> index 00000000000..a42d82872af
> --- /dev/null
> +++ b/tests/functional/test_aarch64_kvm.py
> @@ -0,0 +1,83 @@
> +#!/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.ben...@linaro.org>
> +#
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +from qemu.machine.machine import VMLaunchFailure
> +
> +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")
> +
> +        try:
> +            self.vm.launch()
> +        except VMLaunchFailure as excp:
> +            self.log.info("unhandled launch failure: %s", excp.output)
> +            raise excp
> +
> +        self.wait_for_console_pattern('buildroot login:')
> +        ec_and_wait(self, 'root', '#')
> +        ec_and_wait(self, f"export PS1='{self.PS1}'", self.OK_CMD)
> +
> +
> +    def test_aarch64_nvhe_selftest(self):
> +
> +        self._launch_guest("nvhe")
> +
> +        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)

These could probably be merged in _launch_guest() just as well

> +
> +
> +    def test_aarch64_vhe_selftest(self):
> +
> +        self._launch_guest("vhe")
> +
> +        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)
> +
> +
> +if __name__ == '__main__':
> +    LinuxKernelTest.main()
> --
> 2.47.2
>
>

Tested-by: Manos Pitsidianakis <manos.pitsidiana...@linaro.org>
Reviewed-by: Manos Pitsidianakis <manos.pitsidiana...@linaro.org>

Reply via email to