From nobody Mon Apr 13 12:34:39 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1772814184; cv=none; d=zohomail.com; s=zohoarc; b=MNewUl72penfMpr24oovoE5UDqfzHg4wkc6Kqf0j6imqxfm+VMg9pe6owVnMpyA5KxiCFTAz8tPmRoE0QWcT0FrbiuQmTD5lULqxMXa+p5evIRAxW9ki1E+z9VqwOxBJBYMTYKq49JSZPHR8GfJIGu2vr196r9ZtRb6DUToK9yA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772814184; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=dqXQr4uENYp7Zhjhp+PlBR4pffBHMkJZVYziiA75uYo=; b=h+LJMwYLY8IDzS5j6swndWGshRopa5dcesVZirJeO8HpFkTxbXUZovvx0sIN2Dr0wA3srqHq+uTpHJxk60WX8JuqsZE+VhrLUlU3zznNuu68cHCIZ4yhAlINXbz44VdjLNCx2mqIhiTk4cz6UoqA7p7SSOInqqVtVlVhij47nVI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772814184844601.2816060939767; Fri, 6 Mar 2026 08:23:04 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vyXs5-0008Em-Gs; Fri, 06 Mar 2026 11:17:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vyXrw-0007NT-8B for qemu-devel@nongnu.org; Fri, 06 Mar 2026 11:17:42 -0500 Received: from mail-wm1-x32d.google.com ([2a00:1450:4864:20::32d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vyXrs-0007k7-EG for qemu-devel@nongnu.org; Fri, 06 Mar 2026 11:17:39 -0500 Received: by mail-wm1-x32d.google.com with SMTP id 5b1f17b1804b1-4852a8482fcso3415785e9.3 for ; Fri, 06 Mar 2026 08:17:35 -0800 (PST) Received: from draig.lan ([185.124.0.126]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4852767d8e4sm42639265e9.2.2026.03.06.08.17.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Mar 2026 08:17:33 -0800 (PST) Received: from draig.lan (localhost [IPv6:::1]) by draig.lan (Postfix) with ESMTP id 80092689D6; Fri, 06 Mar 2026 16:17:29 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1772813854; x=1773418654; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dqXQr4uENYp7Zhjhp+PlBR4pffBHMkJZVYziiA75uYo=; b=zV4C65+4jPK7wTIZV5THW0GzSzqehAr0P7LD+5Nj/gBxGzIFZKU52tp4GUBLeodq+2 oJKT6P2rWVSNAQxeE/G7Vfkx4AD70HLx5BJ5mqm/wksMy154qvhrmgaKhv+c1ldYaFXN uJzn6ux8qWsAF8e/qMCxiJo9mCWEmCPN8F7uKDJL/1STEujZREwhUkOHgyRqUQNXp2Sj r/9Q9IwcQIn6L+icYvaGzgNlGOzM6dHC9BFxmrBdzaoPtDowjKZX3DZSQwMvTqaZPY00 LGuvhPONQy6Xez+DTgUZpuYdK/5R3u5BL7Xj6Co1eFv93kvnMio7x6yq22EduMpGgEV3 jhlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772813854; x=1773418654; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=dqXQr4uENYp7Zhjhp+PlBR4pffBHMkJZVYziiA75uYo=; b=RdryjssjdxdbhRZhG9T31FRkSfrOoZSVN1Fky6nMZZ4clg+9CDC5058L0SNKOR5ZKD lhrDznfU5lRVbdNs88OnpwInke7ZzS36fGc8FGS2h3pGUO2PnhzJ+VuvbkyibQv4MR8v uoZQvJwJd2+1zZXMQ3Nlb3OiNClqEWHUNrg3EuVJrwtsLWGsPyq4boMDXU1KgpadokQf GK/uuyX9b3DQv9RTxwKyZh3P9+Wut83H3zW6LpaChrtzvYnrx9f6Qts1qHl0QHbl42bb I0twVqTT3D1gszQCQZwIszcRCd5jI9CCZ9/jfNHLapROfMUoRzPqAepdvXGIygLW4Pgw nRIw== X-Gm-Message-State: AOJu0YwVgVk+oTaPaMCAX2/Q8IYqW6c9qlHEtRJrFgsKQpsRSzOphXdy di4i6SwTrhaqUHgP0QhKSqeWt88F12beUdNvU/P2TMHnFXSqmKTZqg7DGExdDTYlOzI= X-Gm-Gg: ATEYQzzdpxNEJAA/Nky6pQDn2E60P5jc8myZpg+Il/2eYK8t3J93qvmcUnVNAXKW7/Y 9B6TQq7nFcvaZa5CtHWlIFAq7WoRMb/rrzT3fqny1RVCH5JTYRJE4imU12dgxxQvPUx/RC0pMUV pYUDX348GGXReC9pL2reTBG2OZH2mBi5cBosa+75Slcq7T/Fds0y05CjB+uvNLcLeni4jvCeu5L npp2h14g2A/o7BrhdAsYCtxia/he2KJ6pUmcanqEvwc7H1Ri3jDyp85Sh5Y8NI2GVjVAfqeDeaJ tdO95lv02629SjMuEubm4ok3wkV8a3drD41rDsKSUnaM0R3XKc6+OU6PmVxXrqVLQHw62JYOYsF wRNeh9c3D2DDRSwaw2LYDVh6SrHTO3YMvmGEU4wk477M+M3MN4xb5S1kg7aRshMcmlq5vIOO6hk XTwjzQ8QWFYP+8EfRpm8yny8VHaMX+WxGFvA== X-Received: by 2002:a05:600c:1c03:b0:480:1dc6:2686 with SMTP id 5b1f17b1804b1-48526930d92mr47852765e9.13.1772813854432; Fri, 06 Mar 2026 08:17:34 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: Brad Smith , qemu-arm@nongnu.org, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Pierrick Bouvier , Kyle Evans , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Peter Maydell , Thomas Huth , Warner Losh , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Subject: [PATCH 7/7] tests/functional: add VBSA linux tests Date: Fri, 6 Mar 2026 16:17:28 +0000 Message-ID: <20260306161728.2657486-8-alex.bennee@linaro.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260306161728.2657486-1-alex.bennee@linaro.org> References: <20260306161728.2657486-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::32d; envelope-from=alex.bennee@linaro.org; helo=mail-wm1-x32d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1772814186474158500 This extends the VBSA test to run the linux tests. The sysarch-acs test suite does provide some pre-built images which is good because the tests require a patched kernel. However due to the structure of the image we need to jump one or two hoops to get something useful: - download and double decompress (zip then xz) the image - navigate grub to launch the Linux Execution Environment - shutdown the system once tests are done - extract the logs from the MSDOS file system and parse them It does make the code a bit ugly but it works for me at least. So far the subset of tests run is limited but that might be solved by adding some more devices to the PCIe bus to exercise the SMMU behaviour. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Pierrick Bouvier --- tests/functional/aarch64/test_virt_vbsa.py | 123 +++++++++++++++++++-- 1 file changed, 112 insertions(+), 11 deletions(-) diff --git a/tests/functional/aarch64/test_virt_vbsa.py b/tests/functional/= aarch64/test_virt_vbsa.py index 1dd4cecde1e..0456dfe9fd5 100755 --- a/tests/functional/aarch64/test_virt_vbsa.py +++ b/tests/functional/aarch64/test_virt_vbsa.py @@ -10,12 +10,15 @@ # SPDX-License-Identifier: GPL-2.0-or-later =20 import shutil -from subprocess import check_call, DEVNULL +import re +from subprocess import check_call, check_output, DEVNULL =20 from qemu_test import QemuSystemTest, Asset from qemu_test import get_qemu_img, skipIfMissingCommands from qemu_test import wait_for_console_pattern +from qemu_test import interrupt_interactive_console_until_pattern as int_u= ntil from qemu_test import exec_command_and_wait_for_pattern as ec_and_wait +from qemu_test import send_key =20 =20 @skipIfMissingCommands("mformat", "mcopy", "mmd") @@ -28,6 +31,20 @@ def wait_for_console_pattern(self, success_message, vm= =3DNone): failure_message=3D'FAILED', vm=3Dvm) =20 + def append_firmware_blobs(self): + """ + Setup QEMU firmware blobs for boot. + """ + code_path =3D self.build_file('pc-bios', 'edk2-aarch64-code.fd') + vars_source =3D self.build_file('pc-bios', 'edk2-arm-vars.fd') + vars_path =3D self.scratch_file('vars.fd') + shutil.copy(vars_source, vars_path) + + self.vm.add_args('-drive', + f'if=3Dpflash,format=3Draw,readonly=3Don,file=3D{= code_path}') + self.vm.add_args('-drive', f'if=3Dpflash,format=3Draw,file=3D{vars= _path}') + + ASSET_VBSA_EFI =3D Asset( 'https://github.com/ARM-software/sysarch-acs/raw/refs/heads/main' '/prebuilt_images/VBSA/v25.12_VBSA_0.7.0/Vbsa.efi', @@ -45,20 +62,12 @@ def test_aarch64_vbsa_uefi_tests(self): =20 self.vm.set_console() =20 - # virt machine wi + # virt machine self.set_machine('virt') self.vm.add_args('-M', 'virt,gic-version=3Dmax,virtualization=3Don= ') self.vm.add_args('-cpu', 'max', '-m', '1024') =20 - # We will use the QEMU firmware blobs to boot - code_path =3D self.build_file('pc-bios', 'edk2-aarch64-code.fd') - vars_source =3D self.build_file('pc-bios', 'edk2-arm-vars.fd') - vars_path =3D self.scratch_file('vars.fd') - shutil.copy(vars_source, vars_path) - - self.vm.add_args('-drive', - f'if=3Dpflash,format=3Draw,readonly=3Don,file=3D{= code_path}') - self.vm.add_args('-drive', f'if=3Dpflash,format=3Draw,file=3D{vars= _path}') + self.append_firmware_blobs() =20 # Build an EFI FAT32 file-system for the UEFI tests vbsa_efi =3D self.ASSET_VBSA_EFI.fetch() @@ -102,5 +111,97 @@ def test_aarch64_vbsa_uefi_tests(self): self.wait_for_console_pattern('VBSA tests complete. Reset the syst= em.') =20 =20 + ASSET_SYSREADY_IMAGE =3D Asset( + 'https://github.com/ARM-software/arm-systemready/' + 'releases/download/v25.10_SR_3.1.0/systemready_acs_live_image.img.= xz.zip', + 'df2c359de15784b1da6a8e6f3c98a053ee38ac0b3f241ccea62e17db092eb03a') + + ROOT_PROMPT =3D '/ # ' + DOWN_KEY =3D "\x1b[B" + + @skipIfMissingCommands("sfdisk", "jq") + def test_aarch64_vbsa_linux_tests(self): + """ + Launch the Linux based VBSA test from the ACS prebuilt images. + + We can use the pre-built images and then trigger the Linux + build and run the tests. We then need to slurp the results + from the partition. + """ + + self.vm.set_console() + + # virt machine with SMMU + self.set_machine('virt') + self.vm.add_args('-M', 'virt,gic-version=3Dmax,virtualization=3Don= ,iommu=3Dsmmuv3') + self.vm.add_args('-cpu', 'max', '-m', '1024', '-smp', '4') + + self.append_firmware_blobs() + + # First fetch, decompress (twice) and prepare the disk image + # on an NVME device (the kernel only has drivers for that). + disk_image_zip =3D self.ASSET_SYSREADY_IMAGE.fetch() + disk_image_xz =3D self.uncompress(disk_image_zip, + target=3D"sysacs.xz", format=3D"zi= p") + disk_image =3D self.uncompress(disk_image_xz, + target=3D"sysacs.img", format=3D"xz") + + self.vm.add_args('-device', + 'nvme,drive=3Dhd,serial=3DQEMU_ROOT_SSD') + self.vm.add_args('-blockdev', + f'driver=3Draw,node-name=3Dhd,file.driver=3Dfile,= file.filename=3D{disk_image}') + + # Launch QEMU and wait for grub and select the "Linux + # Execution Environment" so we can launch the test. + + self.vm.launch() + self.wait_for_console_pattern('Use the ^ and v keys to select whic= h entry is highlighted') + + # 3 down arrows then return to select entry + send_key(self, self.DOWN_KEY) + send_key(self, self.DOWN_KEY) + send_key(self, self.DOWN_KEY) + + ec_and_wait(self, "\n", self.ROOT_PROMPT) + + ec_and_wait(self, "/usr/bin/bsa.sh --skip B_REP_1,B_IEP_1,B_PCIe_1= 1,B_MEM_06", + self.ROOT_PROMPT) + + # Now we can shutdown + ec_and_wait(self, "halt -f", "reboot: System halted") + self.vm.shutdown() + + # and extract the test logs + offset =3D int(check_output(f"sfdisk --json {disk_image} |" + "jq '.partitiontable.partitions[0].start= * 512'", + shell =3D True)) + bsa_app_res =3D self.scratch_file("BsaResultsApp.log") + bsa_kern_res =3D self.scratch_file("BsaResultsKernel.log") + + check_call(["mcopy", "-i", f"{disk_image}@@{offset}", + f"::acs_results/Linux/BsaResultsApp.log", bsa_app_res]) + check_call(["mcopy", "-i", f"{disk_image}@@{offset}", + f"::acs_results/Linux/BsaResultsKernel.log", bsa_kern_= res]) + + # for now just check the kernel log for the result summary + test_result_re =3D re.compile(r"\[.*\]\s+(.+): Result:\s+(\w+)") + summary_re =3D re.compile(r"Total Tests Run =3D\s*(\d+), Tests Pas= sed =3D\s*(\d+), Tests Failed =3D\s*(\d+)") + + with open(bsa_kern_res, 'r') as f: + for line in f: + test_match =3D test_result_re.search(line) + if test_match: + desc =3D test_match.group(1) + status =3D test_match.group(2) + self.log.info(f"Test: {desc} status: {status}") + + match =3D summary_re.search(line) + if match: + total, passed, failed =3D match.groups() + + if int(failed) > 0: + self.fail(f"{failed} tests failed ({total})") + + if __name__ =3D=3D '__main__': QemuSystemTest.main() --=20 2.47.3