* Fix a crash that occurs when passing through virtio devices to nested guest
* Update s390x MAINTAINERS * Fix various pylint warnings in functional tests -----BEGIN PGP SIGNATURE----- iQJFBAABCgAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmkgMrgRHHRodXRoQHJl ZGhhdC5jb20ACgkQLtnXdP5wLbXvEg/8CxLpA1a/lkf17XyGQmxvES5sRZDD2DCg CTZfK8j4ZwaDlHH4WIQdvAPHxSMZ4p0Z+HoS+GlKkAMTp6ALJkSg+mRosehy7sH0 z3DRcGXnR46kArdhLzZIXL0QStAcTRAhTrva/eI+pf6CDD8ypR3Qut6d4hTBVdvB lgU1LOOXDOGRsWYq11asUJabwZr4VYYIQlIMd57Lv2MITCt3UNwK279hZQQ/Xe5C 07Y9X4aC3m3f8+AHbZJhrSB9ySNQMGuKyGfHf+rQDyYGOybsG/cJoJLUO6eAUU3M b3J/YoEViL7JmKqwv2WJQdP2p7/M8M9XlK9rMn7Ry26Wdab/QeNTdjMHuakxHfmn oaorN7ua2P+wLKV6h2ElHFKiqhvs/n6vGGE39FsvbgGYhzsqdg0YvKDr61KxpXRp rz7LuiLygBFEUwhqlLa2ePoJb9wxgECLgEib17qNhjUlDHegSDGNpENAzvJ/rC2l ufCNQR17zocffJp1N/S1ZcjVc+JzMUG5G6ScdQsKUHueSqiXpS6pRI7cX0PFNz70 jp2Ul+m1Mr9GJn9bFhz2Kf2k74gpW5B27SKnZlcZa/AFtT9WlHcEkStAs0PRe00Q rrPkxBJaesLayxX6xW8HMzO+IkBniHtxQesf5WPlf9+z2roM0eXuCXibMGHnK49P YqvvLCvBTEA= =yxWh -----END PGP SIGNATURE----- Merge tag 'pull-request-2025-11-21' of https://gitlab.com/thuth/qemu into staging * Fix a crash that occurs when passing through virtio devices to nested guest * Update s390x MAINTAINERS * Fix various pylint warnings in functional tests # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCgAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmkgMrgRHHRodXRoQHJl # ZGhhdC5jb20ACgkQLtnXdP5wLbXvEg/8CxLpA1a/lkf17XyGQmxvES5sRZDD2DCg # CTZfK8j4ZwaDlHH4WIQdvAPHxSMZ4p0Z+HoS+GlKkAMTp6ALJkSg+mRosehy7sH0 # z3DRcGXnR46kArdhLzZIXL0QStAcTRAhTrva/eI+pf6CDD8ypR3Qut6d4hTBVdvB # lgU1LOOXDOGRsWYq11asUJabwZr4VYYIQlIMd57Lv2MITCt3UNwK279hZQQ/Xe5C # 07Y9X4aC3m3f8+AHbZJhrSB9ySNQMGuKyGfHf+rQDyYGOybsG/cJoJLUO6eAUU3M # b3J/YoEViL7JmKqwv2WJQdP2p7/M8M9XlK9rMn7Ry26Wdab/QeNTdjMHuakxHfmn # oaorN7ua2P+wLKV6h2ElHFKiqhvs/n6vGGE39FsvbgGYhzsqdg0YvKDr61KxpXRp # rz7LuiLygBFEUwhqlLa2ePoJb9wxgECLgEib17qNhjUlDHegSDGNpENAzvJ/rC2l # ufCNQR17zocffJp1N/S1ZcjVc+JzMUG5G6ScdQsKUHueSqiXpS6pRI7cX0PFNz70 # jp2Ul+m1Mr9GJn9bFhz2Kf2k74gpW5B27SKnZlcZa/AFtT9WlHcEkStAs0PRe00Q # rrPkxBJaesLayxX6xW8HMzO+IkBniHtxQesf5WPlf9+z2roM0eXuCXibMGHnK49P # YqvvLCvBTEA= # =yxWh # -----END PGP SIGNATURE----- # gpg: Signature made Fri 21 Nov 2025 01:36:56 AM PST # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [unknown] # gpg: aka "Thomas Huth <thuth@redhat.com>" [unknown] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [unknown] # gpg: WARNING: The key's User ID is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * tag 'pull-request-2025-11-21' of https://gitlab.com/thuth/qemu: MAINTAINERS: s390 maintainer updates tests/functional/aarch64/test_rme_sbsaref: Silence issues reported by pylint tests/functional/aarch64/test_reverse_debug: Fix issues reported by pylint tests/functional/ppc/test_ppe42: Fix style issues reported by pylint tests/functional/ppc/test_amiga: Fix issues reported by pylint and flake8 tests/functional/x86_64/test_memlock: Silence pylint warnings tests/functional/x86_64/test_reverse_debug: Silence pylint warning tests/functional/x86_64/test_virtio_gpu: Fix various issues reported by pylint tests/functional/arm/test_aspeed_ast2600_buildroot: Fix pylint warnings hw/s390x: Fix a possible crash with passed-through virtio devices Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
ab9079f59b
10 changed files with 75 additions and 58 deletions
|
|
@ -364,8 +364,8 @@ F: target/rx/
|
|||
|
||||
S390 TCG CPUs
|
||||
M: Richard Henderson <richard.henderson@linaro.org>
|
||||
M: David Hildenbrand <david@kernel.org>
|
||||
R: Ilya Leoshkevich <iii@linux.ibm.com>
|
||||
M: Ilya Leoshkevich <iii@linux.ibm.com>
|
||||
R: David Hildenbrand <david@kernel.org>
|
||||
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 <david@kernel.org>
|
||||
M: Hendrik Brueckner <brueckner@linux.ibm.com>
|
||||
R: David Hildenbrand <david@kernel.org>
|
||||
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 <pasic@linux.ibm.com>
|
||||
M: Christian Borntraeger <borntraeger@linux.ibm.com>
|
||||
M: David Hildenbrand <david@kernel.org>
|
||||
R: David Hildenbrand <david@kernel.org>
|
||||
R: Jason Herne <jjherne@linux.ibm.com>
|
||||
S: Supported
|
||||
F: hw/intc/s390_flic*.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)) {
|
||||
|
|
|
|||
|
|
@ -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/'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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("<test completed>")
|
||||
return True
|
||||
else:
|
||||
if "NIP fff80200" not in output:
|
||||
self.log.info("<test not completed>")
|
||||
return False
|
||||
|
||||
self.log.info("<test completed>")
|
||||
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!")
|
||||
|
|
|
|||
|
|
@ -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__':
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue