diff options
60 files changed, 439 insertions, 706 deletions
diff --git a/.gitignore b/.gitignore index 64efdfd929..0430257313 100644 --- a/.gitignore +++ b/.gitignore @@ -30,78 +30,14 @@ /qapi-gen-timestamp /qapi/qapi-builtin-types.[ch] /qapi/qapi-builtin-visit.[ch] -/qapi/qapi-commands-block-core.[ch] -/qapi/qapi-commands-block.[ch] -/qapi/qapi-commands-char.[ch] -/qapi/qapi-commands-common.[ch] -/qapi/qapi-commands-crypto.[ch] -/qapi/qapi-commands-introspect.[ch] -/qapi/qapi-commands-job.[ch] -/qapi/qapi-commands-migration.[ch] -/qapi/qapi-commands-misc.[ch] -/qapi/qapi-commands-net.[ch] -/qapi/qapi-commands-rocker.[ch] -/qapi/qapi-commands-run-state.[ch] -/qapi/qapi-commands-sockets.[ch] -/qapi/qapi-commands-tpm.[ch] -/qapi/qapi-commands-trace.[ch] -/qapi/qapi-commands-transaction.[ch] -/qapi/qapi-commands-ui.[ch] +/qapi/qapi-commands-*.[ch] /qapi/qapi-commands.[ch] -/qapi/qapi-events-block-core.[ch] -/qapi/qapi-events-block.[ch] -/qapi/qapi-events-char.[ch] -/qapi/qapi-events-common.[ch] -/qapi/qapi-events-crypto.[ch] -/qapi/qapi-events-introspect.[ch] -/qapi/qapi-events-job.[ch] -/qapi/qapi-events-migration.[ch] -/qapi/qapi-events-misc.[ch] -/qapi/qapi-events-net.[ch] -/qapi/qapi-events-rocker.[ch] -/qapi/qapi-events-run-state.[ch] -/qapi/qapi-events-sockets.[ch] -/qapi/qapi-events-tpm.[ch] -/qapi/qapi-events-trace.[ch] -/qapi/qapi-events-transaction.[ch] -/qapi/qapi-events-ui.[ch] +/qapi/qapi-events-*.[ch] /qapi/qapi-events.[ch] /qapi/qapi-introspect.[ch] -/qapi/qapi-types-block-core.[ch] -/qapi/qapi-types-block.[ch] -/qapi/qapi-types-char.[ch] -/qapi/qapi-types-common.[ch] -/qapi/qapi-types-crypto.[ch] -/qapi/qapi-types-introspect.[ch] -/qapi/qapi-types-job.[ch] -/qapi/qapi-types-migration.[ch] -/qapi/qapi-types-misc.[ch] -/qapi/qapi-types-net.[ch] -/qapi/qapi-types-rocker.[ch] -/qapi/qapi-types-run-state.[ch] -/qapi/qapi-types-sockets.[ch] -/qapi/qapi-types-tpm.[ch] -/qapi/qapi-types-trace.[ch] -/qapi/qapi-types-transaction.[ch] -/qapi/qapi-types-ui.[ch] +/qapi/qapi-types-*.[ch] /qapi/qapi-types.[ch] -/qapi/qapi-visit-block-core.[ch] -/qapi/qapi-visit-block.[ch] -/qapi/qapi-visit-char.[ch] -/qapi/qapi-visit-common.[ch] -/qapi/qapi-visit-crypto.[ch] -/qapi/qapi-visit-introspect.[ch] -/qapi/qapi-visit-job.[ch] -/qapi/qapi-visit-migration.[ch] -/qapi/qapi-visit-misc.[ch] -/qapi/qapi-visit-net.[ch] -/qapi/qapi-visit-rocker.[ch] -/qapi/qapi-visit-run-state.[ch] -/qapi/qapi-visit-sockets.[ch] -/qapi/qapi-visit-tpm.[ch] -/qapi/qapi-visit-trace.[ch] -/qapi/qapi-visit-transaction.[ch] -/qapi/qapi-visit-ui.[ch] +/qapi/qapi-visit-*.[ch] /qapi/qapi-visit.[ch] /qapi/qapi-doc.texi /qemu-doc.html diff --git a/.mailmap b/.mailmap index ed8faa5719..b8e08297c9 100644 --- a/.mailmap +++ b/.mailmap @@ -34,6 +34,6 @@ Justin Terry (VM) <juterry@microsoft.com> Justin Terry (VM) via Qemu-devel <qemu # Also list preferred name forms where people have changed their -# git author config, or having utf8/latin1 encoding issues. +# git author config, or had utf8/latin1 encoding issues. Daniel P. Berrangé <berrange@redhat.com> Reimar Döffinger <Reimar.Doeffinger@gmx.de> diff --git a/MAINTAINERS b/MAINTAINERS index 63effdc473..02acc1cc8a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -233,7 +233,9 @@ M: Marek Vasut <marex@denx.de> S: Maintained F: target/nios2/ F: hw/nios2/ +F: hw/intc/nios2_iic.c F: disas/nios2.c +F: default-configs/nios2-softmmu.mak OpenRISC M: Stafford Horne <shorne@gmail.com> @@ -289,6 +291,7 @@ S: Maintained F: target/sparc/ F: hw/sparc/ F: hw/sparc64/ +F: include/hw/sparc/sparc64.h F: disas/sparc.c UniCore32 @@ -538,6 +541,7 @@ L: qemu-arm@nongnu.org S: Odd Fixes F: include/hw/arm/digic.h F: hw/*/digic* +F: include/hw/*/digic* Gumstix M: Peter Maydell <peter.maydell@linaro.org> @@ -608,6 +612,8 @@ F: hw/misc/mps2-*.c F: include/hw/misc/mps2-*.h F: hw/arm/iotkit.c F: include/hw/arm/iotkit.h +F: hw/misc/iotkit-secctl.c +F: include/hw/misc/iotkit-secctl.h F: hw/misc/iotkit-sysctl.c F: include/hw/misc/iotkit-sysctl.h F: hw/misc/iotkit-sysinfo.c @@ -738,6 +744,9 @@ L: qemu-arm@nongnu.org S: Maintained F: hw/*/xlnx*.c F: include/hw/*/xlnx*.h +F: include/hw/ssi/xilinx_spips.h +F: hw/display/dpcd.c +F: include/hw/display/dpcd.h ARM ACPI Subsystem M: Shannon Zhao <shannon.zhaosl@gmail.com> @@ -846,6 +855,7 @@ petalogix_s3adsp1800 M: Edgar E. Iglesias <edgar.iglesias@gmail.com> S: Maintained F: hw/microblaze/petalogix_s3adsp1800_mmu.c +F: include/hw/char/xilinx_uartlite.h petalogix_ml605 M: Edgar E. Iglesias <edgar.iglesias@gmail.com> @@ -859,6 +869,8 @@ M: Hervé Poussineau <hpoussin@reactos.org> R: Stefan Markovic <smarkovic@wavecomp.com> S: Maintained F: hw/mips/mips_jazz.c +F: hw/display/jazz_led.c +F: hw/dma/rc4030.c Malta M: Aurelien Jarno <aurelien@aurel32.net> @@ -885,7 +897,7 @@ R: Stefan Markovic <smarkovic@wavecomp.com> S: Odd Fixes F: hw/mips/mips_fulong2e.c F: hw/isa/vt82c686.c - +F: hw/pci-host/bonito.c F: include/hw/isa/vt82c686.h Boston @@ -895,6 +907,7 @@ S: Maintained F: hw/core/loader-fit.c F: hw/mips/boston.c F: hw/pci-host/xilinx-pcie.c +F: include/hw/pci-host/xilinx-pcie.h OpenRISC Machines ----------------- @@ -947,6 +960,7 @@ F: hw/nvram/mac_nvram.c F: include/hw/misc/macio/ F: include/hw/misc/mos6522.h F: include/hw/ppc/mac_dbdma.h +F: include/hw/pci-host/uninorth.h Old World M: David Gibson <david@gibson.dropbear.id.au> @@ -956,6 +970,7 @@ F: hw/ppc/mac_oldworld.c F: hw/pci-host/grackle.c F: hw/misc/macio/ F: hw/intc/heathrow_pic.c +F: include/hw/intc/heathrow_pic.h PReP M: Hervé Poussineau <hpoussin@reactos.org> @@ -1032,12 +1047,15 @@ F: hw/misc/eccmemctl.c F: hw/misc/slavio_misc.c F: include/hw/sparc/sparc32_dma.h F: pc-bios/openbios-sparc32 +F: include/hw/sparc/sun4m_iommu.h Sun4u M: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> S: Maintained F: hw/sparc64/sun4u.c F: pc-bios/openbios-sparc64 +F: hw/pci-host/sabre.c +F: include/hw/pci-host/sabre.h Sun4v M: Artyom Tarasenko <atar4qemu@gmail.com> @@ -1136,11 +1154,13 @@ F: hw/timer/hpet* F: hw/timer/i8254* F: hw/timer/mc146818rtc* F: hw/watchdog/wdt_ib700.c +F: hw/watchdog/wdt_i6300esb.c F: include/hw/display/vga.h F: include/hw/char/parallel.h F: include/hw/dma/i8257.h F: include/hw/i2c/pm_smbus.h F: include/hw/input/i8042.h +F: include/hw/isa/i8259_internal.h F: include/hw/isa/superio.h F: include/hw/timer/hpet.h F: include/hw/timer/i8254* @@ -1246,8 +1266,7 @@ F: hw/i386/acpi-build.[hc] F: hw/arm/virt-acpi-build.c F: tests/bios-tables-test.c F: tests/acpi-utils.[hc] -F: tests/acpi-test-data/* -F: tests/acpi-test-data/*/* +F: tests/data/acpi/ ppc4xx M: David Gibson <david@gibson.dropbear.id.au> @@ -1282,7 +1301,7 @@ T: git https://github.com/jasowang/qemu.git net SCSI M: Paolo Bonzini <pbonzini@redhat.com> -R: Fam Zheng <famz@redhat.com> +R: Fam Zheng <fam@euphon.net> S: Supported F: include/hw/scsi/* F: hw/scsi/* @@ -1366,6 +1385,7 @@ M: Michael S. Tsirkin <mst@redhat.com> S: Supported F: hw/*/*vhost* F: docs/interop/vhost-user.txt +F: contrib/vhost-user-*/ virtio M: Michael S. Tsirkin <mst@redhat.com> @@ -1478,6 +1498,7 @@ S: Maintained F: hw/acpi/nvdimm.c F: hw/mem/nvdimm.c F: include/hw/mem/nvdimm.h +F: docs/nvdimm.txt e1000x M: Dmitry Fleytman <dmitry.fleytman@gmail.com> @@ -1608,7 +1629,7 @@ T: git https://repo.or.cz/qemu/kevin.git block Block I/O path M: Stefan Hajnoczi <stefanha@redhat.com> -M: Fam Zheng <famz@redhat.com> +M: Fam Zheng <fam@euphon.net> L: qemu-block@nongnu.org S: Supported F: util/async.c @@ -1622,7 +1643,7 @@ T: git https://github.com/stefanha/qemu.git block Block SCSI subsystem M: Paolo Bonzini <pbonzini@redhat.com> -R: Fam Zheng <famz@redhat.com> +R: Fam Zheng <fam@euphon.net> L: qemu-block@nongnu.org S: Supported F: include/scsi/* @@ -1654,7 +1675,7 @@ F: qapi/transaction.json T: git https://repo.or.cz/qemu/armbru.git block-next Dirty Bitmaps -M: Fam Zheng <famz@redhat.com> +M: Fam Zheng <fam@euphon.net> M: John Snow <jsnow@redhat.com> L: qemu-block@nongnu.org S: Supported @@ -1752,6 +1773,7 @@ F: ui/spice-*.c F: audio/spiceaudio.c F: hw/display/qxl* F: qapi/ui.json +F: docs/spice-port-fqdn.txt Graphics M: Gerd Hoffmann <kraxel@redhat.com> @@ -1896,6 +1918,7 @@ S: Supported F: qmp.c F: monitor.c F: docs/devel/*qmp-* +F: docs/interop/*qmp-* F: scripts/qmp/ F: tests/qmp-test.c F: tests/qmp-cmd-test.c @@ -2028,7 +2051,7 @@ F: tests/test-throttle.c L: qemu-block@nongnu.org UUID -M: Fam Zheng <famz@redhat.com> +M: Fam Zheng <fam@euphon.net> S: Supported F: util/uuid.c F: include/qemu/uuid.h @@ -2159,7 +2182,7 @@ F: disas/tci.c Block drivers ------------- VMDK -M: Fam Zheng <famz@redhat.com> +M: Fam Zheng <fam@euphon.net> L: qemu-block@nongnu.org S: Supported F: block/vmdk.c @@ -2245,13 +2268,13 @@ F: block/gluster.c T: git https://github.com/codyprime/qemu-kvm-jtc.git block Null Block Driver -M: Fam Zheng <famz@redhat.com> +M: Fam Zheng <fam@euphon.net> L: qemu-block@nongnu.org S: Supported F: block/null.c NVMe Block Driver -M: Fam Zheng <famz@redhat.com> +M: Fam Zheng <fam@euphon.net> L: qemu-block@nongnu.org S: Supported F: block/nvme* @@ -2382,8 +2405,8 @@ Build and test automation ------------------------- Build and test automation M: Alex Bennée <alex.bennee@linaro.org> -M: Fam Zheng <famz@redhat.com> -R: Philippe Mathieu-Daudé <f4bug@amsat.org> +M: Fam Zheng <fam@euphon.net> +R: Philippe Mathieu-Daudé <philmd@redhat.com> L: qemu-devel@nongnu.org S: Maintained F: .travis.yml diff --git a/Makefile b/Makefile index f2947186a4..c8b9efdad4 100644 --- a/Makefile +++ b/Makefile @@ -88,82 +88,26 @@ endif include $(SRC_PATH)/rules.mak GENERATED_FILES = qemu-version.h config-host.h qemu-options.def -GENERATED_FILES += qapi/qapi-builtin-types.h qapi/qapi-builtin-types.c -GENERATED_FILES += qapi/qapi-types.h qapi/qapi-types.c -GENERATED_FILES += qapi/qapi-types-block-core.h qapi/qapi-types-block-core.c -GENERATED_FILES += qapi/qapi-types-block.h qapi/qapi-types-block.c -GENERATED_FILES += qapi/qapi-types-char.h qapi/qapi-types-char.c -GENERATED_FILES += qapi/qapi-types-common.h qapi/qapi-types-common.c -GENERATED_FILES += qapi/qapi-types-crypto.h qapi/qapi-types-crypto.c -GENERATED_FILES += qapi/qapi-types-introspect.h qapi/qapi-types-introspect.c -GENERATED_FILES += qapi/qapi-types-job.h qapi/qapi-types-job.c -GENERATED_FILES += qapi/qapi-types-migration.h qapi/qapi-types-migration.c -GENERATED_FILES += qapi/qapi-types-misc.h qapi/qapi-types-misc.c -GENERATED_FILES += qapi/qapi-types-net.h qapi/qapi-types-net.c -GENERATED_FILES += qapi/qapi-types-rocker.h qapi/qapi-types-rocker.c -GENERATED_FILES += qapi/qapi-types-run-state.h qapi/qapi-types-run-state.c -GENERATED_FILES += qapi/qapi-types-sockets.h qapi/qapi-types-sockets.c -GENERATED_FILES += qapi/qapi-types-tpm.h qapi/qapi-types-tpm.c -GENERATED_FILES += qapi/qapi-types-trace.h qapi/qapi-types-trace.c -GENERATED_FILES += qapi/qapi-types-transaction.h qapi/qapi-types-transaction.c -GENERATED_FILES += qapi/qapi-types-ui.h qapi/qapi-types-ui.c -GENERATED_FILES += qapi/qapi-builtin-visit.h qapi/qapi-builtin-visit.c -GENERATED_FILES += qapi/qapi-visit.h qapi/qapi-visit.c -GENERATED_FILES += qapi/qapi-visit-block-core.h qapi/qapi-visit-block-core.c -GENERATED_FILES += qapi/qapi-visit-block.h qapi/qapi-visit-block.c -GENERATED_FILES += qapi/qapi-visit-char.h qapi/qapi-visit-char.c -GENERATED_FILES += qapi/qapi-visit-common.h qapi/qapi-visit-common.c -GENERATED_FILES += qapi/qapi-visit-crypto.h qapi/qapi-visit-crypto.c -GENERATED_FILES += qapi/qapi-visit-introspect.h qapi/qapi-visit-introspect.c -GENERATED_FILES += qapi/qapi-visit-job.h qapi/qapi-visit-job.c -GENERATED_FILES += qapi/qapi-visit-migration.h qapi/qapi-visit-migration.c -GENERATED_FILES += qapi/qapi-visit-misc.h qapi/qapi-visit-misc.c -GENERATED_FILES += qapi/qapi-visit-net.h qapi/qapi-visit-net.c -GENERATED_FILES += qapi/qapi-visit-rocker.h qapi/qapi-visit-rocker.c -GENERATED_FILES += qapi/qapi-visit-run-state.h qapi/qapi-visit-run-state.c -GENERATED_FILES += qapi/qapi-visit-sockets.h qapi/qapi-visit-sockets.c -GENERATED_FILES += qapi/qapi-visit-tpm.h qapi/qapi-visit-tpm.c -GENERATED_FILES += qapi/qapi-visit-trace.h qapi/qapi-visit-trace.c -GENERATED_FILES += qapi/qapi-visit-transaction.h qapi/qapi-visit-transaction.c -GENERATED_FILES += qapi/qapi-visit-ui.h qapi/qapi-visit-ui.c -GENERATED_FILES += qapi/qapi-commands.h qapi/qapi-commands.c -GENERATED_FILES += qapi/qapi-commands-block-core.h qapi/qapi-commands-block-core.c -GENERATED_FILES += qapi/qapi-commands-block.h qapi/qapi-commands-block.c -GENERATED_FILES += qapi/qapi-commands-char.h qapi/qapi-commands-char.c -GENERATED_FILES += qapi/qapi-commands-common.h qapi/qapi-commands-common.c -GENERATED_FILES += qapi/qapi-commands-crypto.h qapi/qapi-commands-crypto.c -GENERATED_FILES += qapi/qapi-commands-introspect.h qapi/qapi-commands-introspect.c -GENERATED_FILES += qapi/qapi-commands-job.h qapi/qapi-commands-job.c -GENERATED_FILES += qapi/qapi-commands-migration.h qapi/qapi-commands-migration.c -GENERATED_FILES += qapi/qapi-commands-misc.h qapi/qapi-commands-misc.c -GENERATED_FILES += qapi/qapi-commands-net.h qapi/qapi-commands-net.c -GENERATED_FILES += qapi/qapi-commands-rocker.h qapi/qapi-commands-rocker.c -GENERATED_FILES += qapi/qapi-commands-run-state.h qapi/qapi-commands-run-state.c -GENERATED_FILES += qapi/qapi-commands-sockets.h qapi/qapi-commands-sockets.c -GENERATED_FILES += qapi/qapi-commands-tpm.h qapi/qapi-commands-tpm.c -GENERATED_FILES += qapi/qapi-commands-trace.h qapi/qapi-commands-trace.c -GENERATED_FILES += qapi/qapi-commands-transaction.h qapi/qapi-commands-transaction.c -GENERATED_FILES += qapi/qapi-commands-ui.h qapi/qapi-commands-ui.c -GENERATED_FILES += qapi/qapi-events.h qapi/qapi-events.c -GENERATED_FILES += qapi/qapi-events-block-core.h qapi/qapi-events-block-core.c -GENERATED_FILES += qapi/qapi-events-block.h qapi/qapi-events-block.c -GENERATED_FILES += qapi/qapi-events-char.h qapi/qapi-events-char.c -GENERATED_FILES += qapi/qapi-events-common.h qapi/qapi-events-common.c -GENERATED_FILES += qapi/qapi-events-crypto.h qapi/qapi-events-crypto.c -GENERATED_FILES += qapi/qapi-events-introspect.h qapi/qapi-events-introspect.c -GENERATED_FILES += qapi/qapi-events-job.h qapi/qapi-events-job.c -GENERATED_FILES += qapi/qapi-events-migration.h qapi/qapi-events-migration.c -GENERATED_FILES += qapi/qapi-events-misc.h qapi/qapi-events-misc.c -GENERATED_FILES += qapi/qapi-events-net.h qapi/qapi-events-net.c -GENERATED_FILES += qapi/qapi-events-rocker.h qapi/qapi-events-rocker.c -GENERATED_FILES += qapi/qapi-events-run-state.h qapi/qapi-events-run-state.c -GENERATED_FILES += qapi/qapi-events-sockets.h qapi/qapi-events-sockets.c -GENERATED_FILES += qapi/qapi-events-tpm.h qapi/qapi-events-tpm.c -GENERATED_FILES += qapi/qapi-events-trace.h qapi/qapi-events-trace.c -GENERATED_FILES += qapi/qapi-events-transaction.h qapi/qapi-events-transaction.c -GENERATED_FILES += qapi/qapi-events-ui.h qapi/qapi-events-ui.c -GENERATED_FILES += qapi/qapi-introspect.c qapi/qapi-introspect.h -GENERATED_FILES += qapi/qapi-doc.texi + +#see Makefile.objs for the definition of QAPI_MODULES +GENERATED_QAPI_FILES = qapi/qapi-builtin-types.h qapi/qapi-builtin-types.c +GENERATED_QAPI_FILES += qapi/qapi-types.h qapi/qapi-types.c +GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-types-%.h) +GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-types-%.c) +GENERATED_QAPI_FILES += qapi/qapi-builtin-visit.h qapi/qapi-builtin-visit.c +GENERATED_QAPI_FILES += qapi/qapi-visit.h qapi/qapi-visit.c +GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-visit-%.h) +GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-visit-%.c) +GENERATED_QAPI_FILES += qapi/qapi-commands.h qapi/qapi-commands.c +GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-commands-%.h) +GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-commands-%.c) +GENERATED_QAPI_FILES += qapi/qapi-events.h qapi/qapi-events.c +GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-events-%.h) +GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-events-%.c) +GENERATED_QAPI_FILES += qapi/qapi-introspect.c qapi/qapi-introspect.h +GENERATED_QAPI_FILES += qapi/qapi-doc.texi + +GENERATED_FILES += $(GENERATED_QAPI_FILES) GENERATED_FILES += trace/generated-tcg-tracers.h @@ -583,100 +527,10 @@ qga/qapi-generated/qapi-gen-timestamp: $(SRC_PATH)/qga/qapi-schema.json $(qapi-p "GEN","$(@:%-timestamp=%)") @>$@ -qapi-modules = $(SRC_PATH)/qapi/qapi-schema.json $(SRC_PATH)/qapi/common.json \ - $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \ - $(SRC_PATH)/qapi/char.json \ - $(SRC_PATH)/qapi/crypto.json \ - $(SRC_PATH)/qapi/introspect.json \ - $(SRC_PATH)/qapi/job.json \ - $(SRC_PATH)/qapi/migration.json \ - $(SRC_PATH)/qapi/misc.json \ - $(SRC_PATH)/qapi/net.json \ - $(SRC_PATH)/qapi/rocker.json \ - $(SRC_PATH)/qapi/run-state.json \ - $(SRC_PATH)/qapi/sockets.json \ - $(SRC_PATH)/qapi/tpm.json \ - $(SRC_PATH)/qapi/trace.json \ - $(SRC_PATH)/qapi/transaction.json \ - $(SRC_PATH)/qapi/ui.json - -qapi/qapi-builtin-types.c qapi/qapi-builtin-types.h \ -qapi/qapi-types.c qapi/qapi-types.h \ -qapi/qapi-types-block-core.c qapi/qapi-types-block-core.h \ -qapi/qapi-types-block.c qapi/qapi-types-block.h \ -qapi/qapi-types-char.c qapi/qapi-types-char.h \ -qapi/qapi-types-common.c qapi/qapi-types-common.h \ -qapi/qapi-types-crypto.c qapi/qapi-types-crypto.h \ -qapi/qapi-types-introspect.c qapi/qapi-types-introspect.h \ -qapi/qapi-types-job.c qapi/qapi-types-job.h \ -qapi/qapi-types-migration.c qapi/qapi-types-migration.h \ -qapi/qapi-types-misc.c qapi/qapi-types-misc.h \ -qapi/qapi-types-net.c qapi/qapi-types-net.h \ -qapi/qapi-types-rocker.c qapi/qapi-types-rocker.h \ -qapi/qapi-types-run-state.c qapi/qapi-types-run-state.h \ -qapi/qapi-types-sockets.c qapi/qapi-types-sockets.h \ -qapi/qapi-types-tpm.c qapi/qapi-types-tpm.h \ -qapi/qapi-types-trace.c qapi/qapi-types-trace.h \ -qapi/qapi-types-transaction.c qapi/qapi-types-transaction.h \ -qapi/qapi-types-ui.c qapi/qapi-types-ui.h \ -qapi/qapi-builtin-visit.c qapi/qapi-builtin-visit.h \ -qapi/qapi-visit.c qapi/qapi-visit.h \ -qapi/qapi-visit-block-core.c qapi/qapi-visit-block-core.h \ -qapi/qapi-visit-block.c qapi/qapi-visit-block.h \ -qapi/qapi-visit-char.c qapi/qapi-visit-char.h \ -qapi/qapi-visit-common.c qapi/qapi-visit-common.h \ -qapi/qapi-visit-crypto.c qapi/qapi-visit-crypto.h \ -qapi/qapi-visit-introspect.c qapi/qapi-visit-introspect.h \ -qapi/qapi-visit-job.c qapi/qapi-visit-job.h \ -qapi/qapi-visit-migration.c qapi/qapi-visit-migration.h \ -qapi/qapi-visit-misc.c qapi/qapi-visit-misc.h \ -qapi/qapi-visit-net.c qapi/qapi-visit-net.h \ -qapi/qapi-visit-rocker.c qapi/qapi-visit-rocker.h \ -qapi/qapi-visit-run-state.c qapi/qapi-visit-run-state.h \ -qapi/qapi-visit-sockets.c qapi/qapi-visit-sockets.h \ -qapi/qapi-visit-tpm.c qapi/qapi-visit-tpm.h \ -qapi/qapi-visit-trace.c qapi/qapi-visit-trace.h \ -qapi/qapi-visit-transaction.c qapi/qapi-visit-transaction.h \ -qapi/qapi-visit-ui.c qapi/qapi-visit-ui.h \ -qapi/qapi-commands.h qapi/qapi-commands.c \ -qapi/qapi-commands-block-core.c qapi/qapi-commands-block-core.h \ -qapi/qapi-commands-block.c qapi/qapi-commands-block.h \ -qapi/qapi-commands-char.c qapi/qapi-commands-char.h \ -qapi/qapi-commands-common.c qapi/qapi-commands-common.h \ -qapi/qapi-commands-crypto.c qapi/qapi-commands-crypto.h \ -qapi/qapi-commands-introspect.c qapi/qapi-commands-introspect.h \ -qapi/qapi-commands-job.c qapi/qapi-commands-job.h \ -qapi/qapi-commands-migration.c qapi/qapi-commands-migration.h \ -qapi/qapi-commands-misc.c qapi/qapi-commands-misc.h \ -qapi/qapi-commands-net.c qapi/qapi-commands-net.h \ -qapi/qapi-commands-rocker.c qapi/qapi-commands-rocker.h \ -qapi/qapi-commands-run-state.c qapi/qapi-commands-run-state.h \ -qapi/qapi-commands-sockets.c qapi/qapi-commands-sockets.h \ -qapi/qapi-commands-tpm.c qapi/qapi-commands-tpm.h \ -qapi/qapi-commands-trace.c qapi/qapi-commands-trace.h \ -qapi/qapi-commands-transaction.c qapi/qapi-commands-transaction.h \ -qapi/qapi-commands-ui.c qapi/qapi-commands-ui.h \ -qapi/qapi-events.c qapi/qapi-events.h \ -qapi/qapi-events-block-core.c qapi/qapi-events-block-core.h \ -qapi/qapi-events-block.c qapi/qapi-events-block.h \ -qapi/qapi-events-char.c qapi/qapi-events-char.h \ -qapi/qapi-events-common.c qapi/qapi-events-common.h \ -qapi/qapi-events-crypto.c qapi/qapi-events-crypto.h \ -qapi/qapi-events-introspect.c qapi/qapi-events-introspect.h \ -qapi/qapi-events-job.c qapi/qapi-events-job.h \ -qapi/qapi-events-migration.c qapi/qapi-events-migration.h \ -qapi/qapi-events-misc.c qapi/qapi-events-misc.h \ -qapi/qapi-events-net.c qapi/qapi-events-net.h \ -qapi/qapi-events-rocker.c qapi/qapi-events-rocker.h \ -qapi/qapi-events-run-state.c qapi/qapi-events-run-state.h \ -qapi/qapi-events-sockets.c qapi/qapi-events-sockets.h \ -qapi/qapi-events-tpm.c qapi/qapi-events-tpm.h \ -qapi/qapi-events-trace.c qapi/qapi-events-trace.h \ -qapi/qapi-events-transaction.c qapi/qapi-events-transaction.h \ -qapi/qapi-events-ui.c qapi/qapi-events-ui.h \ -qapi/qapi-introspect.h qapi/qapi-introspect.c \ -qapi/qapi-doc.texi: \ -qapi-gen-timestamp ; +qapi-modules = $(SRC_PATH)/qapi/qapi-schema.json \ + $(QAPI_MODULES:%=$(SRC_PATH)/qapi/%.json) + +$(GENERATED_QAPI_FILES): qapi-gen-timestamp ; qapi-gen-timestamp: $(qapi-modules) $(qapi-py) $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-gen.py \ -o "qapi" -b $<, \ diff --git a/Makefile.objs b/Makefile.objs index 1e1ff387d7..56af0347d3 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -1,63 +1,18 @@ +QAPI_MODULES = block-core block char common crypto introspect job migration +QAPI_MODULES += misc net rocker run-state sockets tpm trace transaction ui + ####################################################################### # Common libraries for tools and emulators stub-obj-y = stubs/ crypto/ util-obj-y = util/ qobject/ qapi/ util-obj-y += qapi/qapi-builtin-types.o util-obj-y += qapi/qapi-types.o -util-obj-y += qapi/qapi-types-block-core.o -util-obj-y += qapi/qapi-types-block.o -util-obj-y += qapi/qapi-types-char.o -util-obj-y += qapi/qapi-types-common.o -util-obj-y += qapi/qapi-types-crypto.o -util-obj-y += qapi/qapi-types-introspect.o -util-obj-y += qapi/qapi-types-job.o -util-obj-y += qapi/qapi-types-migration.o -util-obj-y += qapi/qapi-types-misc.o -util-obj-y += qapi/qapi-types-net.o -util-obj-y += qapi/qapi-types-rocker.o -util-obj-y += qapi/qapi-types-run-state.o -util-obj-y += qapi/qapi-types-sockets.o -util-obj-y += qapi/qapi-types-tpm.o -util-obj-y += qapi/qapi-types-trace.o -util-obj-y += qapi/qapi-types-transaction.o -util-obj-y += qapi/qapi-types-ui.o +util-obj-y += $(QAPI_MODULES:%=qapi/qapi-types-%.o) util-obj-y += qapi/qapi-builtin-visit.o util-obj-y += qapi/qapi-visit.o -util-obj-y += qapi/qapi-visit-block-core.o -util-obj-y += qapi/qapi-visit-block.o -util-obj-y += qapi/qapi-visit-char.o -util-obj-y += qapi/qapi-visit-common.o -util-obj-y += qapi/qapi-visit-crypto.o -util-obj-y += qapi/qapi-visit-introspect.o -util-obj-y += qapi/qapi-visit-job.o -util-obj-y += qapi/qapi-visit-migration.o -util-obj-y += qapi/qapi-visit-misc.o -util-obj-y += qapi/qapi-visit-net.o -util-obj-y += qapi/qapi-visit-rocker.o -util-obj-y += qapi/qapi-visit-run-state.o -util-obj-y += qapi/qapi-visit-sockets.o -util-obj-y += qapi/qapi-visit-tpm.o -util-obj-y += qapi/qapi-visit-trace.o -util-obj-y += qapi/qapi-visit-transaction.o -util-obj-y += qapi/qapi-visit-ui.o +util-obj-y += $(QAPI_MODULES:%=qapi/qapi-visit-%.o) util-obj-y += qapi/qapi-events.o -util-obj-y += qapi/qapi-events-block-core.o -util-obj-y += qapi/qapi-events-block.o -util-obj-y += qapi/qapi-events-char.o -util-obj-y += qapi/qapi-events-common.o -util-obj-y += qapi/qapi-events-crypto.o -util-obj-y += qapi/qapi-events-introspect.o -util-obj-y += qapi/qapi-events-job.o -util-obj-y += qapi/qapi-events-migration.o -util-obj-y += qapi/qapi-events-misc.o -util-obj-y += qapi/qapi-events-net.o -util-obj-y += qapi/qapi-events-rocker.o -util-obj-y += qapi/qapi-events-run-state.o -util-obj-y += qapi/qapi-events-sockets.o -util-obj-y += qapi/qapi-events-tpm.o -util-obj-y += qapi/qapi-events-trace.o -util-obj-y += qapi/qapi-events-transaction.o -util-obj-y += qapi/qapi-events-ui.o +util-obj-y += $(QAPI_MODULES:%=qapi/qapi-events-%.o) util-obj-y += qapi/qapi-introspect.o chardev-obj-y = chardev/ @@ -138,23 +93,7 @@ common-obj-$(CONFIG_FDT) += device_tree.o # qapi common-obj-y += qapi/qapi-commands.o -common-obj-y += qapi/qapi-commands-block-core.o -common-obj-y += qapi/qapi-commands-block.o -common-obj-y += qapi/qapi-commands-char.o -common-obj-y += qapi/qapi-commands-common.o -common-obj-y += qapi/qapi-commands-crypto.o -common-obj-y += qapi/qapi-commands-introspect.o -common-obj-y += qapi/qapi-commands-job.o -common-obj-y += qapi/qapi-commands-migration.o -common-obj-y += qapi/qapi-commands-misc.o -common-obj-y += qapi/qapi-commands-net.o -common-obj-y += qapi/qapi-commands-rocker.o -common-obj-y += qapi/qapi-commands-run-state.o -common-obj-y += qapi/qapi-commands-sockets.o -common-obj-y += qapi/qapi-commands-tpm.o -common-obj-y += qapi/qapi-commands-trace.o -common-obj-y += qapi/qapi-commands-transaction.o -common-obj-y += qapi/qapi-commands-ui.o +common-obj-y += $(QAPI_MODULES:%=qapi/qapi-commands-%.o) common-obj-y += qapi/qapi-introspect.o common-obj-y += qmp.o hmp.o endif diff --git a/VERSION b/VERSION index fd2a01863f..0bc4611411 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.1.0 +3.1.50 diff --git a/accel/accel.c b/accel/accel.c index 966b2d8f53..3da26eb90f 100644 --- a/accel/accel.c +++ b/accel/accel.c @@ -34,6 +34,7 @@ #include "qom/object.h" #include "qemu/error-report.h" #include "qemu/option.h" +#include "qapi/error.h" static const TypeInfo accel_type = { .name = TYPE_ACCEL, @@ -121,7 +122,13 @@ void configure_accelerator(MachineState *ms) void accel_register_compat_props(AccelState *accel) { AccelClass *class = ACCEL_GET_CLASS(accel); - register_compat_props_array(class->global_props); + GlobalProperty *prop = class->global_props; + + for (; prop && prop->driver; prop++) { + /* Any compat_props must never cause error */ + prop->errp = &error_abort; + qdev_prop_register_global(prop); + } } void accel_setup_post(MachineState *ms) diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c index 6630021226..78f058dee2 100644 --- a/backends/hostmem-file.c +++ b/backends/hostmem-file.c @@ -145,26 +145,20 @@ static void file_memory_backend_set_pmem(Object *o, bool value, Error **errp) HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o); if (host_memory_backend_mr_inited(backend)) { - char *path = object_get_canonical_path_component(o); - error_setg(errp, "cannot change property 'pmem' of %s '%s'", - object_get_typename(o), - path); - g_free(path); + error_setg(errp, "cannot change property 'pmem' of %s.", + object_get_typename(o)); return; } #ifndef CONFIG_LIBPMEM if (value) { Error *local_err = NULL; - char *path = object_get_canonical_path_component(o); error_setg(&local_err, "Lack of libpmem support while setting the 'pmem=on'" - " of %s '%s'. We can't ensure data persistence.", - object_get_typename(o), - path); - g_free(path); + " of %s. We can't ensure data persistence.", + object_get_typename(o)); error_propagate(errp, local_err); return; } diff --git a/backends/hostmem.c b/backends/hostmem.c index 1a89342039..af800284e0 100644 --- a/backends/hostmem.c +++ b/backends/hostmem.c @@ -103,14 +103,23 @@ host_memory_backend_set_host_nodes(Object *obj, Visitor *v, const char *name, { #ifdef CONFIG_NUMA HostMemoryBackend *backend = MEMORY_BACKEND(obj); - uint16List *l = NULL; + uint16List *l, *host_nodes = NULL; - visit_type_uint16List(v, name, &l, errp); + visit_type_uint16List(v, name, &host_nodes, errp); - while (l) { + for (l = host_nodes; l; l = l->next) { + if (l->value >= MAX_NODES) { + error_setg(errp, "Invalid host-nodes value: %d", l->value); + goto out; + } + } + + for (l = host_nodes; l; l = l->next) { bitmap_set(backend->host_nodes, l->value, 1); - l = l->next; } + +out: + qapi_free_uint16List(host_nodes); #else error_setg(errp, "NUMA node binding are not supported by this QEMU"); #endif diff --git a/docs/cpu-hotplug.rst b/docs/cpu-hotplug.rst new file mode 100644 index 0000000000..1c268e00b4 --- /dev/null +++ b/docs/cpu-hotplug.rst @@ -0,0 +1,142 @@ +=================== +Virtual CPU hotplug +=================== + +A complete example of vCPU hotplug (and hot-unplug) using QMP +``device_add`` and ``device_del``. + +vCPU hotplug +------------ + +(1) Launch QEMU as follows (note that the "maxcpus" is mandatory to + allow vCPU hotplug):: + + $ qemu-system-x86_64 -display none -no-user-config -m 2048 \ + -nodefaults -monitor stdio -machine pc,accel=kvm,usb=off \ + -smp 1,maxcpus=2 -cpu IvyBridge-IBRS \ + -qmp unix:/tmp/qmp-sock,server,nowait + +(2) Run 'qmp-shell' (located in the source tree, under: "scripts/qmp/) + to connect to the just-launched QEMU:: + + $> ./qmp-shell -p -v /tmp/qmp-sock + [...] + (QEMU) + +(3) Find out which CPU types could be plugged, and into which sockets:: + + (QEMU) query-hotpluggable-cpus + { + "execute": "query-hotpluggable-cpus", + "arguments": {} + } + { + "return": [ + { + "type": "IvyBridge-IBRS-x86_64-cpu", + "vcpus-count": 1, + "props": { + "socket-id": 1, + "core-id": 0, + "thread-id": 0 + } + }, + { + "qom-path": "/machine/unattached/device[0]", + "type": "IvyBridge-IBRS-x86_64-cpu", + "vcpus-count": 1, + "props": { + "socket-id": 0, + "core-id": 0, + "thread-id": 0 + } + } + ] + } + (QEMU) + +(4) The ``query-hotpluggable-cpus`` command returns an object for CPUs + that are present (containing a "qom-path" member) or which may be + hot-plugged (no "qom-path" member). From its output in step (3), we + can see that ``IvyBridge-IBRS-x86_64-cpu`` is present in socket 0, + while hot-plugging a CPU into socket 1 requires passing the listed + properties to QMP ``device_add``: + + (QEMU) device_add id=cpu-2 driver=IvyBridge-IBRS-x86_64-cpu socket-id=1 core-id=0 thread-id=0 + { + "execute": "device_add", + "arguments": { + "socket-id": 1, + "driver": "IvyBridge-IBRS-x86_64-cpu", + "id": "cpu-2", + "core-id": 0, + "thread-id": 0 + } + } + { + "return": {} + } + (QEMU) + +(5) Optionally, run QMP `query-cpus-fast` for some details about the + vCPUs:: + + (QEMU) query-cpus-fast + { + "execute": "query-cpus-fast", + "arguments": {} + } + { + "return": [ + { + "qom-path": "/machine/unattached/device[0]", + "target": "x86_64", + "thread-id": 11534, + "cpu-index": 0, + "props": { + "socket-id": 0, + "core-id": 0, + "thread-id": 0 + }, + "arch": "x86" + }, + { + "qom-path": "/machine/peripheral/cpu-2", + "target": "x86_64", + "thread-id": 12106, + "cpu-index": 1, + "props": { + "socket-id": 1, + "core-id": 0, + "thread-id": 0 + }, + "arch": "x86" + } + ] + } + (QEMU) + +vCPU hot-unplug +--------------- + +From the 'qmp-shell', invoke the QMP ``device_del`` command:: + + (QEMU) device_del id=cpu-2 + { + "execute": "device_del", + "arguments": { + "id": "cpu-2" + } + } + { + "return": {} + } + (QEMU) + +.. note:: + vCPU hot-unplug requires guest cooperation; so the ``device_del`` + command above does not guarantee vCPU removal -- it's a "request to + unplug". At this point, the guest will get a System Control + Interupt (SCI) and calls the ACPI handler for the affected vCPU + device. Then the guest kernel will bring the vCPU offline and tell + QEMU to unplug it. diff --git a/hmp-commands.hx b/hmp-commands.hx index db0c681f74..ba71558c25 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1849,14 +1849,16 @@ ETEXI .name = "cpu-add", .args_type = "id:i", .params = "id", - .help = "add cpu", + .help = "add cpu (deprecated, use device_add instead)", .cmd = hmp_cpu_add, }, STEXI @item cpu-add @var{id} @findex cpu-add -Add CPU with id @var{id} +Add CPU with id @var{id}. This command is deprecated, please ++use @code{device_add} instead. For details, refer to +'docs/cpu-hotplug.rst'. ETEXI { diff --git a/hmp.c b/hmp.c index 7828f93a39..43ae9ec61a 100644 --- a/hmp.c +++ b/hmp.c @@ -2372,6 +2372,8 @@ void hmp_cpu_add(Monitor *mon, const QDict *qdict) int cpuid; Error *err = NULL; + error_report("cpu_add is deprecated, please use device_add instead"); + cpuid = qdict_get_int(qdict, "id"); qmp_cpu_add(cpuid, &err); hmp_handle_error(mon, &err); diff --git a/hw/arm/virt.c b/hw/arm/virt.c index f69e7eb399..17f1b49d11 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -74,7 +74,6 @@ static const TypeInfo machvirt_##major##_##minor##_info = { \ .name = MACHINE_TYPE_NAME("virt-" # major "." # minor), \ .parent = TYPE_VIRT_MACHINE, \ - .instance_init = virt_##major##_##minor##_instance_init, \ .class_init = virt_##major##_##minor##_class_init, \ }; \ static void machvirt_machine_##major##_##minor##_init(void) \ @@ -1778,26 +1777,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data) hc->plug = virt_machine_device_plug_cb; } -static const TypeInfo virt_machine_info = { - .name = TYPE_VIRT_MACHINE, - .parent = TYPE_MACHINE, - .abstract = true, - .instance_size = sizeof(VirtMachineState), - .class_size = sizeof(VirtMachineClass), - .class_init = virt_machine_class_init, - .interfaces = (InterfaceInfo[]) { - { TYPE_HOTPLUG_HANDLER }, - { } - }, -}; - -static void machvirt_machine_init(void) -{ - type_register_static(&virt_machine_info); -} -type_init(machvirt_machine_init); - -static void virt_3_1_instance_init(Object *obj) +static void virt_instance_init(Object *obj) { VirtMachineState *vms = VIRT_MACHINE(obj); VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms); @@ -1867,18 +1847,43 @@ static void virt_3_1_instance_init(Object *obj) vms->irqmap = a15irqmap; } -static void virt_machine_3_1_options(MachineClass *mc) +static const TypeInfo virt_machine_info = { + .name = TYPE_VIRT_MACHINE, + .parent = TYPE_MACHINE, + .abstract = true, + .instance_size = sizeof(VirtMachineState), + .class_size = sizeof(VirtMachineClass), + .class_init = virt_machine_class_init, + .instance_init = virt_instance_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_HOTPLUG_HANDLER }, + { } + }, +}; + +static void machvirt_machine_init(void) { + type_register_static(&virt_machine_info); } -DEFINE_VIRT_MACHINE_AS_LATEST(3, 1) +type_init(machvirt_machine_init); -#define VIRT_COMPAT_3_0 \ - HW_COMPAT_3_0 +static void virt_machine_4_0_options(MachineClass *mc) +{ +} +DEFINE_VIRT_MACHINE_AS_LATEST(4, 0) -static void virt_3_0_instance_init(Object *obj) +#define VIRT_COMPAT_3_1 \ + HW_COMPAT_3_1 + +static void virt_machine_3_1_options(MachineClass *mc) { - virt_3_1_instance_init(obj); + virt_machine_4_0_options(mc); + SET_MACHINE_COMPAT(mc, VIRT_COMPAT_3_1); } +DEFINE_VIRT_MACHINE(3, 1) + +#define VIRT_COMPAT_3_0 \ + HW_COMPAT_3_0 static void virt_machine_3_0_options(MachineClass *mc) { @@ -1890,11 +1895,6 @@ DEFINE_VIRT_MACHINE(3, 0) #define VIRT_COMPAT_2_12 \ HW_COMPAT_2_12 -static void virt_2_12_instance_init(Object *obj) -{ - virt_3_0_instance_init(obj); -} - static void virt_machine_2_12_options(MachineClass *mc) { VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc)); @@ -1909,11 +1909,6 @@ DEFINE_VIRT_MACHINE(2, 12) #define VIRT_COMPAT_2_11 \ HW_COMPAT_2_11 -static void virt_2_11_instance_init(Object *obj) -{ - virt_2_12_instance_init(obj); -} - static void virt_machine_2_11_options(MachineClass *mc) { VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc)); @@ -1927,11 +1922,6 @@ DEFINE_VIRT_MACHINE(2, 11) #define VIRT_COMPAT_2_10 \ HW_COMPAT_2_10 -static void virt_2_10_instance_init(Object *obj) -{ - virt_2_11_instance_init(obj); -} - static void virt_machine_2_10_options(MachineClass *mc) { virt_machine_2_11_options(mc); @@ -1944,11 +1934,6 @@ DEFINE_VIRT_MACHINE(2, 10) #define VIRT_COMPAT_2_9 \ HW_COMPAT_2_9 -static void virt_2_9_instance_init(Object *obj) -{ - virt_2_10_instance_init(obj); -} - static void virt_machine_2_9_options(MachineClass *mc) { virt_machine_2_10_options(mc); @@ -1959,11 +1944,6 @@ DEFINE_VIRT_MACHINE(2, 9) #define VIRT_COMPAT_2_8 \ HW_COMPAT_2_8 -static void virt_2_8_instance_init(Object *obj) -{ - virt_2_9_instance_init(obj); -} - static void virt_machine_2_8_options(MachineClass *mc) { VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc)); @@ -1980,11 +1960,6 @@ DEFINE_VIRT_MACHINE(2, 8) #define VIRT_COMPAT_2_7 \ HW_COMPAT_2_7 -static void virt_2_7_instance_init(Object *obj) -{ - virt_2_8_instance_init(obj); -} - static void virt_machine_2_7_options(MachineClass *mc) { VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc)); @@ -2001,11 +1976,6 @@ DEFINE_VIRT_MACHINE(2, 7) #define VIRT_COMPAT_2_6 \ HW_COMPAT_2_6 -static void virt_2_6_instance_init(Object *obj) -{ - virt_2_7_instance_init(obj); -} - static void virt_machine_2_6_options(MachineClass *mc) { VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc)); diff --git a/hw/core/machine.c b/hw/core/machine.c index da50ad6de7..c51423b647 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -834,16 +834,6 @@ void machine_run_board_init(MachineState *machine) machine_class->init(machine); } -static void machine_class_finalize(ObjectClass *klass, void *data) -{ - MachineClass *mc = MACHINE_CLASS(klass); - - if (mc->compat_props) { - g_array_free(mc->compat_props, true); - } - g_free(mc->name); -} - void machine_register_compat_props(MachineState *machine) { MachineClass *mc = MACHINE_GET_CLASS(machine); @@ -869,7 +859,6 @@ static const TypeInfo machine_info = { .class_size = sizeof(MachineClass), .class_init = machine_class_init, .class_base_init = machine_class_base_init, - .class_finalize = machine_class_finalize, .instance_size = sizeof(MachineState), .instance_init = machine_initfn, .instance_finalize = machine_finalize, diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c index 8b22fb51c9..b45a7ef54b 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -288,10 +288,6 @@ static void set_netdev(Object *obj, Visitor *v, const char *name, } for (i = 0; i < queues; i++) { - if (peers[i] == NULL) { - err = -ENOENT; - goto out; - } if (peers[i]->peer) { err = -EEXIST; diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index 35072dec1e..bd84c4ea4c 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -1180,36 +1180,6 @@ void qdev_prop_register_global(GlobalProperty *prop) global_props = g_list_append(global_props, prop); } -void register_compat_prop(const char *driver, - const char *property, - const char *value) -{ - GlobalProperty *p = g_new0(GlobalProperty, 1); - - /* Any compat_props must never cause error */ - p->errp = &error_abort; - p->driver = driver; - p->property = property; - p->value = value; - qdev_prop_register_global(p); -} - -void register_compat_props_array(GlobalProperty *prop) -{ - for (; prop && prop->driver; prop++) { - register_compat_prop(prop->driver, prop->property, prop->value); - } -} - -void qdev_prop_register_global_list(GlobalProperty *props) -{ - int i; - - for (i = 0; props[i].driver != NULL; i++) { - qdev_prop_register_global(props+i); - } -} - int qdev_prop_check_globals(void) { GList *l; diff --git a/hw/i386/pc.c b/hw/i386/pc.c index f095725dba..4cd2fbca4d 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -2222,42 +2222,42 @@ static bool pc_machine_get_smbus(Object *obj, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); - return pcms->smbus; + return pcms->smbus_enabled; } static void pc_machine_set_smbus(Object *obj, bool value, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); - pcms->smbus = value; + pcms->smbus_enabled = value; } static bool pc_machine_get_sata(Object *obj, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); - return pcms->sata; + return pcms->sata_enabled; } static void pc_machine_set_sata(Object *obj, bool value, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); - pcms->sata = value; + pcms->sata_enabled = value; } static bool pc_machine_get_pit(Object *obj, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); - return pcms->pit; + return pcms->pit_enabled; } static void pc_machine_set_pit(Object *obj, bool value, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); - pcms->pit = value; + pcms->pit_enabled = value; } static void pc_machine_initfn(Object *obj) @@ -2271,9 +2271,9 @@ static void pc_machine_initfn(Object *obj) pcms->acpi_nvdimm_state.is_enabled = false; /* acpi build is enabled by default if machine supports it */ pcms->acpi_build_enabled = PC_MACHINE_GET_CLASS(pcms)->has_acpi_build; - pcms->smbus = true; - pcms->sata = true; - pcms->pit = true; + pcms->smbus_enabled = true; + pcms->sata_enabled = true; + pcms->pit_enabled = true; } static void pc_machine_reset(void) diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index 7092d6d13f..6981cfa740 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -239,7 +239,8 @@ static void pc_init1(MachineState *machine, /* init basic PC hardware */ pc_basic_device_init(isa_bus, pcms->gsi, &rtc_state, true, - (pcms->vmport != ON_OFF_AUTO_ON), pcms->pit, 0x4); + (pcms->vmport != ON_OFF_AUTO_ON), pcms->pit_enabled, + 0x4); pc_nic_init(pcmc, isa_bus, pci_bus); @@ -320,7 +321,6 @@ static void pc_compat_2_3(MachineState *machine) static void pc_compat_2_2(MachineState *machine) { pc_compat_2_3(machine); - machine->suppress_vmdesc = true; } static void pc_compat_2_1(MachineState *machine) @@ -428,21 +428,30 @@ static void pc_i440fx_machine_options(MachineClass *m) machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE); } -static void pc_i440fx_3_1_machine_options(MachineClass *m) +static void pc_i440fx_4_0_machine_options(MachineClass *m) { pc_i440fx_machine_options(m); m->alias = "pc"; m->is_default = 1; } +DEFINE_I440FX_MACHINE(v4_0, "pc-i440fx-4.0", NULL, + pc_i440fx_4_0_machine_options); + +static void pc_i440fx_3_1_machine_options(MachineClass *m) +{ + pc_i440fx_4_0_machine_options(m); + m->is_default = 0; + m->alias = NULL; + SET_MACHINE_COMPAT(m, PC_COMPAT_3_1); +} + DEFINE_I440FX_MACHINE(v3_1, "pc-i440fx-3.1", NULL, pc_i440fx_3_1_machine_options); static void pc_i440fx_3_0_machine_options(MachineClass *m) { pc_i440fx_3_1_machine_options(m); - m->is_default = 0; - m->alias = NULL; SET_MACHINE_COMPAT(m, PC_COMPAT_3_0); } @@ -562,6 +571,7 @@ static void pc_i440fx_2_2_machine_options(MachineClass *m) PCMachineClass *pcmc = PC_MACHINE_CLASS(m); pc_i440fx_2_3_machine_options(m); m->hw_version = "2.2.0"; + m->default_machine_opts = "firmware=bios-256k.bin,suppress-vmdesc=on"; SET_MACHINE_COMPAT(m, PC_COMPAT_2_2); pcmc->rsdp_in_ram = false; } diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index 4702bb13c4..58459bdab5 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -236,13 +236,13 @@ static void pc_q35_init(MachineState *machine) /* init basic PC hardware */ pc_basic_device_init(isa_bus, pcms->gsi, &rtc_state, !mc->no_floppy, - (pcms->vmport != ON_OFF_AUTO_ON), pcms->pit, + (pcms->vmport != ON_OFF_AUTO_ON), pcms->pit_enabled, 0xff0104); /* connect pm stuff to lpc */ ich9_lpc_pm_init(lpc, pc_machine_is_smm_enabled(pcms)); - if (pcms->sata) { + if (pcms->sata_enabled) { /* ahci and SATA device, for q35 1 ahci controller is built-in */ ahci = pci_create_simple_multifunction(host_bus, PCI_DEVFN(ICH9_SATA1_DEV, @@ -262,7 +262,7 @@ static void pc_q35_init(MachineState *machine) ehci_create_ich9_with_companions(host_bus, 0x1d); } - if (pcms->smbus) { + if (pcms->smbus_enabled) { /* TODO: Populate SPD eeprom data. */ smbus_eeprom_init(ich9_smb_init(host_bus, PCI_DEVFN(ICH9_SMB_DEV, ICH9_SMB_FUNC), @@ -311,19 +311,28 @@ static void pc_q35_machine_options(MachineClass *m) m->max_cpus = 288; } -static void pc_q35_3_1_machine_options(MachineClass *m) +static void pc_q35_4_0_machine_options(MachineClass *m) { pc_q35_machine_options(m); m->alias = "q35"; } +DEFINE_Q35_MACHINE(v4_0, "pc-q35-4.0", NULL, + pc_q35_4_0_machine_options); + +static void pc_q35_3_1_machine_options(MachineClass *m) +{ + pc_q35_4_0_machine_options(m); + m->alias = NULL; + SET_MACHINE_COMPAT(m, PC_COMPAT_3_1); +} + DEFINE_Q35_MACHINE(v3_1, "pc-q35-3.1", NULL, pc_q35_3_1_machine_options); static void pc_q35_3_0_machine_options(MachineClass *m) { pc_q35_3_1_machine_options(m); - m->alias = NULL; SET_MACHINE_COMPAT(m, PC_COMPAT_3_0); } diff --git a/hw/mem/memory-device.c b/hw/mem/memory-device.c index 7de1ccd497..8be63c8032 100644 --- a/hw/mem/memory-device.c +++ b/hw/mem/memory-device.c @@ -85,7 +85,8 @@ static void memory_device_check_addable(MachineState *ms, uint64_t size, /* will we exceed the total amount of memory specified */ memory_device_used_region_size(OBJECT(ms), &used_region_size); - if (used_region_size + size > ms->maxram_size - ms->ram_size) { + if (used_region_size + size < used_region_size || + used_region_size + size > ms->maxram_size - ms->ram_size) { error_setg(errp, "not enough space, currently 0x%" PRIx64 " in use of total space for memory devices 0x" RAM_ADDR_FMT, used_region_size, ms->maxram_size - ms->ram_size); @@ -120,7 +121,7 @@ static uint64_t memory_device_get_free_addr(MachineState *ms, g_assert(address_space_end >= address_space_start); /* address_space_start indicates the maximum alignment we expect */ - if (QEMU_ALIGN_UP(address_space_start, align) != address_space_start) { + if (!QEMU_IS_ALIGNED(address_space_start, align)) { error_setg(errp, "the alignment (0x%" PRIx64 ") is not supported", align); return 0; @@ -131,13 +132,13 @@ static uint64_t memory_device_get_free_addr(MachineState *ms, return 0; } - if (hint && QEMU_ALIGN_UP(*hint, align) != *hint) { + if (hint && !QEMU_IS_ALIGNED(*hint, align)) { error_setg(errp, "address must be aligned to 0x%" PRIx64 " bytes", align); return 0; } - if (QEMU_ALIGN_UP(size, align) != size) { + if (!QEMU_IS_ALIGNED(size, align)) { error_setg(errp, "backend memory size must be multiple of 0x%" PRIx64, align); return 0; diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index ecfd10a29a..8213659602 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -1280,7 +1280,7 @@ static void desugar_shm(IVShmemState *s) object_property_add_child(OBJECT(s), "internal-shm-backend", obj, &error_abort); object_unref(obj); - user_creatable_complete(obj, &error_abort); + user_creatable_complete(USER_CREATABLE(obj), &error_abort); s->hostmem = MEMORY_BACKEND(obj); } diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c index 0918f3a6ea..f6d7163273 100644 --- a/hw/misc/tmp105.c +++ b/hw/misc/tmp105.c @@ -79,7 +79,7 @@ static void tmp105_set_temperature(Object *obj, Visitor *v, const char *name, return; } if (temp >= 128000 || temp < -128000) { - error_setg(errp, "value %" PRId64 ".%03" PRIu64 " °C is out of range", + error_setg(errp, "value %" PRId64 ".%03" PRIu64 " C is out of range", temp / 1000, temp % 1000); return; } diff --git a/hw/misc/tmp421.c b/hw/misc/tmp421.c index c234044305..eeb11000f0 100644 --- a/hw/misc/tmp421.c +++ b/hw/misc/tmp421.c @@ -153,7 +153,7 @@ static void tmp421_set_temperature(Object *obj, Visitor *v, const char *name, } if (temp >= maxs[ext_range] || temp < mins[ext_range]) { - error_setg(errp, "value %" PRId64 ".%03" PRIu64 " °C is out of range", + error_setg(errp, "value %" PRId64 ".%03" PRIu64 " C is out of range", temp / 1000, temp % 1000); return; } diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 7afd1a175b..55be0f56cb 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3939,16 +3939,10 @@ static const TypeInfo spapr_machine_info = { mc->is_default = 1; \ } \ } \ - static void spapr_machine_##suffix##_instance_init(Object *obj) \ - { \ - MachineState *machine = MACHINE(obj); \ - spapr_machine_##suffix##_instance_options(machine); \ - } \ static const TypeInfo spapr_machine_##suffix##_info = { \ .name = MACHINE_TYPE_NAME("pseries-" verstr), \ .parent = TYPE_SPAPR_MACHINE, \ .class_init = spapr_machine_##suffix##_class_init, \ - .instance_init = spapr_machine_##suffix##_instance_init, \ }; \ static void spapr_machine_register_##suffix(void) \ { \ @@ -3956,19 +3950,29 @@ static const TypeInfo spapr_machine_info = { } \ type_init(spapr_machine_register_##suffix) - /* - * pseries-3.1 +/* + * pseries-4.0 */ -static void spapr_machine_3_1_instance_options(MachineState *machine) +static void spapr_machine_4_0_class_options(MachineClass *mc) { + /* Defaults for the latest behaviour inherited from the base class */ } +DEFINE_SPAPR_MACHINE(4_0, "4.0", true); + +/* + * pseries-3.1 + */ +#define SPAPR_COMPAT_3_1 \ + HW_COMPAT_3_1 + static void spapr_machine_3_1_class_options(MachineClass *mc) { - /* Defaults for the latest behaviour inherited from the base class */ + spapr_machine_4_0_class_options(mc); + SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_3_1); } -DEFINE_SPAPR_MACHINE(3_1, "3.1", true); +DEFINE_SPAPR_MACHINE(3_1, "3.1", false); /* * pseries-3.0 @@ -3976,11 +3980,6 @@ DEFINE_SPAPR_MACHINE(3_1, "3.1", true); #define SPAPR_COMPAT_3_0 \ HW_COMPAT_3_0 -static void spapr_machine_3_0_instance_options(MachineState *machine) -{ - spapr_machine_3_1_instance_options(machine); -} - static void spapr_machine_3_0_class_options(MachineClass *mc) { sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc); @@ -4010,11 +4009,6 @@ DEFINE_SPAPR_MACHINE(3_0, "3.0", false); .value = "on", \ }, -static void spapr_machine_2_12_instance_options(MachineState *machine) -{ - spapr_machine_3_0_instance_options(machine); -} - static void spapr_machine_2_12_class_options(MachineClass *mc) { sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc); @@ -4032,11 +4026,6 @@ static void spapr_machine_2_12_class_options(MachineClass *mc) DEFINE_SPAPR_MACHINE(2_12, "2.12", false); -static void spapr_machine_2_12_sxxm_instance_options(MachineState *machine) -{ - spapr_machine_2_12_instance_options(machine); -} - static void spapr_machine_2_12_sxxm_class_options(MachineClass *mc) { sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc); @@ -4055,11 +4044,6 @@ DEFINE_SPAPR_MACHINE(2_12_sxxm, "2.12-sxxm", false); #define SPAPR_COMPAT_2_11 \ HW_COMPAT_2_11 -static void spapr_machine_2_11_instance_options(MachineState *machine) -{ - spapr_machine_2_12_instance_options(machine); -} - static void spapr_machine_2_11_class_options(MachineClass *mc) { sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc); @@ -4077,11 +4061,6 @@ DEFINE_SPAPR_MACHINE(2_11, "2.11", false); #define SPAPR_COMPAT_2_10 \ HW_COMPAT_2_10 -static void spapr_machine_2_10_instance_options(MachineState *machine) -{ - spapr_machine_2_11_instance_options(machine); -} - static void spapr_machine_2_10_class_options(MachineClass *mc) { spapr_machine_2_11_class_options(mc); @@ -4101,11 +4080,6 @@ DEFINE_SPAPR_MACHINE(2_10, "2.10", false); .value = "on", \ }, \ -static void spapr_machine_2_9_instance_options(MachineState *machine) -{ - spapr_machine_2_10_instance_options(machine); -} - static void spapr_machine_2_9_class_options(MachineClass *mc) { sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc); @@ -4130,11 +4104,6 @@ DEFINE_SPAPR_MACHINE(2_9, "2.9", false); .value = "off", \ }, -static void spapr_machine_2_8_instance_options(MachineState *machine) -{ - spapr_machine_2_9_instance_options(machine); -} - static void spapr_machine_2_8_class_options(MachineClass *mc) { spapr_machine_2_9_class_options(mc); @@ -4219,20 +4188,13 @@ static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index, */ } -static void spapr_machine_2_7_instance_options(MachineState *machine) -{ - sPAPRMachineState *spapr = SPAPR_MACHINE(machine); - - spapr_machine_2_8_instance_options(machine); - spapr->use_hotplug_event_source = false; -} - static void spapr_machine_2_7_class_options(MachineClass *mc) { sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc); spapr_machine_2_8_class_options(mc); mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power7_v2.3"); + mc->default_machine_opts = "modern-hotplug-events=off"; SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_7); smc->phb_placement = phb_placement_2_7; } @@ -4250,11 +4212,6 @@ DEFINE_SPAPR_MACHINE(2_7, "2.7", false); .value = stringify(off),\ }, -static void spapr_machine_2_6_instance_options(MachineState *machine) -{ - spapr_machine_2_7_instance_options(machine); -} - static void spapr_machine_2_6_class_options(MachineClass *mc) { spapr_machine_2_7_class_options(mc); @@ -4275,11 +4232,6 @@ DEFINE_SPAPR_MACHINE(2_6, "2.6", false); .value = "off", \ }, -static void spapr_machine_2_5_instance_options(MachineState *machine) -{ - spapr_machine_2_6_instance_options(machine); -} - static void spapr_machine_2_5_class_options(MachineClass *mc) { sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc); @@ -4297,11 +4249,6 @@ DEFINE_SPAPR_MACHINE(2_5, "2.5", false); #define SPAPR_COMPAT_2_4 \ HW_COMPAT_2_4 -static void spapr_machine_2_4_instance_options(MachineState *machine) -{ - spapr_machine_2_5_instance_options(machine); -} - static void spapr_machine_2_4_class_options(MachineClass *mc) { sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc); @@ -4324,11 +4271,6 @@ DEFINE_SPAPR_MACHINE(2_4, "2.4", false); .value = "off",\ }, -static void spapr_machine_2_3_instance_options(MachineState *machine) -{ - spapr_machine_2_4_instance_options(machine); -} - static void spapr_machine_2_3_class_options(MachineClass *mc) { spapr_machine_2_4_class_options(mc); @@ -4348,16 +4290,11 @@ DEFINE_SPAPR_MACHINE(2_3, "2.3", false); .value = "0x20000000",\ }, -static void spapr_machine_2_2_instance_options(MachineState *machine) -{ - spapr_machine_2_3_instance_options(machine); - machine->suppress_vmdesc = true; -} - static void spapr_machine_2_2_class_options(MachineClass *mc) { spapr_machine_2_3_class_options(mc); SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_2); + mc->default_machine_opts = "modern-hotplug-events=off,suppress-vmdesc=on"; } DEFINE_SPAPR_MACHINE(2_2, "2.2", false); @@ -4367,11 +4304,6 @@ DEFINE_SPAPR_MACHINE(2_2, "2.2", false); #define SPAPR_COMPAT_2_1 \ HW_COMPAT_2_1 -static void spapr_machine_2_1_instance_options(MachineState *machine) -{ - spapr_machine_2_2_instance_options(machine); -} - static void spapr_machine_2_1_class_options(MachineClass *mc) { spapr_machine_2_2_class_options(mc); diff --git a/hw/timer/sun4v-rtc.c b/hw/timer/sun4v-rtc.c index 4e7f6a1eff..b93cbd6a81 100644 --- a/hw/timer/sun4v-rtc.c +++ b/hw/timer/sun4v-rtc.c @@ -41,7 +41,7 @@ static uint64_t sun4v_rtc_read(void *opaque, hwaddr addr, static void sun4v_rtc_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { - trace_sun4v_rtc_read(addr, val); + trace_sun4v_rtc_write(addr, val); } static const MemoryRegionOps sun4v_rtc_ops = { diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c index 855f1b41d1..30493a2586 100644 --- a/hw/virtio/virtio-rng.c +++ b/hw/virtio/virtio-rng.c @@ -191,7 +191,7 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp) if (vrng->conf.rng == NULL) { vrng->conf.default_backend = RNG_RANDOM(object_new(TYPE_RNG_RANDOM)); - user_creatable_complete(OBJECT(vrng->conf.default_backend), + user_creatable_complete(USER_CREATABLE(vrng->conf.default_backend), &local_err); if (local_err) { error_propagate(errp, local_err); diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 5828ed14df..22bd1ac34e 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -796,13 +796,13 @@ static void virtqueue_undo_map_desc(unsigned int out_num, unsigned int in_num, } static void virtqueue_map_iovec(VirtIODevice *vdev, struct iovec *sg, - hwaddr *addr, unsigned int *num_sg, + hwaddr *addr, unsigned int num_sg, int is_write) { unsigned int i; hwaddr len; - for (i = 0; i < *num_sg; i++) { + for (i = 0; i < num_sg; i++) { len = sg[i].iov_len; sg[i].iov_base = dma_memory_map(vdev->dma_as, addr[i], &len, is_write ? @@ -821,8 +821,8 @@ static void virtqueue_map_iovec(VirtIODevice *vdev, struct iovec *sg, void virtqueue_map(VirtIODevice *vdev, VirtQueueElement *elem) { - virtqueue_map_iovec(vdev, elem->in_sg, elem->in_addr, &elem->in_num, 1); - virtqueue_map_iovec(vdev, elem->out_sg, elem->out_addr, &elem->out_num, 0); + virtqueue_map_iovec(vdev, elem->in_sg, elem->in_addr, elem->in_num, 1); + virtqueue_map_iovec(vdev, elem->out_sg, elem->out_addr, elem->out_num, 0); } static void *virtqueue_alloc_element(size_t sz, unsigned out_num, unsigned in_num) diff --git a/include/hw/acpi/acpi_dev_interface.h b/include/hw/acpi/acpi_dev_interface.h index dabf4c4fc9..43ff119179 100644 --- a/include/hw/acpi/acpi_dev_interface.h +++ b/include/hw/acpi/acpi_dev_interface.h @@ -25,11 +25,7 @@ typedef enum { INTERFACE_CHECK(AcpiDeviceIf, (obj), \ TYPE_ACPI_DEVICE_IF) - -typedef struct AcpiDeviceIf { - /* <private> */ - Object Parent; -} AcpiDeviceIf; +typedef struct AcpiDeviceIf AcpiDeviceIf; void acpi_send_event(DeviceState *dev, AcpiEventStatusBits event); diff --git a/include/hw/arm/linux-boot-if.h b/include/hw/arm/linux-boot-if.h index aba4479a14..7bbdfd1cc6 100644 --- a/include/hw/arm/linux-boot-if.h +++ b/include/hw/arm/linux-boot-if.h @@ -16,10 +16,7 @@ #define ARM_LINUX_BOOT_IF(obj) \ INTERFACE_CHECK(ARMLinuxBootIf, (obj), TYPE_ARM_LINUX_BOOT_IF) -typedef struct ARMLinuxBootIf { - /*< private >*/ - Object parent_obj; -} ARMLinuxBootIf; +typedef struct ARMLinuxBootIf ARMLinuxBootIf; typedef struct ARMLinuxBootIfClass { /*< private >*/ diff --git a/include/hw/compat.h b/include/hw/compat.h index 6f4d5fc647..70958328fe 100644 --- a/include/hw/compat.h +++ b/include/hw/compat.h @@ -1,6 +1,9 @@ #ifndef HW_COMPAT_H #define HW_COMPAT_H +#define HW_COMPAT_3_1 \ + /* empty */ + #define HW_COMPAT_3_0 \ /* empty */ diff --git a/include/hw/fw-path-provider.h b/include/hw/fw-path-provider.h index 050cb05d92..5df893a3d8 100644 --- a/include/hw/fw-path-provider.h +++ b/include/hw/fw-path-provider.h @@ -30,9 +30,7 @@ #define FW_PATH_PROVIDER(obj) \ INTERFACE_CHECK(FWPathProvider, (obj), TYPE_FW_PATH_PROVIDER) -typedef struct FWPathProvider { - Object parent_obj; -} FWPathProvider; +typedef struct FWPathProvider FWPathProvider; typedef struct FWPathProviderClass { InterfaceClass parent_class; diff --git a/include/hw/hotplug.h b/include/hw/hotplug.h index 1a0516a479..6321e292fd 100644 --- a/include/hw/hotplug.h +++ b/include/hw/hotplug.h @@ -23,11 +23,7 @@ #define HOTPLUG_HANDLER(obj) \ INTERFACE_CHECK(HotplugHandler, (obj), TYPE_HOTPLUG_HANDLER) - -typedef struct HotplugHandler { - /* <private> */ - Object Parent; -} HotplugHandler; +typedef struct HotplugHandler HotplugHandler; /** * hotplug_fn: diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 136fe497b6..9d29c4b1df 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -49,9 +49,9 @@ struct PCMachineState { AcpiNVDIMMState acpi_nvdimm_state; bool acpi_build_enabled; - bool smbus; - bool sata; - bool pit; + bool smbus_enabled; + bool sata_enabled; + bool pit_enabled; /* RAM information (sizes, addresses, configuration): */ ram_addr_t below_4g_mem_size, above_4g_mem_size; @@ -294,6 +294,9 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t); int e820_get_num_entries(void); bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *); +#define PC_COMPAT_3_1 \ + HW_COMPAT_3_1 \ + #define PC_COMPAT_3_0 \ HW_COMPAT_3_0 \ {\ diff --git a/include/hw/intc/intc.h b/include/hw/intc/intc.h index 27d9828943..fb3e8e621f 100644 --- a/include/hw/intc/intc.h +++ b/include/hw/intc/intc.h @@ -15,9 +15,7 @@ INTERFACE_CHECK(InterruptStatsProvider, (obj), \ TYPE_INTERRUPT_STATS_PROVIDER) -typedef struct InterruptStatsProvider { - Object parent; -} InterruptStatsProvider; +typedef struct InterruptStatsProvider InterruptStatsProvider; typedef struct InterruptStatsProviderClass { InterfaceClass parent; diff --git a/include/hw/ipmi/ipmi.h b/include/hw/ipmi/ipmi.h index 0affe5a4d8..99661d2bf0 100644 --- a/include/hw/ipmi/ipmi.h +++ b/include/hw/ipmi/ipmi.h @@ -114,9 +114,7 @@ uint32_t ipmi_next_uuid(void); #define IPMI_INTERFACE_GET_CLASS(class) \ OBJECT_GET_CLASS(IPMIInterfaceClass, (class), TYPE_IPMI_INTERFACE) -typedef struct IPMIInterface { - Object parent; -} IPMIInterface; +typedef struct IPMIInterface IPMIInterface; typedef struct IPMIInterfaceClass { InterfaceClass parent; diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h index b9dbab24b4..e62ac91c19 100644 --- a/include/hw/isa/isa.h +++ b/include/hw/isa/isa.h @@ -43,10 +43,6 @@ static inline uint16_t applesmc_port(void) #define ISADMA(obj) \ INTERFACE_CHECK(IsaDma, (obj), TYPE_ISADMA) -struct IsaDma { - Object parent; -}; - typedef enum { ISADMA_TRANSFER_VERIFY, ISADMA_TRANSFER_READ, diff --git a/include/hw/mem/memory-device.h b/include/hw/mem/memory-device.h index e904e194d5..0293a96abb 100644 --- a/include/hw/mem/memory-device.h +++ b/include/hw/mem/memory-device.h @@ -25,9 +25,7 @@ #define MEMORY_DEVICE(obj) \ INTERFACE_CHECK(MemoryDeviceState, (obj), TYPE_MEMORY_DEVICE) -typedef struct MemoryDeviceState { - Object parent_obj; -} MemoryDeviceState; +typedef struct MemoryDeviceState MemoryDeviceState; /** * MemoryDeviceClass: diff --git a/include/hw/nmi.h b/include/hw/nmi.h index d092c684a1..ad857f3832 100644 --- a/include/hw/nmi.h +++ b/include/hw/nmi.h @@ -34,9 +34,7 @@ #define NMI(obj) \ INTERFACE_CHECK(NMI, (obj), TYPE_NMI) -typedef struct NMIState { - Object parent_obj; -} NMIState; +typedef struct NMIState NMIState; typedef struct NMIClass { InterfaceClass parent_class; diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index a24d0dd566..92851e55df 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -197,7 +197,7 @@ typedef struct BusChild { /** * BusState: - * @hotplug_device: link to a hotplug device associated with bus. + * @hotplug_handler: link to a hotplug handler associated with bus. */ struct BusState { Object obj; diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h index 4f60cc88f3..3ab9cd2eb6 100644 --- a/include/hw/qdev-properties.h +++ b/include/hw/qdev-properties.h @@ -249,42 +249,12 @@ void qdev_prop_set_enum(DeviceState *dev, const char *name, int value); void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value); void qdev_prop_register_global(GlobalProperty *prop); -void qdev_prop_register_global_list(GlobalProperty *props); int qdev_prop_check_globals(void); void qdev_prop_set_globals(DeviceState *dev); void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev, Property *prop, const char *value); /** - * register_compat_prop: - * - * Register internal (not user-provided) global property, changing the - * default value of a given property in a device type. This can be used - * for enabling machine-type compatibility or for enabling - * accelerator-specific defaults in devices. - * - * The property values set using this function must be always valid and - * never report setter errors, as the property will have - * GlobalProperty::errp set to &error_abort. - * - * User-provided global properties should override internal global - * properties, so callers of this function should ensure that it is - * called before user-provided global properties are registered. - * - * @driver: Device type to be affected - * @property: Property whose default value is going to be changed - * @value: New default value for the property - */ -void register_compat_prop(const char *driver, const char *property, - const char *value); -/* - * register_compat_props_array(): using register_compat_prop(), which - * only registers internal global properties (which has lower priority - * than user-provided global properties) - */ -void register_compat_props_array(GlobalProperty *prop); - -/** * qdev_property_add_static: * @dev: Device to add the property to. * @prop: The qdev property definition. diff --git a/include/hw/stream.h b/include/hw/stream.h index c370ba0c66..15774f07ab 100644 --- a/include/hw/stream.h +++ b/include/hw/stream.h @@ -14,9 +14,7 @@ #define STREAM_SLAVE(obj) \ INTERFACE_CHECK(StreamSlave, (obj), TYPE_STREAM_SLAVE) -typedef struct StreamSlave { - Object Parent; -} StreamSlave; +typedef struct StreamSlave StreamSlave; typedef void (*StreamCanPushNotifyFn)(void *opaque); diff --git a/include/hw/timer/m48t59.h b/include/hw/timer/m48t59.h index db5e43a8da..6f8db04fce 100644 --- a/include/hw/timer/m48t59.h +++ b/include/hw/timer/m48t59.h @@ -13,9 +13,7 @@ #define NVRAM(obj) \ INTERFACE_CHECK(Nvram, (obj), TYPE_NVRAM) -typedef struct Nvram { - Object parent; -} Nvram; +typedef struct Nvram Nvram; typedef struct NvramClass { InterfaceClass parent; diff --git a/include/qemu/range.h b/include/qemu/range.h index f28f0c1825..7e75f4e655 100644 --- a/include/qemu/range.h +++ b/include/qemu/range.h @@ -39,7 +39,7 @@ struct Range { uint64_t upb; /* inclusive upper bound */ }; -static inline void range_invariant(Range *range) +static inline void range_invariant(const Range *range) { assert(range->lob <= range->upb || range->lob == range->upb + 1); } @@ -48,14 +48,14 @@ static inline void range_invariant(Range *range) #define range_empty ((Range){ .lob = 1, .upb = 0 }) /* Is @range empty? */ -static inline bool range_is_empty(Range *range) +static inline bool range_is_empty(const Range *range) { range_invariant(range); return range->lob > range->upb; } /* Does @range contain @val? */ -static inline bool range_contains(Range *range, uint64_t val) +static inline bool range_contains(const Range *range, uint64_t val) { return val >= range->lob && val <= range->upb; } diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h index 3ec0e13a96..d59df20c4d 100644 --- a/include/qemu/typedefs.h +++ b/include/qemu/typedefs.h @@ -61,7 +61,9 @@ typedef struct MSIMessage MSIMessage; typedef struct NetClientState NetClientState; typedef struct NetFilterState NetFilterState; typedef struct NICInfo NICInfo; +typedef struct NodeInfo NodeInfo; typedef struct NumaNodeMem NumaNodeMem; +typedef struct ObjectClass ObjectClass; typedef struct PCIBridge PCIBridge; typedef struct PCIBus PCIBus; typedef struct PCIDevice PCIDevice; @@ -112,7 +114,6 @@ typedef struct SSIBus SSIBus; typedef struct uWireSlave uWireSlave; typedef struct VirtIODevice VirtIODevice; typedef struct Visitor Visitor; -typedef struct node_info NodeInfo; typedef void SaveStateHandler(QEMUFile *f, void *opaque); typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id); diff --git a/include/qom/object.h b/include/qom/object.h index f0b0bf39cc..bcae3f4951 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -20,7 +20,6 @@ struct TypeImpl; typedef struct TypeImpl *Type; -typedef struct ObjectClass ObjectClass; typedef struct Object Object; typedef struct TypeInfo TypeInfo; @@ -455,10 +454,8 @@ struct Object * parent class initialization has occurred, but before the class itself * is initialized. This is the function to use to undo the effects of * memcpy from the parent class to the descendants. - * @class_finalize: This function is called during class destruction and is - * meant to release and dynamic parameters allocated by @class_init. - * @class_data: Data to pass to the @class_init, @class_base_init and - * @class_finalize functions. This can be useful when building dynamic + * @class_data: Data to pass to the @class_init, + * @class_base_init. This can be useful when building dynamic * classes. * @interfaces: The list of interfaces associated with this type. This * should point to a static array that's terminated with a zero filled @@ -479,7 +476,6 @@ struct TypeInfo void (*class_init)(ObjectClass *klass, void *data); void (*class_base_init)(ObjectClass *klass, void *data); - void (*class_finalize)(ObjectClass *klass, void *data); void *class_data; InterfaceInfo *interfaces; diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h index 4d513fb329..682ba1d9b0 100644 --- a/include/qom/object_interfaces.h +++ b/include/qom/object_interfaces.h @@ -16,11 +16,7 @@ INTERFACE_CHECK(UserCreatable, (obj), \ TYPE_USER_CREATABLE) - -typedef struct UserCreatable { - /* <private> */ - Object Parent; -} UserCreatable; +typedef struct UserCreatable UserCreatable; /** * UserCreatableClass: @@ -55,14 +51,14 @@ typedef struct UserCreatableClass { /** * user_creatable_complete: - * @obj: the object whose complete() method is called if defined + * @uc: the user-creatable object whose complete() method is called if defined * @errp: if an error occurs, a pointer to an area to store the error * * Wrapper to call complete() method if one of types it's inherited * from implements USER_CREATABLE interface, otherwise the call does * nothing. */ -void user_creatable_complete(Object *obj, Error **errp); +void user_creatable_complete(UserCreatable *uc, Error **errp); /** * user_creatable_can_be_deleted: diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h index 21713b7e2f..b6ac7de43e 100644 --- a/include/sysemu/numa.h +++ b/include/sysemu/numa.h @@ -9,7 +9,7 @@ extern int nb_numa_nodes; /* Number of NUMA nodes */ extern bool have_numa_distance; -struct node_info { +struct NodeInfo { uint64_t node_mem; struct HostMemoryBackend *node_memdev; bool present; diff --git a/include/sysemu/tpm.h b/include/sysemu/tpm.h index 17a97ed77a..5b541a71c8 100644 --- a/include/sysemu/tpm.h +++ b/include/sysemu/tpm.h @@ -33,9 +33,7 @@ typedef enum TPMVersion { #define TPM_IF(obj) \ INTERFACE_CHECK(TPMIf, (obj), TYPE_TPM_IF) -typedef struct TPMIf { - Object parent_obj; -} TPMIf; +typedef struct TPMIf TPMIf; typedef struct TPMIfClass { InterfaceClass parent_class; diff --git a/qapi/misc.json b/qapi/misc.json index 6c1c5c0a37..45121492dd 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -1109,7 +1109,7 @@ ## # @cpu-add: # -# Adds CPU with specified ID +# Adds CPU with specified ID. # # @id: ID of CPU to be created, valid values [0..max_cpus) # @@ -1117,6 +1117,10 @@ # # Since: 1.5 # +# Note: This command is deprecated. The `device_add` command should be +# used instead. See the `query-hotpluggable-cpus` command for +# details. +# # Example: # # -> { "execute": "cpu-add", "arguments": { "id": 2 } } @@ -3219,6 +3223,8 @@ ## # @query-hotpluggable-cpus: # +# TODO: Better documentation; currently there is none. +# # Returns: a list of HotpluggableCPU objects. # # Since: 2.7 diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi index cb4291f1e5..72b8191d60 100644 --- a/qemu-deprecated.texi +++ b/qemu-deprecated.texi @@ -121,6 +121,11 @@ replaced by the ``target'' output member. The @option{[hub_id name]} parameter tuple of the 'hostfwd_add' and 'hostfwd_remove' HMP commands has been replaced by @option{netdev_id}. +@subsection cpu-add (since 3.1) + +Use ``device_add'' for hotplugging vCPUs instead of ``cpu-add''. See +documentation of ``query-hotpluggable-cpus'' for additional details. + @section System emulator devices @subsection ivshmem (since 2.6.0) diff --git a/qom/object.c b/qom/object.c index 547dcf97c3..17921c0a71 100644 --- a/qom/object.c +++ b/qom/object.c @@ -49,7 +49,6 @@ struct TypeImpl void (*class_init)(ObjectClass *klass, void *data); void (*class_base_init)(ObjectClass *klass, void *data); - void (*class_finalize)(ObjectClass *klass, void *data); void *class_data; @@ -114,7 +113,6 @@ static TypeImpl *type_new(const TypeInfo *info) ti->class_init = info->class_init; ti->class_base_init = info->class_base_init; - ti->class_finalize = info->class_finalize; ti->class_data = info->class_data; ti->instance_init = info->instance_init; @@ -417,6 +415,7 @@ void object_initialize_childv(Object *parentobj, const char *propname, { Error *local_err = NULL; Object *obj; + UserCreatable *uc; object_initialize(childobj, size, type); obj = OBJECT(childobj); @@ -431,8 +430,9 @@ void object_initialize_childv(Object *parentobj, const char *propname, goto out; } - if (object_dynamic_cast(obj, TYPE_USER_CREATABLE)) { - user_creatable_complete(obj, &local_err); + uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE); + if (uc) { + user_creatable_complete(uc, &local_err); if (local_err) { object_unparent(obj); goto out; @@ -590,6 +590,7 @@ Object *object_new_with_propv(const char *typename, Object *obj; ObjectClass *klass; Error *local_err = NULL; + UserCreatable *uc; klass = object_class_by_name(typename); if (!klass) { @@ -612,8 +613,9 @@ Object *object_new_with_propv(const char *typename, goto error; } - if (object_dynamic_cast(obj, TYPE_USER_CREATABLE)) { - user_creatable_complete(obj, &local_err); + uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE); + if (uc) { + user_creatable_complete(uc, &local_err); if (local_err) { object_unparent(obj); goto error; diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 97b79b48bb..db85d1eb75 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -8,18 +8,10 @@ #include "qapi/opts-visitor.h" #include "qemu/config-file.h" -void user_creatable_complete(Object *obj, Error **errp) +void user_creatable_complete(UserCreatable *uc, Error **errp) { + UserCreatableClass *ucc = USER_CREATABLE_GET_CLASS(uc); - UserCreatableClass *ucc; - UserCreatable *uc = - (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE); - - if (!uc) { - return; - } - - ucc = USER_CREATABLE_GET_CLASS(uc); if (ucc->complete) { ucc->complete(uc, errp); } @@ -89,7 +81,7 @@ Object *user_creatable_add_type(const char *type, const char *id, goto out; } - user_creatable_complete(obj, &local_err); + user_creatable_complete(USER_CREATABLE(obj), &local_err); if (local_err) { object_property_del(object_get_objects_root(), id, &error_abort); diff --git a/target/arm/idau.h b/target/arm/idau.h index cac27b95fa..7c0e4e3776 100644 --- a/target/arm/idau.h +++ b/target/arm/idau.h @@ -38,9 +38,7 @@ #define IDAU_INTERFACE_GET_CLASS(obj) \ OBJECT_GET_CLASS(IDAUInterfaceClass, (obj), TYPE_IDAU_INTERFACE) -typedef struct IDAUInterface { - Object parent; -} IDAUInterface; +typedef struct IDAUInterface IDAUInterface; #define IREGION_NOTVALID -1 diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 12f559b6af..677a3bd5fb 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -4065,7 +4065,7 @@ arch_query_cpu_model_expansion(CpuModelExpansionType type, x86_cpu_to_dict_full(xc, props); break; default: - error_setg(&err, "Unsupportted expansion type"); + error_setg(&err, "Unsupported expansion type"); goto out; } diff --git a/target/i386/hax-all.c b/target/i386/hax-all.c index d2e512856b..b978a9b821 100644 --- a/target/i386/hax-all.c +++ b/target/i386/hax-all.c @@ -154,13 +154,7 @@ int hax_vcpu_create(int id) return 0; } - vcpu = g_malloc(sizeof(struct hax_vcpu_state)); - if (!vcpu) { - fprintf(stderr, "Failed to alloc vcpu state\n"); - return -ENOMEM; - } - - memset(vcpu, 0, sizeof(struct hax_vcpu_state)); + vcpu = g_new0(struct hax_vcpu_state, 1); ret = hax_host_create_vcpu(hax_global.vm->fd, id); if (ret) { @@ -211,7 +205,7 @@ int hax_vcpu_destroy(CPUState *cpu) } /* - * 1. The hax_tunnel is also destroied when vcpu destroy + * 1. The hax_tunnel is also destroyed when vcpu is destroyed * 2. close fd will cause hax module vcpu be cleaned */ hax_close_fd(vcpu->fd); @@ -250,11 +244,8 @@ struct hax_vm *hax_vm_create(struct hax_state *hax) return hax->vm; } - vm = g_malloc(sizeof(struct hax_vm)); - if (!vm) { - return NULL; - } - memset(vm, 0, sizeof(struct hax_vm)); + vm = g_new0(struct hax_vm, 1); + ret = hax_host_create_vm(hax, &vm_id); if (ret) { fprintf(stderr, "Failed to create vm %x\n", ret); diff --git a/tests/check-qom-interface.c b/tests/check-qom-interface.c index f87c9aaa8a..2177f0dce5 100644 --- a/tests/check-qom-interface.c +++ b/tests/check-qom-interface.c @@ -23,9 +23,7 @@ #define TEST_IF(obj) \ INTERFACE_CHECK(TestIf, (obj), TYPE_TEST_IF) -typedef struct TestIf { - Object parent_obj; -} TestIf; +typedef struct TestIf TestIf; typedef struct TestIfClass { InterfaceClass parent_class; diff --git a/tests/tcg/i386/test-i386.c b/tests/tcg/i386/test-i386.c index a29b41e764..18d5609665 100644 --- a/tests/tcg/i386/test-i386.c +++ b/tests/tcg/i386/test-i386.c @@ -1137,7 +1137,7 @@ void test_xchg(void) TEST_XCHG(xchgb, "b", "+q"); #if defined(__x86_64__) - TEST_XCHG(xchgq, "", "=m"); + TEST_XCHG(xchgq, "", "+m"); #endif TEST_XCHG(xchgl, "k", "+m"); TEST_XCHG(xchgw, "w", "+m"); diff --git a/tests/test-qdev-global-props.c b/tests/test-qdev-global-props.c index d81b0862d5..b1eb505442 100644 --- a/tests/test-qdev-global-props.c +++ b/tests/test-qdev-global-props.c @@ -89,6 +89,16 @@ static void test_static_prop(void) g_test_trap_assert_stdout(""); } +static void register_global_properties(GlobalProperty *props) +{ + int i; + + for (i = 0; props[i].driver != NULL; i++) { + qdev_prop_register_global(props + i); + } +} + + /* Test setting of static property using global properties */ static void test_static_globalprop_subprocess(void) { @@ -98,7 +108,7 @@ static void test_static_globalprop_subprocess(void) {} }; - qdev_prop_register_global_list(props); + register_global_properties(props); mt = STATIC_TYPE(object_new(TYPE_STATIC_PROPS)); qdev_init_nofail(DEVICE(mt)); @@ -214,17 +224,17 @@ static void test_dynamic_globalprop_subprocess(void) { TYPE_NONDEVICE, "prop6", "106", true }, {} }; - int all_used; + int global_error; - qdev_prop_register_global_list(props); + register_global_properties(props); mt = DYNAMIC_TYPE(object_new(TYPE_DYNAMIC_PROPS)); qdev_init_nofail(DEVICE(mt)); g_assert_cmpuint(mt->prop1, ==, 101); g_assert_cmpuint(mt->prop2, ==, 102); - all_used = qdev_prop_check_globals(); - g_assert_cmpuint(all_used, ==, 1); + global_error = qdev_prop_check_globals(); + g_assert_cmpuint(global_error, ==, 1); g_assert(props[0].used); g_assert(props[1].used); g_assert(!props[2].used); @@ -259,17 +269,17 @@ static void test_dynamic_globalprop_nouser_subprocess(void) { TYPE_NONDEVICE, "prop6", "106" }, {} }; - int all_used; + int global_error; - qdev_prop_register_global_list(props); + register_global_properties(props); mt = DYNAMIC_TYPE(object_new(TYPE_DYNAMIC_PROPS)); qdev_init_nofail(DEVICE(mt)); g_assert_cmpuint(mt->prop1, ==, 101); g_assert_cmpuint(mt->prop2, ==, 102); - all_used = qdev_prop_check_globals(); - g_assert_cmpuint(all_used, ==, 0); + global_error = qdev_prop_check_globals(); + g_assert_cmpuint(global_error, ==, 0); g_assert(props[0].used); g_assert(props[1].used); g_assert(!props[2].used); @@ -299,7 +309,7 @@ static void test_subclass_global_props(void) {} }; - qdev_prop_register_global_list(props); + register_global_properties(props); mt = STATIC_TYPE(object_new(TYPE_SUBCLASS)); qdev_init_nofail(DEVICE(mt)); diff --git a/util/cutils.c b/util/cutils.c index 698bd315bd..0621565930 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -280,6 +280,7 @@ int qemu_strtosz_metric(const char *nptr, char **end, uint64_t *result) static int check_strtox_error(const char *nptr, char *ep, const char **endptr, int libc_errno) { + assert(ep >= nptr); if (endptr) { *endptr = ep; } @@ -327,6 +328,7 @@ int qemu_strtoi(const char *nptr, const char **endptr, int base, char *ep; long long lresult; + assert((unsigned) base <= 36 && base != 1); if (!nptr) { if (endptr) { *endptr = nptr; @@ -379,6 +381,7 @@ int qemu_strtoui(const char *nptr, const char **endptr, int base, char *ep; long long lresult; + assert((unsigned) base <= 36 && base != 1); if (!nptr) { if (endptr) { *endptr = nptr; @@ -435,6 +438,7 @@ int qemu_strtol(const char *nptr, const char **endptr, int base, { char *ep; + assert((unsigned) base <= 36 && base != 1); if (!nptr) { if (endptr) { *endptr = nptr; @@ -477,6 +481,7 @@ int qemu_strtoul(const char *nptr, const char **endptr, int base, { char *ep; + assert((unsigned) base <= 36 && base != 1); if (!nptr) { if (endptr) { *endptr = nptr; @@ -504,6 +509,7 @@ int qemu_strtoi64(const char *nptr, const char **endptr, int base, { char *ep; + assert((unsigned) base <= 36 && base != 1); if (!nptr) { if (endptr) { *endptr = nptr; @@ -527,6 +533,7 @@ int qemu_strtou64(const char *nptr, const char **endptr, int base, { char *ep; + assert((unsigned) base <= 36 && base != 1); if (!nptr) { if (endptr) { *endptr = nptr; @@ -594,6 +601,7 @@ int parse_uint(const char *s, unsigned long long *value, char **endptr, char *endp = (char *)s; unsigned long long val = 0; + assert((unsigned) base <= 36 && base != 1); if (!s) { r = -EINVAL; goto out; diff --git a/util/vfio-helpers.c b/util/vfio-helpers.c index cccc9cd42e..342d4a2285 100644 --- a/util/vfio-helpers.c +++ b/util/vfio-helpers.c @@ -348,7 +348,7 @@ static int qemu_vfio_init_pci(QEMUVFIOState *s, const char *device, goto fail; } - for (i = 0; i < 6; i++) { + for (i = 0; i < ARRAY_SIZE(s->bar_region_info); i++) { ret = qemu_vfio_pci_init_bar(s, i, errp); if (ret) { goto fail; |