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