diff --git a/MAINTAINERS b/MAINTAINERS index d1c5080e50..d048c9f30d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -364,8 +364,8 @@ F: target/rx/ S390 TCG CPUs M: Richard Henderson -M: David Hildenbrand -R: Ilya Leoshkevich +M: Ilya Leoshkevich +R: David Hildenbrand S: Maintained F: target/s390x/ F: target/s390x/tcg @@ -1862,7 +1862,8 @@ F: target/s390x/ioinst.c L: qemu-s390x@nongnu.org S390 CPU models -M: David Hildenbrand +M: Hendrik Brueckner +R: David Hildenbrand S: Maintained F: target/s390x/cpu_features*.[ch] F: target/s390x/cpu_models.[ch] @@ -2919,7 +2920,7 @@ L: qemu-s390x@nongnu.org S390 floating interrupt controller M: Halil Pasic M: Christian Borntraeger -M: David Hildenbrand +R: David Hildenbrand R: Jason Herne S: Supported F: hw/intc/s390_flic*.c diff --git a/hw/s390x/s390-hypercall.c b/hw/s390x/s390-hypercall.c index ac1b08b2cd..508dd97ca0 100644 --- a/hw/s390x/s390-hypercall.c +++ b/hw/s390x/s390-hypercall.c @@ -10,6 +10,7 @@ */ #include "qemu/osdep.h" +#include "qemu/error-report.h" #include "cpu.h" #include "hw/s390x/s390-virtio-ccw.h" #include "hw/s390x/s390-hypercall.h" @@ -42,6 +43,19 @@ static int handle_virtio_ccw_notify(uint64_t subch_id, uint64_t data) if (!sch || !css_subch_visible(sch)) { return -EINVAL; } + if (sch->id.cu_type != VIRTIO_CCW_CU_TYPE) { + /* + * This might happen in nested setups: If the L1 host defined the + * L2 guest with a virtio device (e.g. virtio-keyboard), and the + * L2 guest passes this device through to the L3 guest, the L3 guest + * might send virtio notifications to the QEMU in L2 for that device. + * But since the QEMU in L2 defined this device as vfio-ccw, it's not + * a VirtIODevice that we can handle here! + */ + warn_report_once("Got virtio notification for unsupported device " + "on subchannel %02x.%1x.%04x!", cssid, ssid, schid); + return -EINVAL; + } vdev = virtio_ccw_get_vdev(sch); if (vq_idx >= VIRTIO_QUEUE_MAX || !virtio_queue_get_num(vdev, vq_idx)) { diff --git a/tests/functional/aarch64/test_reverse_debug.py b/tests/functional/aarch64/test_reverse_debug.py index ec3348c96d..e9fa4479d7 100755 --- a/tests/functional/aarch64/test_reverse_debug.py +++ b/tests/functional/aarch64/test_reverse_debug.py @@ -14,11 +14,11 @@ # This work is licensed under the terms of the GNU GPL, version 2 or # later. See the COPYING file in the top-level directory. -from qemu_test import Asset, skipFlakyTest +from qemu_test import Asset from reverse_debugging import ReverseDebugging -class ReverseDebugging_AArch64(ReverseDebugging): +class ReverseDebuggingAArch64(ReverseDebugging): ASSET_KERNEL = Asset( ('https://archives.fedoraproject.org/pub/archive/fedora/linux/' diff --git a/tests/functional/aarch64/test_rme_sbsaref.py b/tests/functional/aarch64/test_rme_sbsaref.py index 6f92858397..4845c82496 100755 --- a/tests/functional/aarch64/test_rme_sbsaref.py +++ b/tests/functional/aarch64/test_rme_sbsaref.py @@ -14,7 +14,6 @@ from os.path import join import shutil from qemu_test import QemuSystemTest, Asset, wait_for_console_pattern -from qemu_test import exec_command_and_wait_for_pattern class Aarch64RMESbsaRefMachine(QemuSystemTest): @@ -48,7 +47,7 @@ class Aarch64RMESbsaRefMachine(QemuSystemTest): efi = join(rme_stack, 'out', 'EFI') os.makedirs(efi, exist_ok=True) shutil.copyfile(join(rme_stack, 'out', 'Image'), join(efi, 'Image')) - with open(join(efi, 'startup.nsh'), 'w') as startup: + with open(join(efi, 'startup.nsh'), 'w', encoding='ascii') as startup: startup.write('fs0:Image nokaslr root=/dev/vda rw init=/init --' ' /host/out/lkvm run --realm' ' -m 256m' diff --git a/tests/functional/arm/test_aspeed_ast2600_buildroot.py b/tests/functional/arm/test_aspeed_ast2600_buildroot.py index 51f2676c90..575a5f6414 100755 --- a/tests/functional/arm/test_aspeed_ast2600_buildroot.py +++ b/tests/functional/arm/test_aspeed_ast2600_buildroot.py @@ -9,8 +9,8 @@ import time import tempfile import subprocess -from qemu_test import Asset from aspeed import AspeedTest +from qemu_test import Asset from qemu_test import exec_command_and_wait_for_pattern, skipIfMissingCommands @@ -66,21 +66,18 @@ class AST2600Machine(AspeedTest): 'images/ast2600-evb/buildroot-2023.02-tpm/flash.img'), 'a46009ae8a5403a0826d607215e731a8c68d27c14c41e55331706b8f9c7bd997') - @skipIfMissingCommands('swtpm') - def test_arm_ast2600_evb_buildroot_tpm(self): - self.set_machine('ast2600-evb') - + def _test_arm_ast2600_evb_buildroot_tpm(self, tpmstate_dir): image_path = self.ASSET_BR2_202302_AST2600_TPM_FLASH.fetch() - tpmstate_dir = tempfile.TemporaryDirectory(prefix="qemu_") - socket = os.path.join(tpmstate_dir.name, 'swtpm-socket') + socket = os.path.join(tpmstate_dir, 'swtpm-socket') # We must put the TPM state dir in /tmp/, not the build dir, # because some distros use AppArmor to lock down swtpm and # restrict the set of locations it can access files in. subprocess.run(['swtpm', 'socket', '-d', '--tpm2', - '--tpmstate', f'dir={tpmstate_dir.name}', - '--ctrl', f'type=unixio,path={socket}']) + '--tpmstate', f'dir={tpmstate_dir}', + '--ctrl', f'type=unixio,path={socket}'], + check=True) self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}') self.vm.add_args('-tpmdev', 'emulator,id=tpm0,chardev=chrtpm') @@ -97,6 +94,12 @@ class AST2600Machine(AspeedTest): self.do_test_arm_aspeed_buildroot_poweroff() + @skipIfMissingCommands('swtpm') + def test_arm_ast2600_evb_buildroot_tpm(self): + self.set_machine('ast2600-evb') + with tempfile.TemporaryDirectory(prefix="qemu_") as tpmstate_dir: + self._test_arm_ast2600_evb_buildroot_tpm(tpmstate_dir) + if __name__ == '__main__': AspeedTest.main() diff --git a/tests/functional/ppc/test_amiga.py b/tests/functional/ppc/test_amiga.py index 8600e2e963..36378fb697 100755 --- a/tests/functional/ppc/test_amiga.py +++ b/tests/functional/ppc/test_amiga.py @@ -15,8 +15,6 @@ from qemu_test import wait_for_console_pattern class AmigaOneMachine(QemuSystemTest): - timeout = 90 - ASSET_IMAGE = Asset( ('https://www.hyperion-entertainment.com/index.php/' 'downloads?view=download&format=raw&file=25'), @@ -25,19 +23,19 @@ class AmigaOneMachine(QemuSystemTest): def test_ppc_amigaone(self): self.require_accelerator("tcg") self.set_machine('amigaone') - tar_name = 'A1Firmware_Floppy_05-Mar-2005.zip' self.archive_extract(self.ASSET_IMAGE, format="zip") bios = self.scratch_file("u-boot-amigaone.bin") with open(bios, "wb") as bios_fh: subprocess.run(['tail', '-c', '524288', self.scratch_file("floppy_edition", "updater.image")], - stdout=bios_fh) + stdout=bios_fh, check=True) self.vm.set_console() self.vm.add_args('-bios', bios) self.vm.launch() wait_for_console_pattern(self, 'FLASH:') + if __name__ == '__main__': QemuSystemTest.main() diff --git a/tests/functional/ppc/test_ppe42.py b/tests/functional/ppc/test_ppe42.py index 26bbe11b2d..7b360a40a5 100644 --- a/tests/functional/ppc/test_ppe42.py +++ b/tests/functional/ppc/test_ppe42.py @@ -6,8 +6,9 @@ # # SPDX-License-Identifier: GPL-2.0-or-later -from qemu_test import QemuSystemTest, Asset import asyncio +from qemu_test import QemuSystemTest, Asset + class Ppe42Machine(QemuSystemTest): @@ -30,13 +31,13 @@ class Ppe42Machine(QemuSystemTest): raise self.log.info(output) - if "NIP fff80200" in output: - self.log.info("") - return True - else: + if "NIP fff80200" not in output: self.log.info("") return False + self.log.info("") + return True + def _wait_pass_fail(self, timeout): while not self._test_completed(): if timeout >= self.poll_period: @@ -49,14 +50,13 @@ class Ppe42Machine(QemuSystemTest): except asyncio.TimeoutError: self.log.info("Poll period ended.") - pass except Exception as err: self.log.debug(f"event_wait() failed due to {err=}," " {type(err)=}") raise - if e != None: + if e is not None: self.log.debug(f"Execution stopped: {e}") self.log.debug("Exiting due to test failure") self.fail("Failure detected!") diff --git a/tests/functional/x86_64/test_memlock.py b/tests/functional/x86_64/test_memlock.py index 81bce80b0c..f970a2c309 100755 --- a/tests/functional/x86_64/test_memlock.py +++ b/tests/functional/x86_64/test_memlock.py @@ -69,11 +69,13 @@ class MemlockTest(QemuSystemTest): return result def _get_raw_process_status(self, pid: int) -> str: + status = None try: - with open(f'/proc/{pid}/status', 'r') as f: - return f.read() + with open(f'/proc/{pid}/status', 'r', encoding="ascii") as f: + status = f.read() except FileNotFoundError: self.skipTest("Can't open status file of the process") + return status if __name__ == '__main__': diff --git a/tests/functional/x86_64/test_reverse_debug.py b/tests/functional/x86_64/test_reverse_debug.py index 2b31ae8724..ab5dac9838 100755 --- a/tests/functional/x86_64/test_reverse_debug.py +++ b/tests/functional/x86_64/test_reverse_debug.py @@ -18,7 +18,7 @@ from qemu_test import skipFlakyTest from reverse_debugging import ReverseDebugging -class ReverseDebugging_X86_64(ReverseDebugging): +class ReverseDebuggingX86(ReverseDebugging): @skipFlakyTest("https://gitlab.com/qemu-project/qemu/-/issues/2922") def test_x86_64_pc(self): diff --git a/tests/functional/x86_64/test_virtio_gpu.py b/tests/functional/x86_64/test_virtio_gpu.py index be96de24da..58b0f72ba4 100755 --- a/tests/functional/x86_64/test_virtio_gpu.py +++ b/tests/functional/x86_64/test_virtio_gpu.py @@ -5,22 +5,23 @@ # This work is licensed under the terms of the GNU GPL, version 2 or # later. See the COPYING file in the top-level directory. +import os +import socket +import subprocess from qemu_test import QemuSystemTest, Asset from qemu_test import wait_for_console_pattern from qemu_test import exec_command_and_wait_for_pattern from qemu_test import is_readable_executable_file - -import os -import socket -import subprocess +from qemu.machine.machine import VMLaunchFailure def pick_default_vug_bin(test): bld_dir_path = test.build_file("contrib", "vhost-user-gpu", "vhost-user-gpu") if is_readable_executable_file(bld_dir_path): return bld_dir_path + return None class VirtioGPUx86(QemuSystemTest): @@ -46,8 +47,8 @@ class VirtioGPUx86(QemuSystemTest): ) def test_virtio_vga_virgl(self): - # FIXME: should check presence of virtio, virgl etc self.require_accelerator('kvm') + self.require_device('virtio-vga-gl') kernel_path = self.ASSET_KERNEL.fetch() initrd_path = self.ASSET_INITRD.fetch() @@ -68,7 +69,7 @@ class VirtioGPUx86(QemuSystemTest): ) try: self.vm.launch() - except: + except VMLaunchFailure: # TODO: probably fails because we are missing the VirGL features self.skipTest("VirGL not enabled?") @@ -78,8 +79,8 @@ class VirtioGPUx86(QemuSystemTest): ) def test_vhost_user_vga_virgl(self): - # FIXME: should check presence of vhost-user-gpu, virgl, memfd etc self.require_accelerator('kvm') + self.require_device('vhost-user-vga') vug = pick_default_vug_bin(self) if not vug: @@ -95,27 +96,29 @@ class VirtioGPUx86(QemuSystemTest): os.set_inheritable(qemu_sock.fileno(), True) os.set_inheritable(vug_sock.fileno(), True) - self._vug_log_path = self.log_file("vhost-user-gpu.log") - self._vug_log_file = open(self._vug_log_path, "wb") - self.log.info('Complete vhost-user-gpu.log file can be ' - 'found at %s', self._vug_log_path) - - vugp = subprocess.Popen( - [vug, "--virgl", "--fd=%d" % vug_sock.fileno()], - stdin=subprocess.DEVNULL, - stdout=self._vug_log_file, - stderr=subprocess.STDOUT, - shell=False, - close_fds=False, - ) - self._vug_log_file.close() - + vug_log_path = self.log_file("vhost-user-gpu.log") + self.log.info('Complete vhost-user-gpu.log file can be found at %s', + vug_log_path) + with open(vug_log_path, "wb") as vug_log_file: + with subprocess.Popen([vug, "--virgl", f"--fd={vug_sock.fileno()}"], + stdin=subprocess.DEVNULL, + stdout=vug_log_file, + stderr=subprocess.STDOUT, + shell=False, + close_fds=False) as vugp: + self._test_vhost_user_vga_virgl(qemu_sock, + kernel_path, initrd_path) + qemu_sock.close() + vug_sock.close() + vugp.terminate() + + def _test_vhost_user_vga_virgl(self, qemu_sock, kernel_path, initrd_path): self.vm.set_console() self.vm.add_args("-cpu", "host") self.vm.add_args("-m", "2G") self.vm.add_args("-object", "memory-backend-memfd,id=mem,size=2G") self.vm.add_args("-machine", "pc,memory-backend=mem,accel=kvm") - self.vm.add_args("-chardev", "socket,id=vug,fd=%d" % qemu_sock.fileno()) + self.vm.add_args("-chardev", f"socket,id=vug,fd={qemu_sock.fileno()}") self.vm.add_args("-device", "vhost-user-vga,chardev=vug") self.vm.add_args("-display", "egl-headless") self.vm.add_args( @@ -128,17 +131,14 @@ class VirtioGPUx86(QemuSystemTest): ) try: self.vm.launch() - except: + except VMLaunchFailure: # TODO: probably fails because we are missing the VirGL features self.skipTest("VirGL not enabled?") self.wait_for_console_pattern("as init process") exec_command_and_wait_for_pattern(self, "/usr/sbin/modprobe virtio_gpu", "features: +virgl +edid") self.vm.shutdown() - qemu_sock.close() - vug_sock.close() - vugp.terminate() - vugp.wait() + if __name__ == '__main__': QemuSystemTest.main()