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