* s390x PCI fixes and improvements (for the ISM device)
* Fix emulated MVCP and MVCS s390x instructions * Clean-ups for the e1000e qtest * Enable qtests on Windows * Update FreeBSD CI to version 12.4 * Check --disable-tcg for ppc64 in the CI * Improve scripts/make-releases a little bit * Many other misc small clean-ups and fixes here and there -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmObN8gRHHRodXRoQHJl ZGhhdC5jb20ACgkQLtnXdP5wLbVzWQ/+OzpXQODK/Xp0UUwre4kxm1Ju15tHdIPr lb5GqxcxZQay2hH1OIr5RjCEODDCzO+uPPq9VPh+a8qrx+nypcJDXlNDX4y9e7yK wz8pZ8G8E6OmflHjojbKESTUbdDkCY3c+Ge86Jdot0UMtvwSkmU8VZ9EiFRW+9MF i6NDgEhpHeiur8834+7BMyYc5YDE5TPaNsbzpSulKZQUsPJ6gntKwA15YPgZobXX s2CnCV6E48zUaxhtZs5plFQKIkUS2TAl15Zvr4OVKjAXpSk86ysBUWKZjZDQup/l G6dh8yF1Y724l4oq7rpVcEG02vXQSlsUIZlpUWWmGyNzt6npJ71aWQbPN2we9C1j pa3hZDak/g9B8wDlWJQMYNcKKHUtp6LW+qqJxxujKUjzGlsXWgflpBjeXBH8TE3z vAi+iTXsQJSEwvhMboHzogZjLpyG1PXcrlksRyRPvgKyW00CzVTjclz58Yd+m/cm Bfc2T/PWr+OsxYXRZBZPu0RebQW1s3XnG0bx8jctcEty3ZsPs0eyPNvYTkT+sEnl e1BkXN6C1ImB214psH4mDzgtQx0/zz4vVMH+4JeeX5Wrfmc+FTjr083oiWsFJRsn JE+CkRbK74iN3fY6HhH9XiD60OwVMOgNe/NMhjH9eIokez8D15lOeKFMuR1vPwqi Rcuip8uENZk= =u/jz -----END PGP SIGNATURE----- Merge tag 'pull-request-2022-12-15' of https://gitlab.com/thuth/qemu into staging * s390x PCI fixes and improvements (for the ISM device) * Fix emulated MVCP and MVCS s390x instructions * Clean-ups for the e1000e qtest * Enable qtests on Windows * Update FreeBSD CI to version 12.4 * Check --disable-tcg for ppc64 in the CI * Improve scripts/make-releases a little bit * Many other misc small clean-ups and fixes here and there # gpg: Signature made Thu 15 Dec 2022 15:05:44 GMT # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * tag 'pull-request-2022-12-15' of https://gitlab.com/thuth/qemu: (23 commits) tests/qtest/vhost-user-blk-test: don't abort all qtests on missing envar .gitlab/issue_templates: Move suggestions into comments gitlab-ci: Check building ppc64 without TCG FreeBSD: Upgrade to 12.4 release tests/qtest: Enable qtest build on Windows .gitlab-ci.d/windows.yml: Exclude qTests from 64-bit CI job for now .gitlab-ci.d/windows.yml: Keep 64-bit and 32-bit build scripts consistent .gitlab-ci.d/windows.yml: Unify the prerequisite packages tests/qtest/libqos/e1000e: Correctly group register accesses tests/qtest/e1000e-test: De-duplicate constants tests/qtest/libqos/e1000e: Remove "other" interrupts hw: Include the VMWare devices only in the x86 targets MAINTAINERS: Add documentation files to the corresponding sections util/oslib-win32: Remove obsolete reference to g_poll code util/qemu-config: Fix "query-command-line-options" to provide the right values scripts/make-release: Only clone single branches to speed up the script scripts/make-release: Add a simple help text for the script monitor/misc: Remove superfluous include statements target/s390x: The MVCP and MVCS instructions are not privileged target/s390x/tcg/mem_helper: Test the right bits in psw_key_valid() ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
4208e6ae11
@ -50,7 +50,7 @@ x64-freebsd-12-build:
|
||||
NAME: freebsd-12
|
||||
CIRRUS_VM_INSTANCE_TYPE: freebsd_instance
|
||||
CIRRUS_VM_IMAGE_SELECTOR: image_family
|
||||
CIRRUS_VM_IMAGE_NAME: freebsd-12-3
|
||||
CIRRUS_VM_IMAGE_NAME: freebsd-12-4
|
||||
CIRRUS_VM_CPUS: 8
|
||||
CIRRUS_VM_RAM: 8G
|
||||
UPDATE_COMMAND: pkg update
|
||||
|
@ -112,6 +112,14 @@ cross-ppc64el-user:
|
||||
variables:
|
||||
IMAGE: debian-ppc64el-cross
|
||||
|
||||
cross-ppc64el-kvm-only:
|
||||
extends: .cross_accel_build_job
|
||||
needs:
|
||||
job: ppc64el-debian-cross-container
|
||||
variables:
|
||||
IMAGE: debian-ppc64el-cross
|
||||
EXTRA_CONFIGURE_OPTS: --disable-tcg --without-default-devices
|
||||
|
||||
# The riscv64 cross-builds currently use a 'sid' container to get
|
||||
# compilers and libraries. Until something more stable is found we
|
||||
# allow_failure so as not to block CI.
|
||||
|
@ -41,11 +41,15 @@ msys2-64bit:
|
||||
mingw-w64-x86_64-gcc
|
||||
mingw-w64-x86_64-glib2
|
||||
mingw-w64-x86_64-gnutls
|
||||
mingw-w64-x86_64-gtk3
|
||||
mingw-w64-x86_64-libgcrypt
|
||||
mingw-w64-x86_64-libjpeg-turbo
|
||||
mingw-w64-x86_64-libnfs
|
||||
mingw-w64-x86_64-libpng
|
||||
mingw-w64-x86_64-libssh
|
||||
mingw-w64-x86_64-libtasn1
|
||||
mingw-w64-x86_64-libusb
|
||||
mingw-w64-x86_64-lzo2
|
||||
mingw-w64-x86_64-nettle
|
||||
mingw-w64-x86_64-ninja
|
||||
mingw-w64-x86_64-pixman
|
||||
@ -57,12 +61,21 @@ msys2-64bit:
|
||||
mingw-w64-x86_64-usbredir
|
||||
mingw-w64-x86_64-zstd "
|
||||
- $env:CHERE_INVOKING = 'yes' # Preserve the current working directory
|
||||
- $env:MSYSTEM = 'MINGW64' # Start a 64 bit Mingw environment
|
||||
- $env:MSYSTEM = 'MINGW64' # Start a 64-bit MinGW environment
|
||||
- $env:MSYS = 'winsymlinks:native' # Enable native Windows symlink
|
||||
- .\msys64\usr\bin\bash -lc './configure --target-list=x86_64-softmmu
|
||||
--enable-capstone --without-default-devices'
|
||||
- .\msys64\usr\bin\bash -lc 'make'
|
||||
- .\msys64\usr\bin\bash -lc 'make check || { cat build/meson-logs/testlog.txt; exit 1; } ;'
|
||||
- mkdir output
|
||||
- cd output
|
||||
# Note: do not remove "--without-default-devices"!
|
||||
# commit 9f8e6cad65a6 ("gitlab-ci: Speed up the msys2-64bit job by using --without-default-devices"
|
||||
# changed to compile QEMU with the --without-default-devices switch
|
||||
# for the msys2 64-bit job, due to the build could not complete within
|
||||
# the project timeout.
|
||||
- ..\msys64\usr\bin\bash -lc '../configure --target-list=x86_64-softmmu
|
||||
--without-default-devices'
|
||||
- ..\msys64\usr\bin\bash -lc 'make'
|
||||
# qTests don't run successfully with "--without-default-devices",
|
||||
# so let's exclude the qtests from CI for now.
|
||||
- ..\msys64\usr\bin\bash -lc 'make check MTESTARGS=\"--no-suite qtest\" || { cat meson-logs/testlog.txt; exit 1; } ;'
|
||||
|
||||
msys2-32bit:
|
||||
extends: .shared_msys2_builder
|
||||
@ -79,21 +92,27 @@ msys2-32bit:
|
||||
mingw-w64-i686-gtk3
|
||||
mingw-w64-i686-libgcrypt
|
||||
mingw-w64-i686-libjpeg-turbo
|
||||
mingw-w64-i686-libnfs
|
||||
mingw-w64-i686-libpng
|
||||
mingw-w64-i686-libssh
|
||||
mingw-w64-i686-libtasn1
|
||||
mingw-w64-i686-libusb
|
||||
mingw-w64-i686-lzo2
|
||||
mingw-w64-i686-nettle
|
||||
mingw-w64-i686-ninja
|
||||
mingw-w64-i686-pixman
|
||||
mingw-w64-i686-pkgconf
|
||||
mingw-w64-i686-python
|
||||
mingw-w64-i686-SDL2
|
||||
mingw-w64-i686-SDL2_image
|
||||
mingw-w64-i686-snappy
|
||||
mingw-w64-i686-usbredir "
|
||||
mingw-w64-i686-usbredir
|
||||
mingw-w64-i686-zstd "
|
||||
- $env:CHERE_INVOKING = 'yes' # Preserve the current working directory
|
||||
- $env:MSYSTEM = 'MINGW32' # Start a 32-bit MinG environment
|
||||
- $env:MSYSTEM = 'MINGW32' # Start a 32-bit MinGW environment
|
||||
- $env:MSYS = 'winsymlinks:native' # Enable native Windows symlink
|
||||
- mkdir output
|
||||
- cd output
|
||||
- ..\msys64\usr\bin\bash -lc "../configure --target-list=ppc64-softmmu"
|
||||
- ..\msys64\usr\bin\bash -lc '../configure --target-list=ppc64-softmmu'
|
||||
- ..\msys64\usr\bin\bash -lc 'make'
|
||||
- ..\msys64\usr\bin\bash -lc 'make check || { cat meson-logs/testlog.txt; exit 1; } ;'
|
||||
|
@ -18,11 +18,11 @@ https://www.qemu.org/contribute/security-process/
|
||||
-->
|
||||
|
||||
## Host environment
|
||||
- Operating system: (Windows 10 21H1, Fedora 34, etc.)
|
||||
- OS/kernel version: (For POSIX hosts, use `uname -a`)
|
||||
- Architecture: (x86, ARM, s390x, etc.)
|
||||
- QEMU flavor: (qemu-system-x86_64, qemu-aarch64, qemu-img, etc.)
|
||||
- QEMU version: (e.g. `qemu-system-x86_64 --version`)
|
||||
- Operating system: <!-- Windows 10 21H1, Fedora 37, etc. -->
|
||||
- OS/kernel version: <!-- For POSIX hosts, use `uname -a` -->
|
||||
- Architecture: <!-- x86, ARM, s390x, etc. -->
|
||||
- QEMU flavor: <!-- qemu-system-x86_64, qemu-aarch64, qemu-img, etc. -->
|
||||
- QEMU version: <!-- e.g. `qemu-system-x86_64 --version` -->
|
||||
- QEMU command line:
|
||||
<!--
|
||||
Give the smallest, complete command line that exhibits the problem.
|
||||
@ -35,9 +35,9 @@ https://www.qemu.org/contribute/security-process/
|
||||
```
|
||||
|
||||
## Emulated/Virtualized environment
|
||||
- Operating system: (Windows 10 21H1, Fedora 34, etc.)
|
||||
- OS/kernel version: (For POSIX guests, use `uname -a`.)
|
||||
- Architecture: (x86, ARM, s390x, etc.)
|
||||
- Operating system: <!-- Windows 10 21H1, Fedora 37, etc. -->
|
||||
- OS/kernel version: <!-- For POSIX guests, use `uname -a`. -->
|
||||
- Architecture: <!-- x86, ARM, s390x, etc. -->
|
||||
|
||||
|
||||
## Description of problem
|
||||
|
20
MAINTAINERS
20
MAINTAINERS
@ -78,6 +78,7 @@ M: Laurent Vivier <laurent@vivier.eu>
|
||||
S: Maintained
|
||||
L: qemu-trivial@nongnu.org
|
||||
K: ^Subject:.*(?i)trivial
|
||||
F: docs/devel/trivial-patches.rst
|
||||
T: git git://git.corpit.ru/qemu.git trivial-patches
|
||||
T: git https://github.com/vivier/qemu.git trivial-patches
|
||||
|
||||
@ -129,6 +130,7 @@ F: util/cacheinfo.c
|
||||
F: util/cacheflush.c
|
||||
F: scripts/decodetree.py
|
||||
F: docs/devel/decodetree.rst
|
||||
F: docs/devel/tcg*
|
||||
F: include/exec/cpu*.h
|
||||
F: include/exec/exec-all.h
|
||||
F: include/exec/helper*.h
|
||||
@ -254,6 +256,7 @@ F: tests/docker/dockerfiles/debian-nios2-cross.d/build-toolchain.sh
|
||||
OpenRISC TCG CPUs
|
||||
M: Stafford Horne <shorne@gmail.com>
|
||||
S: Odd Fixes
|
||||
F: docs/system/openrisc/cpu-features.rst
|
||||
F: target/openrisc/
|
||||
F: hw/openrisc/
|
||||
F: tests/tcg/openrisc/
|
||||
@ -332,6 +335,7 @@ F: target/i386/tcg/
|
||||
F: tests/tcg/i386/
|
||||
F: tests/tcg/x86_64/
|
||||
F: hw/i386/
|
||||
F: docs/system/i386/cpu.rst
|
||||
F: docs/system/cpu-models-x86*
|
||||
T: git https://gitlab.com/ehabkost/qemu.git x86-next
|
||||
|
||||
@ -873,6 +877,7 @@ M: Peter Maydell <peter.maydell@linaro.org>
|
||||
R: Jean-Christophe Dubois <jcd@tribudubois.net>
|
||||
L: qemu-arm@nongnu.org
|
||||
S: Odd Fixes
|
||||
F: docs/system/arm/sabrelite.rst
|
||||
F: hw/arm/sabrelite.c
|
||||
F: hw/arm/fsl-imx6.c
|
||||
F: hw/misc/imx6_*.c
|
||||
@ -1273,6 +1278,7 @@ OpenRISC Machines
|
||||
or1k-sim
|
||||
M: Jia Liu <proljc@gmail.com>
|
||||
S: Maintained
|
||||
F: docs/system/openrisc/or1k-sim.rst
|
||||
F: hw/openrisc/openrisc_sim.c
|
||||
|
||||
PowerPC Machines
|
||||
@ -2016,6 +2022,7 @@ F: hw/virtio/trace-events
|
||||
F: qapi/virtio.json
|
||||
F: net/vhost-user.c
|
||||
F: include/hw/virtio/
|
||||
F: docs/devel/virtio*
|
||||
|
||||
virtio-balloon
|
||||
M: Michael S. Tsirkin <mst@redhat.com>
|
||||
@ -2108,7 +2115,7 @@ F: tests/qtest/virtio-rng-test.c
|
||||
vhost-user-rng
|
||||
M: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
S: Supported
|
||||
F: docs/tools/vhost-user-rng.rst
|
||||
F: docs/system/devices/vhost-user-rng.rst
|
||||
F: hw/virtio/vhost-user-rng.c
|
||||
F: hw/virtio/vhost-user-rng-pci.c
|
||||
F: include/hw/virtio/vhost-user-rng.h
|
||||
@ -2146,7 +2153,7 @@ S: Supported
|
||||
F: hw/nvme/*
|
||||
F: include/block/nvme.h
|
||||
F: tests/qtest/nvme-test.c
|
||||
F: docs/system/nvme.rst
|
||||
F: docs/system/devices/nvme.rst
|
||||
T: git git://git.infradead.org/qemu-nvme.git nvme-next
|
||||
|
||||
megasas
|
||||
@ -2696,6 +2703,7 @@ GDB stub
|
||||
M: Alex Bennée <alex.bennee@linaro.org>
|
||||
R: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
S: Maintained
|
||||
F: docs/system/gdb.rst
|
||||
F: gdbstub/*
|
||||
F: include/exec/gdbstub.h
|
||||
F: gdb-xml/
|
||||
@ -2753,6 +2761,7 @@ F: ui/
|
||||
F: include/ui/
|
||||
F: qapi/ui.json
|
||||
F: util/drm.c
|
||||
F: docs/devel/ui.rst
|
||||
|
||||
Cocoa graphics
|
||||
M: Peter Maydell <peter.maydell@linaro.org>
|
||||
@ -2930,6 +2939,7 @@ M: Paolo Bonzini <pbonzini@redhat.com>
|
||||
R: Daniel P. Berrange <berrange@redhat.com>
|
||||
R: Eduardo Habkost <eduardo@habkost.net>
|
||||
S: Supported
|
||||
F: docs/devel/qom.rst
|
||||
F: docs/qdev-device-use.txt
|
||||
F: hw/core/qdev*
|
||||
F: hw/core/bus.c
|
||||
@ -2978,6 +2988,7 @@ F: softmmu/qtest.c
|
||||
F: accel/qtest/
|
||||
F: tests/qtest/
|
||||
F: docs/devel/qgraph.rst
|
||||
F: docs/devel/qtest.rst
|
||||
X: tests/qtest/bios-tables-test*
|
||||
|
||||
Device Fuzzing
|
||||
@ -3044,6 +3055,7 @@ F: include/sysemu/tpm*
|
||||
F: qapi/tpm.json
|
||||
F: backends/tpm/
|
||||
F: tests/qtest/*tpm*
|
||||
F: docs/specs/tpm.rst
|
||||
T: git https://github.com/stefanberger/qemu-tpm.git tpm-next
|
||||
|
||||
Checkpatch
|
||||
@ -3195,7 +3207,8 @@ F: replay/*
|
||||
F: block/blkreplay.c
|
||||
F: net/filter-replay.c
|
||||
F: include/sysemu/replay.h
|
||||
F: docs/replay.txt
|
||||
F: docs/devel/replay.rst
|
||||
F: docs/system/replay.rst
|
||||
F: stubs/replay.c
|
||||
F: tests/avocado/replay_kernel.py
|
||||
F: tests/avocado/replay_linux.py
|
||||
@ -3719,6 +3732,7 @@ F: tests/docker/
|
||||
F: tests/vm/
|
||||
F: tests/lcitool/
|
||||
F: scripts/archive-source.sh
|
||||
F: docs/devel/testing.rst
|
||||
W: https://gitlab.com/qemu-project/qemu/pipelines
|
||||
W: https://travis-ci.org/qemu/qemu
|
||||
|
||||
|
@ -55,7 +55,7 @@ config VGA_MMIO
|
||||
|
||||
config VMWARE_VGA
|
||||
bool
|
||||
default y if PCI_DEVICES
|
||||
default y if PCI_DEVICES && PC_PCI
|
||||
depends on PCI
|
||||
select VGA
|
||||
|
||||
|
@ -51,7 +51,7 @@ config RTL8139_PCI
|
||||
|
||||
config VMXNET3_PCI
|
||||
bool
|
||||
default y if PCI_DEVICES
|
||||
default y if PCI_DEVICES && PC_PCI
|
||||
depends on PCI
|
||||
|
||||
config SMC91C111
|
||||
|
@ -24,6 +24,8 @@
|
||||
#include "hw/pci/msi.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/module.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "sysemu/runstate.h"
|
||||
|
||||
#ifndef DEBUG_S390PCI_BUS
|
||||
#define DEBUG_S390PCI_BUS 0
|
||||
@ -150,10 +152,30 @@ out:
|
||||
psccb->header.response_code = cpu_to_be16(rc);
|
||||
}
|
||||
|
||||
static void s390_pci_shutdown_notifier(Notifier *n, void *opaque)
|
||||
{
|
||||
S390PCIBusDevice *pbdev = container_of(n, S390PCIBusDevice,
|
||||
shutdown_notifier);
|
||||
|
||||
pci_device_reset(pbdev->pdev);
|
||||
}
|
||||
|
||||
static void s390_pci_reset_cb(void *opaque)
|
||||
{
|
||||
S390PCIBusDevice *pbdev = opaque;
|
||||
|
||||
pci_device_reset(pbdev->pdev);
|
||||
}
|
||||
|
||||
static void s390_pci_perform_unplug(S390PCIBusDevice *pbdev)
|
||||
{
|
||||
HotplugHandler *hotplug_ctrl;
|
||||
|
||||
if (pbdev->pft == ZPCI_PFT_ISM) {
|
||||
notifier_remove(&pbdev->shutdown_notifier);
|
||||
qemu_unregister_reset(s390_pci_reset_cb, pbdev);
|
||||
}
|
||||
|
||||
/* Unplug the PCI device */
|
||||
if (pbdev->pdev) {
|
||||
DeviceState *pdev = DEVICE(pbdev->pdev);
|
||||
@ -1111,6 +1133,12 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
pbdev->fh |= FH_SHM_VFIO;
|
||||
pbdev->forwarding_assist = false;
|
||||
}
|
||||
/* Register shutdown notifier and reset callback for ISM devices */
|
||||
if (pbdev->pft == ZPCI_PFT_ISM) {
|
||||
pbdev->shutdown_notifier.notify = s390_pci_shutdown_notifier;
|
||||
qemu_register_shutdown_notifier(&pbdev->shutdown_notifier);
|
||||
qemu_register_reset(s390_pci_reset_cb, pbdev);
|
||||
}
|
||||
} else {
|
||||
pbdev->fh |= FH_SHM_EMUL;
|
||||
/* Always intercept emulated devices */
|
||||
|
@ -640,6 +640,8 @@ static uint32_t s390_pci_update_iotlb(S390PCIIOMMU *iommu,
|
||||
}
|
||||
g_hash_table_remove(iommu->iotlb, &entry->iova);
|
||||
inc_dma_avail(iommu);
|
||||
/* Don't notify the iommu yet, maybe we can bundle contiguous unmaps */
|
||||
goto out;
|
||||
} else {
|
||||
if (cache) {
|
||||
if (cache->perm == entry->perm &&
|
||||
@ -663,15 +665,44 @@ static uint32_t s390_pci_update_iotlb(S390PCIIOMMU *iommu,
|
||||
dec_dma_avail(iommu);
|
||||
}
|
||||
|
||||
/*
|
||||
* All associated iotlb entries have already been cleared, trigger the
|
||||
* unmaps.
|
||||
*/
|
||||
memory_region_notify_iommu(&iommu->iommu_mr, 0, event);
|
||||
|
||||
out:
|
||||
return iommu->dma_limit ? iommu->dma_limit->avail : 1;
|
||||
}
|
||||
|
||||
static void s390_pci_batch_unmap(S390PCIIOMMU *iommu, uint64_t iova,
|
||||
uint64_t len)
|
||||
{
|
||||
uint64_t remain = len, start = iova, end = start + len - 1, mask, size;
|
||||
IOMMUTLBEvent event = {
|
||||
.type = IOMMU_NOTIFIER_UNMAP,
|
||||
.entry = {
|
||||
.target_as = &address_space_memory,
|
||||
.translated_addr = 0,
|
||||
.perm = IOMMU_NONE,
|
||||
},
|
||||
};
|
||||
|
||||
while (remain >= TARGET_PAGE_SIZE) {
|
||||
mask = dma_aligned_pow2_mask(start, end, 64);
|
||||
size = mask + 1;
|
||||
event.entry.iova = start;
|
||||
event.entry.addr_mask = mask;
|
||||
memory_region_notify_iommu(&iommu->iommu_mr, 0, event);
|
||||
start += size;
|
||||
remain -= size;
|
||||
}
|
||||
}
|
||||
|
||||
int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra)
|
||||
{
|
||||
CPUS390XState *env = &cpu->env;
|
||||
uint64_t iova, coalesce = 0;
|
||||
uint32_t fh;
|
||||
uint16_t error = 0;
|
||||
S390PCIBusDevice *pbdev;
|
||||
@ -742,6 +773,21 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* If this is an unmap of a PTE, let's try to coalesce multiple unmaps
|
||||
* into as few notifier events as possible.
|
||||
*/
|
||||
if (entry.perm == IOMMU_NONE && entry.len == TARGET_PAGE_SIZE) {
|
||||
if (coalesce == 0) {
|
||||
iova = entry.iova;
|
||||
}
|
||||
coalesce += entry.len;
|
||||
} else if (coalesce > 0) {
|
||||
/* Unleash the coalesced unmap before processing a new map */
|
||||
s390_pci_batch_unmap(iommu, iova, coalesce);
|
||||
coalesce = 0;
|
||||
}
|
||||
|
||||
start += entry.len;
|
||||
while (entry.iova < start && entry.iova < end) {
|
||||
if (dma_avail > 0 || entry.perm == IOMMU_NONE) {
|
||||
@ -759,6 +805,11 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (coalesce) {
|
||||
/* Unleash the coalesced unmap before finishing rpcit */
|
||||
s390_pci_batch_unmap(iommu, iova, coalesce);
|
||||
coalesce = 0;
|
||||
}
|
||||
if (again && dma_avail > 0)
|
||||
goto retry;
|
||||
err:
|
||||
|
@ -84,6 +84,7 @@ S390PCIDMACount *s390_pci_start_dma_count(S390pciState *s,
|
||||
cnt->users = 1;
|
||||
cnt->avail = avail;
|
||||
QTAILQ_INSERT_TAIL(&s->zpci_dma_limit, cnt, link);
|
||||
pbdev->iommu->max_dma_limit = avail;
|
||||
return cnt;
|
||||
}
|
||||
|
||||
@ -103,6 +104,7 @@ static void s390_pci_read_base(S390PCIBusDevice *pbdev,
|
||||
struct vfio_info_cap_header *hdr;
|
||||
struct vfio_device_info_cap_zpci_base *cap;
|
||||
VFIOPCIDevice *vpci = container_of(pbdev->pdev, VFIOPCIDevice, pdev);
|
||||
uint64_t vfio_size;
|
||||
|
||||
hdr = vfio_get_device_info_cap(info, VFIO_DEVICE_INFO_CAP_ZPCI_BASE);
|
||||
|
||||
@ -122,6 +124,17 @@ static void s390_pci_read_base(S390PCIBusDevice *pbdev,
|
||||
/* The following values remain 0 until we support other FMB formats */
|
||||
pbdev->zpci_fn.fmbl = 0;
|
||||
pbdev->zpci_fn.pft = 0;
|
||||
/* Store function type separately for type-specific behavior */
|
||||
pbdev->pft = cap->pft;
|
||||
|
||||
/*
|
||||
* If appropriate, reduce the size of the supported DMA aperture reported
|
||||
* to the guest based upon the vfio DMA limit.
|
||||
*/
|
||||
vfio_size = pbdev->iommu->max_dma_limit << TARGET_PAGE_BITS;
|
||||
if (vfio_size < (cap->end_dma - cap->start_dma + 1)) {
|
||||
pbdev->zpci_fn.edma = cap->start_dma + vfio_size - 1;
|
||||
}
|
||||
}
|
||||
|
||||
static bool get_host_fh(S390PCIBusDevice *pbdev, struct vfio_device_info *info,
|
||||
|
@ -39,6 +39,9 @@
|
||||
#define UID_CHECKING_ENABLED 0x01
|
||||
#define ZPCI_DTSM 0x40
|
||||
|
||||
/* zPCI Function Types */
|
||||
#define ZPCI_PFT_ISM 5
|
||||
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(S390pciState, S390_PCI_HOST_BRIDGE)
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(S390PCIBus, S390_PCI_BUS)
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(S390PCIBusDevice, S390_PCI_DEVICE)
|
||||
@ -278,6 +281,7 @@ struct S390PCIIOMMU {
|
||||
uint64_t g_iota;
|
||||
uint64_t pba;
|
||||
uint64_t pal;
|
||||
uint64_t max_dma_limit;
|
||||
GHashTable *iotlb;
|
||||
S390PCIDMACount *dma_limit;
|
||||
};
|
||||
@ -343,6 +347,7 @@ struct S390PCIBusDevice {
|
||||
uint16_t noi;
|
||||
uint16_t maxstbl;
|
||||
uint8_t sum;
|
||||
uint8_t pft;
|
||||
S390PCIGroup *pci_group;
|
||||
ClpRspQueryPci zpci_fn;
|
||||
S390MsixInfo msix;
|
||||
@ -351,6 +356,7 @@ struct S390PCIBusDevice {
|
||||
MemoryRegion msix_notify_mr;
|
||||
IndAddr *summary_ind;
|
||||
IndAddr *indicator;
|
||||
Notifier shutdown_notifier;
|
||||
bool pci_unplug_request_processed;
|
||||
bool unplug_requested;
|
||||
bool interp;
|
||||
|
@ -25,10 +25,8 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "monitor-internal.h"
|
||||
#include "monitor/qdev.h"
|
||||
#include "hw/usb.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "sysemu/watchdog.h"
|
||||
#include "hw/loader.h"
|
||||
#include "exec/gdbstub.h"
|
||||
#include "net/net.h"
|
||||
#include "net/slirp.h"
|
||||
@ -39,16 +37,13 @@
|
||||
#include "ui/input.h"
|
||||
#include "audio/audio.h"
|
||||
#include "disas/disas.h"
|
||||
#include "sysemu/balloon.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "qemu/log.h"
|
||||
#include "sysemu/hw_accel.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "authz/list.h"
|
||||
#include "qapi/util.h"
|
||||
#include "sysemu/blockdev.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/tpm.h"
|
||||
#include "sysemu/device_tree.h"
|
||||
#include "qapi/qmp/qdict.h"
|
||||
#include "qapi/qmp/qerror.h"
|
||||
@ -77,7 +72,6 @@
|
||||
#include "qapi/qapi-init-commands.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qmp-event.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "qemu/cutils.h"
|
||||
|
||||
#if defined(TARGET_S390X)
|
||||
|
@ -10,14 +10,22 @@
|
||||
# This work is licensed under the terms of the GNU GPLv2 or later.
|
||||
# See the COPYING file in the top-level directory.
|
||||
|
||||
if [ $# -ne 2 ]; then
|
||||
echo "Usage:"
|
||||
echo " $0 gitrepo version"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
src="$1"
|
||||
version="$2"
|
||||
destination=qemu-${version}
|
||||
|
||||
git clone "${src}" ${destination}
|
||||
git clone --single-branch -b "v${version}" -c advice.detachedHead=false \
|
||||
"${src}" ${destination}
|
||||
|
||||
pushd ${destination}
|
||||
git checkout "v${version}"
|
||||
git submodule update --init
|
||||
|
||||
git submodule update --init --single-branch
|
||||
(cd roms/seabios && git describe --tags --long --dirty > .version)
|
||||
(cd roms/skiboot && ./make_version.sh > .version)
|
||||
# Fetch edk2 submodule's submodules, since it won't have access to them via
|
||||
@ -28,7 +36,7 @@ git submodule update --init
|
||||
# submodule dependencies, so we continue to handle these on a case-by-case
|
||||
# basis for now.
|
||||
(cd roms/edk2 && \
|
||||
git submodule update --init -- \
|
||||
git submodule update --init --depth 1 -- \
|
||||
ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3 \
|
||||
BaseTools/Source/C/BrotliCompress/brotli \
|
||||
CryptoPkg/Library/OpensslLib/openssl \
|
||||
|
@ -353,8 +353,8 @@ DEF_HELPER_FLAGS_3(tprot, TCG_CALL_NO_WG, i32, env, i64, i64)
|
||||
DEF_HELPER_2(iske, i64, env, i64)
|
||||
DEF_HELPER_3(sske, void, env, i64, i64)
|
||||
DEF_HELPER_2(rrbe, i32, env, i64)
|
||||
DEF_HELPER_4(mvcs, i32, env, i64, i64, i64)
|
||||
DEF_HELPER_4(mvcp, i32, env, i64, i64, i64)
|
||||
DEF_HELPER_5(mvcs, i32, env, i64, i64, i64, i64)
|
||||
DEF_HELPER_5(mvcp, i32, env, i64, i64, i64, i64)
|
||||
DEF_HELPER_4(sigp, i32, env, i64, i32, i32)
|
||||
DEF_HELPER_FLAGS_2(sacf, TCG_CALL_NO_WG, void, env, i64)
|
||||
DEF_HELPER_FLAGS_4(idte, TCG_CALL_NO_RWG, void, env, i64, i64, i32)
|
||||
|
@ -1355,9 +1355,9 @@
|
||||
E(0xb24b, LURA, RRE, Z, 0, ra2, new, r1_32, lura, 0, MO_TEUL, IF_PRIV)
|
||||
E(0xb905, LURAG, RRE, Z, 0, ra2, r1, 0, lura, 0, MO_TEUQ, IF_PRIV)
|
||||
/* MOVE TO PRIMARY */
|
||||
F(0xda00, MVCP, SS_d, Z, la1, a2, 0, 0, mvcp, 0, IF_PRIV)
|
||||
C(0xda00, MVCP, SS_d, Z, la1, a2, 0, 0, mvcp, 0)
|
||||
/* MOVE TO SECONDARY */
|
||||
F(0xdb00, MVCS, SS_d, Z, la1, a2, 0, 0, mvcs, 0, IF_PRIV)
|
||||
C(0xdb00, MVCS, SS_d, Z, la1, a2, 0, 0, mvcs, 0)
|
||||
/* PURGE TLB */
|
||||
F(0xb20d, PTLB, S, Z, 0, 0, 0, 0, ptlb, 0, IF_PRIV)
|
||||
/* RESET REFERENCE BIT EXTENDED */
|
||||
|
@ -51,7 +51,7 @@ static inline bool psw_key_valid(CPUS390XState *env, uint8_t psw_key)
|
||||
|
||||
if (env->psw.mask & PSW_MASK_PSTATE) {
|
||||
/* PSW key has range 0..15, it is valid if the bit is 1 in the PKM */
|
||||
return pkm & (0x80 >> psw_key);
|
||||
return pkm & (0x8000 >> psw_key);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -2295,7 +2295,8 @@ uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t r2)
|
||||
return re >> 1;
|
||||
}
|
||||
|
||||
uint32_t HELPER(mvcs)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
|
||||
uint32_t HELPER(mvcs)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2,
|
||||
uint64_t key)
|
||||
{
|
||||
const uint8_t psw_as = (env->psw.mask & PSW_MASK_ASC) >> PSW_SHIFT_ASC;
|
||||
S390Access srca, desta;
|
||||
@ -2310,6 +2311,10 @@ uint32_t HELPER(mvcs)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
|
||||
s390_program_interrupt(env, PGM_SPECIAL_OP, ra);
|
||||
}
|
||||
|
||||
if (!psw_key_valid(env, (key >> 4) & 0xf)) {
|
||||
s390_program_interrupt(env, PGM_PRIVILEGED, ra);
|
||||
}
|
||||
|
||||
l = wrap_length32(env, l);
|
||||
if (l > 256) {
|
||||
/* max 256 */
|
||||
@ -2319,14 +2324,14 @@ uint32_t HELPER(mvcs)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
|
||||
return cc;
|
||||
}
|
||||
|
||||
/* TODO: Access key handling */
|
||||
srca = access_prepare(env, a2, l, MMU_DATA_LOAD, MMU_PRIMARY_IDX, ra);
|
||||
desta = access_prepare(env, a1, l, MMU_DATA_STORE, MMU_SECONDARY_IDX, ra);
|
||||
access_memmove(env, &desta, &srca, ra);
|
||||
return cc;
|
||||
}
|
||||
|
||||
uint32_t HELPER(mvcp)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
|
||||
uint32_t HELPER(mvcp)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2,
|
||||
uint64_t key)
|
||||
{
|
||||
const uint8_t psw_as = (env->psw.mask & PSW_MASK_ASC) >> PSW_SHIFT_ASC;
|
||||
S390Access srca, desta;
|
||||
@ -2341,6 +2346,10 @@ uint32_t HELPER(mvcp)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
|
||||
s390_program_interrupt(env, PGM_SPECIAL_OP, ra);
|
||||
}
|
||||
|
||||
if (!psw_key_valid(env, (key >> 4) & 0xf)) {
|
||||
s390_program_interrupt(env, PGM_PRIVILEGED, ra);
|
||||
}
|
||||
|
||||
l = wrap_length32(env, l);
|
||||
if (l > 256) {
|
||||
/* max 256 */
|
||||
@ -2350,7 +2359,6 @@ uint32_t HELPER(mvcp)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
|
||||
return cc;
|
||||
}
|
||||
|
||||
/* TODO: Access key handling */
|
||||
srca = access_prepare(env, a2, l, MMU_DATA_LOAD, MMU_SECONDARY_IDX, ra);
|
||||
desta = access_prepare(env, a1, l, MMU_DATA_STORE, MMU_PRIMARY_IDX, ra);
|
||||
access_memmove(env, &desta, &srca, ra);
|
||||
|
@ -3476,7 +3476,8 @@ static DisasJumpType op_mvcos(DisasContext *s, DisasOps *o)
|
||||
static DisasJumpType op_mvcp(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
int r1 = get_field(s, l1);
|
||||
gen_helper_mvcp(cc_op, cpu_env, regs[r1], o->addr1, o->in2);
|
||||
int r3 = get_field(s, r3);
|
||||
gen_helper_mvcp(cc_op, cpu_env, regs[r1], o->addr1, o->in2, regs[r3]);
|
||||
set_cc_static(s);
|
||||
return DISAS_NEXT;
|
||||
}
|
||||
@ -3484,7 +3485,8 @@ static DisasJumpType op_mvcp(DisasContext *s, DisasOps *o)
|
||||
static DisasJumpType op_mvcs(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
int r1 = get_field(s, l1);
|
||||
gen_helper_mvcs(cc_op, cpu_env, regs[r1], o->addr1, o->in2);
|
||||
int r3 = get_field(s, r3);
|
||||
gen_helper_mvcs(cc_op, cpu_env, regs[r1], o->addr1, o->in2, regs[r3]);
|
||||
set_cc_static(s);
|
||||
return DISAS_NEXT;
|
||||
}
|
||||
|
@ -37,15 +37,15 @@
|
||||
|
||||
static void e1000e_send_verify(QE1000E *d, int *test_sockets, QGuestAllocator *alloc)
|
||||
{
|
||||
static const char test[] = "TEST";
|
||||
struct e1000_tx_desc descr;
|
||||
static const int data_len = 64;
|
||||
char buffer[64];
|
||||
int ret;
|
||||
uint32_t recv_len;
|
||||
|
||||
/* Prepare test data buffer */
|
||||
uint64_t data = guest_alloc(alloc, data_len);
|
||||
memwrite(data, "TEST", 5);
|
||||
uint64_t data = guest_alloc(alloc, sizeof(buffer));
|
||||
memwrite(data, test, sizeof(test));
|
||||
|
||||
/* Prepare TX descriptor */
|
||||
memset(&descr, 0, sizeof(descr));
|
||||
@ -54,7 +54,7 @@ static void e1000e_send_verify(QE1000E *d, int *test_sockets, QGuestAllocator *a
|
||||
E1000_TXD_CMD_EOP |
|
||||
E1000_TXD_CMD_DEXT |
|
||||
E1000_TXD_DTYP_D |
|
||||
data_len);
|
||||
sizeof(buffer));
|
||||
|
||||
/* Put descriptor to the ring */
|
||||
e1000e_tx_ring_push(d, &descr);
|
||||
@ -69,9 +69,9 @@ static void e1000e_send_verify(QE1000E *d, int *test_sockets, QGuestAllocator *a
|
||||
/* Check data sent to the backend */
|
||||
ret = recv(test_sockets[0], &recv_len, sizeof(recv_len), 0);
|
||||
g_assert_cmpint(ret, == , sizeof(recv_len));
|
||||
ret = recv(test_sockets[0], buffer, 64, 0);
|
||||
g_assert_cmpint(ret, >=, 5);
|
||||
g_assert_cmpstr(buffer, == , "TEST");
|
||||
ret = recv(test_sockets[0], buffer, sizeof(buffer), 0);
|
||||
g_assert_cmpint(ret, ==, sizeof(buffer));
|
||||
g_assert_cmpstr(buffer, == , test);
|
||||
|
||||
/* Free test data buffer */
|
||||
guest_free(alloc, data);
|
||||
@ -93,7 +93,6 @@ static void e1000e_receive_verify(QE1000E *d, int *test_sockets, QGuestAllocator
|
||||
},
|
||||
};
|
||||
|
||||
static const int data_len = 64;
|
||||
char buffer[64];
|
||||
int ret;
|
||||
|
||||
@ -102,7 +101,7 @@ static void e1000e_receive_verify(QE1000E *d, int *test_sockets, QGuestAllocator
|
||||
g_assert_cmpint(ret, == , sizeof(test) + sizeof(len));
|
||||
|
||||
/* Prepare test data buffer */
|
||||
uint64_t data = guest_alloc(alloc, data_len);
|
||||
uint64_t data = guest_alloc(alloc, sizeof(buffer));
|
||||
|
||||
/* Prepare RX descriptor */
|
||||
memset(&descr, 0, sizeof(descr));
|
||||
@ -120,7 +119,7 @@ static void e1000e_receive_verify(QE1000E *d, int *test_sockets, QGuestAllocator
|
||||
|
||||
/* Check data sent to the backend */
|
||||
memread(data, buffer, sizeof(buffer));
|
||||
g_assert_cmpstr(buffer, == , "TEST");
|
||||
g_assert_cmpstr(buffer, == , test);
|
||||
|
||||
/* Free test data buffer */
|
||||
guest_free(alloc, data);
|
||||
|
@ -32,7 +32,6 @@
|
||||
#define E1000E_IVAR_TEST_CFG \
|
||||
(((E1000E_RX0_MSG_ID | E1000_IVAR_INT_ALLOC_VALID) << E1000_IVAR_RXQ0_SHIFT) | \
|
||||
((E1000E_TX0_MSG_ID | E1000_IVAR_INT_ALLOC_VALID) << E1000_IVAR_TXQ0_SHIFT) | \
|
||||
((E1000E_OTHER_MSG_ID | E1000_IVAR_INT_ALLOC_VALID) << E1000_IVAR_OTHER_SHIFT) | \
|
||||
E1000_IVAR_TX_INT_EVERY_WB)
|
||||
|
||||
#define E1000E_RING_LEN (0x1000)
|
||||
@ -152,6 +151,7 @@ static void e1000e_pci_start_hw(QOSGraphObject *obj)
|
||||
|
||||
/* Enable transmit */
|
||||
e1000e_macreg_write(&d->e1000e, E1000_TCTL, E1000_TCTL_EN);
|
||||
|
||||
e1000e_macreg_write(&d->e1000e, E1000_RDBAL,
|
||||
(uint32_t)d->e1000e.rx_ring);
|
||||
e1000e_macreg_write(&d->e1000e, E1000_RDBAH,
|
||||
|
@ -24,7 +24,6 @@
|
||||
|
||||
#define E1000E_RX0_MSG_ID (0)
|
||||
#define E1000E_TX0_MSG_ID (1)
|
||||
#define E1000E_OTHER_MSG_ID (2)
|
||||
|
||||
#define E1000E_TDLEN (0x3808)
|
||||
#define E1000E_TDT (0x3818)
|
||||
|
@ -1,9 +1,3 @@
|
||||
# All QTests for now are POSIX-only, but the dependencies are
|
||||
# really in libqtest, not in the testcases themselves.
|
||||
if not config_host.has_key('CONFIG_POSIX')
|
||||
subdir_done()
|
||||
endif
|
||||
|
||||
slow_qtests = {
|
||||
'ahci-test' : 60,
|
||||
'bios-tables-test' : 120,
|
||||
|
@ -983,6 +983,12 @@ static void register_vhost_user_blk_test(void)
|
||||
.before = vhost_user_blk_test_setup,
|
||||
};
|
||||
|
||||
if (!getenv("QTEST_QEMU_STORAGE_DAEMON_BINARY")) {
|
||||
g_test_message("QTEST_QEMU_STORAGE_DAEMON_BINARY not defined, "
|
||||
"skipping vhost-user-blk-test");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* tests for vhost-user-blk and vhost-user-blk-pci
|
||||
* The tests are borrowed from tests/virtio-blk-test.c. But some tests
|
||||
|
@ -28,8 +28,8 @@ class FreeBSDVM(basevm.BaseVM):
|
||||
name = "freebsd"
|
||||
arch = "x86_64"
|
||||
|
||||
link = "https://download.freebsd.org/ftp/releases/ISO-IMAGES/12.3/FreeBSD-12.3-RELEASE-amd64-disc1.iso.xz"
|
||||
csum = "36dd0de50f1fe5f0a88e181e94657656de26fb64254412f74e80e128e8b938b4"
|
||||
link = "https://download.freebsd.org/ftp/releases/ISO-IMAGES/12.4/FreeBSD-12.4-RELEASE-amd64-disc1.iso.xz"
|
||||
csum = "1dcf6446e31bf3f81b582e9aba3319a258c29a937a2af6138ee4b181ed719a87"
|
||||
size = "20G"
|
||||
pkgs = [
|
||||
# build tools
|
||||
|
@ -24,10 +24,6 @@
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* The implementation of g_poll (functions poll_rest, g_poll) at the end of
|
||||
* this file are based on code from GNOME glib-2 and use a different license,
|
||||
* see the license comment there.
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/option.h"
|
||||
#include "qemu/config-file.h"
|
||||
#include "hw/boards.h"
|
||||
|
||||
static QemuOptsList *vm_config_groups[48];
|
||||
static QemuOptsList *drive_config_groups[5];
|
||||
@ -143,97 +144,80 @@ static CommandLineParameterInfoList *get_drive_infolist(void)
|
||||
return head;
|
||||
}
|
||||
|
||||
/* restore machine options that are now machine's properties */
|
||||
static QemuOptsList machine_opts = {
|
||||
.merge_lists = true,
|
||||
.head = QTAILQ_HEAD_INITIALIZER(machine_opts.head),
|
||||
.desc = {
|
||||
{
|
||||
.name = "type",
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "emulated machine"
|
||||
},{
|
||||
.name = "accel",
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "accelerator list",
|
||||
},{
|
||||
.name = "kernel_irqchip",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "use KVM in-kernel irqchip",
|
||||
},{
|
||||
.name = "kvm_shadow_mem",
|
||||
.type = QEMU_OPT_SIZE,
|
||||
.help = "KVM shadow MMU size",
|
||||
},{
|
||||
.name = "kernel",
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "Linux kernel image file",
|
||||
},{
|
||||
.name = "initrd",
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "Linux initial ramdisk file",
|
||||
},{
|
||||
.name = "append",
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "Linux kernel command line",
|
||||
},{
|
||||
.name = "dtb",
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "Linux kernel device tree file",
|
||||
},{
|
||||
.name = "dumpdtb",
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "Dump current dtb to a file and quit",
|
||||
},{
|
||||
.name = "phandle_start",
|
||||
.type = QEMU_OPT_NUMBER,
|
||||
.help = "The first phandle ID we may generate dynamically",
|
||||
},{
|
||||
.name = "dt_compatible",
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "Overrides the \"compatible\" property of the dt root node",
|
||||
},{
|
||||
.name = "dump-guest-core",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "Include guest memory in a core dump",
|
||||
},{
|
||||
.name = "mem-merge",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "enable/disable memory merge support",
|
||||
},{
|
||||
.name = "usb",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "Set on/off to enable/disable usb",
|
||||
},{
|
||||
.name = "firmware",
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "firmware image",
|
||||
},{
|
||||
.name = "iommu",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "Set on/off to enable/disable Intel IOMMU (VT-d)",
|
||||
},{
|
||||
.name = "suppress-vmdesc",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "Set on to disable self-describing migration",
|
||||
},{
|
||||
.name = "aes-key-wrap",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "enable/disable AES key wrapping using the CPACF wrapping key",
|
||||
},{
|
||||
.name = "dea-key-wrap",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "enable/disable DEA key wrapping using the CPACF wrapping key",
|
||||
},{
|
||||
.name = "loadparm",
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "Up to 8 chars in set of [A-Za-z0-9. ](lower case chars"
|
||||
" converted to upper case) to pass to machine"
|
||||
" loader, boot manager, and guest kernel",
|
||||
},
|
||||
{ /* End of list */ }
|
||||
static CommandLineParameterInfo *objprop_to_cmdline_prop(ObjectProperty *prop)
|
||||
{
|
||||
CommandLineParameterInfo *info;
|
||||
|
||||
info = g_malloc0(sizeof(*info));
|
||||
info->name = g_strdup(prop->name);
|
||||
|
||||
if (g_str_equal(prop->type, "bool") || g_str_equal(prop->type, "OnOffAuto")) {
|
||||
info->type = COMMAND_LINE_PARAMETER_TYPE_BOOLEAN;
|
||||
} else if (g_str_equal(prop->type, "int")) {
|
||||
info->type = COMMAND_LINE_PARAMETER_TYPE_NUMBER;
|
||||
} else if (g_str_equal(prop->type, "size")) {
|
||||
info->type = COMMAND_LINE_PARAMETER_TYPE_SIZE;
|
||||
} else {
|
||||
info->type = COMMAND_LINE_PARAMETER_TYPE_STRING;
|
||||
}
|
||||
};
|
||||
|
||||
if (prop->description) {
|
||||
info->help = g_strdup(prop->description);
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
static CommandLineParameterInfoList *query_all_machine_properties(void)
|
||||
{
|
||||
CommandLineParameterInfoList *params = NULL, *clpiter;
|
||||
CommandLineParameterInfo *info;
|
||||
GSList *machines, *curr_mach;
|
||||
ObjectPropertyIterator op_iter;
|
||||
ObjectProperty *prop;
|
||||
bool is_new;
|
||||
|
||||
machines = object_class_get_list(TYPE_MACHINE, false);
|
||||
assert(machines);
|
||||
|
||||
/* Loop over all machine classes */
|
||||
for (curr_mach = machines; curr_mach; curr_mach = curr_mach->next) {
|
||||
object_class_property_iter_init(&op_iter, curr_mach->data);
|
||||
/* ... and over the properties of each machine: */
|
||||
while ((prop = object_property_iter_next(&op_iter))) {
|
||||
if (!prop->set) {
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
* Check whether the property has already been put into the list
|
||||
* (via another machine class)
|
||||
*/
|
||||
is_new = true;
|
||||
for (clpiter = params; clpiter != NULL; clpiter = clpiter->next) {
|
||||
if (g_str_equal(clpiter->value->name, prop->name)) {
|
||||
is_new = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* If it hasn't been added before, add it now to the list */
|
||||
if (is_new) {
|
||||
info = objprop_to_cmdline_prop(prop);
|
||||
QAPI_LIST_PREPEND(params, info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_slist_free(machines);
|
||||
|
||||
/* Add entry for the "type" parameter */
|
||||
info = g_malloc0(sizeof(*info));
|
||||
info->name = g_strdup("type");
|
||||
info->type = COMMAND_LINE_PARAMETER_TYPE_STRING;
|
||||
info->help = g_strdup("machine type");
|
||||
QAPI_LIST_PREPEND(params, info);
|
||||
|
||||
return params;
|
||||
}
|
||||
|
||||
CommandLineOptionInfoList *qmp_query_command_line_options(const char *option,
|
||||
Error **errp)
|
||||
@ -259,7 +243,7 @@ CommandLineOptionInfoList *qmp_query_command_line_options(const char *option,
|
||||
if (!option || !strcmp(option, "machine")) {
|
||||
info = g_malloc0(sizeof(*info));
|
||||
info->option = g_strdup("machine");
|
||||
info->parameters = query_option_descs(machine_opts.desc);
|
||||
info->parameters = query_all_machine_properties();
|
||||
QAPI_LIST_PREPEND(conf_list, info);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user