All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/26] Various qom & qdev enhancements
@ 2020-01-10 15:30 Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 01/26] object: add extra sanity checks Marc-André Lureau
                   ` (26 more replies)
  0 siblings, 27 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

aa bpkwef

Marc-André Lureau (26):
  object: add extra sanity checks
  qdev: remove duplicated qdev_property_add_static() doc
  qdev: remove extraneous error
  qdev: move helper function to monitor/misc
  object: avoid extra class property key duplication
  object: add class property initializer
  object: add object_property_get_defaut()
  object: make object_class_property_add* return property
  qstring: add qstring_free()
  object: add object_property_set_defaut_{bool,str,int,uint}()
  object: do not free class properties
  object: check strong flag with &
  object: rename link "child" to "target"
  object: add direct link flag
  object: express const link with link property
  object: add object_class_property_add_link()
  object: release all props
  object: return self in object_ref()
  qdev: set properties with device_class_set_props()
  qdev: move instance properties to class properties
  qdev: register properties as class properties
  vl: print default value in object help
  qom: simplify qmp_device_list_properties()
  qom: introduce object_property_help()
  qapi/qmp: add ObjectPropertyInfo.default-value
  qdev: use object_property_help()

 qapi/qom.json                       |   7 +-
 include/hw/qdev-core.h              |   8 +-
 include/hw/qdev-properties.h        |   3 +-
 include/qapi/qmp/qstring.h          |   1 +
 include/qom/object.h                | 126 ++++++++++--
 hw/9pfs/virtio-9p-device.c          |   2 +-
 hw/acpi/generic_event_device.c      |   2 +-
 hw/acpi/piix4.c                     |   2 +-
 hw/acpi/vmgenid.c                   |   2 +-
 hw/arm/armsse.c                     |   2 +-
 hw/arm/armv7m.c                     |   4 +-
 hw/arm/aspeed_soc.c                 |   2 +-
 hw/arm/bcm2836.c                    |   2 +-
 hw/arm/integratorcp.c               |   2 +-
 hw/arm/msf2-soc.c                   |   2 +-
 hw/arm/musicpal.c                   |   2 +-
 hw/arm/nrf51_soc.c                  |   2 +-
 hw/arm/pxa2xx.c                     |   4 +-
 hw/arm/pxa2xx_gpio.c                |   2 +-
 hw/arm/smmu-common.c                |   2 +-
 hw/arm/spitz.c                      |   2 +-
 hw/arm/stm32f205_soc.c              |   2 +-
 hw/arm/strongarm.c                  |   2 +-
 hw/arm/xlnx-versal.c                |   2 +-
 hw/arm/xlnx-zynqmp.c                |   2 +-
 hw/audio/ac97.c                     |   2 +-
 hw/audio/adlib.c                    |   2 +-
 hw/audio/cs4231.c                   |   2 +-
 hw/audio/cs4231a.c                  |   2 +-
 hw/audio/es1370.c                   |   2 +-
 hw/audio/gus.c                      |   2 +-
 hw/audio/hda-codec.c                |   2 +-
 hw/audio/intel-hda.c                |   4 +-
 hw/audio/milkymist-ac97.c           |   2 +-
 hw/audio/pcspk.c                    |   2 +-
 hw/audio/pl041.c                    |   2 +-
 hw/audio/sb16.c                     |   2 +-
 hw/audio/wm8750.c                   |   2 +-
 hw/block/fdc.c                      |   8 +-
 hw/block/m25p80.c                   |   2 +-
 hw/block/nand.c                     |   2 +-
 hw/block/nvme.c                     |   2 +-
 hw/block/onenand.c                  |   2 +-
 hw/block/pflash_cfi01.c             |   2 +-
 hw/block/pflash_cfi02.c             |   2 +-
 hw/block/swim.c                     |   2 +-
 hw/block/vhost-user-blk.c           |   2 +-
 hw/block/virtio-blk.c               |   2 +-
 hw/block/xen-block.c                |   2 +-
 hw/char/bcm2835_aux.c               |   2 +-
 hw/char/cadence_uart.c              |   2 +-
 hw/char/cmsdk-apb-uart.c            |   2 +-
 hw/char/debugcon.c                  |   2 +-
 hw/char/digic-uart.c                |   2 +-
 hw/char/escc.c                      |   2 +-
 hw/char/etraxfs_ser.c               |   2 +-
 hw/char/exynos4210_uart.c           |   2 +-
 hw/char/grlib_apbuart.c             |   2 +-
 hw/char/imx_serial.c                |   2 +-
 hw/char/ipoctal232.c                |   2 +-
 hw/char/lm32_juart.c                |   2 +-
 hw/char/lm32_uart.c                 |   2 +-
 hw/char/mcf_uart.c                  |   2 +-
 hw/char/milkymist-uart.c            |   2 +-
 hw/char/nrf51_uart.c                |   2 +-
 hw/char/parallel.c                  |   2 +-
 hw/char/pl011.c                     |   2 +-
 hw/char/sclpconsole-lm.c            |   2 +-
 hw/char/sclpconsole.c               |   2 +-
 hw/char/serial-isa.c                |   2 +-
 hw/char/serial-pci-multi.c          |   4 +-
 hw/char/serial-pci.c                |   2 +-
 hw/char/serial.c                    |   4 +-
 hw/char/spapr_vty.c                 |   2 +-
 hw/char/stm32f2xx_usart.c           |   2 +-
 hw/char/terminal3270.c              |   2 +-
 hw/char/virtio-console.c            |   2 +-
 hw/char/virtio-serial-bus.c         |   4 +-
 hw/char/xilinx_uartlite.c           |   2 +-
 hw/core/cpu.c                       |   2 +-
 hw/core/generic-loader.c            |   2 +-
 hw/core/or-irq.c                    |   2 +-
 hw/core/platform-bus.c              |   2 +-
 hw/core/qdev-properties.c           |  38 ++--
 hw/core/qdev.c                      | 155 ++++++--------
 hw/core/split-irq.c                 |   2 +-
 hw/cpu/a15mpcore.c                  |   2 +-
 hw/cpu/a9mpcore.c                   |   2 +-
 hw/cpu/arm11mpcore.c                |   2 +-
 hw/cpu/cluster.c                    |   2 +-
 hw/cpu/realview_mpcore.c            |   2 +-
 hw/display/ati.c                    |   2 +-
 hw/display/bcm2835_fb.c             |   2 +-
 hw/display/bochs-display.c          |   2 +-
 hw/display/cg3.c                    |   2 +-
 hw/display/cirrus_vga.c             |   2 +-
 hw/display/cirrus_vga_isa.c         |   2 +-
 hw/display/g364fb.c                 |   2 +-
 hw/display/i2c-ddc.c                |   2 +-
 hw/display/macfb.c                  |   4 +-
 hw/display/milkymist-vgafb.c        |   2 +-
 hw/display/qxl.c                    |   2 +-
 hw/display/ramfb-standalone.c       |   2 +-
 hw/display/sm501.c                  |   4 +-
 hw/display/tcx.c                    |   2 +-
 hw/display/vga-isa.c                |   2 +-
 hw/display/vga-pci.c                |   4 +-
 hw/display/vhost-user-gpu.c         |   2 +-
 hw/display/virtio-gpu-pci.c         |   2 +-
 hw/display/virtio-gpu.c             |   2 +-
 hw/display/virtio-vga.c             |   2 +-
 hw/display/vmware_vga.c             |   2 +-
 hw/dma/i82374.c                     |   2 +-
 hw/dma/i8257.c                      |   2 +-
 hw/dma/pl080.c                      |   2 +-
 hw/dma/pl330.c                      |   2 +-
 hw/dma/pxa2xx_dma.c                 |   2 +-
 hw/dma/xilinx_axidma.c              |   2 +-
 hw/dma/xlnx-zdma.c                  |   2 +-
 hw/gpio/imx_gpio.c                  |   2 +-
 hw/gpio/omap_gpio.c                 |   4 +-
 hw/i2c/aspeed_i2c.c                 |   2 +-
 hw/i2c/core.c                       |   2 +-
 hw/i2c/omap_i2c.c                   |   2 +-
 hw/i386/intel_iommu.c               |   2 +-
 hw/i386/kvm/clock.c                 |   2 +-
 hw/i386/kvm/i8254.c                 |   2 +-
 hw/i386/kvm/ioapic.c                |   2 +-
 hw/i386/vmmouse.c                   |   2 +-
 hw/i386/x86-iommu.c                 |   2 +-
 hw/i386/xen/xen_pvdevice.c          |   2 +-
 hw/ide/ahci.c                       |   2 +-
 hw/ide/cmd646.c                     |   2 +-
 hw/ide/isa.c                        |   2 +-
 hw/ide/macio.c                      |   2 +-
 hw/ide/mmio.c                       |   2 +-
 hw/ide/qdev.c                       |   8 +-
 hw/input/adb.c                      |   2 +-
 hw/input/milkymist-softusb.c        |   2 +-
 hw/input/virtio-input-hid.c         |   6 +-
 hw/input/virtio-input-host.c        |   2 +-
 hw/input/virtio-input.c             |   2 +-
 hw/intc/apic_common.c               |   2 +-
 hw/intc/arm_gic_common.c            |   2 +-
 hw/intc/arm_gicv2m.c                |   2 +-
 hw/intc/arm_gicv3_common.c          |   2 +-
 hw/intc/arm_gicv3_its_kvm.c         |   2 +-
 hw/intc/armv7m_nvic.c               |   2 +-
 hw/intc/exynos4210_combiner.c       |   2 +-
 hw/intc/exynos4210_gic.c            |   4 +-
 hw/intc/i8259_common.c              |   2 +-
 hw/intc/ioapic.c                    |   2 +-
 hw/intc/mips_gic.c                  |   2 +-
 hw/intc/omap_intc.c                 |   4 +-
 hw/intc/ompic.c                     |   2 +-
 hw/intc/openpic.c                   |   2 +-
 hw/intc/openpic_kvm.c               |   2 +-
 hw/intc/pnv_xive.c                  |   2 +-
 hw/intc/s390_flic.c                 |   2 +-
 hw/intc/spapr_xive.c                |   2 +-
 hw/intc/xics.c                      |   4 +-
 hw/intc/xilinx_intc.c               |   2 +-
 hw/intc/xive.c                      |   6 +-
 hw/intc/xlnx-pmu-iomod-intc.c       |   2 +-
 hw/ipack/ipack.c                    |   2 +-
 hw/ipmi/ipmi.c                      |   2 +-
 hw/ipmi/ipmi_bmc_extern.c           |   2 +-
 hw/ipmi/ipmi_bmc_sim.c              |   2 +-
 hw/ipmi/isa_ipmi_bt.c               |   2 +-
 hw/ipmi/isa_ipmi_kcs.c              |   2 +-
 hw/isa/lpc_ich9.c                   |   2 +-
 hw/isa/pc87312.c                    |   2 +-
 hw/isa/vt82c686.c                   |   2 +-
 hw/mem/nvdimm.c                     |   2 +-
 hw/mem/pc-dimm.c                    |   2 +-
 hw/mips/cps.c                       |   2 +-
 hw/misc/a9scu.c                     |   2 +-
 hw/misc/applesmc.c                  |   2 +-
 hw/misc/arm11scu.c                  |   2 +-
 hw/misc/arm_l2x0.c                  |   2 +-
 hw/misc/arm_sysctl.c                |   2 +-
 hw/misc/armsse-cpuid.c              |   2 +-
 hw/misc/aspeed_scu.c                |   2 +-
 hw/misc/aspeed_sdmc.c               |   2 +-
 hw/misc/bcm2835_property.c          |   2 +-
 hw/misc/debugexit.c                 |   2 +-
 hw/misc/eccmemctl.c                 |   2 +-
 hw/misc/iotkit-sysctl.c             |   2 +-
 hw/misc/iotkit-sysinfo.c            |   2 +-
 hw/misc/ivshmem.c                   |   4 +-
 hw/misc/mac_via.c                   |   2 +-
 hw/misc/macio/cuda.c                |   2 +-
 hw/misc/macio/macio.c               |   4 +-
 hw/misc/macio/pmu.c                 |   2 +-
 hw/misc/mips_cmgcr.c                |   2 +-
 hw/misc/mips_cpc.c                  |   2 +-
 hw/misc/mips_itu.c                  |   2 +-
 hw/misc/mos6522.c                   |   2 +-
 hw/misc/mps2-fpgaio.c               |   2 +-
 hw/misc/mps2-scc.c                  |   2 +-
 hw/misc/msf2-sysreg.c               |   2 +-
 hw/misc/nrf51_rng.c                 |   2 +-
 hw/misc/pci-testdev.c               |   2 +-
 hw/misc/pvpanic.c                   |   2 +-
 hw/misc/tz-mpc.c                    |   2 +-
 hw/misc/tz-msc.c                    |   2 +-
 hw/misc/tz-ppc.c                    |   2 +-
 hw/misc/unimp.c                     |   2 +-
 hw/net/allwinner_emac.c             |   2 +-
 hw/net/cadence_gem.c                |   2 +-
 hw/net/dp8393x.c                    |   2 +-
 hw/net/e1000.c                      |   2 +-
 hw/net/e1000e.c                     |   2 +-
 hw/net/eepro100.c                   |   2 +-
 hw/net/etraxfs_eth.c                |   2 +-
 hw/net/fsl_etsec/etsec.c            |   2 +-
 hw/net/ftgmac100.c                  |   4 +-
 hw/net/imx_fec.c                    |   2 +-
 hw/net/lan9118.c                    |   2 +-
 hw/net/lance.c                      |   2 +-
 hw/net/mcf_fec.c                    |   2 +-
 hw/net/milkymist-minimac2.c         |   2 +-
 hw/net/mipsnet.c                    |   2 +-
 hw/net/ne2000-isa.c                 |   2 +-
 hw/net/ne2000-pci.c                 |   2 +-
 hw/net/opencores_eth.c              |   2 +-
 hw/net/pcnet-pci.c                  |   2 +-
 hw/net/rocker/rocker.c              |   2 +-
 hw/net/rtl8139.c                    |   2 +-
 hw/net/smc91c111.c                  |   2 +-
 hw/net/spapr_llan.c                 |   2 +-
 hw/net/stellaris_enet.c             |   2 +-
 hw/net/sungem.c                     |   2 +-
 hw/net/sunhme.c                     |   2 +-
 hw/net/tulip.c                      |   2 +-
 hw/net/virtio-net.c                 |   2 +-
 hw/net/vmxnet3.c                    |   2 +-
 hw/net/xgmac.c                      |   2 +-
 hw/net/xilinx_axienet.c             |   2 +-
 hw/net/xilinx_ethlite.c             |   2 +-
 hw/nvram/ds1225y.c                  |   2 +-
 hw/nvram/eeprom_at24c.c             |   2 +-
 hw/nvram/fw_cfg.c                   |   4 +-
 hw/nvram/mac_nvram.c                |   2 +-
 hw/nvram/nrf51_nvm.c                |   2 +-
 hw/nvram/spapr_nvram.c              |   2 +-
 hw/pci-bridge/gen_pcie_root_port.c  |   2 +-
 hw/pci-bridge/pci_bridge_dev.c      |   2 +-
 hw/pci-bridge/pci_expander_bridge.c |   4 +-
 hw/pci-bridge/pcie_pci_bridge.c     |   2 +-
 hw/pci-bridge/pcie_root_port.c      |   2 +-
 hw/pci-bridge/xio3130_downstream.c  |   2 +-
 hw/pci-host/grackle.c               |   2 +-
 hw/pci-host/i440fx.c                |   2 +-
 hw/pci-host/ppce500.c               |   2 +-
 hw/pci-host/prep.c                  |   2 +-
 hw/pci-host/q35.c                   |   4 +-
 hw/pci-host/sabre.c                 |   2 +-
 hw/pci-host/uninorth.c              |   2 +-
 hw/pci-host/versatile.c             |   2 +-
 hw/pci-host/xilinx-pcie.c           |   2 +-
 hw/pci/pci.c                        |   2 +-
 hw/pci/pcie_port.c                  |   4 +-
 hw/ppc/pnv.c                        |   2 +-
 hw/ppc/pnv_core.c                   |   4 +-
 hw/ppc/pnv_homer.c                  |   2 +-
 hw/ppc/pnv_lpc.c                    |   2 +-
 hw/ppc/pnv_occ.c                    |   2 +-
 hw/ppc/pnv_pnor.c                   |   2 +-
 hw/ppc/pnv_psi.c                    |   2 +-
 hw/ppc/ppc440_uc.c                  |   2 +-
 hw/ppc/prep_systemio.c              |   2 +-
 hw/ppc/rs6000_mc.c                  |   2 +-
 hw/ppc/spapr_cpu_core.c             |   2 +-
 hw/ppc/spapr_pci.c                  |   2 +-
 hw/ppc/spapr_rng.c                  |   2 +-
 hw/ppc/spapr_tpm_proxy.c            |   2 +-
 hw/rdma/vmw/pvrdma_main.c           |   2 +-
 hw/riscv/riscv_hart.c               |   2 +-
 hw/riscv/sifive_clint.c             |   2 +-
 hw/riscv/sifive_plic.c              |   2 +-
 hw/riscv/sifive_u_otp.c             |   2 +-
 hw/rtc/m48t59-isa.c                 |   2 +-
 hw/rtc/m48t59.c                     |   2 +-
 hw/rtc/mc146818rtc.c                |   2 +-
 hw/rtc/pl031.c                      |   2 +-
 hw/s390x/3270-ccw.c                 |   2 +-
 hw/s390x/ccw-device.c               |   2 +-
 hw/s390x/css-bridge.c               |   2 +-
 hw/s390x/ipl.c                      |   2 +-
 hw/s390x/s390-pci-bus.c             |   2 +-
 hw/s390x/vhost-vsock-ccw.c          |   2 +-
 hw/s390x/virtio-ccw-9p.c            |   2 +-
 hw/s390x/virtio-ccw-balloon.c       |   2 +-
 hw/s390x/virtio-ccw-blk.c           |   2 +-
 hw/s390x/virtio-ccw-crypto.c        |   2 +-
 hw/s390x/virtio-ccw-gpu.c           |   2 +-
 hw/s390x/virtio-ccw-input.c         |   2 +-
 hw/s390x/virtio-ccw-net.c           |   2 +-
 hw/s390x/virtio-ccw-rng.c           |   2 +-
 hw/s390x/virtio-ccw-scsi.c          |   4 +-
 hw/s390x/virtio-ccw-serial.c        |   2 +-
 hw/scsi/megasas.c                   |   2 +-
 hw/scsi/mptsas.c                    |   2 +-
 hw/scsi/scsi-bus.c                  |   2 +-
 hw/scsi/scsi-disk.c                 |   8 +-
 hw/scsi/scsi-generic.c              |   2 +-
 hw/scsi/spapr_vscsi.c               |   2 +-
 hw/scsi/vhost-scsi.c                |   2 +-
 hw/scsi/vhost-user-scsi.c           |   2 +-
 hw/scsi/virtio-scsi.c               |   2 +-
 hw/scsi/vmw_pvscsi.c                |   2 +-
 hw/sd/sd.c                          |   2 +-
 hw/sd/sdhci-pci.c                   |   2 +-
 hw/sd/sdhci.c                       |   2 +-
 hw/sparc/sun4m.c                    |   4 +-
 hw/sparc/sun4m_iommu.c              |   2 +-
 hw/sparc64/sun4u.c                  |   6 +-
 hw/ssi/aspeed_smc.c                 |   2 +-
 hw/ssi/xilinx_spi.c                 |   2 +-
 hw/ssi/xilinx_spips.c               |   4 +-
 hw/timer/a9gtimer.c                 |   2 +-
 hw/timer/allwinner-a10-pit.c        |   2 +-
 hw/timer/altera_timer.c             |   2 +-
 hw/timer/arm_mptimer.c              |   2 +-
 hw/timer/arm_timer.c                |   2 +-
 hw/timer/aspeed_timer.c             |   2 +-
 hw/timer/cmsdk-apb-dualtimer.c      |   2 +-
 hw/timer/cmsdk-apb-timer.c          |   2 +-
 hw/timer/grlib_gptimer.c            |   2 +-
 hw/timer/hpet.c                     |   2 +-
 hw/timer/i8254.c                    |   2 +-
 hw/timer/lm32_timer.c               |   2 +-
 hw/timer/milkymist-sysctl.c         |   2 +-
 hw/timer/mss-timer.c                |   2 +-
 hw/timer/pxa2xx_timer.c             |   4 +-
 hw/timer/slavio_timer.c             |   2 +-
 hw/timer/stm32f2xx_timer.c          |   2 +-
 hw/timer/xilinx_timer.c             |   2 +-
 hw/tpm/tpm_crb.c                    |   2 +-
 hw/tpm/tpm_tis.c                    |   2 +-
 hw/usb/bus.c                        |   2 +-
 hw/usb/ccid-card-emulated.c         |   2 +-
 hw/usb/ccid-card-passthru.c         |   2 +-
 hw/usb/dev-audio.c                  |   2 +-
 hw/usb/dev-hid.c                    |   6 +-
 hw/usb/dev-hub.c                    |   2 +-
 hw/usb/dev-mtp.c                    |   2 +-
 hw/usb/dev-network.c                |   2 +-
 hw/usb/dev-serial.c                 |   4 +-
 hw/usb/dev-smartcard-reader.c       |   4 +-
 hw/usb/dev-storage.c                |   2 +-
 hw/usb/dev-uas.c                    |   2 +-
 hw/usb/hcd-ehci-pci.c               |   2 +-
 hw/usb/hcd-ehci-sysbus.c            |   2 +-
 hw/usb/hcd-ohci-pci.c               |   2 +-
 hw/usb/hcd-ohci.c                   |   2 +-
 hw/usb/hcd-uhci.c                   |   4 +-
 hw/usb/hcd-xhci-nec.c               |   2 +-
 hw/usb/hcd-xhci.c                   |   2 +-
 hw/usb/host-libusb.c                |   2 +-
 hw/usb/redirect.c                   |   2 +-
 hw/vfio/ap.c                        |   2 +-
 hw/vfio/ccw.c                       |   2 +-
 hw/vfio/pci.c                       |   4 +-
 hw/vfio/platform.c                  |   2 +-
 hw/virtio/vhost-scsi-pci.c          |   2 +-
 hw/virtio/vhost-user-blk-pci.c      |   2 +-
 hw/virtio/vhost-user-fs-pci.c       |   2 +-
 hw/virtio/vhost-user-fs.c           |   2 +-
 hw/virtio/vhost-user-scsi-pci.c     |   2 +-
 hw/virtio/vhost-vsock-pci.c         |   2 +-
 hw/virtio/vhost-vsock.c             |   2 +-
 hw/virtio/virtio-9p-pci.c           |   2 +-
 hw/virtio/virtio-balloon-pci.c      |   2 +-
 hw/virtio/virtio-balloon.c          |   2 +-
 hw/virtio/virtio-blk-pci.c          |   2 +-
 hw/virtio/virtio-crypto-pci.c       |   2 +-
 hw/virtio/virtio-crypto.c           |   2 +-
 hw/virtio/virtio-input-pci.c        |   2 +-
 hw/virtio/virtio-mmio.c             |   2 +-
 hw/virtio/virtio-net-pci.c          |   2 +-
 hw/virtio/virtio-pci.c              |   4 +-
 hw/virtio/virtio-pmem.c             |   2 +-
 hw/virtio/virtio-rng.c              |   2 +-
 hw/virtio/virtio-scsi-pci.c         |   2 +-
 hw/virtio/virtio-serial-pci.c       |   2 +-
 hw/virtio/virtio.c                  |   2 +-
 hw/watchdog/cmsdk-apb-watchdog.c    |   2 +-
 hw/watchdog/wdt_aspeed.c            |   2 +-
 hw/xen/xen-bus.c                    |   2 +-
 hw/xen/xen-legacy-backend.c         |   4 +-
 hw/xen/xen_pt.c                     |   2 +-
 migration/migration.c               |   2 +-
 monitor/misc.c                      |  26 +++
 qdev-monitor.c                      |  15 +-
 qobject/qstring.c                   |  27 ++-
 qom/object.c                        | 305 +++++++++++++++++++++-------
 qom/object_interfaces.c             |  33 ++-
 qom/qom-qmp-cmds.c                  |  54 +----
 target/arm/cpu.c                    |  38 ++--
 target/i386/cpu.c                   |   4 +-
 target/microblaze/cpu.c             |   2 +-
 target/nios2/cpu.c                  |   2 +-
 target/ppc/translate_init.inc.c     |  10 +-
 target/riscv/cpu.c                  |   2 +-
 target/s390x/cpu.c                  |   2 +-
 target/sparc/cpu.c                  |   2 +-
 tests/test-qdev-global-props.c      |   2 +-
 409 files changed, 987 insertions(+), 745 deletions(-)

-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 01/26] object: add extra sanity checks
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 19:18   ` Philippe Mathieu-Daudé
  2020-01-10 15:30 ` [PATCH 02/26] qdev: remove duplicated qdev_property_add_static() doc Marc-André Lureau
                   ` (25 subsequent siblings)
  26 siblings, 1 reply; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Type system checked that children class_size >= parent class_size, but
not instances. Fix that.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qom/object.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/qom/object.c b/qom/object.c
index 0d971ca897..8453e4ac91 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -303,6 +303,7 @@ static void type_initialize(TypeImpl *ti)
         int i;
 
         g_assert(parent->class_size <= ti->class_size);
+        g_assert(parent->instance_size <= ti->instance_size);
         memcpy(ti->class, parent->class, parent->class_size);
         ti->class->interfaces = NULL;
         ti->class->properties = g_hash_table_new_full(
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 02/26] qdev: remove duplicated qdev_property_add_static() doc
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 01/26] object: add extra sanity checks Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 03/26] qdev: remove extraneous error Marc-André Lureau
                   ` (24 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

The function is already documented in the header.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/core/qdev.c | 10 ----------
 1 file changed, 10 deletions(-)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 9f1753f5cf..48fae0b932 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -717,16 +717,6 @@ static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
     g_free(name);
 }
 
-/**
- * qdev_property_add_static:
- * @dev: Device to add the property to.
- * @prop: The qdev property definition.
- * @errp: location to store error information.
- *
- * Add a static QOM property to @dev for qdev property @prop.
- * On error, store error in @errp.  Static properties access data in a struct.
- * The type of the QOM property is derived from prop->info.
- */
 void qdev_property_add_static(DeviceState *dev, Property *prop,
                               Error **errp)
 {
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 03/26] qdev: remove extraneous error
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 01/26] object: add extra sanity checks Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 02/26] qdev: remove duplicated qdev_property_add_static() doc Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 04/26] qdev: move helper function to monitor/misc Marc-André Lureau
                   ` (23 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

All callers use error_abort, and even the function itself calls with
error_abort.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/qdev-properties.h |  3 +--
 hw/core/qdev.c               | 15 ++++-----------
 target/arm/cpu.c             | 36 ++++++++++++------------------------
 3 files changed, 17 insertions(+), 37 deletions(-)

diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index a90a9cec80..906e697c58 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -253,13 +253,12 @@ void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
  * qdev_property_add_static:
  * @dev: Device to add the property to.
  * @prop: The qdev property definition.
- * @errp: location to store error information.
  *
  * Add a static QOM property to @dev for qdev property @prop.
  * On error, store error in @errp.  Static properties access data in a struct.
  * The type of the QOM property is derived from prop->info.
  */
-void qdev_property_add_static(DeviceState *dev, Property *prop, Error **errp);
+void qdev_property_add_static(DeviceState *dev, Property *prop);
 
 void qdev_alias_all_properties(DeviceState *target, Object *source);
 
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 48fae0b932..c2aa7f91a6 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -717,24 +717,17 @@ static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
     g_free(name);
 }
 
-void qdev_property_add_static(DeviceState *dev, Property *prop,
-                              Error **errp)
+void qdev_property_add_static(DeviceState *dev, Property *prop)
 {
-    Error *local_err = NULL;
     Object *obj = OBJECT(dev);
 
     if (prop->info->create) {
-        prop->info->create(obj, prop, &local_err);
+        prop->info->create(obj, prop, &error_abort);
     } else {
         object_property_add(obj, prop->name, prop->info->name,
                             prop->info->get, prop->info->set,
                             prop->info->release,
-                            prop, &local_err);
-    }
-
-    if (local_err) {
-        error_propagate(errp, local_err);
-        return;
+                            prop, &error_abort);
     }
 
     object_property_set_description(obj, prop->name,
@@ -988,7 +981,7 @@ static void device_initfn(Object *obj)
     do {
         for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
             qdev_property_add_legacy(dev, prop, &error_abort);
-            qdev_property_add_static(dev, prop, &error_abort);
+            qdev_property_add_static(dev, prop);
         }
         class = object_class_get_parent(class);
     } while (class != object_class_by_name(TYPE_DEVICE));
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index d62fd5fdc6..6921464e2b 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1104,26 +1104,22 @@ void arm_cpu_post_init(Object *obj)
 
     if (arm_feature(&cpu->env, ARM_FEATURE_CBAR) ||
         arm_feature(&cpu->env, ARM_FEATURE_CBAR_RO)) {
-        qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_cbar_property,
-                                 &error_abort);
+        qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_cbar_property);
     }
 
     if (!arm_feature(&cpu->env, ARM_FEATURE_M)) {
-        qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_hivecs_property,
-                                 &error_abort);
+        qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_hivecs_property);
     }
 
     if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
-        qdev_property_add_static(DEVICE(obj), &arm_cpu_rvbar_property,
-                                 &error_abort);
+        qdev_property_add_static(DEVICE(obj), &arm_cpu_rvbar_property);
     }
 
     if (arm_feature(&cpu->env, ARM_FEATURE_EL3)) {
         /* Add the has_el3 state CPU property only if EL3 is allowed.  This will
          * prevent "has_el3" from existing on CPUs which cannot support EL3.
          */
-        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_el3_property,
-                                 &error_abort);
+        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_el3_property);
 
 #ifndef CONFIG_USER_ONLY
         object_property_add_link(obj, "secure-memory",
@@ -1136,8 +1132,7 @@ void arm_cpu_post_init(Object *obj)
     }
 
     if (arm_feature(&cpu->env, ARM_FEATURE_EL2)) {
-        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_el2_property,
-                                 &error_abort);
+        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_el2_property);
     }
 
     if (arm_feature(&cpu->env, ARM_FEATURE_PMU)) {
@@ -1154,32 +1149,27 @@ void arm_cpu_post_init(Object *obj)
     if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
         cpu->has_vfp = true;
         if (!kvm_enabled()) {
-            qdev_property_add_static(DEVICE(obj), &arm_cpu_has_vfp_property,
-                                     &error_abort);
+            qdev_property_add_static(DEVICE(obj), &arm_cpu_has_vfp_property);
         }
     }
 
     if (arm_feature(&cpu->env, ARM_FEATURE_NEON)) {
         cpu->has_neon = true;
         if (!kvm_enabled()) {
-            qdev_property_add_static(DEVICE(obj), &arm_cpu_has_neon_property,
-                                     &error_abort);
+            qdev_property_add_static(DEVICE(obj), &arm_cpu_has_neon_property);
         }
     }
 
     if (arm_feature(&cpu->env, ARM_FEATURE_M) &&
         arm_feature(&cpu->env, ARM_FEATURE_THUMB_DSP)) {
-        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_dsp_property,
-                                 &error_abort);
+        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_dsp_property);
     }
 
     if (arm_feature(&cpu->env, ARM_FEATURE_PMSA)) {
-        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_mpu_property,
-                                 &error_abort);
+        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_mpu_property);
         if (arm_feature(&cpu->env, ARM_FEATURE_V7)) {
             qdev_property_add_static(DEVICE(obj),
-                                     &arm_cpu_pmsav7_dregion_property,
-                                     &error_abort);
+                                     &arm_cpu_pmsav7_dregion_property);
         }
     }
 
@@ -1198,12 +1188,10 @@ void arm_cpu_post_init(Object *obj)
                             NULL, NULL, &error_abort);
     }
 
-    qdev_property_add_static(DEVICE(obj), &arm_cpu_cfgend_property,
-                             &error_abort);
+    qdev_property_add_static(DEVICE(obj), &arm_cpu_cfgend_property);
 
     if (arm_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER)) {
-        qdev_property_add_static(DEVICE(cpu), &arm_cpu_gt_cntfrq_property,
-                                 &error_abort);
+        qdev_property_add_static(DEVICE(cpu), &arm_cpu_gt_cntfrq_property);
     }
 }
 
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 04/26] qdev: move helper function to monitor/misc
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (2 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 03/26] qdev: remove extraneous error Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 19:18   ` Philippe Mathieu-Daudé
  2020-01-10 15:30 ` [PATCH 05/26] object: avoid extra class property key duplication Marc-André Lureau
                   ` (22 subsequent siblings)
  26 siblings, 1 reply; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Move the one-user function to the place it is being used.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/qdev-core.h |  2 --
 hw/core/qdev.c         | 26 --------------------------
 monitor/misc.c         | 26 ++++++++++++++++++++++++++
 3 files changed, 26 insertions(+), 28 deletions(-)

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 1518495b1e..6b0e7b265d 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -457,8 +457,6 @@ extern bool qdev_hot_removed;
 
 char *qdev_get_dev_path(DeviceState *dev);
 
-GSList *qdev_build_hotpluggable_device_list(Object *peripheral);
-
 void qbus_set_hotplug_handler(BusState *bus, Object *handler, Error **errp);
 
 void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp);
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index c2aa7f91a6..a520d7fa89 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -760,32 +760,6 @@ void qdev_alias_all_properties(DeviceState *target, Object *source)
     } while (class != object_class_by_name(TYPE_DEVICE));
 }
 
-static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
-{
-    GSList **list = opaque;
-    DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
-                                                          TYPE_DEVICE);
-
-    if (dev == NULL) {
-        return 0;
-    }
-
-    if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
-        *list = g_slist_append(*list, dev);
-    }
-
-    return 0;
-}
-
-GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
-{
-    GSList *list = NULL;
-
-    object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
-
-    return list;
-}
-
 static bool device_get_realized(Object *obj, Error **errp)
 {
     DeviceState *dev = DEVICE(obj);
diff --git a/monitor/misc.c b/monitor/misc.c
index a04d7edde0..be3c700511 100644
--- a/monitor/misc.c
+++ b/monitor/misc.c
@@ -1954,6 +1954,32 @@ void object_add_completion(ReadLineState *rs, int nb_args, const char *str)
     g_slist_free(list);
 }
 
+static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
+{
+    GSList **list = opaque;
+    DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
+                                                          TYPE_DEVICE);
+
+    if (dev == NULL) {
+        return 0;
+    }
+
+    if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
+        *list = g_slist_append(*list, dev);
+    }
+
+    return 0;
+}
+
+static GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
+{
+    GSList *list = NULL;
+
+    object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
+
+    return list;
+}
+
 static void peripheral_device_del_completion(ReadLineState *rs,
                                              const char *str, size_t len)
 {
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 05/26] object: avoid extra class property key duplication
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (3 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 04/26] qdev: move helper function to monitor/misc Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 06/26] object: add class property initializer Marc-André Lureau
                   ` (21 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Like object properties, no need to duplicate property name, as it is
owned already by ObjectProperty value.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qom/object.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/qom/object.c b/qom/object.c
index 8453e4ac91..29101fdcd4 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -307,7 +307,7 @@ static void type_initialize(TypeImpl *ti)
         memcpy(ti->class, parent->class, parent->class_size);
         ti->class->interfaces = NULL;
         ti->class->properties = g_hash_table_new_full(
-            g_str_hash, g_str_equal, g_free, object_property_free);
+            g_str_hash, g_str_equal, NULL, object_property_free);
 
         for (e = parent->class->interfaces; e; e = e->next) {
             InterfaceClass *iface = e->data;
@@ -334,7 +334,7 @@ static void type_initialize(TypeImpl *ti)
         }
     } else {
         ti->class->properties = g_hash_table_new_full(
-            g_str_hash, g_str_equal, g_free, object_property_free);
+            g_str_hash, g_str_equal, NULL, object_property_free);
     }
 
     ti->class->type = ti;
@@ -1178,7 +1178,7 @@ object_class_property_add(ObjectClass *klass,
     prop->release = release;
     prop->opaque = opaque;
 
-    g_hash_table_insert(klass->properties, g_strdup(name), prop);
+    g_hash_table_insert(klass->properties, prop->name, prop);
 
     return prop;
 }
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 06/26] object: add class property initializer
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (4 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 05/26] object: avoid extra class property key duplication Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 07/26] object: add object_property_get_defaut() Marc-André Lureau
                   ` (20 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

This callback is used to set default value in following patch "object:
add object_property_set_defaut_{bool,str,int,uint}()".

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h | 16 ++++++++++++++--
 qom/object.c         | 14 ++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 54a548868c..29f47d3b35 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -309,6 +309,8 @@ typedef struct InterfaceInfo InterfaceInfo;
  */
 
 
+typedef struct ObjectProperty ObjectProperty;
+
 /**
  * ObjectPropertyAccessor:
  * @obj: the object that owns the property
@@ -356,7 +358,16 @@ typedef void (ObjectPropertyRelease)(Object *obj,
                                      const char *name,
                                      void *opaque);
 
-typedef struct ObjectProperty
+/**
+ * ObjectPropertyInit:
+ * @obj: the object that owns the property
+ * @prop: the property to set
+ *
+ * Called when a property is initialized.
+ */
+typedef void (ObjectPropertyInit)(Object *obj, ObjectProperty *prop);
+
+struct ObjectProperty
 {
     gchar *name;
     gchar *type;
@@ -365,8 +376,9 @@ typedef struct ObjectProperty
     ObjectPropertyAccessor *set;
     ObjectPropertyResolve *resolve;
     ObjectPropertyRelease *release;
+    ObjectPropertyInit *init;
     void *opaque;
-} ObjectProperty;
+};
 
 /**
  * ObjectUnparent:
diff --git a/qom/object.c b/qom/object.c
index 29101fdcd4..1e9113bfc8 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -469,6 +469,19 @@ void object_apply_compat_props(Object *obj)
     }
 }
 
+static void object_class_property_init_all(Object *obj)
+{
+    ObjectPropertyIterator iter;
+    ObjectProperty *prop;
+
+    object_class_property_iter_init(&iter, object_get_class(obj));
+    while ((prop = object_property_iter_next(&iter))) {
+        if (prop->init) {
+            prop->init(obj, prop);
+        }
+    }
+}
+
 static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
 {
     Object *obj = data;
@@ -482,6 +495,7 @@ static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
     memset(obj, 0, type->instance_size);
     obj->class = type->class;
     object_ref(obj);
+    object_class_property_init_all(obj);
     obj->properties = g_hash_table_new_full(g_str_hash, g_str_equal,
                                             NULL, object_property_free);
     object_init_with_type(obj, type);
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 07/26] object: add object_property_get_defaut()
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (5 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 06/26] object: add class property initializer Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 08/26] object: make object_class_property_add* return property Marc-André Lureau
                   ` (19 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

The new callback will be used in following "object: add
object_property_set_defaut_{bool,str,int,uint}()" and "vl: print
default value in object help" patches.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h | 17 +++++++++++++++++
 qom/object.c         |  9 +++++++++
 2 files changed, 26 insertions(+)

diff --git a/include/qom/object.h b/include/qom/object.h
index 29f47d3b35..ca47308ac4 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -367,6 +367,13 @@ typedef void (ObjectPropertyRelease)(Object *obj,
  */
 typedef void (ObjectPropertyInit)(Object *obj, ObjectProperty *prop);
 
+/**
+ * ObjectPropertyGetDefault:
+ *
+ * Get an allocated string representation of the default value.
+ */
+typedef char *(ObjectPropertyGetDefault)(ObjectProperty *prop);
+
 struct ObjectProperty
 {
     gchar *name;
@@ -377,6 +384,7 @@ struct ObjectProperty
     ObjectPropertyResolve *resolve;
     ObjectPropertyRelease *release;
     ObjectPropertyInit *init;
+    ObjectPropertyGetDefault *get_default;
     void *opaque;
 };
 
@@ -1233,6 +1241,15 @@ bool object_property_get_bool(Object *obj, const char *name,
 void object_property_set_int(Object *obj, int64_t value,
                              const char *name, Error **errp);
 
+/**
+ * object_property_get_defaut:
+ * @prop: the property to get default value
+ *
+ * Return an allocated string that represents the default property
+ * value or NULL.
+ */
+char *object_property_get_default(ObjectProperty *prop);
+
 /**
  * object_property_get_int:
  * @obj: the object
diff --git a/qom/object.c b/qom/object.c
index 1e9113bfc8..b319db4ac6 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1429,6 +1429,15 @@ int64_t object_property_get_int(Object *obj, const char *name,
     return retval;
 }
 
+char *object_property_get_default(ObjectProperty *prop)
+{
+    if (!prop->get_default) {
+        return NULL;
+    }
+
+    return prop->get_default(prop);
+}
+
 void object_property_set_uint(Object *obj, uint64_t value,
                               const char *name, Error **errp)
 {
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 08/26] object: make object_class_property_add* return property
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (6 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 07/26] object: add object_property_get_defaut() Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 09/26] qstring: add qstring_free() Marc-André Lureau
                   ` (18 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

This will help calling other ObjectProperty associated functions
easily after.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h | 24 +++++++++++------
 qom/object.c         | 64 ++++++++++++++++++++++++++++++--------------
 2 files changed, 60 insertions(+), 28 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index ca47308ac4..9f52bc365b 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1556,7 +1556,8 @@ void object_property_add_str(Object *obj, const char *name,
                              void (*set)(Object *, const char *, Error **),
                              Error **errp);
 
-void object_class_property_add_str(ObjectClass *klass, const char *name,
+ObjectProperty *object_class_property_add_str(ObjectClass *klass,
+                                   const char *name,
                                    char *(*get)(Object *, Error **),
                                    void (*set)(Object *, const char *,
                                                Error **),
@@ -1578,7 +1579,8 @@ void object_property_add_bool(Object *obj, const char *name,
                               void (*set)(Object *, bool, Error **),
                               Error **errp);
 
-void object_class_property_add_bool(ObjectClass *klass, const char *name,
+ObjectProperty *object_class_property_add_bool(ObjectClass *klass,
+                                    const char *name,
                                     bool (*get)(Object *, Error **),
                                     void (*set)(Object *, bool, Error **),
                                     Error **errp);
@@ -1602,7 +1604,8 @@ void object_property_add_enum(Object *obj, const char *name,
                               void (*set)(Object *, int, Error **),
                               Error **errp);
 
-void object_class_property_add_enum(ObjectClass *klass, const char *name,
+ObjectProperty *object_class_property_add_enum(ObjectClass *klass,
+                                    const char *name,
                                     const char *typename,
                                     const QEnumLookup *lookup,
                                     int (*get)(Object *, Error **),
@@ -1623,7 +1626,8 @@ void object_property_add_tm(Object *obj, const char *name,
                             void (*get)(Object *, struct tm *, Error **),
                             Error **errp);
 
-void object_class_property_add_tm(ObjectClass *klass, const char *name,
+ObjectProperty *object_class_property_add_tm(ObjectClass *klass,
+                                  const char *name,
                                   void (*get)(Object *, struct tm *, Error **),
                                   Error **errp);
 
@@ -1639,7 +1643,8 @@ void object_class_property_add_tm(ObjectClass *klass, const char *name,
  */
 void object_property_add_uint8_ptr(Object *obj, const char *name,
                                    const uint8_t *v, Error **errp);
-void object_class_property_add_uint8_ptr(ObjectClass *klass, const char *name,
+ObjectProperty *object_class_property_add_uint8_ptr(ObjectClass *klass,
+                                         const char *name,
                                          const uint8_t *v, Error **errp);
 
 /**
@@ -1654,7 +1659,8 @@ void object_class_property_add_uint8_ptr(ObjectClass *klass, const char *name,
  */
 void object_property_add_uint16_ptr(Object *obj, const char *name,
                                     const uint16_t *v, Error **errp);
-void object_class_property_add_uint16_ptr(ObjectClass *klass, const char *name,
+ObjectProperty *object_class_property_add_uint16_ptr(ObjectClass *klass,
+                                          const char *name,
                                           const uint16_t *v, Error **errp);
 
 /**
@@ -1669,7 +1675,8 @@ void object_class_property_add_uint16_ptr(ObjectClass *klass, const char *name,
  */
 void object_property_add_uint32_ptr(Object *obj, const char *name,
                                     const uint32_t *v, Error **errp);
-void object_class_property_add_uint32_ptr(ObjectClass *klass, const char *name,
+ObjectProperty *object_class_property_add_uint32_ptr(ObjectClass *klass,
+                                          const char *name,
                                           const uint32_t *v, Error **errp);
 
 /**
@@ -1684,7 +1691,8 @@ void object_class_property_add_uint32_ptr(ObjectClass *klass, const char *name,
  */
 void object_property_add_uint64_ptr(Object *obj, const char *name,
                                     const uint64_t *v, Error **errp);
-void object_class_property_add_uint64_ptr(ObjectClass *klass, const char *name,
+ObjectProperty *object_class_property_add_uint64_ptr(ObjectClass *klass,
+                                          const char *name,
                                           const uint64_t *v, Error **errp);
 
 /**
diff --git a/qom/object.c b/qom/object.c
index b319db4ac6..a4c7bb01e6 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2065,7 +2065,8 @@ void object_property_add_str(Object *obj, const char *name,
     }
 }
 
-void object_class_property_add_str(ObjectClass *klass, const char *name,
+ObjectProperty *
+object_class_property_add_str(ObjectClass *klass, const char *name,
                                    char *(*get)(Object *, Error **),
                                    void (*set)(Object *, const char *,
                                                Error **),
@@ -2073,11 +2074,12 @@ void object_class_property_add_str(ObjectClass *klass, const char *name,
 {
     Error *local_err = NULL;
     StringProperty *prop = g_malloc0(sizeof(*prop));
+    ObjectProperty *rv;
 
     prop->get = get;
     prop->set = set;
 
-    object_class_property_add(klass, name, "string",
+    rv = object_class_property_add(klass, name, "string",
                               get ? property_get_str : NULL,
                               set ? property_set_str : NULL,
                               property_release_str,
@@ -2086,6 +2088,8 @@ void object_class_property_add_str(ObjectClass *klass, const char *name,
         error_propagate(errp, local_err);
         g_free(prop);
     }
+
+    return rv;
 }
 
 typedef struct BoolProperty
@@ -2155,18 +2159,20 @@ void object_property_add_bool(Object *obj, const char *name,
     }
 }
 
-void object_class_property_add_bool(ObjectClass *klass, const char *name,
+ObjectProperty *
+object_class_property_add_bool(ObjectClass *klass, const char *name,
                                     bool (*get)(Object *, Error **),
                                     void (*set)(Object *, bool, Error **),
                                     Error **errp)
 {
     Error *local_err = NULL;
     BoolProperty *prop = g_malloc0(sizeof(*prop));
+    ObjectProperty *rv;
 
     prop->get = get;
     prop->set = set;
 
-    object_class_property_add(klass, name, "bool",
+    rv = object_class_property_add(klass, name, "bool",
                               get ? property_get_bool : NULL,
                               set ? property_set_bool : NULL,
                               property_release_bool,
@@ -2175,6 +2181,8 @@ void object_class_property_add_bool(ObjectClass *klass, const char *name,
         error_propagate(errp, local_err);
         g_free(prop);
     }
+
+    return rv;
 }
 
 static void property_get_enum(Object *obj, Visitor *v, const char *name,
@@ -2240,7 +2248,8 @@ void object_property_add_enum(Object *obj, const char *name,
     }
 }
 
-void object_class_property_add_enum(ObjectClass *klass, const char *name,
+ObjectProperty *
+object_class_property_add_enum(ObjectClass *klass, const char *name,
                                     const char *typename,
                                     const QEnumLookup *lookup,
                                     int (*get)(Object *, Error **),
@@ -2249,12 +2258,13 @@ void object_class_property_add_enum(ObjectClass *klass, const char *name,
 {
     Error *local_err = NULL;
     EnumProperty *prop = g_malloc(sizeof(*prop));
+    ObjectProperty *rv;
 
     prop->lookup = lookup;
     prop->get = get;
     prop->set = set;
 
-    object_class_property_add(klass, name, typename,
+    rv = object_class_property_add(klass, name, typename,
                               get ? property_get_enum : NULL,
                               set ? property_set_enum : NULL,
                               property_release_enum,
@@ -2263,6 +2273,8 @@ void object_class_property_add_enum(ObjectClass *klass, const char *name,
         error_propagate(errp, local_err);
         g_free(prop);
     }
+
+    return rv;
 }
 
 typedef struct TMProperty {
@@ -2343,16 +2355,18 @@ void object_property_add_tm(Object *obj, const char *name,
     }
 }
 
-void object_class_property_add_tm(ObjectClass *klass, const char *name,
+ObjectProperty *
+object_class_property_add_tm(ObjectClass *klass, const char *name,
                                   void (*get)(Object *, struct tm *, Error **),
                                   Error **errp)
 {
     Error *local_err = NULL;
     TMProperty *prop = g_malloc0(sizeof(*prop));
+    ObjectProperty *rv;
 
     prop->get = get;
 
-    object_class_property_add(klass, name, "struct tm",
+    rv = object_class_property_add(klass, name, "struct tm",
                               get ? property_get_tm : NULL, NULL,
                               property_release_tm,
                               prop, &local_err);
@@ -2360,6 +2374,8 @@ void object_class_property_add_tm(ObjectClass *klass, const char *name,
         error_propagate(errp, local_err);
         g_free(prop);
     }
+
+    return rv;
 }
 
 static char *qdev_get_type(Object *obj, Error **errp)
@@ -2402,11 +2418,13 @@ void object_property_add_uint8_ptr(Object *obj, const char *name,
                         NULL, NULL, (void *)v, errp);
 }
 
-void object_class_property_add_uint8_ptr(ObjectClass *klass, const char *name,
+ObjectProperty *
+object_class_property_add_uint8_ptr(ObjectClass *klass, const char *name,
                                          const uint8_t *v, Error **errp)
 {
-    object_class_property_add(klass, name, "uint8", property_get_uint8_ptr,
-                              NULL, NULL, (void *)v, errp);
+    return object_class_property_add(klass, name, "uint8",
+                                     property_get_uint8_ptr,
+                                     NULL, NULL, (void *)v, errp);
 }
 
 void object_property_add_uint16_ptr(Object *obj, const char *name,
@@ -2416,11 +2434,13 @@ void object_property_add_uint16_ptr(Object *obj, const char *name,
                         NULL, NULL, (void *)v, errp);
 }
 
-void object_class_property_add_uint16_ptr(ObjectClass *klass, const char *name,
+ObjectProperty *
+object_class_property_add_uint16_ptr(ObjectClass *klass, const char *name,
                                           const uint16_t *v, Error **errp)
 {
-    object_class_property_add(klass, name, "uint16", property_get_uint16_ptr,
-                              NULL, NULL, (void *)v, errp);
+    return object_class_property_add(klass, name, "uint16",
+                                     property_get_uint16_ptr,
+                                     NULL, NULL, (void *)v, errp);
 }
 
 void object_property_add_uint32_ptr(Object *obj, const char *name,
@@ -2430,11 +2450,13 @@ void object_property_add_uint32_ptr(Object *obj, const char *name,
                         NULL, NULL, (void *)v, errp);
 }
 
-void object_class_property_add_uint32_ptr(ObjectClass *klass, const char *name,
+ObjectProperty *
+object_class_property_add_uint32_ptr(ObjectClass *klass, const char *name,
                                           const uint32_t *v, Error **errp)
 {
-    object_class_property_add(klass, name, "uint32", property_get_uint32_ptr,
-                              NULL, NULL, (void *)v, errp);
+    return object_class_property_add(klass, name, "uint32",
+                                     property_get_uint32_ptr,
+                                     NULL, NULL, (void *)v, errp);
 }
 
 void object_property_add_uint64_ptr(Object *obj, const char *name,
@@ -2444,11 +2466,13 @@ void object_property_add_uint64_ptr(Object *obj, const char *name,
                         NULL, NULL, (void *)v, errp);
 }
 
-void object_class_property_add_uint64_ptr(ObjectClass *klass, const char *name,
+ObjectProperty *
+object_class_property_add_uint64_ptr(ObjectClass *klass, const char *name,
                                           const uint64_t *v, Error **errp)
 {
-    object_class_property_add(klass, name, "uint64", property_get_uint64_ptr,
-                              NULL, NULL, (void *)v, errp);
+    return object_class_property_add(klass, name, "uint64",
+                                     property_get_uint64_ptr,
+                                     NULL, NULL, (void *)v, errp);
 }
 
 typedef struct {
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 09/26] qstring: add qstring_free()
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (7 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 08/26] object: make object_class_property_add* return property Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 10/26] object: add object_property_set_defaut_{bool, str, int, uint}() Marc-André Lureau
                   ` (17 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Similar to g_string_free(), optionally return the underlying char*.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qapi/qmp/qstring.h |  1 +
 qobject/qstring.c          | 27 ++++++++++++++++++++++-----
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/include/qapi/qmp/qstring.h b/include/qapi/qmp/qstring.h
index 3e83e3a95d..e2e356e5e7 100644
--- a/include/qapi/qmp/qstring.h
+++ b/include/qapi/qmp/qstring.h
@@ -33,6 +33,7 @@ void qstring_append_int(QString *qstring, int64_t value);
 void qstring_append(QString *qstring, const char *str);
 void qstring_append_chr(QString *qstring, int c);
 bool qstring_is_equal(const QObject *x, const QObject *y);
+char *qstring_free(QString *qstring, bool return_str);
 void qstring_destroy_obj(QObject *obj);
 
 #endif /* QSTRING_H */
diff --git a/qobject/qstring.c b/qobject/qstring.c
index 1c6897df00..b66a2c35f2 100644
--- a/qobject/qstring.c
+++ b/qobject/qstring.c
@@ -149,16 +149,33 @@ bool qstring_is_equal(const QObject *x, const QObject *y)
                    qobject_to(QString, y)->string);
 }
 
+/**
+ * qstring_free(): Free the memory allocated by a QString object
+ *
+ * Return: if @return_str, return the underlying string, to be
+ * g_free(), otherwise NULL is returned.
+ */
+char *qstring_free(QString *qstring, bool return_str)
+{
+    char *rv = NULL;
+
+    if (return_str) {
+        rv = qstring->string;
+    } else {
+        g_free(qstring->string);
+    }
+
+    g_free(qstring);
+
+    return rv;
+}
+
 /**
  * qstring_destroy_obj(): Free all memory allocated by a QString
  * object
  */
 void qstring_destroy_obj(QObject *obj)
 {
-    QString *qs;
-
     assert(obj != NULL);
-    qs = qobject_to(QString, obj);
-    g_free(qs->string);
-    g_free(qs);
+    qstring_free(qobject_to(QString, obj), FALSE);
 }
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 10/26] object: add object_property_set_defaut_{bool, str, int, uint}()
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (8 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 09/26] qstring: add qstring_free() Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-23 11:28   ` Paolo Bonzini
  2020-01-10 15:30 ` [PATCH 11/26] object: do not free class properties Marc-André Lureau
                   ` (16 subsequent siblings)
  26 siblings, 1 reply; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h | 37 +++++++++++++++++++++++++++++
 qom/object.c         | 56 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 93 insertions(+)

diff --git a/include/qom/object.h b/include/qom/object.h
index 9f52bc365b..fb133d693f 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -386,6 +386,7 @@ struct ObjectProperty
     ObjectPropertyInit *init;
     ObjectPropertyGetDefault *get_default;
     void *opaque;
+    QObject *defval;
 };
 
 /**
@@ -1063,6 +1064,42 @@ ObjectProperty *object_class_property_add(ObjectClass *klass, const char *name,
                                           ObjectPropertyRelease *release,
                                           void *opaque, Error **errp);
 
+/**
+ * object_property_set_defaut_bool:
+ * @prop: the property to set
+ * @value: the value to be written to the property
+ *
+ * Set the property default value.
+ */
+void object_property_set_defaut_bool(ObjectProperty *prop, bool value);
+
+/**
+ * object_property_set_defaut_str:
+ * @prop: the property to set
+ * @value: the value to be written to the property
+ *
+ * Set the property default value.
+ */
+void object_property_set_defaut_str(ObjectProperty *prop, const char *value);
+
+/**
+ * object_property_set_defaut_int:
+ * @prop: the property to set
+ * @value: the value to be written to the property
+ *
+ * Set the property default value.
+ */
+void object_property_set_defaut_int(ObjectProperty *prop, int64_t value);
+
+/**
+ * object_property_set_defaut_uint:
+ * @prop: the property to set
+ * @value: the value to be written to the property
+ *
+ * Set the property default value.
+ */
+void object_property_set_defaut_uint(ObjectProperty *prop, uint64_t value);
+
 /**
  * object_property_find:
  * @obj: the object
diff --git a/qom/object.c b/qom/object.c
index a4c7bb01e6..aef7e64b5c 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -19,8 +19,10 @@
 #include "qapi/visitor.h"
 #include "qapi/string-input-visitor.h"
 #include "qapi/string-output-visitor.h"
+#include "qapi/qobject-input-visitor.h"
 #include "qapi/qapi-builtin-visit.h"
 #include "qapi/qmp/qerror.h"
+#include "qapi/qmp/qjson.h"
 #include "trace.h"
 
 /* TODO: replace QObject with a simpler visitor to avoid a dependency
@@ -264,6 +266,10 @@ static void object_property_free(gpointer data)
 {
     ObjectProperty *prop = data;
 
+    if (prop->defval) {
+        qobject_unref(prop->defval);
+        prop->defval = NULL;
+    }
     g_free(prop->name);
     g_free(prop->type);
     g_free(prop->description);
@@ -1438,6 +1444,52 @@ char *object_property_get_default(ObjectProperty *prop)
     return prop->get_default(prop);
 }
 
+static void object_property_init_defval(Object *obj, ObjectProperty *prop)
+{
+    Visitor *v = qobject_input_visitor_new(prop->defval);
+
+    assert(prop->set != NULL);
+    prop->set(obj, v, prop->name, prop->opaque, &error_abort);
+
+    visit_free(v);
+}
+
+static char *object_property_get_defval(ObjectProperty *prop)
+{
+    return qstring_free(qobject_to_json(prop->defval), TRUE);
+}
+
+static void object_property_set_defaut(ObjectProperty *prop, QObject *defval)
+{
+    assert(!prop->defval);
+    assert(!prop->init);
+    assert(!prop->get_default);
+
+    prop->defval = defval;
+    prop->init = object_property_init_defval;
+    prop->get_default = object_property_get_defval;
+}
+
+void object_property_set_defaut_bool(ObjectProperty *prop, bool value)
+{
+    object_property_set_defaut(prop, QOBJECT(qbool_from_bool(value)));
+}
+
+void object_property_set_defaut_str(ObjectProperty *prop, const char *value)
+{
+    object_property_set_defaut(prop, QOBJECT(qstring_from_str(value)));
+}
+
+void object_property_set_defaut_int(ObjectProperty *prop, int64_t value)
+{
+    object_property_set_defaut(prop, QOBJECT(qnum_from_int(value)));
+}
+
+void object_property_set_defaut_uint(ObjectProperty *prop, uint64_t value)
+{
+    object_property_set_defaut(prop, QOBJECT(qnum_from_uint(value)));
+}
+
 void object_property_set_uint(Object *obj, uint64_t value,
                               const char *name, Error **errp)
 {
@@ -2549,6 +2601,10 @@ void object_property_add_alias(Object *obj, const char *name,
         goto out;
     }
     op->resolve = property_resolve_alias;
+    if (target_prop->get_default) {
+        op->get_default = target_prop->get_default;
+        op->defval = qobject_ref(target_prop->defval);
+    }
 
     object_property_set_description(obj, op->name,
                                     target_prop->description,
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 11/26] object: do not free class properties
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (9 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 10/26] object: add object_property_set_defaut_{bool, str, int, uint}() Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 12/26] object: check strong flag with & Marc-André Lureau
                   ` (15 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

The release callback is called during object_property_del_all(), on a
live instance. But class properties are common among all
instances. It is not currently called, because we don't release
classes, but it would not be correct if we did.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qom/object.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/qom/object.c b/qom/object.c
index aef7e64b5c..1ce961b84f 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2134,7 +2134,7 @@ object_class_property_add_str(ObjectClass *klass, const char *name,
     rv = object_class_property_add(klass, name, "string",
                               get ? property_get_str : NULL,
                               set ? property_set_str : NULL,
-                              property_release_str,
+                              NULL,
                               prop, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
@@ -2227,7 +2227,7 @@ object_class_property_add_bool(ObjectClass *klass, const char *name,
     rv = object_class_property_add(klass, name, "bool",
                               get ? property_get_bool : NULL,
                               set ? property_set_bool : NULL,
-                              property_release_bool,
+                              NULL,
                               prop, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
@@ -2319,7 +2319,7 @@ object_class_property_add_enum(ObjectClass *klass, const char *name,
     rv = object_class_property_add(klass, name, typename,
                               get ? property_get_enum : NULL,
                               set ? property_set_enum : NULL,
-                              property_release_enum,
+                              NULL,
                               prop, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
@@ -2420,7 +2420,7 @@ object_class_property_add_tm(ObjectClass *klass, const char *name,
 
     rv = object_class_property_add(klass, name, "struct tm",
                               get ? property_get_tm : NULL, NULL,
-                              property_release_tm,
+                              NULL,
                               prop, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 12/26] object: check strong flag with &
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (10 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 11/26] object: do not free class properties Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 13/26] object: rename link "child" to "target" Marc-André Lureau
                   ` (14 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

The following patch is going to introduce more flags.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qom/object.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/qom/object.c b/qom/object.c
index 1ce961b84f..9df4c14226 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1813,7 +1813,7 @@ static void object_set_link_property(Object *obj, Visitor *v,
     }
 
     *child = new_target;
-    if (prop->flags == OBJ_PROP_LINK_STRONG) {
+    if (prop->flags & OBJ_PROP_LINK_STRONG) {
         object_ref(new_target);
         object_unref(old_target);
     }
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 13/26] object: rename link "child" to "target"
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (11 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 12/26] object: check strong flag with & Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 14/26] object: add direct link flag Marc-André Lureau
                   ` (13 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

A child property is a different kind of property. Let's use "target"
for the link target.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h |  4 ++--
 qom/object.c         | 24 ++++++++++++------------
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index fb133d693f..7e66bc78c9 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1545,7 +1545,7 @@ void object_property_allow_set_link(const Object *, const char *,
  * @obj: the object to add a property to
  * @name: the name of the property
  * @type: the qobj type of the link
- * @child: a pointer to where the link object reference is stored
+ * @targetp: a pointer to where the link object reference is stored
  * @check: callback to veto setting or NULL if the property is read-only
  * @flags: additional options for the link
  * @errp: if an error occurs, a pointer to an area to store the error
@@ -1570,7 +1570,7 @@ void object_property_allow_set_link(const Object *, const char *,
  * modified.
  */
 void object_property_add_link(Object *obj, const char *name,
-                              const char *type, Object **child,
+                              const char *type, Object **targetp,
                               void (*check)(const Object *obj, const char *name,
                                             Object *val, Error **errp),
                               ObjectPropertyLinkFlags flags,
diff --git a/qom/object.c b/qom/object.c
index 9df4c14226..47d8be81a6 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1720,7 +1720,7 @@ void object_property_allow_set_link(const Object *obj, const char *name,
 }
 
 typedef struct {
-    Object **child;
+    Object **targetp;
     void (*check)(const Object *, const char *, Object *, Error **);
     ObjectPropertyLinkFlags flags;
 } LinkProperty;
@@ -1730,11 +1730,11 @@ static void object_get_link_property(Object *obj, Visitor *v,
                                      Error **errp)
 {
     LinkProperty *lprop = opaque;
-    Object **child = lprop->child;
+    Object **targetp = lprop->targetp;
     gchar *path;
 
-    if (*child) {
-        path = object_get_canonical_path(*child);
+    if (*targetp) {
+        path = object_get_canonical_path(*targetp);
         visit_type_str(v, name, &path, errp);
         g_free(path);
     } else {
@@ -1789,8 +1789,8 @@ static void object_set_link_property(Object *obj, Visitor *v,
 {
     Error *local_err = NULL;
     LinkProperty *prop = opaque;
-    Object **child = prop->child;
-    Object *old_target = *child;
+    Object **targetp = prop->targetp;
+    Object *old_target = *targetp;
     Object *new_target = NULL;
     char *path = NULL;
 
@@ -1812,7 +1812,7 @@ static void object_set_link_property(Object *obj, Visitor *v,
         return;
     }
 
-    *child = new_target;
+    *targetp = new_target;
     if (prop->flags & OBJ_PROP_LINK_STRONG) {
         object_ref(new_target);
         object_unref(old_target);
@@ -1823,7 +1823,7 @@ static Object *object_resolve_link_property(Object *parent, void *opaque, const
 {
     LinkProperty *lprop = opaque;
 
-    return *lprop->child;
+    return *lprop->targetp;
 }
 
 static void object_release_link_property(Object *obj, const char *name,
@@ -1831,14 +1831,14 @@ static void object_release_link_property(Object *obj, const char *name,
 {
     LinkProperty *prop = opaque;
 
-    if ((prop->flags & OBJ_PROP_LINK_STRONG) && *prop->child) {
-        object_unref(*prop->child);
+    if ((prop->flags & OBJ_PROP_LINK_STRONG) && *prop->targetp) {
+        object_unref(*prop->targetp);
     }
     g_free(prop);
 }
 
 void object_property_add_link(Object *obj, const char *name,
-                              const char *type, Object **child,
+                              const char *type, Object **targetp,
                               void (*check)(const Object *, const char *,
                                             Object *, Error **),
                               ObjectPropertyLinkFlags flags,
@@ -1849,7 +1849,7 @@ void object_property_add_link(Object *obj, const char *name,
     gchar *full_type;
     ObjectProperty *op;
 
-    prop->child = child;
+    prop->targetp = targetp;
     prop->check = check;
     prop->flags = flags;
 
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 14/26] object: add direct link flag
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (12 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 13/26] object: rename link "child" to "target" Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 15/26] object: express const link with link property Marc-André Lureau
                   ` (12 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Allow the link property to hold the pointer to the target, instead of
indirectly through another variable.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h |  3 +++
 qom/object.c         | 26 ++++++++++++++++++++------
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 7e66bc78c9..5b02be68ec 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1528,6 +1528,9 @@ void object_property_add_child(Object *obj, const char *name,
 typedef enum {
     /* Unref the link pointer when the property is deleted */
     OBJ_PROP_LINK_STRONG = 0x1,
+
+    /* private */
+    OBJ_PROP_LINK_DIRECT = 0x2,
 } ObjectPropertyLinkFlags;
 
 /**
diff --git a/qom/object.c b/qom/object.c
index 47d8be81a6..30eee0f36b 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1720,17 +1720,30 @@ void object_property_allow_set_link(const Object *obj, const char *name,
 }
 
 typedef struct {
-    Object **targetp;
+    union {
+        Object **targetp;
+        Object *target; /* if OBJ_PROP_LINK_DIRECT, when holding the pointer  */
+    };
     void (*check)(const Object *, const char *, Object *, Error **);
     ObjectPropertyLinkFlags flags;
 } LinkProperty;
 
+static Object **
+object_link_get_targetp(Object *obj, LinkProperty *lprop)
+{
+    if (lprop->flags & OBJ_PROP_LINK_DIRECT) {
+        return &lprop->target;
+    } else {
+        return lprop->targetp;
+    }
+}
+
 static void object_get_link_property(Object *obj, Visitor *v,
                                      const char *name, void *opaque,
                                      Error **errp)
 {
     LinkProperty *lprop = opaque;
-    Object **targetp = lprop->targetp;
+    Object **targetp = object_link_get_targetp(obj, lprop);
     gchar *path;
 
     if (*targetp) {
@@ -1789,7 +1802,7 @@ static void object_set_link_property(Object *obj, Visitor *v,
 {
     Error *local_err = NULL;
     LinkProperty *prop = opaque;
-    Object **targetp = prop->targetp;
+    Object **targetp = object_link_get_targetp(obj, prop);
     Object *old_target = *targetp;
     Object *new_target = NULL;
     char *path = NULL;
@@ -1823,16 +1836,17 @@ static Object *object_resolve_link_property(Object *parent, void *opaque, const
 {
     LinkProperty *lprop = opaque;
 
-    return *lprop->targetp;
+    return *object_link_get_targetp(parent, lprop);
 }
 
 static void object_release_link_property(Object *obj, const char *name,
                                          void *opaque)
 {
     LinkProperty *prop = opaque;
+    Object **targetp = object_link_get_targetp(obj, prop);
 
-    if ((prop->flags & OBJ_PROP_LINK_STRONG) && *prop->targetp) {
-        object_unref(*prop->targetp);
+    if ((prop->flags & OBJ_PROP_LINK_STRONG) && *targetp) {
+        object_unref(*targetp);
     }
     g_free(prop);
 }
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 15/26] object: express const link with link property
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (13 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 14/26] object: add direct link flag Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 16/26] object: add object_class_property_add_link() Marc-André Lureau
                   ` (11 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Let's not mix child property and link property callbacks, as this is
confusing, use LinkProperty with DIRECT flag to hold the target pointer.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qom/object.c | 41 +++++++++++++++++++++++------------------
 1 file changed, 23 insertions(+), 18 deletions(-)

diff --git a/qom/object.c b/qom/object.c
index 30eee0f36b..09d960f254 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1851,19 +1851,23 @@ static void object_release_link_property(Object *obj, const char *name,
     g_free(prop);
 }
 
-void object_property_add_link(Object *obj, const char *name,
-                              const char *type, Object **targetp,
-                              void (*check)(const Object *, const char *,
-                                            Object *, Error **),
-                              ObjectPropertyLinkFlags flags,
-                              Error **errp)
+static void object_add_link_prop(Object *obj, const char *name,
+                                 const char *type, void *ptr,
+                                 void (*check)(const Object *, const char *,
+                                               Object *, Error **),
+                                 ObjectPropertyLinkFlags flags,
+                                 Error **errp)
 {
     Error *local_err = NULL;
     LinkProperty *prop = g_malloc(sizeof(*prop));
     gchar *full_type;
     ObjectProperty *op;
 
-    prop->targetp = targetp;
+    if (flags & OBJ_PROP_LINK_DIRECT) {
+        prop->target = ptr;
+    } else {
+        prop->targetp = ptr;
+    }
     prop->check = check;
     prop->flags = flags;
 
@@ -1887,20 +1891,21 @@ out:
     g_free(full_type);
 }
 
+void object_property_add_link(Object *obj, const char *name,
+                              const char *type, Object **targetp,
+                              void (*check)(const Object *, const char *,
+                                            Object *, Error **),
+                              ObjectPropertyLinkFlags flags,
+                              Error **errp)
+{
+    object_add_link_prop(obj, name, type, targetp, check, flags, errp);
+}
+
 void object_property_add_const_link(Object *obj, const char *name,
                                     Object *target, Error **errp)
 {
-    char *link_type;
-    ObjectProperty *op;
-
-    link_type = g_strdup_printf("link<%s>", object_get_typename(target));
-    op = object_property_add(obj, name, link_type,
-                             object_get_child_property, NULL,
-                             NULL, target, errp);
-    if (op != NULL) {
-        op->resolve = object_resolve_child_property;
-    }
-    g_free(link_type);
+    object_add_link_prop(obj, name, object_get_typename(target), target,
+                         NULL, OBJ_PROP_LINK_DIRECT, errp);
 }
 
 gchar *object_get_canonical_path_component(Object *obj)
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 16/26] object: add object_class_property_add_link()
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (14 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 15/26] object: express const link with link property Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 17/26] object: release all props Marc-André Lureau
                   ` (10 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h |  9 +++++++++
 qom/object.c         | 46 +++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 5b02be68ec..ead9129ac8 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1531,6 +1531,7 @@ typedef enum {
 
     /* private */
     OBJ_PROP_LINK_DIRECT = 0x2,
+    OBJ_PROP_LINK_CLASS = 0x4,
 } ObjectPropertyLinkFlags;
 
 /**
@@ -1579,6 +1580,14 @@ void object_property_add_link(Object *obj, const char *name,
                               ObjectPropertyLinkFlags flags,
                               Error **errp);
 
+ObjectProperty *object_class_property_add_link(ObjectClass *oc,
+                              const char *name,
+                              const char *type, ptrdiff_t offset,
+                              void (*check)(const Object *obj, const char *name,
+                                            Object *val, Error **errp),
+                              ObjectPropertyLinkFlags flags,
+                              Error **errp);
+
 /**
  * object_property_add_str:
  * @obj: the object to add a property to
diff --git a/qom/object.c b/qom/object.c
index 09d960f254..04f2991716 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1723,6 +1723,7 @@ typedef struct {
     union {
         Object **targetp;
         Object *target; /* if OBJ_PROP_LINK_DIRECT, when holding the pointer  */
+        ptrdiff_t offset; /* if OBJ_PROP_LINK_CLASS */
     };
     void (*check)(const Object *, const char *, Object *, Error **);
     ObjectPropertyLinkFlags flags;
@@ -1733,6 +1734,8 @@ object_link_get_targetp(Object *obj, LinkProperty *lprop)
 {
     if (lprop->flags & OBJ_PROP_LINK_DIRECT) {
         return &lprop->target;
+    } else if (lprop->flags & OBJ_PROP_LINK_CLASS) {
+        return (void *)obj + lprop->offset;
     } else {
         return lprop->targetp;
     }
@@ -1848,7 +1851,9 @@ static void object_release_link_property(Object *obj, const char *name,
     if ((prop->flags & OBJ_PROP_LINK_STRONG) && *targetp) {
         object_unref(*targetp);
     }
-    g_free(prop);
+    if (!(prop->flags & OBJ_PROP_LINK_CLASS)) {
+        g_free(prop);
+    }
 }
 
 static void object_add_link_prop(Object *obj, const char *name,
@@ -1901,6 +1906,45 @@ void object_property_add_link(Object *obj, const char *name,
     object_add_link_prop(obj, name, type, targetp, check, flags, errp);
 }
 
+ObjectProperty *
+object_class_property_add_link(ObjectClass *oc,
+    const char *name,
+    const char *type, ptrdiff_t offset,
+    void (*check)(const Object *obj, const char *name,
+                  Object *val, Error **errp),
+    ObjectPropertyLinkFlags flags,
+    Error **errp)
+{
+    Error *local_err = NULL;
+    LinkProperty *prop = g_new0(LinkProperty, 1);
+    gchar *full_type;
+    ObjectProperty *op;
+
+    prop->offset = offset;
+    prop->check = check;
+    prop->flags = flags | OBJ_PROP_LINK_CLASS;
+
+    full_type = g_strdup_printf("link<%s>", type);
+
+    op = object_class_property_add(oc, name, full_type,
+                                   object_get_link_property,
+                                   check ? object_set_link_property : NULL,
+                                   object_release_link_property,
+                                   prop,
+                                   &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        g_free(prop);
+        goto out;
+    }
+
+    op->resolve = object_resolve_link_property;
+
+out:
+    g_free(full_type);
+    return op;
+}
+
 void object_property_add_const_link(Object *obj, const char *name,
                                     Object *target, Error **errp)
 {
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 17/26] object: release all props
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (15 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 16/26] object: add object_class_property_add_link() Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 18/26] object: return self in object_ref() Marc-André Lureau
                   ` (9 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Class properties may have to release resources when the object is
destroyed. Let's use the existing release() callback for that, but
class properties must not release ObjectProperty, as it can be shared
by various instances.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qom/object.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/qom/object.c b/qom/object.c
index 04f2991716..3924678ec3 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -583,23 +583,22 @@ static inline bool object_property_is_child(ObjectProperty *prop)
 
 static void object_property_del_all(Object *obj)
 {
+    g_autoptr(GHashTable) done = g_hash_table_new(NULL, NULL);
     ObjectProperty *prop;
-    GHashTableIter iter;
-    gpointer key, value;
+    ObjectPropertyIterator iter;
     bool released;
 
     do {
         released = false;
-        g_hash_table_iter_init(&iter, obj->properties);
-        while (g_hash_table_iter_next(&iter, &key, &value)) {
-            prop = value;
-            if (prop->release) {
-                prop->release(obj, prop->name, prop->opaque);
-                prop->release = NULL;
-                released = true;
-                break;
+        object_property_iter_init(&iter, obj);
+        while ((prop = object_property_iter_next(&iter)) != NULL) {
+            if (g_hash_table_add(done, prop)) {
+                if (prop->release) {
+                    prop->release(obj, prop->name, prop->opaque);
+                    released = true;
+                    break;
+                }
             }
-            g_hash_table_iter_remove(&iter);
         }
     } while (released);
 
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 18/26] object: return self in object_ref()
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (16 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 17/26] object: release all props Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 19:22   ` Philippe Mathieu-Daudé
  2020-01-10 15:30 ` [PATCH 19/26] qdev: set properties with device_class_set_props() Marc-André Lureau
                   ` (8 subsequent siblings)
  26 siblings, 1 reply; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

This allow for simpler assignment with ref: foo = object_ref(bar)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h | 3 ++-
 qom/object.c         | 5 +++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index ead9129ac8..933e5c6cb9 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1013,8 +1013,9 @@ GSList *object_class_get_list_sorted(const char *implements_type,
  *
  * Increase the reference count of a object.  A object cannot be freed as long
  * as its reference count is greater than zero.
+ * Returns: @obj
  */
-void object_ref(Object *obj);
+Object *object_ref(Object *obj);
 
 /**
  * object_unref:
diff --git a/qom/object.c b/qom/object.c
index 3924678ec3..9f76a330ff 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1098,12 +1098,13 @@ GSList *object_class_get_list_sorted(const char *implements_type,
                         object_class_cmp);
 }
 
-void object_ref(Object *obj)
+Object *object_ref(Object *obj)
 {
     if (!obj) {
-        return;
+        return NULL;
     }
     atomic_inc(&obj->ref);
+    return obj;
 }
 
 void object_unref(Object *obj)
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 19/26] qdev: set properties with device_class_set_props()
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (17 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 18/26] object: return self in object_ref() Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-23 11:08   ` Paolo Bonzini
  2020-01-10 15:30 ` [PATCH 20/26] qdev: move instance properties to class properties Marc-André Lureau
                   ` (7 subsequent siblings)
  26 siblings, 1 reply; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

The following patch will need to handle properties registration during
class_init time. Let's use a device_class_set_props() setter.

spatch --macro-file scripts/cocci-macro-file.h  --sp-file
./scripts/coccinelle/qdev-set-props.cocci --keep-comments --in-place
--dir .

@@
typedef DeviceClass;
DeviceClass *d;
expression val;
@@
- d->props = val
+ device_class_set_props(d, val)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/qdev-core.h              |  2 ++
 hw/9pfs/virtio-9p-device.c          |  2 +-
 hw/acpi/generic_event_device.c      |  2 +-
 hw/acpi/piix4.c                     |  2 +-
 hw/acpi/vmgenid.c                   |  2 +-
 hw/arm/armsse.c                     |  2 +-
 hw/arm/armv7m.c                     |  4 ++--
 hw/arm/aspeed_soc.c                 |  2 +-
 hw/arm/bcm2836.c                    |  2 +-
 hw/arm/integratorcp.c               |  2 +-
 hw/arm/msf2-soc.c                   |  2 +-
 hw/arm/musicpal.c                   |  2 +-
 hw/arm/nrf51_soc.c                  |  2 +-
 hw/arm/pxa2xx.c                     |  4 ++--
 hw/arm/pxa2xx_gpio.c                |  2 +-
 hw/arm/smmu-common.c                |  2 +-
 hw/arm/spitz.c                      |  2 +-
 hw/arm/stm32f205_soc.c              |  2 +-
 hw/arm/strongarm.c                  |  2 +-
 hw/arm/xlnx-versal.c                |  2 +-
 hw/arm/xlnx-zynqmp.c                |  2 +-
 hw/audio/ac97.c                     |  2 +-
 hw/audio/adlib.c                    |  2 +-
 hw/audio/cs4231.c                   |  2 +-
 hw/audio/cs4231a.c                  |  2 +-
 hw/audio/es1370.c                   |  2 +-
 hw/audio/gus.c                      |  2 +-
 hw/audio/hda-codec.c                |  2 +-
 hw/audio/intel-hda.c                |  4 ++--
 hw/audio/milkymist-ac97.c           |  2 +-
 hw/audio/pcspk.c                    |  2 +-
 hw/audio/pl041.c                    |  2 +-
 hw/audio/sb16.c                     |  2 +-
 hw/audio/wm8750.c                   |  2 +-
 hw/block/fdc.c                      |  8 ++++----
 hw/block/m25p80.c                   |  2 +-
 hw/block/nand.c                     |  2 +-
 hw/block/nvme.c                     |  2 +-
 hw/block/onenand.c                  |  2 +-
 hw/block/pflash_cfi01.c             |  2 +-
 hw/block/pflash_cfi02.c             |  2 +-
 hw/block/swim.c                     |  2 +-
 hw/block/vhost-user-blk.c           |  2 +-
 hw/block/virtio-blk.c               |  2 +-
 hw/block/xen-block.c                |  2 +-
 hw/char/bcm2835_aux.c               |  2 +-
 hw/char/cadence_uart.c              |  2 +-
 hw/char/cmsdk-apb-uart.c            |  2 +-
 hw/char/debugcon.c                  |  2 +-
 hw/char/digic-uart.c                |  2 +-
 hw/char/escc.c                      |  2 +-
 hw/char/etraxfs_ser.c               |  2 +-
 hw/char/exynos4210_uart.c           |  2 +-
 hw/char/grlib_apbuart.c             |  2 +-
 hw/char/imx_serial.c                |  2 +-
 hw/char/ipoctal232.c                |  2 +-
 hw/char/lm32_juart.c                |  2 +-
 hw/char/lm32_uart.c                 |  2 +-
 hw/char/mcf_uart.c                  |  2 +-
 hw/char/milkymist-uart.c            |  2 +-
 hw/char/nrf51_uart.c                |  2 +-
 hw/char/parallel.c                  |  2 +-
 hw/char/pl011.c                     |  2 +-
 hw/char/sclpconsole-lm.c            |  2 +-
 hw/char/sclpconsole.c               |  2 +-
 hw/char/serial-isa.c                |  2 +-
 hw/char/serial-pci-multi.c          |  4 ++--
 hw/char/serial-pci.c                |  2 +-
 hw/char/serial.c                    |  4 ++--
 hw/char/spapr_vty.c                 |  2 +-
 hw/char/stm32f2xx_usart.c           |  2 +-
 hw/char/terminal3270.c              |  2 +-
 hw/char/virtio-console.c            |  2 +-
 hw/char/virtio-serial-bus.c         |  4 ++--
 hw/char/xilinx_uartlite.c           |  2 +-
 hw/core/cpu.c                       |  2 +-
 hw/core/generic-loader.c            |  2 +-
 hw/core/or-irq.c                    |  2 +-
 hw/core/platform-bus.c              |  2 +-
 hw/core/qdev.c                      |  5 +++++
 hw/core/split-irq.c                 |  2 +-
 hw/cpu/a15mpcore.c                  |  2 +-
 hw/cpu/a9mpcore.c                   |  2 +-
 hw/cpu/arm11mpcore.c                |  2 +-
 hw/cpu/cluster.c                    |  2 +-
 hw/cpu/realview_mpcore.c            |  2 +-
 hw/display/ati.c                    |  2 +-
 hw/display/bcm2835_fb.c             |  2 +-
 hw/display/bochs-display.c          |  2 +-
 hw/display/cg3.c                    |  2 +-
 hw/display/cirrus_vga.c             |  2 +-
 hw/display/cirrus_vga_isa.c         |  2 +-
 hw/display/g364fb.c                 |  2 +-
 hw/display/i2c-ddc.c                |  2 +-
 hw/display/macfb.c                  |  4 ++--
 hw/display/milkymist-vgafb.c        |  2 +-
 hw/display/qxl.c                    |  2 +-
 hw/display/ramfb-standalone.c       |  2 +-
 hw/display/sm501.c                  |  4 ++--
 hw/display/tcx.c                    |  2 +-
 hw/display/vga-isa.c                |  2 +-
 hw/display/vga-pci.c                |  4 ++--
 hw/display/vhost-user-gpu.c         |  2 +-
 hw/display/virtio-gpu-pci.c         |  2 +-
 hw/display/virtio-gpu.c             |  2 +-
 hw/display/virtio-vga.c             |  2 +-
 hw/display/vmware_vga.c             |  2 +-
 hw/dma/i82374.c                     |  2 +-
 hw/dma/i8257.c                      |  2 +-
 hw/dma/pl080.c                      |  2 +-
 hw/dma/pl330.c                      |  2 +-
 hw/dma/pxa2xx_dma.c                 |  2 +-
 hw/dma/xilinx_axidma.c              |  2 +-
 hw/dma/xlnx-zdma.c                  |  2 +-
 hw/gpio/imx_gpio.c                  |  2 +-
 hw/gpio/omap_gpio.c                 |  4 ++--
 hw/i2c/aspeed_i2c.c                 |  2 +-
 hw/i2c/core.c                       |  2 +-
 hw/i2c/omap_i2c.c                   |  2 +-
 hw/i386/intel_iommu.c               |  2 +-
 hw/i386/kvm/clock.c                 |  2 +-
 hw/i386/kvm/i8254.c                 |  2 +-
 hw/i386/kvm/ioapic.c                |  2 +-
 hw/i386/vmmouse.c                   |  2 +-
 hw/i386/x86-iommu.c                 |  2 +-
 hw/i386/xen/xen_pvdevice.c          |  2 +-
 hw/ide/ahci.c                       |  2 +-
 hw/ide/cmd646.c                     |  2 +-
 hw/ide/isa.c                        |  2 +-
 hw/ide/macio.c                      |  2 +-
 hw/ide/mmio.c                       |  2 +-
 hw/ide/qdev.c                       |  8 ++++----
 hw/input/adb.c                      |  2 +-
 hw/input/milkymist-softusb.c        |  2 +-
 hw/input/virtio-input-hid.c         |  6 +++---
 hw/input/virtio-input-host.c        |  2 +-
 hw/input/virtio-input.c             |  2 +-
 hw/intc/apic_common.c               |  2 +-
 hw/intc/arm_gic_common.c            |  2 +-
 hw/intc/arm_gicv2m.c                |  2 +-
 hw/intc/arm_gicv3_common.c          |  2 +-
 hw/intc/arm_gicv3_its_kvm.c         |  2 +-
 hw/intc/armv7m_nvic.c               |  2 +-
 hw/intc/exynos4210_combiner.c       |  2 +-
 hw/intc/exynos4210_gic.c            |  4 ++--
 hw/intc/i8259_common.c              |  2 +-
 hw/intc/ioapic.c                    |  2 +-
 hw/intc/mips_gic.c                  |  2 +-
 hw/intc/omap_intc.c                 |  4 ++--
 hw/intc/ompic.c                     |  2 +-
 hw/intc/openpic.c                   |  2 +-
 hw/intc/openpic_kvm.c               |  2 +-
 hw/intc/pnv_xive.c                  |  2 +-
 hw/intc/s390_flic.c                 |  2 +-
 hw/intc/spapr_xive.c                |  2 +-
 hw/intc/xics.c                      |  4 ++--
 hw/intc/xilinx_intc.c               |  2 +-
 hw/intc/xive.c                      |  6 +++---
 hw/intc/xlnx-pmu-iomod-intc.c       |  2 +-
 hw/ipack/ipack.c                    |  2 +-
 hw/ipmi/ipmi.c                      |  2 +-
 hw/ipmi/ipmi_bmc_extern.c           |  2 +-
 hw/ipmi/ipmi_bmc_sim.c              |  2 +-
 hw/ipmi/isa_ipmi_bt.c               |  2 +-
 hw/ipmi/isa_ipmi_kcs.c              |  2 +-
 hw/isa/lpc_ich9.c                   |  2 +-
 hw/isa/pc87312.c                    |  2 +-
 hw/isa/vt82c686.c                   |  2 +-
 hw/mem/nvdimm.c                     |  2 +-
 hw/mem/pc-dimm.c                    |  2 +-
 hw/mips/cps.c                       |  2 +-
 hw/misc/a9scu.c                     |  2 +-
 hw/misc/applesmc.c                  |  2 +-
 hw/misc/arm11scu.c                  |  2 +-
 hw/misc/arm_l2x0.c                  |  2 +-
 hw/misc/arm_sysctl.c                |  2 +-
 hw/misc/armsse-cpuid.c              |  2 +-
 hw/misc/aspeed_scu.c                |  2 +-
 hw/misc/aspeed_sdmc.c               |  2 +-
 hw/misc/bcm2835_property.c          |  2 +-
 hw/misc/debugexit.c                 |  2 +-
 hw/misc/eccmemctl.c                 |  2 +-
 hw/misc/iotkit-sysctl.c             |  2 +-
 hw/misc/iotkit-sysinfo.c            |  2 +-
 hw/misc/ivshmem.c                   |  4 ++--
 hw/misc/mac_via.c                   |  2 +-
 hw/misc/macio/cuda.c                |  2 +-
 hw/misc/macio/macio.c               |  4 ++--
 hw/misc/macio/pmu.c                 |  2 +-
 hw/misc/mips_cmgcr.c                |  2 +-
 hw/misc/mips_cpc.c                  |  2 +-
 hw/misc/mips_itu.c                  |  2 +-
 hw/misc/mos6522.c                   |  2 +-
 hw/misc/mps2-fpgaio.c               |  2 +-
 hw/misc/mps2-scc.c                  |  2 +-
 hw/misc/msf2-sysreg.c               |  2 +-
 hw/misc/nrf51_rng.c                 |  2 +-
 hw/misc/pci-testdev.c               |  2 +-
 hw/misc/pvpanic.c                   |  2 +-
 hw/misc/tz-mpc.c                    |  2 +-
 hw/misc/tz-msc.c                    |  2 +-
 hw/misc/tz-ppc.c                    |  2 +-
 hw/misc/unimp.c                     |  2 +-
 hw/net/allwinner_emac.c             |  2 +-
 hw/net/cadence_gem.c                |  2 +-
 hw/net/dp8393x.c                    |  2 +-
 hw/net/e1000.c                      |  2 +-
 hw/net/e1000e.c                     |  2 +-
 hw/net/eepro100.c                   |  2 +-
 hw/net/etraxfs_eth.c                |  2 +-
 hw/net/fsl_etsec/etsec.c            |  2 +-
 hw/net/ftgmac100.c                  |  4 ++--
 hw/net/imx_fec.c                    |  2 +-
 hw/net/lan9118.c                    |  2 +-
 hw/net/lance.c                      |  2 +-
 hw/net/mcf_fec.c                    |  2 +-
 hw/net/milkymist-minimac2.c         |  2 +-
 hw/net/mipsnet.c                    |  2 +-
 hw/net/ne2000-isa.c                 |  2 +-
 hw/net/ne2000-pci.c                 |  2 +-
 hw/net/opencores_eth.c              |  2 +-
 hw/net/pcnet-pci.c                  |  2 +-
 hw/net/rocker/rocker.c              |  2 +-
 hw/net/rtl8139.c                    |  2 +-
 hw/net/smc91c111.c                  |  2 +-
 hw/net/spapr_llan.c                 |  2 +-
 hw/net/stellaris_enet.c             |  2 +-
 hw/net/sungem.c                     |  2 +-
 hw/net/sunhme.c                     |  2 +-
 hw/net/tulip.c                      |  2 +-
 hw/net/virtio-net.c                 |  2 +-
 hw/net/vmxnet3.c                    |  2 +-
 hw/net/xgmac.c                      |  2 +-
 hw/net/xilinx_axienet.c             |  2 +-
 hw/net/xilinx_ethlite.c             |  2 +-
 hw/nvram/ds1225y.c                  |  2 +-
 hw/nvram/eeprom_at24c.c             |  2 +-
 hw/nvram/fw_cfg.c                   |  4 ++--
 hw/nvram/mac_nvram.c                |  2 +-
 hw/nvram/nrf51_nvm.c                |  2 +-
 hw/nvram/spapr_nvram.c              |  2 +-
 hw/pci-bridge/gen_pcie_root_port.c  |  2 +-
 hw/pci-bridge/pci_bridge_dev.c      |  2 +-
 hw/pci-bridge/pci_expander_bridge.c |  4 ++--
 hw/pci-bridge/pcie_pci_bridge.c     |  2 +-
 hw/pci-bridge/pcie_root_port.c      |  2 +-
 hw/pci-bridge/xio3130_downstream.c  |  2 +-
 hw/pci-host/grackle.c               |  2 +-
 hw/pci-host/i440fx.c                |  2 +-
 hw/pci-host/ppce500.c               |  2 +-
 hw/pci-host/prep.c                  |  2 +-
 hw/pci-host/q35.c                   |  4 ++--
 hw/pci-host/sabre.c                 |  2 +-
 hw/pci-host/uninorth.c              |  2 +-
 hw/pci-host/versatile.c             |  2 +-
 hw/pci-host/xilinx-pcie.c           |  2 +-
 hw/pci/pci.c                        |  2 +-
 hw/pci/pcie_port.c                  |  4 ++--
 hw/ppc/pnv.c                        |  2 +-
 hw/ppc/pnv_core.c                   |  4 ++--
 hw/ppc/pnv_homer.c                  |  2 +-
 hw/ppc/pnv_lpc.c                    |  2 +-
 hw/ppc/pnv_occ.c                    |  2 +-
 hw/ppc/pnv_pnor.c                   |  2 +-
 hw/ppc/pnv_psi.c                    |  2 +-
 hw/ppc/ppc440_uc.c                  |  2 +-
 hw/ppc/prep_systemio.c              |  2 +-
 hw/ppc/rs6000_mc.c                  |  2 +-
 hw/ppc/spapr_cpu_core.c             |  2 +-
 hw/ppc/spapr_pci.c                  |  2 +-
 hw/ppc/spapr_rng.c                  |  2 +-
 hw/ppc/spapr_tpm_proxy.c            |  2 +-
 hw/rdma/vmw/pvrdma_main.c           |  2 +-
 hw/riscv/riscv_hart.c               |  2 +-
 hw/riscv/sifive_clint.c             |  2 +-
 hw/riscv/sifive_plic.c              |  2 +-
 hw/riscv/sifive_u_otp.c             |  2 +-
 hw/rtc/m48t59-isa.c                 |  2 +-
 hw/rtc/m48t59.c                     |  2 +-
 hw/rtc/mc146818rtc.c                |  2 +-
 hw/rtc/pl031.c                      |  2 +-
 hw/s390x/3270-ccw.c                 |  2 +-
 hw/s390x/ccw-device.c               |  2 +-
 hw/s390x/css-bridge.c               |  2 +-
 hw/s390x/ipl.c                      |  2 +-
 hw/s390x/s390-pci-bus.c             |  2 +-
 hw/s390x/vhost-vsock-ccw.c          |  2 +-
 hw/s390x/virtio-ccw-9p.c            |  2 +-
 hw/s390x/virtio-ccw-balloon.c       |  2 +-
 hw/s390x/virtio-ccw-blk.c           |  2 +-
 hw/s390x/virtio-ccw-crypto.c        |  2 +-
 hw/s390x/virtio-ccw-gpu.c           |  2 +-
 hw/s390x/virtio-ccw-input.c         |  2 +-
 hw/s390x/virtio-ccw-net.c           |  2 +-
 hw/s390x/virtio-ccw-rng.c           |  2 +-
 hw/s390x/virtio-ccw-scsi.c          |  4 ++--
 hw/s390x/virtio-ccw-serial.c        |  2 +-
 hw/scsi/megasas.c                   |  2 +-
 hw/scsi/mptsas.c                    |  2 +-
 hw/scsi/scsi-bus.c                  |  2 +-
 hw/scsi/scsi-disk.c                 |  8 ++++----
 hw/scsi/scsi-generic.c              |  2 +-
 hw/scsi/spapr_vscsi.c               |  2 +-
 hw/scsi/vhost-scsi.c                |  2 +-
 hw/scsi/vhost-user-scsi.c           |  2 +-
 hw/scsi/virtio-scsi.c               |  2 +-
 hw/scsi/vmw_pvscsi.c                |  2 +-
 hw/sd/sd.c                          |  2 +-
 hw/sd/sdhci-pci.c                   |  2 +-
 hw/sd/sdhci.c                       |  2 +-
 hw/sparc/sun4m.c                    |  4 ++--
 hw/sparc/sun4m_iommu.c              |  2 +-
 hw/sparc64/sun4u.c                  |  6 +++---
 hw/ssi/aspeed_smc.c                 |  2 +-
 hw/ssi/xilinx_spi.c                 |  2 +-
 hw/ssi/xilinx_spips.c               |  4 ++--
 hw/timer/a9gtimer.c                 |  2 +-
 hw/timer/allwinner-a10-pit.c        |  2 +-
 hw/timer/altera_timer.c             |  2 +-
 hw/timer/arm_mptimer.c              |  2 +-
 hw/timer/arm_timer.c                |  2 +-
 hw/timer/aspeed_timer.c             |  2 +-
 hw/timer/cmsdk-apb-dualtimer.c      |  2 +-
 hw/timer/cmsdk-apb-timer.c          |  2 +-
 hw/timer/grlib_gptimer.c            |  2 +-
 hw/timer/hpet.c                     |  2 +-
 hw/timer/i8254.c                    |  2 +-
 hw/timer/lm32_timer.c               |  2 +-
 hw/timer/milkymist-sysctl.c         |  2 +-
 hw/timer/mss-timer.c                |  2 +-
 hw/timer/pxa2xx_timer.c             |  4 ++--
 hw/timer/slavio_timer.c             |  2 +-
 hw/timer/stm32f2xx_timer.c          |  2 +-
 hw/timer/xilinx_timer.c             |  2 +-
 hw/tpm/tpm_crb.c                    |  2 +-
 hw/tpm/tpm_tis.c                    |  2 +-
 hw/usb/bus.c                        |  2 +-
 hw/usb/ccid-card-emulated.c         |  2 +-
 hw/usb/ccid-card-passthru.c         |  2 +-
 hw/usb/dev-audio.c                  |  2 +-
 hw/usb/dev-hid.c                    |  6 +++---
 hw/usb/dev-hub.c                    |  2 +-
 hw/usb/dev-mtp.c                    |  2 +-
 hw/usb/dev-network.c                |  2 +-
 hw/usb/dev-serial.c                 |  4 ++--
 hw/usb/dev-smartcard-reader.c       |  4 ++--
 hw/usb/dev-storage.c                |  2 +-
 hw/usb/dev-uas.c                    |  2 +-
 hw/usb/hcd-ehci-pci.c               |  2 +-
 hw/usb/hcd-ehci-sysbus.c            |  2 +-
 hw/usb/hcd-ohci-pci.c               |  2 +-
 hw/usb/hcd-ohci.c                   |  2 +-
 hw/usb/hcd-uhci.c                   |  4 ++--
 hw/usb/hcd-xhci-nec.c               |  2 +-
 hw/usb/hcd-xhci.c                   |  2 +-
 hw/usb/host-libusb.c                |  2 +-
 hw/usb/redirect.c                   |  2 +-
 hw/vfio/ap.c                        |  2 +-
 hw/vfio/ccw.c                       |  2 +-
 hw/vfio/pci.c                       |  4 ++--
 hw/vfio/platform.c                  |  2 +-
 hw/virtio/vhost-scsi-pci.c          |  2 +-
 hw/virtio/vhost-user-blk-pci.c      |  2 +-
 hw/virtio/vhost-user-fs-pci.c       |  2 +-
 hw/virtio/vhost-user-fs.c           |  2 +-
 hw/virtio/vhost-user-scsi-pci.c     |  2 +-
 hw/virtio/vhost-vsock-pci.c         |  2 +-
 hw/virtio/vhost-vsock.c             |  2 +-
 hw/virtio/virtio-9p-pci.c           |  2 +-
 hw/virtio/virtio-balloon-pci.c      |  2 +-
 hw/virtio/virtio-balloon.c          |  2 +-
 hw/virtio/virtio-blk-pci.c          |  2 +-
 hw/virtio/virtio-crypto-pci.c       |  2 +-
 hw/virtio/virtio-crypto.c           |  2 +-
 hw/virtio/virtio-input-pci.c        |  2 +-
 hw/virtio/virtio-mmio.c             |  2 +-
 hw/virtio/virtio-net-pci.c          |  2 +-
 hw/virtio/virtio-pci.c              |  4 ++--
 hw/virtio/virtio-pmem.c             |  2 +-
 hw/virtio/virtio-rng.c              |  2 +-
 hw/virtio/virtio-scsi-pci.c         |  2 +-
 hw/virtio/virtio-serial-pci.c       |  2 +-
 hw/virtio/virtio.c                  |  2 +-
 hw/watchdog/cmsdk-apb-watchdog.c    |  2 +-
 hw/watchdog/wdt_aspeed.c            |  2 +-
 hw/xen/xen-bus.c                    |  2 +-
 hw/xen/xen-legacy-backend.c         |  4 ++--
 hw/xen/xen_pt.c                     |  2 +-
 migration/migration.c               |  2 +-
 target/arm/cpu.c                    |  2 +-
 target/i386/cpu.c                   |  4 ++--
 target/microblaze/cpu.c             |  2 +-
 target/nios2/cpu.c                  |  2 +-
 target/ppc/translate_init.inc.c     | 10 +++++-----
 target/riscv/cpu.c                  |  2 +-
 target/s390x/cpu.c                  |  2 +-
 target/sparc/cpu.c                  |  2 +-
 tests/test-qdev-global-props.c      |  2 +-
 398 files changed, 456 insertions(+), 449 deletions(-)

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 6b0e7b265d..4065162251 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -433,6 +433,8 @@ void qdev_machine_init(void);
  */
 void device_reset(DeviceState *dev);
 
+void device_class_set_props(DeviceClass *dc, Property *props);
+
 void device_class_set_parent_reset(DeviceClass *dc,
                                    DeviceReset dev_reset,
                                    DeviceReset *parent_reset);
diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c
index b5a7c03f26..1023d427ac 100644
--- a/hw/9pfs/virtio-9p-device.c
+++ b/hw/9pfs/virtio-9p-device.c
@@ -242,7 +242,7 @@ static void virtio_9p_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
 
-    dc->props = virtio_9p_properties;
+    device_class_set_props(dc, virtio_9p_properties);
     dc->vmsd = &vmstate_virtio_9p;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     vdc->realize = virtio_9p_device_realize;
diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c
index 9cee90cc70..375272e211 100644
--- a/hw/acpi/generic_event_device.c
+++ b/hw/acpi/generic_event_device.c
@@ -282,7 +282,7 @@ static void acpi_ged_class_init(ObjectClass *class, void *data)
     AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_CLASS(class);
 
     dc->desc = "ACPI Generic Event Device";
-    dc->props = acpi_ged_properties;
+    device_class_set_props(dc, acpi_ged_properties);
     dc->vmsd = &vmstate_acpi_ged;
 
     hc->plug = acpi_ged_device_plug_cb;
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index 93aec2dd2c..6d621c31e7 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -653,7 +653,7 @@ static void piix4_pm_class_init(ObjectClass *klass, void *data)
     dc->reset = piix4_pm_reset;
     dc->desc = "PM";
     dc->vmsd = &vmstate_acpi;
-    dc->props = piix4_pm_properties;
+    device_class_set_props(dc, piix4_pm_properties);
     /*
      * Reason: part of PIIX4 southbridge, needs to be wired up,
      * e.g. by mips_malta_init()
diff --git a/hw/acpi/vmgenid.c b/hw/acpi/vmgenid.c
index 6e11b0fa9b..2df7623d74 100644
--- a/hw/acpi/vmgenid.c
+++ b/hw/acpi/vmgenid.c
@@ -226,7 +226,7 @@ static void vmgenid_device_class_init(ObjectClass *klass, void *data)
 
     dc->vmsd = &vmstate_vmgenid;
     dc->realize = vmgenid_realize;
-    dc->props = vmgenid_device_properties;
+    device_class_set_props(dc, vmgenid_device_properties);
     dc->hotpluggable = false;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
index e5263aa33d..174ca7effc 100644
--- a/hw/arm/armsse.c
+++ b/hw/arm/armsse.c
@@ -1283,7 +1283,7 @@ static void armsse_class_init(ObjectClass *klass, void *data)
 
     dc->realize = armsse_realize;
     dc->vmsd = &armsse_vmstate;
-    dc->props = info->props;
+    device_class_set_props(dc, info->props);
     dc->reset = armsse_reset;
     iic->check = armsse_idau_check;
     asc->info = info;
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index 7a3c48f002..5d4a581436 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -288,7 +288,7 @@ static void armv7m_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = armv7m_realize;
-    dc->props = armv7m_properties;
+    device_class_set_props(dc, armv7m_properties);
 }
 
 static const TypeInfo armv7m_info = {
@@ -367,7 +367,7 @@ static void bitband_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = bitband_realize;
-    dc->props = bitband_properties;
+    device_class_set_props(dc, bitband_properties);
 }
 
 static const TypeInfo bitband_info = {
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
index a6237e5940..99892cbae6 100644
--- a/hw/arm/aspeed_soc.c
+++ b/hw/arm/aspeed_soc.c
@@ -449,7 +449,7 @@ static void aspeed_soc_class_init(ObjectClass *oc, void *data)
     dc->realize = aspeed_soc_realize;
     /* Reason: Uses serial_hds and nd_table in realize() directly */
     dc->user_creatable = false;
-    dc->props = aspeed_soc_properties;
+    device_class_set_props(dc, aspeed_soc_properties);
 }
 
 static const TypeInfo aspeed_soc_type_info = {
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
index 221ff06895..38e2941bab 100644
--- a/hw/arm/bcm2836.c
+++ b/hw/arm/bcm2836.c
@@ -180,7 +180,7 @@ static void bcm283x_class_init(ObjectClass *oc, void *data)
 
     bc->info = data;
     dc->realize = bcm2836_realize;
-    dc->props = bcm2836_props;
+    device_class_set_props(dc, bcm2836_props);
     /* Reason: Must be wired up in code (see raspi_init() function) */
     dc->user_creatable = false;
 }
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 524970840d..0cd94d9f09 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -673,7 +673,7 @@ static void core_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = core_properties;
+    device_class_set_props(dc, core_properties);
     dc->realize = integratorcm_realize;
     dc->vmsd = &vmstate_integratorcm;
 }
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
index 008fd9327a..8f84692e64 100644
--- a/hw/arm/msf2-soc.c
+++ b/hw/arm/msf2-soc.c
@@ -229,7 +229,7 @@ static void m2sxxx_soc_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = m2sxxx_soc_realize;
-    dc->props = m2sxxx_soc_properties;
+    device_class_set_props(dc, m2sxxx_soc_properties);
 }
 
 static const TypeInfo m2sxxx_soc_info = {
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index f68a399a98..dc551bb0c0 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -435,7 +435,7 @@ static void mv88w8618_eth_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->vmsd = &mv88w8618_eth_vmsd;
-    dc->props = mv88w8618_eth_properties;
+    device_class_set_props(dc, mv88w8618_eth_properties);
     dc->realize = mv88w8618_eth_realize;
 }
 
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
index 74029169d0..4817a76ae0 100644
--- a/hw/arm/nrf51_soc.c
+++ b/hw/arm/nrf51_soc.c
@@ -224,7 +224,7 @@ static void nrf51_soc_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = nrf51_soc_realize;
-    dc->props = nrf51_soc_properties;
+    device_class_set_props(dc, nrf51_soc_properties);
 }
 
 static const TypeInfo nrf51_soc_info = {
diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c
index cdafde2f76..1eeabdfb9b 100644
--- a/hw/arm/pxa2xx.c
+++ b/hw/arm/pxa2xx.c
@@ -1531,7 +1531,7 @@ static void pxa2xx_i2c_class_init(ObjectClass *klass, void *data)
 
     dc->desc = "PXA2xx I2C Bus Controller";
     dc->vmsd = &vmstate_pxa2xx_i2c;
-    dc->props = pxa2xx_i2c_properties;
+    device_class_set_props(dc, pxa2xx_i2c_properties);
 }
 
 static const TypeInfo pxa2xx_i2c_info = {
@@ -2015,7 +2015,7 @@ static void pxa2xx_fir_class_init(ObjectClass *klass, void *data)
 
     dc->realize = pxa2xx_fir_realize;
     dc->vmsd = &pxa2xx_fir_vmsd;
-    dc->props = pxa2xx_fir_properties;
+    device_class_set_props(dc, pxa2xx_fir_properties);
     dc->reset = pxa2xx_fir_reset;
 }
 
diff --git a/hw/arm/pxa2xx_gpio.c b/hw/arm/pxa2xx_gpio.c
index 86a0e86c4c..f8df3cc227 100644
--- a/hw/arm/pxa2xx_gpio.c
+++ b/hw/arm/pxa2xx_gpio.c
@@ -347,7 +347,7 @@ static void pxa2xx_gpio_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->desc = "PXA2xx GPIO controller";
-    dc->props = pxa2xx_gpio_properties;
+    device_class_set_props(dc, pxa2xx_gpio_properties);
     dc->vmsd = &vmstate_pxa2xx_gpio_regs;
     dc->realize = pxa2xx_gpio_realize;
 }
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
index 245817d23e..23eb117041 100644
--- a/hw/arm/smmu-common.c
+++ b/hw/arm/smmu-common.c
@@ -461,7 +461,7 @@ static void smmu_base_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     SMMUBaseClass *sbc = ARM_SMMU_CLASS(klass);
 
-    dc->props = smmu_dev_properties;
+    device_class_set_props(dc, smmu_dev_properties);
     device_class_set_parent_realize(dc, smmu_base_realize,
                                     &sbc->parent_realize);
     dc->reset = smmu_base_reset;
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
index 25bd0f5d9d..e001088103 100644
--- a/hw/arm/spitz.c
+++ b/hw/arm/spitz.c
@@ -1083,7 +1083,7 @@ static void sl_nand_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->vmsd = &vmstate_sl_nand_info;
-    dc->props = sl_nand_properties;
+    device_class_set_props(dc, sl_nand_properties);
     dc->realize = sl_nand_realize;
     /* Reason: init() method uses drive_get() */
     dc->user_creatable = false;
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
index f5a5c2d80c..627fd446f5 100644
--- a/hw/arm/stm32f205_soc.c
+++ b/hw/arm/stm32f205_soc.c
@@ -207,7 +207,7 @@ static void stm32f205_soc_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = stm32f205_soc_realize;
-    dc->props = stm32f205_soc_properties;
+    device_class_set_props(dc, stm32f205_soc_properties);
 }
 
 static const TypeInfo stm32f205_soc_info = {
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
index 6bee034914..efbccf435d 100644
--- a/hw/arm/strongarm.c
+++ b/hw/arm/strongarm.c
@@ -1327,7 +1327,7 @@ static void strongarm_uart_class_init(ObjectClass *klass, void *data)
     dc->desc = "StrongARM UART controller";
     dc->reset = strongarm_uart_reset;
     dc->vmsd = &vmstate_strongarm_uart_regs;
-    dc->props = strongarm_uart_properties;
+    device_class_set_props(dc, strongarm_uart_properties);
     dc->realize = strongarm_uart_realize;
 }
 
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
index 8b3d8d85b8..1cf3daaf4f 100644
--- a/hw/arm/xlnx-versal.c
+++ b/hw/arm/xlnx-versal.c
@@ -305,7 +305,7 @@ static void versal_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = versal_realize;
-    dc->props = versal_properties;
+    device_class_set_props(dc, versal_properties);
     /* No VMSD since we haven't got any top-level SoC state to save.  */
 }
 
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index fb03c60ebb..cab0160ae9 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -657,7 +657,7 @@ static void xlnx_zynqmp_class_init(ObjectClass *oc, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(oc);
 
-    dc->props = xlnx_zynqmp_props;
+    device_class_set_props(dc, xlnx_zynqmp_props);
     dc->realize = xlnx_zynqmp_realize;
     /* Reason: Uses serial_hds in realize function, thus can't be used twice */
     dc->user_creatable = false;
diff --git a/hw/audio/ac97.c b/hw/audio/ac97.c
index 78cda88333..1ec87feec0 100644
--- a/hw/audio/ac97.c
+++ b/hw/audio/ac97.c
@@ -1420,7 +1420,7 @@ static void ac97_class_init (ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
     dc->desc = "Intel 82801AA AC97 Audio";
     dc->vmsd = &vmstate_ac97;
-    dc->props = ac97_properties;
+    device_class_set_props(dc, ac97_properties);
     dc->reset = ac97_on_reset;
 }
 
diff --git a/hw/audio/adlib.c b/hw/audio/adlib.c
index cb4178d861..d6c1fb0586 100644
--- a/hw/audio/adlib.c
+++ b/hw/audio/adlib.c
@@ -312,7 +312,7 @@ static void adlib_class_initfn (ObjectClass *klass, void *data)
     dc->realize = adlib_realizefn;
     set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
     dc->desc = ADLIB_DESC;
-    dc->props = adlib_properties;
+    device_class_set_props(dc, adlib_properties);
 }
 
 static const TypeInfo adlib_info = {
diff --git a/hw/audio/cs4231.c b/hw/audio/cs4231.c
index b5d3e895ce..11a6328fc2 100644
--- a/hw/audio/cs4231.c
+++ b/hw/audio/cs4231.c
@@ -168,7 +168,7 @@ static void cs4231_class_init(ObjectClass *klass, void *data)
 
     dc->reset = cs_reset;
     dc->vmsd = &vmstate_cs4231;
-    dc->props = cs4231_properties;
+    device_class_set_props(dc, cs4231_properties);
 }
 
 static const TypeInfo cs4231_info = {
diff --git a/hw/audio/cs4231a.c b/hw/audio/cs4231a.c
index c7b8067489..ffdbb58d6a 100644
--- a/hw/audio/cs4231a.c
+++ b/hw/audio/cs4231a.c
@@ -706,7 +706,7 @@ static void cs4231a_class_initfn (ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
     dc->desc = "Crystal Semiconductor CS4231A";
     dc->vmsd = &vmstate_cs4231a;
-    dc->props = cs4231a_properties;
+    device_class_set_props(dc, cs4231a_properties);
 }
 
 static const TypeInfo cs4231a_info = {
diff --git a/hw/audio/es1370.c b/hw/audio/es1370.c
index f9e9f2a3b3..89c4dabcd4 100644
--- a/hw/audio/es1370.c
+++ b/hw/audio/es1370.c
@@ -908,7 +908,7 @@ static void es1370_class_init (ObjectClass *klass, void *data)
     dc->desc = "ENSONIQ AudioPCI ES1370";
     dc->vmsd = &vmstate_es1370;
     dc->reset = es1370_on_reset;
-    dc->props = es1370_properties;
+    device_class_set_props(dc, es1370_properties);
 }
 
 static const TypeInfo es1370_info = {
diff --git a/hw/audio/gus.c b/hw/audio/gus.c
index 2b6b7c4e3f..eb4a803fb5 100644
--- a/hw/audio/gus.c
+++ b/hw/audio/gus.c
@@ -315,7 +315,7 @@ static void gus_class_initfn (ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
     dc->desc = "Gravis Ultrasound GF1";
     dc->vmsd = &vmstate_gus;
-    dc->props = gus_properties;
+    device_class_set_props(dc, gus_properties);
 }
 
 static const TypeInfo gus_info = {
diff --git a/hw/audio/hda-codec.c b/hw/audio/hda-codec.c
index e711a99a41..cbd92b72f2 100644
--- a/hw/audio/hda-codec.c
+++ b/hw/audio/hda-codec.c
@@ -892,7 +892,7 @@ static void hda_audio_base_class_init(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
     dc->reset = hda_audio_reset;
     dc->vmsd = &vmstate_hda_audio;
-    dc->props = hda_audio_properties;
+    device_class_set_props(dc, hda_audio_properties);
 }
 
 static const TypeInfo hda_audio_info = {
diff --git a/hw/audio/intel-hda.c b/hw/audio/intel-hda.c
index 6ecd383540..e96a707ac5 100644
--- a/hw/audio/intel-hda.c
+++ b/hw/audio/intel-hda.c
@@ -1233,7 +1233,7 @@ static void intel_hda_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_MULTIMEDIA_HD_AUDIO;
     dc->reset = intel_hda_reset;
     dc->vmsd = &vmstate_intel_hda;
-    dc->props = intel_hda_properties;
+    device_class_set_props(dc, intel_hda_properties);
 }
 
 static void intel_hda_class_init_ich6(ObjectClass *klass, void *data)
@@ -1289,7 +1289,7 @@ static void hda_codec_device_class_init(ObjectClass *klass, void *data)
     k->unrealize = hda_codec_dev_unrealize;
     set_bit(DEVICE_CATEGORY_SOUND, k->categories);
     k->bus_type = TYPE_HDA_BUS;
-    k->props = hda_props;
+    device_class_set_props(k, hda_props);
 }
 
 static const TypeInfo hda_codec_device_type_info = {
diff --git a/hw/audio/milkymist-ac97.c b/hw/audio/milkymist-ac97.c
index 6d409eff1b..0fa38adbe2 100644
--- a/hw/audio/milkymist-ac97.c
+++ b/hw/audio/milkymist-ac97.c
@@ -342,7 +342,7 @@ static void milkymist_ac97_class_init(ObjectClass *klass, void *data)
     dc->realize = milkymist_ac97_realize;
     dc->reset = milkymist_ac97_reset;
     dc->vmsd = &vmstate_milkymist_ac97;
-    dc->props = milkymist_ac97_properties;
+    device_class_set_props(dc, milkymist_ac97_properties);
 }
 
 static const TypeInfo milkymist_ac97_info = {
diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c
index d773eb80de..29dc00bf8d 100644
--- a/hw/audio/pcspk.c
+++ b/hw/audio/pcspk.c
@@ -222,7 +222,7 @@ static void pcspk_class_initfn(ObjectClass *klass, void *data)
     dc->realize = pcspk_realizefn;
     set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
     dc->vmsd = &vmstate_spk;
-    dc->props = pcspk_properties;
+    device_class_set_props(dc, pcspk_properties);
     /* Reason: realize sets global pcspk_state */
     /* Reason: pit object link */
     dc->user_creatable = false;
diff --git a/hw/audio/pl041.c b/hw/audio/pl041.c
index c30417d46d..c3d3eab6ed 100644
--- a/hw/audio/pl041.c
+++ b/hw/audio/pl041.c
@@ -640,7 +640,7 @@ static void pl041_device_class_init(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
     dc->reset = pl041_device_reset;
     dc->vmsd = &vmstate_pl041;
-    dc->props = pl041_device_properties;
+    device_class_set_props(dc, pl041_device_properties);
 }
 
 static const TypeInfo pl041_device_info = {
diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c
index a354f94acb..df6f755a37 100644
--- a/hw/audio/sb16.c
+++ b/hw/audio/sb16.c
@@ -1439,7 +1439,7 @@ static void sb16_class_initfn (ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
     dc->desc = "Creative Sound Blaster 16";
     dc->vmsd = &vmstate_sb16;
-    dc->props = sb16_properties;
+    device_class_set_props(dc, sb16_properties);
 }
 
 static const TypeInfo sb16_info = {
diff --git a/hw/audio/wm8750.c b/hw/audio/wm8750.c
index 601ed04aff..92b2902a10 100644
--- a/hw/audio/wm8750.c
+++ b/hw/audio/wm8750.c
@@ -717,7 +717,7 @@ static void wm8750_class_init(ObjectClass *klass, void *data)
     sc->recv = wm8750_rx;
     sc->send = wm8750_tx;
     dc->vmsd = &vmstate_wm8750;
-    dc->props = wm8750_properties;
+    device_class_set_props(dc, wm8750_properties);
 }
 
 static const TypeInfo wm8750_info = {
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index ac5d31e8c1..22e954e0dc 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -606,7 +606,7 @@ static void floppy_drive_class_init(ObjectClass *klass, void *data)
     k->realize = floppy_drive_realize;
     set_bit(DEVICE_CATEGORY_STORAGE, k->categories);
     k->bus_type = TYPE_FLOPPY_BUS;
-    k->props = floppy_drive_properties;
+    device_class_set_props(k, floppy_drive_properties);
     k->desc = "virtual floppy drive";
 }
 
@@ -2827,7 +2827,7 @@ static void isabus_fdc_class_init(ObjectClass *klass, void *data)
     dc->fw_name = "fdc";
     dc->reset = fdctrl_external_reset_isa;
     dc->vmsd = &vmstate_isa_fdc;
-    dc->props = isa_fdc_properties;
+    device_class_set_props(dc, isa_fdc_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
 
@@ -2880,7 +2880,7 @@ static void sysbus_fdc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = sysbus_fdc_properties;
+    device_class_set_props(dc, sysbus_fdc_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
 
@@ -2906,7 +2906,7 @@ static void sun4m_fdc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = sun4m_fdc_properties;
+    device_class_set_props(dc, sun4m_fdc_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
 
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 11ff5b9ad7..61f2fb8f8f 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -1391,7 +1391,7 @@ static void m25p80_class_init(ObjectClass *klass, void *data)
     k->set_cs = m25p80_cs;
     k->cs_polarity = SSI_CS_LOW;
     dc->vmsd = &vmstate_m25p80;
-    dc->props = m25p80_properties;
+    device_class_set_props(dc, m25p80_properties);
     dc->reset = m25p80_reset;
     mc->pi = data;
 }
diff --git a/hw/block/nand.c b/hw/block/nand.c
index e396004315..bba89688ba 100644
--- a/hw/block/nand.c
+++ b/hw/block/nand.c
@@ -448,7 +448,7 @@ static void nand_class_init(ObjectClass *klass, void *data)
     dc->realize = nand_realize;
     dc->reset = nand_reset;
     dc->vmsd = &vmstate_nand;
-    dc->props = nand_properties;
+    device_class_set_props(dc, nand_properties);
 }
 
 static const TypeInfo nand_info = {
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
index 12d8254250..d28335cbf3 100644
--- a/hw/block/nvme.c
+++ b/hw/block/nvme.c
@@ -1475,7 +1475,7 @@ static void nvme_class_init(ObjectClass *oc, void *data)
 
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     dc->desc = "Non-Volatile Memory Express";
-    dc->props = nvme_props;
+    device_class_set_props(dc, nvme_props);
     dc->vmsd = &nvme_vmstate;
 }
 
diff --git a/hw/block/onenand.c b/hw/block/onenand.c
index 9c233c12e4..898ac563a3 100644
--- a/hw/block/onenand.c
+++ b/hw/block/onenand.c
@@ -845,7 +845,7 @@ static void onenand_class_init(ObjectClass *klass, void *data)
 
     dc->realize = onenand_realize;
     dc->reset = onenand_system_reset;
-    dc->props = onenand_properties;
+    device_class_set_props(dc, onenand_properties);
 }
 
 static const TypeInfo onenand_info = {
diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
index 54e6ebd385..24f3bce7ef 100644
--- a/hw/block/pflash_cfi01.c
+++ b/hw/block/pflash_cfi01.c
@@ -930,7 +930,7 @@ static void pflash_cfi01_class_init(ObjectClass *klass, void *data)
 
     dc->reset = pflash_cfi01_system_reset;
     dc->realize = pflash_cfi01_realize;
-    dc->props = pflash_cfi01_properties;
+    device_class_set_props(dc, pflash_cfi01_properties);
     dc->vmsd = &vmstate_pflash;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
index c7d92c3e79..7c4744c020 100644
--- a/hw/block/pflash_cfi02.c
+++ b/hw/block/pflash_cfi02.c
@@ -963,7 +963,7 @@ static void pflash_cfi02_class_init(ObjectClass *klass, void *data)
 
     dc->realize = pflash_cfi02_realize;
     dc->unrealize = pflash_cfi02_unrealize;
-    dc->props = pflash_cfi02_properties;
+    device_class_set_props(dc, pflash_cfi02_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
 
diff --git a/hw/block/swim.c b/hw/block/swim.c
index c6d117e89b..8f124782f4 100644
--- a/hw/block/swim.c
+++ b/hw/block/swim.c
@@ -239,7 +239,7 @@ static void swim_drive_class_init(ObjectClass *klass, void *data)
     k->realize = swim_drive_realize;
     set_bit(DEVICE_CATEGORY_STORAGE, k->categories);
     k->bus_type = TYPE_SWIM_BUS;
-    k->props = swim_drive_properties;
+    device_class_set_props(k, swim_drive_properties);
     k->desc = "virtual SWIM drive";
 }
 
diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c
index 63da9bb619..ce415092c6 100644
--- a/hw/block/vhost-user-blk.c
+++ b/hw/block/vhost-user-blk.c
@@ -506,7 +506,7 @@ static void vhost_user_blk_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
 
-    dc->props = vhost_user_blk_properties;
+    device_class_set_props(dc, vhost_user_blk_properties);
     dc->vmsd = &vmstate_vhost_user_blk;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     vdc->realize = vhost_user_blk_device_realize;
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
index 9bee514c4e..09f46ed85f 100644
--- a/hw/block/virtio-blk.c
+++ b/hw/block/virtio-blk.c
@@ -1294,7 +1294,7 @@ static void virtio_blk_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
 
-    dc->props = virtio_blk_properties;
+    device_class_set_props(dc, virtio_blk_properties);
     dc->vmsd = &vmstate_virtio_blk;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     vdc->realize = virtio_blk_device_realize;
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index 879fc310a4..686bbc3f0d 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -554,7 +554,7 @@ static void xen_block_class_init(ObjectClass *class, void *data)
     xendev_class->frontend_changed = xen_block_frontend_changed;
     xendev_class->unrealize = xen_block_unrealize;
 
-    dev_class->props = xen_block_props;
+    device_class_set_props(dev_class, xen_block_props);
 }
 
 static const TypeInfo xen_block_type_info = {
diff --git a/hw/char/bcm2835_aux.c b/hw/char/bcm2835_aux.c
index a6fc1bf152..ee3dd40e3c 100644
--- a/hw/char/bcm2835_aux.c
+++ b/hw/char/bcm2835_aux.c
@@ -299,7 +299,7 @@ static void bcm2835_aux_class_init(ObjectClass *oc, void *data)
     dc->realize = bcm2835_aux_realize;
     dc->vmsd = &vmstate_bcm2835_aux;
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
-    dc->props = bcm2835_aux_props;
+    device_class_set_props(dc, bcm2835_aux_props);
 }
 
 static const TypeInfo bcm2835_aux_info = {
diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c
index 0e315b2376..0fd90cf4d7 100644
--- a/hw/char/cadence_uart.c
+++ b/hw/char/cadence_uart.c
@@ -550,7 +550,7 @@ static void cadence_uart_class_init(ObjectClass *klass, void *data)
     dc->realize = cadence_uart_realize;
     dc->vmsd = &vmstate_cadence_uart;
     dc->reset = cadence_uart_reset;
-    dc->props = cadence_uart_properties;
+    device_class_set_props(dc, cadence_uart_properties);
   }
 
 static const TypeInfo cadence_uart_info = {
diff --git a/hw/char/cmsdk-apb-uart.c b/hw/char/cmsdk-apb-uart.c
index 9e1aa43bd3..626b68f2ec 100644
--- a/hw/char/cmsdk-apb-uart.c
+++ b/hw/char/cmsdk-apb-uart.c
@@ -389,7 +389,7 @@ static void cmsdk_apb_uart_class_init(ObjectClass *klass, void *data)
     dc->realize = cmsdk_apb_uart_realize;
     dc->vmsd = &cmsdk_apb_uart_vmstate;
     dc->reset = cmsdk_apb_uart_reset;
-    dc->props = cmsdk_apb_uart_properties;
+    device_class_set_props(dc, cmsdk_apb_uart_properties);
 }
 
 static const TypeInfo cmsdk_apb_uart_info = {
diff --git a/hw/char/debugcon.c b/hw/char/debugcon.c
index 5c592e091b..c8d938efb5 100644
--- a/hw/char/debugcon.c
+++ b/hw/char/debugcon.c
@@ -125,7 +125,7 @@ static void debugcon_isa_class_initfn(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = debugcon_isa_realizefn;
-    dc->props = debugcon_isa_properties;
+    device_class_set_props(dc, debugcon_isa_properties);
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
 
diff --git a/hw/char/digic-uart.c b/hw/char/digic-uart.c
index 974a2619dd..8ca2dbc666 100644
--- a/hw/char/digic-uart.c
+++ b/hw/char/digic-uart.c
@@ -183,7 +183,7 @@ static void digic_uart_class_init(ObjectClass *klass, void *data)
     dc->realize = digic_uart_realize;
     dc->reset = digic_uart_reset;
     dc->vmsd = &vmstate_digic_uart;
-    dc->props = digic_uart_properties;
+    device_class_set_props(dc, digic_uart_properties);
 }
 
 static const TypeInfo digic_uart_info = {
diff --git a/hw/char/escc.c b/hw/char/escc.c
index 8f7bf322cb..9139d6b35e 100644
--- a/hw/char/escc.c
+++ b/hw/char/escc.c
@@ -865,7 +865,7 @@ static void escc_class_init(ObjectClass *klass, void *data)
     dc->reset = escc_reset;
     dc->realize = escc_realize;
     dc->vmsd = &vmstate_escc;
-    dc->props = escc_properties;
+    device_class_set_props(dc, escc_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
diff --git a/hw/char/etraxfs_ser.c b/hw/char/etraxfs_ser.c
index 15ac12ef22..3aee178a9a 100644
--- a/hw/char/etraxfs_ser.c
+++ b/hw/char/etraxfs_ser.c
@@ -244,7 +244,7 @@ static void etraxfs_ser_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = etraxfs_ser_reset;
-    dc->props = etraxfs_ser_properties;
+    device_class_set_props(dc, etraxfs_ser_properties);
     dc->realize = etraxfs_ser_realize;
 }
 
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
index d6b6b62366..c0395baf13 100644
--- a/hw/char/exynos4210_uart.c
+++ b/hw/char/exynos4210_uart.c
@@ -645,7 +645,7 @@ static void exynos4210_uart_class_init(ObjectClass *klass, void *data)
 
     dc->realize = exynos4210_uart_realize;
     dc->reset = exynos4210_uart_reset;
-    dc->props = exynos4210_uart_properties;
+    device_class_set_props(dc, exynos4210_uart_properties);
     dc->vmsd = &vmstate_exynos4210_uart;
 }
 
diff --git a/hw/char/grlib_apbuart.c b/hw/char/grlib_apbuart.c
index fe3cbf41a3..9ead109122 100644
--- a/hw/char/grlib_apbuart.c
+++ b/hw/char/grlib_apbuart.c
@@ -285,7 +285,7 @@ static void grlib_apbuart_class_init(ObjectClass *klass, void *data)
 
     dc->realize = grlib_apbuart_realize;
     dc->reset = grlib_apbuart_reset;
-    dc->props = grlib_apbuart_properties;
+    device_class_set_props(dc, grlib_apbuart_properties);
 }
 
 static const TypeInfo grlib_apbuart_info = {
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
index fddde9b43d..043e352f25 100644
--- a/hw/char/imx_serial.c
+++ b/hw/char/imx_serial.c
@@ -372,7 +372,7 @@ static void imx_serial_class_init(ObjectClass *klass, void *data)
     dc->reset = imx_serial_reset_at_boot;
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
     dc->desc = "i.MX series UART";
-    dc->props = imx_serial_properties;
+    device_class_set_props(dc, imx_serial_properties);
 }
 
 static const TypeInfo imx_serial_info = {
diff --git a/hw/char/ipoctal232.c b/hw/char/ipoctal232.c
index 66c163ba26..13434e5fbf 100644
--- a/hw/char/ipoctal232.c
+++ b/hw/char/ipoctal232.c
@@ -588,7 +588,7 @@ static void ipoctal_class_init(ObjectClass *klass, void *data)
 
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
     dc->desc    = "GE IP-Octal 232 8-channel RS-232 IndustryPack";
-    dc->props   = ipoctal_properties;
+    device_class_set_props(dc, ipoctal_properties);
     dc->vmsd    = &vmstate_ipoctal;
 }
 
diff --git a/hw/char/lm32_juart.c b/hw/char/lm32_juart.c
index e0b1bd6555..4a604c7ecb 100644
--- a/hw/char/lm32_juart.c
+++ b/hw/char/lm32_juart.c
@@ -146,7 +146,7 @@ static void lm32_juart_class_init(ObjectClass *klass, void *data)
 
     dc->reset = juart_reset;
     dc->vmsd = &vmstate_lm32_juart;
-    dc->props = lm32_juart_properties;
+    device_class_set_props(dc, lm32_juart_properties);
     dc->realize = lm32_juart_realize;
 }
 
diff --git a/hw/char/lm32_uart.c b/hw/char/lm32_uart.c
index 32f29c44cf..7f2a79f3f4 100644
--- a/hw/char/lm32_uart.c
+++ b/hw/char/lm32_uart.c
@@ -293,7 +293,7 @@ static void lm32_uart_class_init(ObjectClass *klass, void *data)
 
     dc->reset = uart_reset;
     dc->vmsd = &vmstate_lm32_uart;
-    dc->props = lm32_uart_properties;
+    device_class_set_props(dc, lm32_uart_properties);
     dc->realize = lm32_uart_realize;
 }
 
diff --git a/hw/char/mcf_uart.c b/hw/char/mcf_uart.c
index 58323baf43..5932b5cd96 100644
--- a/hw/char/mcf_uart.c
+++ b/hw/char/mcf_uart.c
@@ -320,7 +320,7 @@ static void mcf_uart_class_init(ObjectClass *oc, void *data)
 
     dc->realize = mcf_uart_realize;
     dc->reset = mcf_uart_reset;
-    dc->props = mcf_uart_properties;
+    device_class_set_props(dc, mcf_uart_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
diff --git a/hw/char/milkymist-uart.c b/hw/char/milkymist-uart.c
index c358ca07f3..dcc5edcaa3 100644
--- a/hw/char/milkymist-uart.c
+++ b/hw/char/milkymist-uart.c
@@ -239,7 +239,7 @@ static void milkymist_uart_class_init(ObjectClass *klass, void *data)
     dc->realize = milkymist_uart_realize;
     dc->reset = milkymist_uart_reset;
     dc->vmsd = &vmstate_milkymist_uart;
-    dc->props = milkymist_uart_properties;
+    device_class_set_props(dc, milkymist_uart_properties);
 }
 
 static const TypeInfo milkymist_uart_info = {
diff --git a/hw/char/nrf51_uart.c b/hw/char/nrf51_uart.c
index 2777afe366..f647d51f09 100644
--- a/hw/char/nrf51_uart.c
+++ b/hw/char/nrf51_uart.c
@@ -314,7 +314,7 @@ static void nrf51_uart_class_init(ObjectClass *klass, void *data)
 
     dc->reset = nrf51_uart_reset;
     dc->realize = nrf51_uart_realize;
-    dc->props = nrf51_uart_properties;
+    device_class_set_props(dc, nrf51_uart_properties);
     dc->vmsd = &nrf51_uart_vmstate;
 }
 
diff --git a/hw/char/parallel.c b/hw/char/parallel.c
index 40174eeda1..8dd67d1375 100644
--- a/hw/char/parallel.c
+++ b/hw/char/parallel.c
@@ -627,7 +627,7 @@ static void parallel_isa_class_initfn(ObjectClass *klass, void *data)
 
     dc->realize = parallel_isa_realizefn;
     dc->vmsd = &vmstate_parallel_isa;
-    dc->props = parallel_isa_properties;
+    device_class_set_props(dc, parallel_isa_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
diff --git a/hw/char/pl011.c b/hw/char/pl011.c
index 84ad8ff9fb..4fab1d5cf3 100644
--- a/hw/char/pl011.c
+++ b/hw/char/pl011.c
@@ -356,7 +356,7 @@ static void pl011_class_init(ObjectClass *oc, void *data)
 
     dc->realize = pl011_realize;
     dc->vmsd = &vmstate_pl011;
-    dc->props = pl011_properties;
+    device_class_set_props(dc, pl011_properties);
 }
 
 static const TypeInfo pl011_arm_info = {
diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c
index 392606259d..c420dc066e 100644
--- a/hw/char/sclpconsole-lm.c
+++ b/hw/char/sclpconsole-lm.c
@@ -342,7 +342,7 @@ static void console_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     SCLPEventClass *ec = SCLP_EVENT_CLASS(klass);
 
-    dc->props = console_properties;
+    device_class_set_props(dc, console_properties);
     dc->reset = console_reset;
     dc->vmsd = &vmstate_sclplmconsole;
     ec->init = console_init;
diff --git a/hw/char/sclpconsole.c b/hw/char/sclpconsole.c
index da126f0133..1fa124dab9 100644
--- a/hw/char/sclpconsole.c
+++ b/hw/char/sclpconsole.c
@@ -258,7 +258,7 @@ static void console_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     SCLPEventClass *ec = SCLP_EVENT_CLASS(klass);
 
-    dc->props = console_properties;
+    device_class_set_props(dc, console_properties);
     dc->reset = console_reset;
     dc->vmsd = &vmstate_sclpconsole;
     ec->init = console_init;
diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
index db8644551e..f9b6eed783 100644
--- a/hw/char/serial-isa.c
+++ b/hw/char/serial-isa.c
@@ -106,7 +106,7 @@ static void serial_isa_class_initfn(ObjectClass *klass, void *data)
 
     dc->realize = serial_isa_realizefn;
     dc->vmsd = &vmstate_isa_serial;
-    dc->props = serial_isa_properties;
+    device_class_set_props(dc, serial_isa_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
index e343a1235c..1742cb77ec 100644
--- a/hw/char/serial-pci-multi.c
+++ b/hw/char/serial-pci-multi.c
@@ -161,7 +161,7 @@ static void multi_2x_serial_pci_class_initfn(ObjectClass *klass, void *data)
     pc->revision = 1;
     pc->class_id = PCI_CLASS_COMMUNICATION_SERIAL;
     dc->vmsd = &vmstate_pci_multi_serial;
-    dc->props = multi_2x_serial_pci_properties;
+    device_class_set_props(dc, multi_2x_serial_pci_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
@@ -176,7 +176,7 @@ static void multi_4x_serial_pci_class_initfn(ObjectClass *klass, void *data)
     pc->revision = 1;
     pc->class_id = PCI_CLASS_COMMUNICATION_SERIAL;
     dc->vmsd = &vmstate_pci_multi_serial;
-    dc->props = multi_4x_serial_pci_properties;
+    device_class_set_props(dc, multi_4x_serial_pci_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index b6a73c65a9..743552c56b 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -100,7 +100,7 @@ static void serial_pci_class_initfn(ObjectClass *klass, void *data)
     pc->revision = 1;
     pc->class_id = PCI_CLASS_COMMUNICATION_SERIAL;
     dc->vmsd = &vmstate_pci_serial;
-    dc->props = serial_pci_properties;
+    device_class_set_props(dc, serial_pci_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
diff --git a/hw/char/serial.c b/hw/char/serial.c
index 6c327183c7..bdfacba162 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -1044,7 +1044,7 @@ static void serial_class_init(ObjectClass *klass, void* data)
     dc->realize = serial_realize;
     dc->unrealize = serial_unrealize;
     dc->vmsd = &vmstate_serial;
-    dc->props = serial_properties;
+    device_class_set_props(dc, serial_properties);
 }
 
 static const TypeInfo serial_info = {
@@ -1159,7 +1159,7 @@ static void serial_mm_class_init(ObjectClass *oc, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(oc);
 
-    dc->props = serial_mm_properties;
+    device_class_set_props(dc, serial_mm_properties);
     dc->realize = serial_mm_realize;
 }
 
diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c
index 8f4d9fe472..ecb94f5673 100644
--- a/hw/char/spapr_vty.c
+++ b/hw/char/spapr_vty.c
@@ -193,7 +193,7 @@ static void spapr_vty_class_init(ObjectClass *klass, void *data)
     k->dt_type = "serial";
     k->dt_compatible = "hvterm1";
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
-    dc->props = spapr_vty_properties;
+    device_class_set_props(dc, spapr_vty_properties);
     dc->vmsd = &vmstate_spapr_vty;
 }
 
diff --git a/hw/char/stm32f2xx_usart.c b/hw/char/stm32f2xx_usart.c
index 4ec843de38..0d661be6d3 100644
--- a/hw/char/stm32f2xx_usart.c
+++ b/hw/char/stm32f2xx_usart.c
@@ -222,7 +222,7 @@ static void stm32f2xx_usart_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = stm32f2xx_usart_reset;
-    dc->props = stm32f2xx_usart_properties;
+    device_class_set_props(dc, stm32f2xx_usart_properties);
     dc->realize = stm32f2xx_usart_realize;
 }
 
diff --git a/hw/char/terminal3270.c b/hw/char/terminal3270.c
index 6859c1bcb2..ddef319027 100644
--- a/hw/char/terminal3270.c
+++ b/hw/char/terminal3270.c
@@ -283,7 +283,7 @@ static void terminal_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     EmulatedCcw3270Class *ck = EMULATED_CCW_3270_CLASS(klass);
 
-    dc->props = terminal_properties;
+    device_class_set_props(dc, terminal_properties);
     dc->vmsd = &terminal3270_vmstate;
     ck->init = terminal_init;
     ck->read_payload_3270 = read_payload_3270;
diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c
index c13649f1ef..8e7e9649d5 100644
--- a/hw/char/virtio-console.c
+++ b/hw/char/virtio-console.c
@@ -282,7 +282,7 @@ static void virtserialport_class_init(ObjectClass *klass, void *data)
     k->set_guest_connected = set_guest_connected;
     k->enable_backend = virtconsole_enable_backend;
     k->guest_writable = guest_writable;
-    dc->props = virtserialport_properties;
+    device_class_set_props(dc, virtserialport_properties);
 }
 
 static const TypeInfo virtserialport_info = {
diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c
index e1cbce3ba3..941ed5aca9 100644
--- a/hw/char/virtio-serial-bus.c
+++ b/hw/char/virtio-serial-bus.c
@@ -1110,7 +1110,7 @@ static void virtio_serial_port_class_init(ObjectClass *klass, void *data)
     k->bus_type = TYPE_VIRTIO_SERIAL_BUS;
     k->realize = virtser_port_device_realize;
     k->unrealize = virtser_port_device_unrealize;
-    k->props = virtser_props;
+    device_class_set_props(k, virtser_props);
 }
 
 static const TypeInfo virtio_serial_port_type_info = {
@@ -1179,7 +1179,7 @@ static void virtio_serial_class_init(ObjectClass *klass, void *data)
 
     QLIST_INIT(&vserdevices.devices);
 
-    dc->props = virtio_serial_properties;
+    device_class_set_props(dc, virtio_serial_properties);
     dc->vmsd = &vmstate_virtio_console;
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
     vdc->realize = virtio_serial_device_realize;
diff --git a/hw/char/xilinx_uartlite.c b/hw/char/xilinx_uartlite.c
index 2c47275068..f0f185b53f 100644
--- a/hw/char/xilinx_uartlite.c
+++ b/hw/char/xilinx_uartlite.c
@@ -236,7 +236,7 @@ static void xilinx_uartlite_class_init(ObjectClass *klass, void *data)
 
     dc->reset = xilinx_uartlite_reset;
     dc->realize = xilinx_uartlite_realize;
-    dc->props = xilinx_uartlite_properties;
+    device_class_set_props(dc, xilinx_uartlite_properties);
 }
 
 static const TypeInfo xilinx_uartlite_info = {
diff --git a/hw/core/cpu.c b/hw/core/cpu.c
index db1a03c6bb..1d03fc8379 100644
--- a/hw/core/cpu.c
+++ b/hw/core/cpu.c
@@ -432,7 +432,7 @@ static void cpu_class_init(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_CPU, dc->categories);
     dc->realize = cpu_common_realizefn;
     dc->unrealize = cpu_common_unrealizefn;
-    dc->props = cpu_common_props;
+    device_class_set_props(dc, cpu_common_props);
     /*
      * Reason: CPUs still need special care by board code: wiring up
      * IRQs, adding reset handlers, halting non-first CPUs, ...
diff --git a/hw/core/generic-loader.c b/hw/core/generic-loader.c
index 4b1fc86a06..e7eb57e860 100644
--- a/hw/core/generic-loader.c
+++ b/hw/core/generic-loader.c
@@ -201,7 +201,7 @@ static void generic_loader_class_init(ObjectClass *klass, void *data)
      */
     dc->realize = generic_loader_realize;
     dc->unrealize = generic_loader_unrealize;
-    dc->props = generic_loader_props;
+    device_class_set_props(dc, generic_loader_props);
     dc->desc = "Generic Loader";
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
diff --git a/hw/core/or-irq.c b/hw/core/or-irq.c
index 18d63831cd..4bbdbcb321 100644
--- a/hw/core/or-irq.c
+++ b/hw/core/or-irq.c
@@ -125,7 +125,7 @@ static void or_irq_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = or_irq_reset;
-    dc->props = or_irq_properties;
+    device_class_set_props(dc, or_irq_properties);
     dc->realize = or_irq_realize;
     dc->vmsd = &vmstate_or_irq;
 
diff --git a/hw/core/platform-bus.c b/hw/core/platform-bus.c
index edb0da1de8..22c5f76dd0 100644
--- a/hw/core/platform-bus.c
+++ b/hw/core/platform-bus.c
@@ -211,7 +211,7 @@ static void platform_bus_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = platform_bus_realize;
-    dc->props = platform_bus_properties;
+    device_class_set_props(dc, platform_bus_properties);
 }
 
 static const TypeInfo platform_bus_info = {
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index a520d7fa89..0e314c051e 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -1060,6 +1060,11 @@ static void device_class_init(ObjectClass *class, void *data)
     vc->get_id = device_vmstate_if_get_id;
 }
 
+void device_class_set_props(DeviceClass *dc, Property *props)
+{
+    dc->props = props;
+}
+
 void device_class_set_parent_reset(DeviceClass *dc,
                                    DeviceReset dev_reset,
                                    DeviceReset *parent_reset)
diff --git a/hw/core/split-irq.c b/hw/core/split-irq.c
index b5acc669fb..3b90af2e8f 100644
--- a/hw/core/split-irq.c
+++ b/hw/core/split-irq.c
@@ -69,7 +69,7 @@ static void split_irq_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     /* No state to reset or migrate */
-    dc->props = split_irq_properties;
+    device_class_set_props(dc, split_irq_properties);
     dc->realize = split_irq_realize;
 
     /* Reason: Needs to be wired up to work */
diff --git a/hw/cpu/a15mpcore.c b/hw/cpu/a15mpcore.c
index 7e9983aa19..4f659115b6 100644
--- a/hw/cpu/a15mpcore.c
+++ b/hw/cpu/a15mpcore.c
@@ -164,7 +164,7 @@ static void a15mp_priv_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = a15mp_priv_realize;
-    dc->props = a15mp_priv_properties;
+    device_class_set_props(dc, a15mp_priv_properties);
     /* We currently have no savable state */
 }
 
diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
index 6872a3a00a..1f8bc8a196 100644
--- a/hw/cpu/a9mpcore.c
+++ b/hw/cpu/a9mpcore.c
@@ -175,7 +175,7 @@ static void a9mp_priv_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = a9mp_priv_realize;
-    dc->props = a9mp_priv_properties;
+    device_class_set_props(dc, a9mp_priv_properties);
 }
 
 static const TypeInfo a9mp_priv_info = {
diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c
index e78f5d080c..2e3e87cc1b 100644
--- a/hw/cpu/arm11mpcore.c
+++ b/hw/cpu/arm11mpcore.c
@@ -156,7 +156,7 @@ static void mpcore_priv_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = mpcore_priv_realize;
-    dc->props = mpcore_priv_properties;
+    device_class_set_props(dc, mpcore_priv_properties);
 }
 
 static const TypeInfo mpcore_priv_info = {
diff --git a/hw/cpu/cluster.c b/hw/cpu/cluster.c
index 349a883261..e444b7c29d 100644
--- a/hw/cpu/cluster.c
+++ b/hw/cpu/cluster.c
@@ -78,7 +78,7 @@ static void cpu_cluster_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = cpu_cluster_properties;
+    device_class_set_props(dc, cpu_cluster_properties);
     dc->realize = cpu_cluster_realize;
 
     /* This is not directly for users, CPU children must be attached by code */
diff --git a/hw/cpu/realview_mpcore.c b/hw/cpu/realview_mpcore.c
index ae2c9913f6..cc2767c716 100644
--- a/hw/cpu/realview_mpcore.c
+++ b/hw/cpu/realview_mpcore.c
@@ -125,7 +125,7 @@ static void mpcore_rirq_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = realview_mpcore_realize;
-    dc->props = mpcore_rirq_properties;
+    device_class_set_props(dc, mpcore_rirq_properties);
 }
 
 static const TypeInfo mpcore_rirq_info = {
diff --git a/hw/display/ati.c b/hw/display/ati.c
index db3b254316..58ec8291d4 100644
--- a/hw/display/ati.c
+++ b/hw/display/ati.c
@@ -980,7 +980,7 @@ static void ati_vga_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
 
     dc->reset = ati_vga_reset;
-    dc->props = ati_vga_properties;
+    device_class_set_props(dc, ati_vga_properties);
     dc->hotpluggable = false;
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
 
diff --git a/hw/display/bcm2835_fb.c b/hw/display/bcm2835_fb.c
index 85aaa54330..d6bf3374a6 100644
--- a/hw/display/bcm2835_fb.c
+++ b/hw/display/bcm2835_fb.c
@@ -451,7 +451,7 @@ static void bcm2835_fb_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = bcm2835_fb_props;
+    device_class_set_props(dc, bcm2835_fb_props);
     dc->realize = bcm2835_fb_realize;
     dc->reset = bcm2835_fb_reset;
     dc->vmsd = &vmstate_bcm2835_fb;
diff --git a/hw/display/bochs-display.c b/hw/display/bochs-display.c
index 215db9a231..62085f9fc0 100644
--- a/hw/display/bochs-display.c
+++ b/hw/display/bochs-display.c
@@ -364,7 +364,7 @@ static void bochs_display_class_init(ObjectClass *klass, void *data)
     k->romfile   = "vgabios-bochs-display.bin";
     k->exit      = bochs_display_exit;
     dc->vmsd     = &vmstate_bochs_display;
-    dc->props    = bochs_display_properties;
+    device_class_set_props(dc, bochs_display_properties);
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
 }
 
diff --git a/hw/display/cg3.c b/hw/display/cg3.c
index f90baae4de..4fb67c6b1c 100644
--- a/hw/display/cg3.c
+++ b/hw/display/cg3.c
@@ -382,7 +382,7 @@ static void cg3_class_init(ObjectClass *klass, void *data)
     dc->realize = cg3_realizefn;
     dc->reset = cg3_reset;
     dc->vmsd = &vmstate_cg3;
-    dc->props = cg3_properties;
+    device_class_set_props(dc, cg3_properties);
 }
 
 static const TypeInfo cg3_info = {
diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
index cd283e53b4..0d391e1300 100644
--- a/hw/display/cirrus_vga.c
+++ b/hw/display/cirrus_vga.c
@@ -3031,7 +3031,7 @@ static void cirrus_vga_class_init(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
     dc->desc = "Cirrus CLGD 54xx VGA";
     dc->vmsd = &vmstate_pci_cirrus_vga;
-    dc->props = pci_vga_cirrus_properties;
+    device_class_set_props(dc, pci_vga_cirrus_properties);
     dc->hotpluggable = false;
 }
 
diff --git a/hw/display/cirrus_vga_isa.c b/hw/display/cirrus_vga_isa.c
index 7ef8e59224..825ba57298 100644
--- a/hw/display/cirrus_vga_isa.c
+++ b/hw/display/cirrus_vga_isa.c
@@ -80,7 +80,7 @@ static void isa_cirrus_vga_class_init(ObjectClass *klass, void *data)
 
     dc->vmsd  = &vmstate_cirrus_vga;
     dc->realize = isa_cirrus_vga_realizefn;
-    dc->props = isa_cirrus_vga_properties;
+    device_class_set_props(dc, isa_cirrus_vga_properties);
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
 }
 
diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c
index 839d26eca1..55185c95c6 100644
--- a/hw/display/g364fb.c
+++ b/hw/display/g364fb.c
@@ -526,7 +526,7 @@ static void g364fb_sysbus_class_init(ObjectClass *klass, void *data)
     dc->desc = "G364 framebuffer";
     dc->reset = g364fb_sysbus_reset;
     dc->vmsd = &vmstate_g364fb;
-    dc->props = g364fb_sysbus_properties;
+    device_class_set_props(dc, g364fb_sysbus_properties);
 }
 
 static const TypeInfo g364fb_sysbus_info = {
diff --git a/hw/display/i2c-ddc.c b/hw/display/i2c-ddc.c
index fc70b7930c..13eb529fc1 100644
--- a/hw/display/i2c-ddc.c
+++ b/hw/display/i2c-ddc.c
@@ -107,7 +107,7 @@ static void i2c_ddc_class_init(ObjectClass *oc, void *data)
 
     dc->reset = i2c_ddc_reset;
     dc->vmsd = &vmstate_i2c_ddc;
-    dc->props = i2c_ddc_properties;
+    device_class_set_props(dc, i2c_ddc_properties);
     isc->event = i2c_ddc_event;
     isc->recv = i2c_ddc_rx;
     isc->send = i2c_ddc_tx;
diff --git a/hw/display/macfb.c b/hw/display/macfb.c
index f4fa8e3206..8bff16d535 100644
--- a/hw/display/macfb.c
+++ b/hw/display/macfb.c
@@ -437,7 +437,7 @@ static void macfb_sysbus_class_init(ObjectClass *klass, void *data)
     dc->desc = "SysBus Macintosh framebuffer";
     dc->reset = macfb_sysbus_reset;
     dc->vmsd = &vmstate_macfb;
-    dc->props = macfb_sysbus_properties;
+    device_class_set_props(dc, macfb_sysbus_properties);
 }
 
 static void macfb_nubus_class_init(ObjectClass *klass, void *data)
@@ -450,7 +450,7 @@ static void macfb_nubus_class_init(ObjectClass *klass, void *data)
     dc->desc = "Nubus Macintosh framebuffer";
     dc->reset = macfb_nubus_reset;
     dc->vmsd = &vmstate_macfb;
-    dc->props = macfb_nubus_properties;
+    device_class_set_props(dc, macfb_nubus_properties);
 }
 
 static TypeInfo macfb_sysbus_info = {
diff --git a/hw/display/milkymist-vgafb.c b/hw/display/milkymist-vgafb.c
index 8b0da4660a..6a6441e6ea 100644
--- a/hw/display/milkymist-vgafb.c
+++ b/hw/display/milkymist-vgafb.c
@@ -341,7 +341,7 @@ static void milkymist_vgafb_class_init(ObjectClass *klass, void *data)
 
     dc->reset = milkymist_vgafb_reset;
     dc->vmsd = &vmstate_milkymist_vgafb;
-    dc->props = milkymist_vgafb_properties;
+    device_class_set_props(dc, milkymist_vgafb_properties);
     dc->realize = milkymist_vgafb_realize;
 }
 
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
index 6d43b7433c..944c02ce56 100644
--- a/hw/display/qxl.c
+++ b/hw/display/qxl.c
@@ -2478,7 +2478,7 @@ static void qxl_pci_class_init(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
     dc->reset = qxl_reset_handler;
     dc->vmsd = &qxl_vmstate;
-    dc->props = qxl_properties;
+    device_class_set_props(dc, qxl_properties);
 }
 
 static const TypeInfo qxl_pci_type_info = {
diff --git a/hw/display/ramfb-standalone.c b/hw/display/ramfb-standalone.c
index 1f72450303..d76a9d0fe2 100644
--- a/hw/display/ramfb-standalone.c
+++ b/hw/display/ramfb-standalone.c
@@ -52,7 +52,7 @@ static void ramfb_class_initfn(ObjectClass *klass, void *data)
 
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
     dc->realize = ramfb_realizefn;
-    dc->props = ramfb_properties;
+    device_class_set_props(dc, ramfb_properties);
     dc->desc = "ram framebuffer standalone device";
     dc->user_creatable = true;
 }
diff --git a/hw/display/sm501.c b/hw/display/sm501.c
index 66a1bfbe60..de0ab9d977 100644
--- a/hw/display/sm501.c
+++ b/hw/display/sm501.c
@@ -1995,7 +1995,7 @@ static void sm501_sysbus_class_init(ObjectClass *klass, void *data)
     dc->realize = sm501_realize_sysbus;
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
     dc->desc = "SM501 Multimedia Companion";
-    dc->props = sm501_sysbus_properties;
+    device_class_set_props(dc, sm501_sysbus_properties);
     dc->reset = sm501_reset_sysbus;
     dc->vmsd = &vmstate_sm501_sysbus;
 }
@@ -2085,7 +2085,7 @@ static void sm501_pci_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_DISPLAY_OTHER;
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
     dc->desc = "SM501 Display Controller";
-    dc->props = sm501_pci_properties;
+    device_class_set_props(dc, sm501_pci_properties);
     dc->reset = sm501_reset_pci;
     dc->hotpluggable = false;
     dc->vmsd = &vmstate_sm501_pci;
diff --git a/hw/display/tcx.c b/hw/display/tcx.c
index 14e829d3fa..e9b08fd0f2 100644
--- a/hw/display/tcx.c
+++ b/hw/display/tcx.c
@@ -891,7 +891,7 @@ static void tcx_class_init(ObjectClass *klass, void *data)
     dc->realize = tcx_realizefn;
     dc->reset = tcx_reset;
     dc->vmsd = &vmstate_tcx;
-    dc->props = tcx_properties;
+    device_class_set_props(dc, tcx_properties);
 }
 
 static const TypeInfo tcx_info = {
diff --git a/hw/display/vga-isa.c b/hw/display/vga-isa.c
index 08a2730db5..0633ed382c 100644
--- a/hw/display/vga-isa.c
+++ b/hw/display/vga-isa.c
@@ -95,7 +95,7 @@ static void vga_isa_class_initfn(ObjectClass *klass, void *data)
     dc->realize = vga_isa_realizefn;
     dc->reset = vga_isa_reset;
     dc->vmsd = &vmstate_vga_common;
-    dc->props = vga_isa_properties;
+    device_class_set_props(dc, vga_isa_properties);
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
 }
 
diff --git a/hw/display/vga-pci.c b/hw/display/vga-pci.c
index cfe095713e..b346324673 100644
--- a/hw/display/vga-pci.c
+++ b/hw/display/vga-pci.c
@@ -383,7 +383,7 @@ static void vga_class_init(ObjectClass *klass, void *data)
     k->realize = pci_std_vga_realize;
     k->romfile = "vgabios-stdvga.bin";
     k->class_id = PCI_CLASS_DISPLAY_VGA;
-    dc->props = vga_pci_properties;
+    device_class_set_props(dc, vga_pci_properties);
     dc->hotpluggable = false;
 }
 
@@ -395,7 +395,7 @@ static void secondary_class_init(ObjectClass *klass, void *data)
     k->realize = pci_secondary_vga_realize;
     k->exit = pci_secondary_vga_exit;
     k->class_id = PCI_CLASS_DISPLAY_OTHER;
-    dc->props = secondary_pci_properties;
+    device_class_set_props(dc, secondary_pci_properties);
     dc->reset = pci_secondary_vga_reset;
 }
 
diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c
index 279877886e..f0c7c6fb9a 100644
--- a/hw/display/vhost-user-gpu.c
+++ b/hw/display/vhost-user-gpu.c
@@ -588,7 +588,7 @@ vhost_user_gpu_class_init(ObjectClass *klass, void *data)
     vdc->get_config = vhost_user_gpu_get_config;
     vdc->set_config = vhost_user_gpu_set_config;
 
-    dc->props = vhost_user_gpu_properties;
+    device_class_set_props(dc, vhost_user_gpu_properties);
 }
 
 static const TypeInfo vhost_user_gpu_info = {
diff --git a/hw/display/virtio-gpu-pci.c b/hw/display/virtio-gpu-pci.c
index 25e4038874..3d152ff5c8 100644
--- a/hw/display/virtio-gpu-pci.c
+++ b/hw/display/virtio-gpu-pci.c
@@ -56,7 +56,7 @@ static void virtio_gpu_pci_base_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
 
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
-    dc->props = virtio_gpu_pci_base_properties;
+    device_class_set_props(dc, virtio_gpu_pci_base_properties);
     dc->hotpluggable = false;
     k->realize = virtio_gpu_pci_base_realize;
     pcidev_k->class_id = PCI_CLASS_DISPLAY_OTHER;
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 28e868c021..5f0dd7c150 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -1254,7 +1254,7 @@ static void virtio_gpu_class_init(ObjectClass *klass, void *data)
     vdc->set_config = virtio_gpu_set_config;
 
     dc->vmsd = &vmstate_virtio_gpu;
-    dc->props = virtio_gpu_properties;
+    device_class_set_props(dc, virtio_gpu_properties);
 }
 
 static const TypeInfo virtio_gpu_info = {
diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c
index cc6e66ea1c..2b4c2aa126 100644
--- a/hw/display/virtio-vga.c
+++ b/hw/display/virtio-vga.c
@@ -184,7 +184,7 @@ static void virtio_vga_base_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
 
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
-    dc->props = virtio_vga_base_properties;
+    device_class_set_props(dc, virtio_vga_base_properties);
     dc->vmsd = &vmstate_virtio_vga_base;
     dc->hotpluggable = false;
     device_class_set_parent_reset(dc, virtio_vga_base_reset,
diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
index ead754eccf..58ea82e3e5 100644
--- a/hw/display/vmware_vga.c
+++ b/hw/display/vmware_vga.c
@@ -1336,7 +1336,7 @@ static void vmsvga_class_init(ObjectClass *klass, void *data)
     k->subsystem_id = SVGA_PCI_DEVICE_ID;
     dc->reset = vmsvga_reset;
     dc->vmsd = &vmstate_vmware_vga;
-    dc->props = vga_vmware_properties;
+    device_class_set_props(dc, vga_vmware_properties);
     dc->hotpluggable = false;
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
 }
diff --git a/hw/dma/i82374.c b/hw/dma/i82374.c
index b788b3681a..6977d85ef8 100644
--- a/hw/dma/i82374.c
+++ b/hw/dma/i82374.c
@@ -149,7 +149,7 @@ static void i82374_class_init(ObjectClass *klass, void *data)
     
     dc->realize = i82374_realize;
     dc->vmsd = &vmstate_i82374;
-    dc->props = i82374_properties;
+    device_class_set_props(dc, i82374_properties);
 }
 
 static const TypeInfo i82374_info = {
diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
index 792f617eb4..bad8debae4 100644
--- a/hw/dma/i8257.c
+++ b/hw/dma/i8257.c
@@ -595,7 +595,7 @@ static void i8257_class_init(ObjectClass *klass, void *data)
     dc->realize = i8257_realize;
     dc->reset = i8257_reset;
     dc->vmsd = &vmstate_i8257;
-    dc->props = i8257_properties;
+    device_class_set_props(dc, i8257_properties);
 
     idc->get_transfer_mode = i8257_dma_get_transfer_mode;
     idc->has_autoinitialization = i8257_dma_has_autoinitialization;
diff --git a/hw/dma/pl080.c b/hw/dma/pl080.c
index 52ba23f4bf..f1a586b1d7 100644
--- a/hw/dma/pl080.c
+++ b/hw/dma/pl080.c
@@ -421,7 +421,7 @@ static void pl080_class_init(ObjectClass *oc, void *data)
 
     dc->vmsd = &vmstate_pl080;
     dc->realize = pl080_realize;
-    dc->props = pl080_properties;
+    device_class_set_props(dc, pl080_properties);
     dc->reset = pl080_reset;
 }
 
diff --git a/hw/dma/pl330.c b/hw/dma/pl330.c
index f2bb2d9ac1..8c9625ca7a 100644
--- a/hw/dma/pl330.c
+++ b/hw/dma/pl330.c
@@ -1656,7 +1656,7 @@ static void pl330_class_init(ObjectClass *klass, void *data)
 
     dc->realize = pl330_realize;
     dc->reset = pl330_reset;
-    dc->props = pl330_properties;
+    device_class_set_props(dc, pl330_properties);
     dc->vmsd = &vmstate_pl330;
 }
 
diff --git a/hw/dma/pxa2xx_dma.c b/hw/dma/pxa2xx_dma.c
index 18e7a0b694..88ed4b6ff1 100644
--- a/hw/dma/pxa2xx_dma.c
+++ b/hw/dma/pxa2xx_dma.c
@@ -566,7 +566,7 @@ static void pxa2xx_dma_class_init(ObjectClass *klass, void *data)
 
     dc->desc = "PXA2xx DMA controller";
     dc->vmsd = &vmstate_pxa2xx_dma;
-    dc->props = pxa2xx_dma_properties;
+    device_class_set_props(dc, pxa2xx_dma_properties);
     dc->realize = pxa2xx_dma_realize;
 }
 
diff --git a/hw/dma/xilinx_axidma.c b/hw/dma/xilinx_axidma.c
index fb3a978e28..018f36991b 100644
--- a/hw/dma/xilinx_axidma.c
+++ b/hw/dma/xilinx_axidma.c
@@ -599,7 +599,7 @@ static void axidma_class_init(ObjectClass *klass, void *data)
 
     dc->realize = xilinx_axidma_realize,
     dc->reset = xilinx_axidma_reset;
-    dc->props = axidma_properties;
+    device_class_set_props(dc, axidma_properties);
 }
 
 static StreamSlaveClass xilinx_axidma_data_stream_class = {
diff --git a/hw/dma/xlnx-zdma.c b/hw/dma/xlnx-zdma.c
index 75b660988f..8fb83f5b07 100644
--- a/hw/dma/xlnx-zdma.c
+++ b/hw/dma/xlnx-zdma.c
@@ -820,7 +820,7 @@ static void zdma_class_init(ObjectClass *klass, void *data)
 
     dc->reset = zdma_reset;
     dc->realize = zdma_realize;
-    dc->props = zdma_props;
+    device_class_set_props(dc, zdma_props);
     dc->vmsd = &vmstate_zdma;
 }
 
diff --git a/hw/gpio/imx_gpio.c b/hw/gpio/imx_gpio.c
index ac8304ec56..7a591804a9 100644
--- a/hw/gpio/imx_gpio.c
+++ b/hw/gpio/imx_gpio.c
@@ -335,7 +335,7 @@ static void imx_gpio_class_init(ObjectClass *klass, void *data)
 
     dc->realize = imx_gpio_realize;
     dc->reset = imx_gpio_reset;
-    dc->props = imx_gpio_properties;
+    device_class_set_props(dc, imx_gpio_properties);
     dc->vmsd = &vmstate_imx_gpio;
     dc->desc = "i.MX GPIO controller";
 }
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
index 85c16897ae..f662c4cb95 100644
--- a/hw/gpio/omap_gpio.c
+++ b/hw/gpio/omap_gpio.c
@@ -755,7 +755,7 @@ static void omap_gpio_class_init(ObjectClass *klass, void *data)
 
     dc->realize = omap_gpio_realize;
     dc->reset = omap_gpif_reset;
-    dc->props = omap_gpio_properties;
+    device_class_set_props(dc, omap_gpio_properties);
     /* Reason: pointer property "clk" */
     dc->user_creatable = false;
 }
@@ -790,7 +790,7 @@ static void omap2_gpio_class_init(ObjectClass *klass, void *data)
 
     dc->realize = omap2_gpio_realize;
     dc->reset = omap2_gpif_reset;
-    dc->props = omap2_gpio_properties;
+    device_class_set_props(dc, omap2_gpio_properties);
     /* Reason: pointer properties "iclk", "fclk0", ..., "fclk5" */
     dc->user_creatable = false;
 }
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
index 2da04a4bff..9cda968501 100644
--- a/hw/i2c/aspeed_i2c.c
+++ b/hw/i2c/aspeed_i2c.c
@@ -832,7 +832,7 @@ static void aspeed_i2c_class_init(ObjectClass *klass, void *data)
 
     dc->vmsd = &aspeed_i2c_vmstate;
     dc->reset = aspeed_i2c_reset;
-    dc->props = aspeed_i2c_properties;
+    device_class_set_props(dc, aspeed_i2c_properties);
     dc->realize = aspeed_i2c_realize;
     dc->desc = "Aspeed I2C Controller";
 }
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
index 92cd489069..a440a84fda 100644
--- a/hw/i2c/core.c
+++ b/hw/i2c/core.c
@@ -281,7 +281,7 @@ static void i2c_slave_class_init(ObjectClass *klass, void *data)
     DeviceClass *k = DEVICE_CLASS(klass);
     set_bit(DEVICE_CATEGORY_MISC, k->categories);
     k->bus_type = TYPE_I2C_BUS;
-    k->props = i2c_props;
+    device_class_set_props(k, i2c_props);
 }
 
 static const TypeInfo i2c_slave_type_info = {
diff --git a/hw/i2c/omap_i2c.c b/hw/i2c/omap_i2c.c
index 3ccbd5cc2c..e5d205dda5 100644
--- a/hw/i2c/omap_i2c.c
+++ b/hw/i2c/omap_i2c.c
@@ -520,7 +520,7 @@ static void omap_i2c_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = omap_i2c_properties;
+    device_class_set_props(dc, omap_i2c_properties);
     dc->reset = omap_i2c_reset;
     /* Reason: pointer properties "iclk", "fclk" */
     dc->user_creatable = false;
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index a523ef0e65..6258c58ac9 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -3845,7 +3845,7 @@ static void vtd_class_init(ObjectClass *klass, void *data)
 
     dc->reset = vtd_reset;
     dc->vmsd = &vtd_vmstate;
-    dc->props = vtd_properties;
+    device_class_set_props(dc, vtd_properties);
     dc->hotpluggable = false;
     x86_class->realize = vtd_realize;
     x86_class->int_remap = vtd_int_remap;
diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c
index 2c59b6894b..64283358f9 100644
--- a/hw/i386/kvm/clock.c
+++ b/hw/i386/kvm/clock.c
@@ -317,7 +317,7 @@ static void kvmclock_class_init(ObjectClass *klass, void *data)
 
     dc->realize = kvmclock_realize;
     dc->vmsd = &kvmclock_vmsd;
-    dc->props = kvmclock_properties;
+    device_class_set_props(dc, kvmclock_properties);
 }
 
 static const TypeInfo kvmclock_info = {
diff --git a/hw/i386/kvm/i8254.c b/hw/i386/kvm/i8254.c
index 6a911e23f9..876f5aa6fa 100644
--- a/hw/i386/kvm/i8254.c
+++ b/hw/i386/kvm/i8254.c
@@ -322,7 +322,7 @@ static void kvm_pit_class_init(ObjectClass *klass, void *data)
     k->set_channel_gate = kvm_pit_set_gate;
     k->get_channel_info = kvm_pit_get_channel_info;
     dc->reset = kvm_pit_reset;
-    dc->props = kvm_pit_properties;
+    device_class_set_props(dc, kvm_pit_properties);
 }
 
 static const TypeInfo kvm_pit_info = {
diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
index 973e2b2af1..4ba8e47251 100644
--- a/hw/i386/kvm/ioapic.c
+++ b/hw/i386/kvm/ioapic.c
@@ -149,7 +149,7 @@ static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
     k->pre_save  = kvm_ioapic_get;
     k->post_load = kvm_ioapic_put;
     dc->reset    = kvm_ioapic_reset;
-    dc->props    = kvm_ioapic_properties;
+    device_class_set_props(dc, kvm_ioapic_properties);
 }
 
 static const TypeInfo kvm_ioapic_info = {
diff --git a/hw/i386/vmmouse.c b/hw/i386/vmmouse.c
index c0c329f817..7c2a375527 100644
--- a/hw/i386/vmmouse.c
+++ b/hw/i386/vmmouse.c
@@ -286,7 +286,7 @@ static void vmmouse_class_initfn(ObjectClass *klass, void *data)
     dc->realize = vmmouse_realizefn;
     dc->reset = vmmouse_reset;
     dc->vmsd = &vmstate_vmmouse;
-    dc->props = vmmouse_properties;
+    device_class_set_props(dc, vmmouse_properties);
 }
 
 static const TypeInfo vmmouse_info = {
diff --git a/hw/i386/x86-iommu.c b/hw/i386/x86-iommu.c
index 1eaf2dd1bc..4104060e68 100644
--- a/hw/i386/x86-iommu.c
+++ b/hw/i386/x86-iommu.c
@@ -153,7 +153,7 @@ static void x86_iommu_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
     dc->realize = x86_iommu_realize;
-    dc->props = x86_iommu_properties;
+    device_class_set_props(dc, x86_iommu_properties);
 }
 
 bool x86_iommu_ir_supported(X86IOMMUState *s)
diff --git a/hw/i386/xen/xen_pvdevice.c b/hw/i386/xen/xen_pvdevice.c
index 27f646da06..ee2610c7a0 100644
--- a/hw/i386/xen/xen_pvdevice.c
+++ b/hw/i386/xen/xen_pvdevice.c
@@ -131,7 +131,7 @@ static void xen_pv_class_init(ObjectClass *klass, void *data)
     k->realize = xen_pv_realize;
     k->class_id = PCI_CLASS_SYSTEM_OTHER;
     dc->desc = "Xen PV Device";
-    dc->props = xen_pv_props;
+    device_class_set_props(dc, xen_pv_props);
     dc->vmsd = &vmstate_xen_pvdevice;
 }
 
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index d45393c019..68264a22e8 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1795,7 +1795,7 @@ static void sysbus_ahci_class_init(ObjectClass *klass, void *data)
 
     dc->realize = sysbus_ahci_realize;
     dc->vmsd = &vmstate_sysbus_ahci;
-    dc->props = sysbus_ahci_properties;
+    device_class_set_props(dc, sysbus_ahci_properties);
     dc->reset = sysbus_ahci_reset;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c
index 3f9be968d1..335c060673 100644
--- a/hw/ide/cmd646.c
+++ b/hw/ide/cmd646.c
@@ -347,7 +347,7 @@ static void cmd646_ide_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_STORAGE_IDE;
     k->config_read = cmd646_pci_config_read;
     k->config_write = cmd646_pci_config_write;
-    dc->props = cmd646_ide_properties;
+    device_class_set_props(dc, cmd646_ide_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
 
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index 9c7f88b2d5..8395807b08 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -117,7 +117,7 @@ static void isa_ide_class_initfn(ObjectClass *klass, void *data)
     dc->realize = isa_ide_realizefn;
     dc->fw_name = "ide";
     dc->reset = isa_ide_reset;
-    dc->props = isa_ide_properties;
+    device_class_set_props(dc, isa_ide_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
 
diff --git a/hw/ide/macio.c b/hw/ide/macio.c
index 79f787c539..7a8470e921 100644
--- a/hw/ide/macio.c
+++ b/hw/ide/macio.c
@@ -474,7 +474,7 @@ static void macio_ide_class_init(ObjectClass *oc, void *data)
 
     dc->realize = macio_ide_realizefn;
     dc->reset = macio_ide_reset;
-    dc->props = macio_ide_properties;
+    device_class_set_props(dc, macio_ide_properties);
     dc->vmsd = &vmstate_pmac;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
diff --git a/hw/ide/mmio.c b/hw/ide/mmio.c
index 7149a9cba6..d233bd8c01 100644
--- a/hw/ide/mmio.c
+++ b/hw/ide/mmio.c
@@ -154,7 +154,7 @@ static void mmio_ide_class_init(ObjectClass *oc, void *data)
 
     dc->realize = mmio_ide_realizefn;
     dc->reset = mmio_ide_reset;
-    dc->props = mmio_ide_properties;
+    device_class_set_props(dc, mmio_ide_properties);
     dc->vmsd = &vmstate_ide_mmio;
 }
 
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 374a791a45..c22afdb8ee 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -319,7 +319,7 @@ static void ide_hd_class_init(ObjectClass *klass, void *data)
     k->realize  = ide_hd_realize;
     dc->fw_name = "drive";
     dc->desc    = "virtual IDE disk";
-    dc->props   = ide_hd_properties;
+    device_class_set_props(dc, ide_hd_properties);
 }
 
 static const TypeInfo ide_hd_info = {
@@ -342,7 +342,7 @@ static void ide_cd_class_init(ObjectClass *klass, void *data)
     k->realize  = ide_cd_realize;
     dc->fw_name = "drive";
     dc->desc    = "virtual IDE CD-ROM";
-    dc->props   = ide_cd_properties;
+    device_class_set_props(dc, ide_cd_properties);
 }
 
 static const TypeInfo ide_cd_info = {
@@ -365,7 +365,7 @@ static void ide_drive_class_init(ObjectClass *klass, void *data)
     k->realize  = ide_drive_realize;
     dc->fw_name = "drive";
     dc->desc    = "virtual IDE disk or CD-ROM (legacy)";
-    dc->props   = ide_drive_properties;
+    device_class_set_props(dc, ide_drive_properties);
 }
 
 static const TypeInfo ide_drive_info = {
@@ -381,7 +381,7 @@ static void ide_device_class_init(ObjectClass *klass, void *data)
     k->realize = ide_qdev_realize;
     set_bit(DEVICE_CATEGORY_STORAGE, k->categories);
     k->bus_type = TYPE_IDE_BUS;
-    k->props = ide_props;
+    device_class_set_props(k, ide_props);
 }
 
 static const TypeInfo ide_device_type_info = {
diff --git a/hw/input/adb.c b/hw/input/adb.c
index 478a90fae2..b1ac4a3852 100644
--- a/hw/input/adb.c
+++ b/hw/input/adb.c
@@ -128,7 +128,7 @@ static void adb_device_class_init(ObjectClass *oc, void *data)
     DeviceClass *dc = DEVICE_CLASS(oc);
 
     dc->realize = adb_device_realizefn;
-    dc->props = adb_device_properties;
+    device_class_set_props(dc, adb_device_properties);
     dc->bus_type = TYPE_ADB_BUS;
 }
 
diff --git a/hw/input/milkymist-softusb.c b/hw/input/milkymist-softusb.c
index 67fcb3595f..3e0a7eb0bd 100644
--- a/hw/input/milkymist-softusb.c
+++ b/hw/input/milkymist-softusb.c
@@ -302,7 +302,7 @@ static void milkymist_softusb_class_init(ObjectClass *klass, void *data)
     dc->realize = milkymist_softusb_realize;
     dc->reset = milkymist_softusb_reset;
     dc->vmsd = &vmstate_milkymist_softusb;
-    dc->props = milkymist_softusb_properties;
+    device_class_set_props(dc, milkymist_softusb_properties);
 }
 
 static const TypeInfo milkymist_softusb_info = {
diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c
index 386a363a17..e8ae6c148a 100644
--- a/hw/input/virtio-input-hid.c
+++ b/hw/input/virtio-input-hid.c
@@ -222,7 +222,7 @@ static void virtio_input_hid_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass);
 
-    dc->props          = virtio_input_hid_properties;
+    device_class_set_props(dc, virtio_input_hid_properties);
     vic->realize       = virtio_input_hid_realize;
     vic->unrealize     = virtio_input_hid_unrealize;
     vic->change_active = virtio_input_hid_change_active;
@@ -362,7 +362,7 @@ static void virtio_mouse_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props  = virtio_mouse_properties;
+    device_class_set_props(dc, virtio_mouse_properties);
 }
 
 static void virtio_mouse_init(Object *obj)
@@ -486,7 +486,7 @@ static void virtio_tablet_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props  = virtio_tablet_properties;
+    device_class_set_props(dc, virtio_tablet_properties);
 }
 
 static void virtio_tablet_init(Object *obj)
diff --git a/hw/input/virtio-input-host.c b/hw/input/virtio-input-host.c
index 1c3b12ba32..f2ab6df676 100644
--- a/hw/input/virtio-input-host.c
+++ b/hw/input/virtio-input-host.c
@@ -226,7 +226,7 @@ static void virtio_input_host_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->vmsd           = &vmstate_virtio_input_host;
-    dc->props          = virtio_input_host_properties;
+    device_class_set_props(dc, virtio_input_host_properties);
     vic->realize       = virtio_input_host_realize;
     vic->unrealize     = virtio_input_host_unrealize;
     vic->handle_status = virtio_input_host_handle_status;
diff --git a/hw/input/virtio-input.c b/hw/input/virtio-input.c
index 9c013afddb..4d49790f50 100644
--- a/hw/input/virtio-input.c
+++ b/hw/input/virtio-input.c
@@ -316,7 +316,7 @@ static void virtio_input_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
 
-    dc->props          = virtio_input_properties;
+    device_class_set_props(dc, virtio_input_properties);
     dc->vmsd           = &vmstate_virtio_input;
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
     vdc->realize      = virtio_input_device_realize;
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index 375cb6abe9..39cb5809f5 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -450,7 +450,7 @@ static void apic_common_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = apic_reset_common;
-    dc->props = apic_properties_common;
+    device_class_set_props(dc, apic_properties_common);
     dc->realize = apic_common_realize;
     dc->unrealize = apic_common_unrealize;
     /*
diff --git a/hw/intc/arm_gic_common.c b/hw/intc/arm_gic_common.c
index f0d0d7c467..e6c4fe7a5a 100644
--- a/hw/intc/arm_gic_common.c
+++ b/hw/intc/arm_gic_common.c
@@ -367,7 +367,7 @@ static void arm_gic_common_class_init(ObjectClass *klass, void *data)
 
     dc->reset = arm_gic_common_reset;
     dc->realize = arm_gic_common_realize;
-    dc->props = arm_gic_common_properties;
+    device_class_set_props(dc, arm_gic_common_properties);
     dc->vmsd = &vmstate_gic;
     albifc->arm_linux_init = arm_gic_common_linux_init;
 }
diff --git a/hw/intc/arm_gicv2m.c b/hw/intc/arm_gicv2m.c
index 6e45f4ff39..0b7e2b4f84 100644
--- a/hw/intc/arm_gicv2m.c
+++ b/hw/intc/arm_gicv2m.c
@@ -179,7 +179,7 @@ static void gicv2m_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = gicv2m_properties;
+    device_class_set_props(dc, gicv2m_properties);
     dc->realize = gicv2m_realize;
 }
 
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
index f0c551d43f..58ef65f589 100644
--- a/hw/intc/arm_gicv3_common.c
+++ b/hw/intc/arm_gicv3_common.c
@@ -507,7 +507,7 @@ static void arm_gicv3_common_class_init(ObjectClass *klass, void *data)
 
     dc->reset = arm_gicv3_common_reset;
     dc->realize = arm_gicv3_common_realize;
-    dc->props = arm_gicv3_common_properties;
+    device_class_set_props(dc, arm_gicv3_common_properties);
     dc->vmsd = &vmstate_gicv3;
     albifc->arm_linux_init = arm_gic_common_linux_init;
 }
diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c
index d66f2431ee..ad0ebabc87 100644
--- a/hw/intc/arm_gicv3_its_kvm.c
+++ b/hw/intc/arm_gicv3_its_kvm.c
@@ -246,7 +246,7 @@ static void kvm_arm_its_class_init(ObjectClass *klass, void *data)
     KVMARMITSClass *ic = KVM_ARM_ITS_CLASS(klass);
 
     dc->realize = kvm_arm_its_realize;
-    dc->props   = kvm_arm_its_props;
+    device_class_set_props(dc, kvm_arm_its_props);
     device_class_set_parent_reset(dc, kvm_arm_its_reset, &ic->parent_reset);
     icc->send_msi = kvm_its_send_msi;
     icc->pre_save = kvm_arm_its_pre_save;
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
index e8c74f9eba..f9e0eeaace 100644
--- a/hw/intc/armv7m_nvic.c
+++ b/hw/intc/armv7m_nvic.c
@@ -2749,7 +2749,7 @@ static void armv7m_nvic_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->vmsd  = &vmstate_nvic;
-    dc->props = props_nvic;
+    device_class_set_props(dc, props_nvic);
     dc->reset = armv7m_nvic_reset;
     dc->realize = armv7m_nvic_realize;
 }
diff --git a/hw/intc/exynos4210_combiner.c b/hw/intc/exynos4210_combiner.c
index 5b33ca6628..b8561e4180 100644
--- a/hw/intc/exynos4210_combiner.c
+++ b/hw/intc/exynos4210_combiner.c
@@ -442,7 +442,7 @@ static void exynos4210_combiner_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = exynos4210_combiner_reset;
-    dc->props = exynos4210_combiner_properties;
+    device_class_set_props(dc, exynos4210_combiner_properties);
     dc->vmsd = &vmstate_exynos4210_combiner;
 }
 
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
index 9a84d8522e..82c8f4192c 100644
--- a/hw/intc/exynos4210_gic.c
+++ b/hw/intc/exynos4210_gic.c
@@ -355,7 +355,7 @@ static void exynos4210_gic_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = exynos4210_gic_properties;
+    device_class_set_props(dc, exynos4210_gic_properties);
     dc->realize = exynos4210_gic_realize;
 }
 
@@ -462,7 +462,7 @@ static void exynos4210_irq_gate_class_init(ObjectClass *klass, void *data)
 
     dc->reset = exynos4210_irq_gate_reset;
     dc->vmsd = &vmstate_exynos4210_irq_gate;
-    dc->props = exynos4210_irq_gate_properties;
+    device_class_set_props(dc, exynos4210_irq_gate_properties);
     dc->realize = exynos4210_irq_gate_realize;
 }
 
diff --git a/hw/intc/i8259_common.c b/hw/intc/i8259_common.c
index e7b1a10436..99f8f6abd5 100644
--- a/hw/intc/i8259_common.c
+++ b/hw/intc/i8259_common.c
@@ -184,7 +184,7 @@ static void pic_common_class_init(ObjectClass *klass, void *data)
     InterruptStatsProviderClass *ic = INTERRUPT_STATS_PROVIDER_CLASS(klass);
 
     dc->vmsd = &vmstate_pic_common;
-    dc->props = pic_properties_common;
+    device_class_set_props(dc, pic_properties_common);
     dc->realize = pic_common_realize;
     /*
      * Reason: unlike ordinary ISA devices, the PICs need additional
diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
index 4f5577678a..15747fe2c2 100644
--- a/hw/intc/ioapic.c
+++ b/hw/intc/ioapic.c
@@ -477,7 +477,7 @@ static void ioapic_class_init(ObjectClass *klass, void *data)
      */
     k->post_load = ioapic_update_kvm_routes;
     dc->reset = ioapic_reset_common;
-    dc->props = ioapic_properties;
+    device_class_set_props(dc, ioapic_properties);
 }
 
 static const TypeInfo ioapic_info = {
diff --git a/hw/intc/mips_gic.c b/hw/intc/mips_gic.c
index 54b3059f3f..bda4549925 100644
--- a/hw/intc/mips_gic.c
+++ b/hw/intc/mips_gic.c
@@ -448,7 +448,7 @@ static void mips_gic_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = mips_gic_properties;
+    device_class_set_props(dc, mips_gic_properties);
     dc->realize = mips_gic_realize;
 }
 
diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
index 73bb1c2af4..b8a1d1fd7d 100644
--- a/hw/intc/omap_intc.c
+++ b/hw/intc/omap_intc.c
@@ -407,7 +407,7 @@ static void omap_intc_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = omap_inth_reset;
-    dc->props = omap_intc_properties;
+    device_class_set_props(dc, omap_intc_properties);
     /* Reason: pointer property "clk" */
     dc->user_creatable = false;
     dc->realize = omap_intc_realize;
@@ -660,7 +660,7 @@ static void omap2_intc_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = omap_inth_reset;
-    dc->props = omap2_intc_properties;
+    device_class_set_props(dc, omap2_intc_properties);
     /* Reason: pointer property "iclk", "fclk" */
     dc->user_creatable = false;
     dc->realize = omap2_intc_realize;
diff --git a/hw/intc/ompic.c b/hw/intc/ompic.c
index ca9614fda1..c354427a61 100644
--- a/hw/intc/ompic.c
+++ b/hw/intc/ompic.c
@@ -161,7 +161,7 @@ static void or1k_ompic_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = or1k_ompic_properties;
+    device_class_set_props(dc, or1k_ompic_properties);
     dc->realize = or1k_ompic_realize;
     dc->vmsd = &vmstate_or1k_ompic;
 }
diff --git a/hw/intc/openpic.c b/hw/intc/openpic.c
index c797ba78f3..65970e1b37 100644
--- a/hw/intc/openpic.c
+++ b/hw/intc/openpic.c
@@ -1628,7 +1628,7 @@ static void openpic_class_init(ObjectClass *oc, void *data)
     DeviceClass *dc = DEVICE_CLASS(oc);
 
     dc->realize = openpic_realize;
-    dc->props = openpic_properties;
+    device_class_set_props(dc, openpic_properties);
     dc->reset = openpic_reset;
     dc->vmsd = &vmstate_openpic;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
diff --git a/hw/intc/openpic_kvm.c b/hw/intc/openpic_kvm.c
index c09bebedd1..e4bf47d885 100644
--- a/hw/intc/openpic_kvm.c
+++ b/hw/intc/openpic_kvm.c
@@ -274,7 +274,7 @@ static void kvm_openpic_class_init(ObjectClass *oc, void *data)
     DeviceClass *dc = DEVICE_CLASS(oc);
 
     dc->realize = kvm_openpic_realize;
-    dc->props = kvm_openpic_properties;
+    device_class_set_props(dc, kvm_openpic_properties);
     dc->reset = kvm_openpic_reset;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c
index a0a69b98a7..6ea74bf80b 100644
--- a/hw/intc/pnv_xive.c
+++ b/hw/intc/pnv_xive.c
@@ -1952,7 +1952,7 @@ static void pnv_xive_class_init(ObjectClass *klass, void *data)
 
     dc->desc = "PowerNV XIVE Interrupt Controller";
     dc->realize = pnv_xive_realize;
-    dc->props = pnv_xive_properties;
+    device_class_set_props(dc, pnv_xive_properties);
 
     xrc->get_eas = pnv_xive_get_eas;
     xrc->get_end = pnv_xive_get_end;
diff --git a/hw/intc/s390_flic.c b/hw/intc/s390_flic.c
index a159c0c7cf..5f290f5410 100644
--- a/hw/intc/s390_flic.c
+++ b/hw/intc/s390_flic.c
@@ -427,7 +427,7 @@ static void s390_flic_class_init(ObjectClass *oc, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(oc);
 
-    dc->props = s390_flic_common_properties;
+    device_class_set_props(dc, s390_flic_common_properties);
     dc->realize = s390_flic_common_realize;
 }
 
diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c
index 57305c56d7..5efaad53a1 100644
--- a/hw/intc/spapr_xive.c
+++ b/hw/intc/spapr_xive.c
@@ -762,7 +762,7 @@ static void spapr_xive_class_init(ObjectClass *klass, void *data)
     XivePresenterClass *xpc = XIVE_PRESENTER_CLASS(klass);
 
     dc->desc    = "sPAPR XIVE Interrupt Controller";
-    dc->props   = spapr_xive_properties;
+    device_class_set_props(dc, spapr_xive_properties);
     dc->realize = spapr_xive_realize;
     dc->vmsd    = &vmstate_spapr_xive;
 
diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index 1952009e6d..785b607528 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -358,7 +358,7 @@ static void icp_class_init(ObjectClass *klass, void *data)
 
     dc->realize = icp_realize;
     dc->unrealize = icp_unrealize;
-    dc->props = icp_properties;
+    device_class_set_props(dc, icp_properties);
     /*
      * Reason: part of XICS interrupt controller, needs to be wired up
      * by icp_create().
@@ -680,7 +680,7 @@ static void ics_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = ics_realize;
-    dc->props = ics_properties;
+    device_class_set_props(dc, ics_properties);
     dc->reset = ics_reset;
     dc->vmsd = &vmstate_ics;
     /*
diff --git a/hw/intc/xilinx_intc.c b/hw/intc/xilinx_intc.c
index e15cb42b36..3e65e68619 100644
--- a/hw/intc/xilinx_intc.c
+++ b/hw/intc/xilinx_intc.c
@@ -185,7 +185,7 @@ static void xilinx_intc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = xilinx_intc_properties;
+    device_class_set_props(dc, xilinx_intc_properties);
 }
 
 static const TypeInfo xilinx_intc_info = {
diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index d4c6e21703..0b25a56285 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -737,7 +737,7 @@ static void xive_tctx_class_init(ObjectClass *klass, void *data)
     dc->desc = "XIVE Interrupt Thread Context";
     dc->realize = xive_tctx_realize;
     dc->vmsd = &vmstate_xive_tctx;
-    dc->props = xive_tctx_properties;
+    device_class_set_props(dc, xive_tctx_properties);
     /*
      * Reason: part of XIVE interrupt controller, needs to be wired up
      * by xive_tctx_create().
@@ -1188,7 +1188,7 @@ static void xive_source_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->desc    = "XIVE Interrupt Source";
-    dc->props   = xive_source_properties;
+    device_class_set_props(dc, xive_source_properties);
     dc->realize = xive_source_realize;
     dc->vmsd    = &vmstate_xive_source;
     /*
@@ -1879,7 +1879,7 @@ static void xive_end_source_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->desc    = "XIVE END Source";
-    dc->props   = xive_end_source_properties;
+    device_class_set_props(dc, xive_end_source_properties);
     dc->realize = xive_end_source_realize;
     /*
      * Reason: part of XIVE interrupt controller, needs to be wired up,
diff --git a/hw/intc/xlnx-pmu-iomod-intc.c b/hw/intc/xlnx-pmu-iomod-intc.c
index f9a1401a94..acaa1c3e6f 100644
--- a/hw/intc/xlnx-pmu-iomod-intc.c
+++ b/hw/intc/xlnx-pmu-iomod-intc.c
@@ -539,7 +539,7 @@ static void xlnx_pmu_io_intc_class_init(ObjectClass *klass, void *data)
     dc->reset = xlnx_pmu_io_intc_reset;
     dc->realize = xlnx_pmu_io_intc_realize;
     dc->vmsd = &vmstate_xlnx_pmu_io_intc;
-    dc->props = xlnx_pmu_io_intc_properties;
+    device_class_set_props(dc, xlnx_pmu_io_intc_properties);
 }
 
 static const TypeInfo xlnx_pmu_io_intc_info = {
diff --git a/hw/ipack/ipack.c b/hw/ipack/ipack.c
index 30e16696c0..49787a13bc 100644
--- a/hw/ipack/ipack.c
+++ b/hw/ipack/ipack.c
@@ -88,7 +88,7 @@ static void ipack_device_class_init(ObjectClass *klass, void *data)
     k->bus_type = TYPE_IPACK_BUS;
     k->realize = ipack_device_realize;
     k->unrealize = ipack_device_unrealize;
-    k->props = ipack_device_props;
+    device_class_set_props(k, ipack_device_props);
 }
 
 const VMStateDescription vmstate_ipack_device = {
diff --git a/hw/ipmi/ipmi.c b/hw/ipmi/ipmi.c
index cbe158f815..46c6a79527 100644
--- a/hw/ipmi/ipmi.c
+++ b/hw/ipmi/ipmi.c
@@ -118,7 +118,7 @@ static void bmc_class_init(ObjectClass *oc, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(oc);
 
-    dc->props = ipmi_bmc_properties;
+    device_class_set_props(dc, ipmi_bmc_properties);
 }
 
 static TypeInfo ipmi_bmc_type_info = {
diff --git a/hw/ipmi/ipmi_bmc_extern.c b/hw/ipmi/ipmi_bmc_extern.c
index 87da9ff99c..43134e0c63 100644
--- a/hw/ipmi/ipmi_bmc_extern.c
+++ b/hw/ipmi/ipmi_bmc_extern.c
@@ -526,7 +526,7 @@ static void ipmi_bmc_extern_class_init(ObjectClass *oc, void *data)
     bk->handle_reset = ipmi_bmc_extern_handle_reset;
     dc->hotpluggable = false;
     dc->realize = ipmi_bmc_extern_realize;
-    dc->props = ipmi_bmc_extern_properties;
+    device_class_set_props(dc, ipmi_bmc_extern_properties);
 }
 
 static const TypeInfo ipmi_bmc_extern_type = {
diff --git a/hw/ipmi/ipmi_bmc_sim.c b/hw/ipmi/ipmi_bmc_sim.c
index 6670cf039d..0b97e04774 100644
--- a/hw/ipmi/ipmi_bmc_sim.c
+++ b/hw/ipmi/ipmi_bmc_sim.c
@@ -1989,7 +1989,7 @@ static void ipmi_sim_class_init(ObjectClass *oc, void *data)
 
     dc->hotpluggable = false;
     dc->realize = ipmi_sim_realize;
-    dc->props = ipmi_sim_properties;
+    device_class_set_props(dc, ipmi_sim_properties);
     bk->handle_command = ipmi_sim_handle_command;
 }
 
diff --git a/hw/ipmi/isa_ipmi_bt.c b/hw/ipmi/isa_ipmi_bt.c
index 9fba5ed383..c8dc0a09dc 100644
--- a/hw/ipmi/isa_ipmi_bt.c
+++ b/hw/ipmi/isa_ipmi_bt.c
@@ -147,7 +147,7 @@ static void isa_ipmi_bt_class_init(ObjectClass *oc, void *data)
     IPMIInterfaceClass *iic = IPMI_INTERFACE_CLASS(oc);
 
     dc->realize = isa_ipmi_bt_realize;
-    dc->props = ipmi_isa_properties;
+    device_class_set_props(dc, ipmi_isa_properties);
 
     iic->get_backend_data = isa_ipmi_bt_get_backend_data;
     ipmi_bt_class_init(iic);
diff --git a/hw/ipmi/isa_ipmi_kcs.c b/hw/ipmi/isa_ipmi_kcs.c
index cc6bd817f2..4b421c33f4 100644
--- a/hw/ipmi/isa_ipmi_kcs.c
+++ b/hw/ipmi/isa_ipmi_kcs.c
@@ -154,7 +154,7 @@ static void isa_ipmi_kcs_class_init(ObjectClass *oc, void *data)
     IPMIInterfaceClass *iic = IPMI_INTERFACE_CLASS(oc);
 
     dc->realize = ipmi_isa_realize;
-    dc->props = ipmi_isa_properties;
+    device_class_set_props(dc, ipmi_isa_properties);
 
     iic->get_backend_data = isa_ipmi_kcs_get_backend_data;
     ipmi_kcs_class_init(iic);
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index 170792a4fc..f85b484eac 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -784,7 +784,7 @@ static void ich9_lpc_class_init(ObjectClass *klass, void *data)
     dc->reset = ich9_lpc_reset;
     k->realize = ich9_lpc_realize;
     dc->vmsd = &vmstate_ich9_lpc;
-    dc->props = ich9_lpc_properties;
+    device_class_set_props(dc, ich9_lpc_properties);
     k->config_write = ich9_lpc_config_write;
     dc->desc = "ICH9 LPC bridge";
     k->vendor_id = PCI_VENDOR_ID_INTEL;
diff --git a/hw/isa/pc87312.c b/hw/isa/pc87312.c
index b9bd57471e..0cacbbc91b 100644
--- a/hw/isa/pc87312.c
+++ b/hw/isa/pc87312.c
@@ -342,7 +342,7 @@ static void pc87312_class_init(ObjectClass *klass, void *data)
     dc->realize = pc87312_realize;
     dc->reset = pc87312_reset;
     dc->vmsd = &vmstate_pc87312;
-    dc->props = pc87312_properties;
+    device_class_set_props(dc, pc87312_properties);
 
     sc->parallel = (ISASuperIOFuncs){
         .count = 1,
diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c
index f828708b1d..d9b51fce8d 100644
--- a/hw/isa/vt82c686.c
+++ b/hw/isa/vt82c686.c
@@ -417,7 +417,7 @@ static void via_pm_class_init(ObjectClass *klass, void *data)
     dc->desc = "PM";
     dc->vmsd = &vmstate_acpi;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
-    dc->props = via_pm_properties;
+    device_class_set_props(dc, via_pm_properties);
 }
 
 static const TypeInfo via_pm_info = {
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index 375f9a588a..39f1426d1f 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -202,7 +202,7 @@ static void nvdimm_class_init(ObjectClass *oc, void *data)
 
     ddc->realize = nvdimm_realize;
     mdc->get_memory_region = nvdimm_md_get_memory_region;
-    dc->props = nvdimm_properties;
+    device_class_set_props(dc, nvdimm_properties);
 
     nvc->read_label_data = nvdimm_read_label_data;
     nvc->write_label_data = nvdimm_write_label_data;
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 99e2faf01b..8f50b8afea 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -271,7 +271,7 @@ static void pc_dimm_class_init(ObjectClass *oc, void *data)
 
     dc->realize = pc_dimm_realize;
     dc->unrealize = pc_dimm_unrealize;
-    dc->props = pc_dimm_properties;
+    device_class_set_props(dc, pc_dimm_properties);
     dc->desc = "DIMM memory module";
 
     ddc->get_vmstate_memory_region = pc_dimm_get_memory_region;
diff --git a/hw/mips/cps.c b/hw/mips/cps.c
index c49868d5da..92b9b1a5f6 100644
--- a/hw/mips/cps.c
+++ b/hw/mips/cps.c
@@ -178,7 +178,7 @@ static void mips_cps_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = mips_cps_realize;
-    dc->props = mips_cps_properties;
+    device_class_set_props(dc, mips_cps_properties);
 }
 
 static const TypeInfo mips_cps_info = {
diff --git a/hw/misc/a9scu.c b/hw/misc/a9scu.c
index 45c91db303..324371a1c0 100644
--- a/hw/misc/a9scu.c
+++ b/hw/misc/a9scu.c
@@ -135,7 +135,7 @@ static void a9_scu_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = a9_scu_properties;
+    device_class_set_props(dc, a9_scu_properties);
     dc->vmsd = &vmstate_a9_scu;
     dc->reset = a9_scu_reset;
 }
diff --git a/hw/misc/applesmc.c b/hw/misc/applesmc.c
index 24d57e8677..1c4addb201 100644
--- a/hw/misc/applesmc.c
+++ b/hw/misc/applesmc.c
@@ -353,7 +353,7 @@ static void qdev_applesmc_class_init(ObjectClass *klass, void *data)
 
     dc->realize = applesmc_isa_realize;
     dc->reset = qdev_applesmc_isa_reset;
-    dc->props = applesmc_isa_properties;
+    device_class_set_props(dc, applesmc_isa_properties);
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
 
diff --git a/hw/misc/arm11scu.c b/hw/misc/arm11scu.c
index 3023284d6f..17c36a0545 100644
--- a/hw/misc/arm11scu.c
+++ b/hw/misc/arm11scu.c
@@ -85,7 +85,7 @@ static void arm11_scu_class_init(ObjectClass *oc, void *data)
     DeviceClass *dc = DEVICE_CLASS(oc);
 
     dc->realize = arm11_scu_realize;
-    dc->props = arm11_scu_properties;
+    device_class_set_props(dc, arm11_scu_properties);
 }
 
 static const TypeInfo arm11_scu_type_info = {
diff --git a/hw/misc/arm_l2x0.c b/hw/misc/arm_l2x0.c
index af2c7af4a0..2066c97f5f 100644
--- a/hw/misc/arm_l2x0.c
+++ b/hw/misc/arm_l2x0.c
@@ -182,7 +182,7 @@ static void l2x0_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->vmsd = &vmstate_l2x0;
-    dc->props = l2x0_properties;
+    device_class_set_props(dc, l2x0_properties);
     dc->reset = l2x0_priv_reset;
 }
 
diff --git a/hw/misc/arm_sysctl.c b/hw/misc/arm_sysctl.c
index fc79522ece..a474bbdd19 100644
--- a/hw/misc/arm_sysctl.c
+++ b/hw/misc/arm_sysctl.c
@@ -642,7 +642,7 @@ static void arm_sysctl_class_init(ObjectClass *klass, void *data)
     dc->realize = arm_sysctl_realize;
     dc->reset = arm_sysctl_reset;
     dc->vmsd = &vmstate_arm_sysctl;
-    dc->props = arm_sysctl_properties;
+    device_class_set_props(dc, arm_sysctl_properties);
 }
 
 static const TypeInfo arm_sysctl_info = {
diff --git a/hw/misc/armsse-cpuid.c b/hw/misc/armsse-cpuid.c
index 8ab15fea81..d58138dc28 100644
--- a/hw/misc/armsse-cpuid.c
+++ b/hw/misc/armsse-cpuid.c
@@ -116,7 +116,7 @@ static void armsse_cpuid_class_init(ObjectClass *klass, void *data)
      * does not need a reset function or VMState.
      */
 
-    dc->props = armsse_cpuid_props;
+    device_class_set_props(dc, armsse_cpuid_props);
 }
 
 static const TypeInfo armsse_cpuid_info = {
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
index f62fa25e34..ce2f9562d4 100644
--- a/hw/misc/aspeed_scu.c
+++ b/hw/misc/aspeed_scu.c
@@ -447,7 +447,7 @@ static void aspeed_scu_class_init(ObjectClass *klass, void *data)
     dc->reset = aspeed_scu_reset;
     dc->desc = "ASPEED System Control Unit";
     dc->vmsd = &vmstate_aspeed_scu;
-    dc->props = aspeed_scu_properties;
+    device_class_set_props(dc, aspeed_scu_properties);
 }
 
 static const TypeInfo aspeed_scu_info = {
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index 2df3244b53..9c184790cd 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -261,7 +261,7 @@ static void aspeed_sdmc_class_init(ObjectClass *klass, void *data)
     dc->reset = aspeed_sdmc_reset;
     dc->desc = "ASPEED SDRAM Memory Controller";
     dc->vmsd = &vmstate_aspeed_sdmc;
-    dc->props = aspeed_sdmc_properties;
+    device_class_set_props(dc, aspeed_sdmc_properties);
 }
 
 static const TypeInfo aspeed_sdmc_info = {
diff --git a/hw/misc/bcm2835_property.c b/hw/misc/bcm2835_property.c
index 0eea2e20f7..df91280dfc 100644
--- a/hw/misc/bcm2835_property.c
+++ b/hw/misc/bcm2835_property.c
@@ -426,7 +426,7 @@ static void bcm2835_property_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = bcm2835_property_props;
+    device_class_set_props(dc, bcm2835_property_props);
     dc->realize = bcm2835_property_realize;
     dc->vmsd = &vmstate_bcm2835_property;
 }
diff --git a/hw/misc/debugexit.c b/hw/misc/debugexit.c
index ccf02bdbd4..99a814f10c 100644
--- a/hw/misc/debugexit.c
+++ b/hw/misc/debugexit.c
@@ -65,7 +65,7 @@ static void debug_exit_class_initfn(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = debug_exit_realizefn;
-    dc->props = debug_exit_properties;
+    device_class_set_props(dc, debug_exit_properties);
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
 
diff --git a/hw/misc/eccmemctl.c b/hw/misc/eccmemctl.c
index 4b1f2b675a..aec447368e 100644
--- a/hw/misc/eccmemctl.c
+++ b/hw/misc/eccmemctl.c
@@ -336,7 +336,7 @@ static void ecc_class_init(ObjectClass *klass, void *data)
     dc->realize = ecc_realize;
     dc->reset = ecc_reset;
     dc->vmsd = &vmstate_ecc;
-    dc->props = ecc_properties;
+    device_class_set_props(dc, ecc_properties);
 }
 
 static const TypeInfo ecc_info = {
diff --git a/hw/misc/iotkit-sysctl.c b/hw/misc/iotkit-sysctl.c
index 9aa8109463..ec1cc1931a 100644
--- a/hw/misc/iotkit-sysctl.c
+++ b/hw/misc/iotkit-sysctl.c
@@ -508,7 +508,7 @@ static void iotkit_sysctl_class_init(ObjectClass *klass, void *data)
 
     dc->vmsd = &iotkit_sysctl_vmstate;
     dc->reset = iotkit_sysctl_reset;
-    dc->props = iotkit_sysctl_props;
+    device_class_set_props(dc, iotkit_sysctl_props);
     dc->realize = iotkit_sysctl_realize;
 }
 
diff --git a/hw/misc/iotkit-sysinfo.c b/hw/misc/iotkit-sysinfo.c
index 783e613959..b2dcfc4376 100644
--- a/hw/misc/iotkit-sysinfo.c
+++ b/hw/misc/iotkit-sysinfo.c
@@ -121,7 +121,7 @@ static void iotkit_sysinfo_class_init(ObjectClass *klass, void *data)
      * does not need a reset function or VMState.
      */
 
-    dc->props = iotkit_sysinfo_props;
+    device_class_set_props(dc, iotkit_sysinfo_props);
 }
 
 static const TypeInfo iotkit_sysinfo_info = {
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index 710cdb7263..1a0fad74e1 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -1055,7 +1055,7 @@ static void ivshmem_plain_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
 
     k->realize = ivshmem_plain_realize;
-    dc->props = ivshmem_plain_properties;
+    device_class_set_props(dc, ivshmem_plain_properties);
     dc->vmsd = &ivshmem_plain_vmsd;
 }
 
@@ -1115,7 +1115,7 @@ static void ivshmem_doorbell_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
 
     k->realize = ivshmem_doorbell_realize;
-    dc->props = ivshmem_doorbell_properties;
+    device_class_set_props(dc, ivshmem_doorbell_properties);
     dc->vmsd = &ivshmem_doorbell_vmsd;
 }
 
diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
index e9e6a95eab..b7d0012794 100644
--- a/hw/misc/mac_via.c
+++ b/hw/misc/mac_via.c
@@ -1021,7 +1021,7 @@ static void mac_via_class_init(ObjectClass *oc, void *data)
     dc->realize = mac_via_realize;
     dc->reset = mac_via_reset;
     dc->vmsd = &vmstate_mac_via;
-    dc->props = mac_via_properties;
+    device_class_set_props(dc, mac_via_properties);
 }
 
 static TypeInfo mac_via_info = {
diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
index e38becba6a..e0cc0aac5d 100644
--- a/hw/misc/macio/cuda.c
+++ b/hw/misc/macio/cuda.c
@@ -571,7 +571,7 @@ static void cuda_class_init(ObjectClass *oc, void *data)
     dc->realize = cuda_realize;
     dc->reset = cuda_reset;
     dc->vmsd = &vmstate_cuda;
-    dc->props = cuda_properties;
+    device_class_set_props(dc, cuda_properties);
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
 }
 
diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index 50f20d8206..79222192e8 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -466,7 +466,7 @@ static void macio_newworld_class_init(ObjectClass *oc, void *data)
     pdc->realize = macio_newworld_realize;
     pdc->device_id = PCI_DEVICE_ID_APPLE_UNI_N_KEYL;
     dc->vmsd = &vmstate_macio_newworld;
-    dc->props = macio_newworld_properties;
+    device_class_set_props(dc, macio_newworld_properties);
 }
 
 static Property macio_properties[] = {
@@ -481,7 +481,7 @@ static void macio_class_init(ObjectClass *klass, void *data)
 
     k->vendor_id = PCI_VENDOR_ID_APPLE;
     k->class_id = PCI_CLASS_OTHERS << 8;
-    dc->props = macio_properties;
+    device_class_set_props(dc, macio_properties);
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     /* Reason: Uses serial_hds in macio_instance_init */
     dc->user_creatable = false;
diff --git a/hw/misc/macio/pmu.c b/hw/misc/macio/pmu.c
index 769aed8052..b8466a4a3f 100644
--- a/hw/misc/macio/pmu.c
+++ b/hw/misc/macio/pmu.c
@@ -795,7 +795,7 @@ static void pmu_class_init(ObjectClass *oc, void *data)
     dc->realize = pmu_realize;
     dc->reset = pmu_reset;
     dc->vmsd = &vmstate_pmu;
-    dc->props = pmu_properties;
+    device_class_set_props(dc, pmu_properties);
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
 }
 
diff --git a/hw/misc/mips_cmgcr.c b/hw/misc/mips_cmgcr.c
index 8176d91c0c..3c8b37f700 100644
--- a/hw/misc/mips_cmgcr.c
+++ b/hw/misc/mips_cmgcr.c
@@ -233,7 +233,7 @@ static void mips_gcr_realize(DeviceState *dev, Error **errp)
 static void mips_gcr_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    dc->props = mips_gcr_properties;
+    device_class_set_props(dc, mips_gcr_properties);
     dc->vmsd = &vmstate_mips_gcr;
     dc->reset = mips_gcr_reset;
     dc->realize = mips_gcr_realize;
diff --git a/hw/misc/mips_cpc.c b/hw/misc/mips_cpc.c
index 19ea016b87..2f7b2c9592 100644
--- a/hw/misc/mips_cpc.c
+++ b/hw/misc/mips_cpc.c
@@ -175,7 +175,7 @@ static void mips_cpc_class_init(ObjectClass *klass, void *data)
     dc->realize = mips_cpc_realize;
     dc->reset = mips_cpc_reset;
     dc->vmsd = &vmstate_mips_cpc;
-    dc->props = mips_cpc_properties;
+    device_class_set_props(dc, mips_cpc_properties);
 }
 
 static const TypeInfo mips_cpc_info = {
diff --git a/hw/misc/mips_itu.c b/hw/misc/mips_itu.c
index ea0cf9726b..3540985258 100644
--- a/hw/misc/mips_itu.c
+++ b/hw/misc/mips_itu.c
@@ -561,7 +561,7 @@ static void mips_itu_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = mips_itu_properties;
+    device_class_set_props(dc, mips_itu_properties);
     dc->realize = mips_itu_realize;
     dc->reset = mips_itu_reset;
 }
diff --git a/hw/misc/mos6522.c b/hw/misc/mos6522.c
index cecf0be59e..4ca7690233 100644
--- a/hw/misc/mos6522.c
+++ b/hw/misc/mos6522.c
@@ -502,7 +502,7 @@ static void mos6522_class_init(ObjectClass *oc, void *data)
 
     dc->reset = mos6522_reset;
     dc->vmsd = &vmstate_mos6522;
-    dc->props = mos6522_properties;
+    device_class_set_props(dc, mos6522_properties);
     mdc->parent_reset = dc->reset;
     mdc->set_sr_int = mos6522_set_sr_int;
     mdc->portB_write = mos6522_portB_write;
diff --git a/hw/misc/mps2-fpgaio.c b/hw/misc/mps2-fpgaio.c
index 5e8b103914..2f3fbeef34 100644
--- a/hw/misc/mps2-fpgaio.c
+++ b/hw/misc/mps2-fpgaio.c
@@ -300,7 +300,7 @@ static void mps2_fpgaio_class_init(ObjectClass *klass, void *data)
 
     dc->vmsd = &mps2_fpgaio_vmstate;
     dc->reset = mps2_fpgaio_reset;
-    dc->props = mps2_fpgaio_properties;
+    device_class_set_props(dc, mps2_fpgaio_properties);
 }
 
 static const TypeInfo mps2_fpgaio_info = {
diff --git a/hw/misc/mps2-scc.c b/hw/misc/mps2-scc.c
index 25779a1dca..9d0909e7b3 100644
--- a/hw/misc/mps2-scc.c
+++ b/hw/misc/mps2-scc.c
@@ -293,7 +293,7 @@ static void mps2_scc_class_init(ObjectClass *klass, void *data)
     dc->realize = mps2_scc_realize;
     dc->vmsd = &mps2_scc_vmstate;
     dc->reset = mps2_scc_reset;
-    dc->props = mps2_scc_properties;
+    device_class_set_props(dc, mps2_scc_properties);
 }
 
 static const TypeInfo mps2_scc_info = {
diff --git a/hw/misc/msf2-sysreg.c b/hw/misc/msf2-sysreg.c
index ddc5a30c80..2dce55c364 100644
--- a/hw/misc/msf2-sysreg.c
+++ b/hw/misc/msf2-sysreg.c
@@ -143,7 +143,7 @@ static void msf2_sysreg_class_init(ObjectClass *klass, void *data)
 
     dc->vmsd = &vmstate_msf2_sysreg;
     dc->reset = msf2_sysreg_reset;
-    dc->props = msf2_sysreg_properties;
+    device_class_set_props(dc, msf2_sysreg_properties);
     dc->realize = msf2_sysreg_realize;
 }
 
diff --git a/hw/misc/nrf51_rng.c b/hw/misc/nrf51_rng.c
index 5140981c96..fc86e1b697 100644
--- a/hw/misc/nrf51_rng.c
+++ b/hw/misc/nrf51_rng.c
@@ -245,7 +245,7 @@ static void nrf51_rng_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = nrf51_rng_properties;
+    device_class_set_props(dc, nrf51_rng_properties);
     dc->vmsd = &vmstate_rng;
     dc->reset = nrf51_rng_reset;
 }
diff --git a/hw/misc/pci-testdev.c b/hw/misc/pci-testdev.c
index 74d8571a73..188de4d9cc 100644
--- a/hw/misc/pci-testdev.c
+++ b/hw/misc/pci-testdev.c
@@ -339,7 +339,7 @@ static void pci_testdev_class_init(ObjectClass *klass, void *data)
     dc->desc = "PCI Test Device";
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     dc->reset = qdev_pci_testdev_reset;
-    dc->props = pci_testdev_properties;
+    device_class_set_props(dc, pci_testdev_properties);
 }
 
 static const TypeInfo pci_testdev_info = {
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index d65ac86478..2186b47b13 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -111,7 +111,7 @@ static void pvpanic_isa_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = pvpanic_isa_realizefn;
-    dc->props = pvpanic_isa_properties;
+    device_class_set_props(dc, pvpanic_isa_properties);
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
 
diff --git a/hw/misc/tz-mpc.c b/hw/misc/tz-mpc.c
index 49dd6050bd..98f151237f 100644
--- a/hw/misc/tz-mpc.c
+++ b/hw/misc/tz-mpc.c
@@ -596,7 +596,7 @@ static void tz_mpc_class_init(ObjectClass *klass, void *data)
     dc->realize = tz_mpc_realize;
     dc->vmsd = &tz_mpc_vmstate;
     dc->reset = tz_mpc_reset;
-    dc->props = tz_mpc_properties;
+    device_class_set_props(dc, tz_mpc_properties);
 }
 
 static const TypeInfo tz_mpc_info = {
diff --git a/hw/misc/tz-msc.c b/hw/misc/tz-msc.c
index 7d522ac0ec..acbe94400b 100644
--- a/hw/misc/tz-msc.c
+++ b/hw/misc/tz-msc.c
@@ -293,7 +293,7 @@ static void tz_msc_class_init(ObjectClass *klass, void *data)
     dc->realize = tz_msc_realize;
     dc->vmsd = &tz_msc_vmstate;
     dc->reset = tz_msc_reset;
-    dc->props = tz_msc_properties;
+    device_class_set_props(dc, tz_msc_properties);
 }
 
 static const TypeInfo tz_msc_info = {
diff --git a/hw/misc/tz-ppc.c b/hw/misc/tz-ppc.c
index 181a5f1e81..6431257b52 100644
--- a/hw/misc/tz-ppc.c
+++ b/hw/misc/tz-ppc.c
@@ -319,7 +319,7 @@ static void tz_ppc_class_init(ObjectClass *klass, void *data)
     dc->realize = tz_ppc_realize;
     dc->vmsd = &tz_ppc_vmstate;
     dc->reset = tz_ppc_reset;
-    dc->props = tz_ppc_properties;
+    device_class_set_props(dc, tz_ppc_properties);
 }
 
 static const TypeInfo tz_ppc_info = {
diff --git a/hw/misc/unimp.c b/hw/misc/unimp.c
index 0e1cb24629..bc4084d344 100644
--- a/hw/misc/unimp.c
+++ b/hw/misc/unimp.c
@@ -79,7 +79,7 @@ static void unimp_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = unimp_realize;
-    dc->props = unimp_properties;
+    device_class_set_props(dc, unimp_properties);
 }
 
 static const TypeInfo unimp_info = {
diff --git a/hw/net/allwinner_emac.c b/hw/net/allwinner_emac.c
index e055a661c4..e9bbff8710 100644
--- a/hw/net/allwinner_emac.c
+++ b/hw/net/allwinner_emac.c
@@ -519,7 +519,7 @@ static void aw_emac_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = aw_emac_realize;
-    dc->props = aw_emac_properties;
+    device_class_set_props(dc, aw_emac_properties);
     dc->reset = aw_emac_reset;
     dc->vmsd = &vmstate_aw_emac;
 }
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index b8be73dc55..871fcf2031 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -1627,7 +1627,7 @@ static void gem_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = gem_realize;
-    dc->props = gem_properties;
+    device_class_set_props(dc, gem_properties);
     dc->vmsd = &vmstate_cadence_gem;
     dc->reset = gem_reset;
 }
diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index cdc2631c0c..a134d431ae 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -963,7 +963,7 @@ static void dp8393x_class_init(ObjectClass *klass, void *data)
     dc->realize = dp8393x_realize;
     dc->reset = dp8393x_reset;
     dc->vmsd = &vmstate_dp8393x;
-    dc->props = dp8393x_properties;
+    device_class_set_props(dc, dp8393x_properties);
 }
 
 static const TypeInfo dp8393x_info = {
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index a73f8d404e..0b833d5a15 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -1764,7 +1764,7 @@ static void e1000_class_init(ObjectClass *klass, void *data)
     dc->desc = "Intel Gigabit Ethernet";
     dc->reset = qdev_e1000_reset;
     dc->vmsd = &vmstate_e1000;
-    dc->props = e1000_properties;
+    device_class_set_props(dc, e1000_properties);
 }
 
 static void e1000_instance_init(Object *obj)
diff --git a/hw/net/e1000e.c b/hw/net/e1000e.c
index b69fd7d8ad..a91dbdca3c 100644
--- a/hw/net/e1000e.c
+++ b/hw/net/e1000e.c
@@ -684,7 +684,6 @@ static void e1000e_class_init(ObjectClass *class, void *data)
     dc->desc = "Intel 82574L GbE Controller";
     dc->reset = e1000e_qdev_reset;
     dc->vmsd = &e1000e_vmstate;
-    dc->props = e1000e_properties;
 
     e1000e_prop_disable_vnet = qdev_prop_uint8;
     e1000e_prop_disable_vnet.description = "Do not use virtio headers, "
@@ -697,6 +696,7 @@ static void e1000e_class_init(ObjectClass *class, void *data)
     e1000e_prop_subsys = qdev_prop_uint16;
     e1000e_prop_subsys.description = "PCI device Subsystem ID";
 
+    device_class_set_props(dc, e1000e_properties);
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 }
 
diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
index cc71a7a036..d043390c50 100644
--- a/hw/net/eepro100.c
+++ b/hw/net/eepro100.c
@@ -2059,7 +2059,7 @@ static void eepro100_class_init(ObjectClass *klass, void *data)
     info = eepro100_get_class_by_name(object_class_get_name(klass));
 
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
-    dc->props = e100_properties;
+    device_class_set_props(dc, e100_properties);
     dc->desc = info->desc;
     k->vendor_id = PCI_VENDOR_ID_INTEL;
     k->class_id = PCI_CLASS_NETWORK_ETHERNET;
diff --git a/hw/net/etraxfs_eth.c b/hw/net/etraxfs_eth.c
index f30d963487..27fd069b96 100644
--- a/hw/net/etraxfs_eth.c
+++ b/hw/net/etraxfs_eth.c
@@ -639,7 +639,7 @@ static void etraxfs_eth_class_init(ObjectClass *klass, void *data)
 
     dc->realize = etraxfs_eth_realize;
     dc->reset = etraxfs_eth_reset;
-    dc->props = etraxfs_eth_properties;
+    device_class_set_props(dc, etraxfs_eth_properties);
     /* Reason: dma_out, dma_in are not user settable */
     dc->user_creatable = false;
 }
diff --git a/hw/net/fsl_etsec/etsec.c b/hw/net/fsl_etsec/etsec.c
index 717de76569..475f3c887a 100644
--- a/hw/net/fsl_etsec/etsec.c
+++ b/hw/net/fsl_etsec/etsec.c
@@ -423,7 +423,7 @@ static void etsec_class_init(ObjectClass *klass, void *data)
 
     dc->realize = etsec_realize;
     dc->reset = etsec_reset;
-    dc->props = etsec_properties;
+    device_class_set_props(dc, etsec_properties);
     /* Supported by ppce500 machine */
     dc->user_creatable = true;
 }
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
index 86ac25894a..4ad2594d3a 100644
--- a/hw/net/ftgmac100.c
+++ b/hw/net/ftgmac100.c
@@ -1075,7 +1075,7 @@ static void ftgmac100_class_init(ObjectClass *klass, void *data)
 
     dc->vmsd = &vmstate_ftgmac100;
     dc->reset = ftgmac100_reset;
-    dc->props = ftgmac100_properties;
+    device_class_set_props(dc, ftgmac100_properties);
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
     dc->realize = ftgmac100_realize;
     dc->desc = "Faraday FTGMAC100 Gigabit Ethernet emulation";
@@ -1237,7 +1237,7 @@ static void aspeed_mii_class_init(ObjectClass *klass, void *data)
     dc->reset = aspeed_mii_reset;
     dc->realize = aspeed_mii_realize;
     dc->desc = "Aspeed MII controller";
-    dc->props = aspeed_mii_properties;
+    device_class_set_props(dc, aspeed_mii_properties);
 }
 
 static const TypeInfo aspeed_mii_info = {
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
index bd99236864..8ece4d69d7 100644
--- a/hw/net/imx_fec.c
+++ b/hw/net/imx_fec.c
@@ -1337,7 +1337,7 @@ static void imx_eth_class_init(ObjectClass *klass, void *data)
 
     dc->vmsd    = &vmstate_imx_eth;
     dc->reset   = imx_eth_reset;
-    dc->props   = imx_eth_properties;
+    device_class_set_props(dc, imx_eth_properties);
     dc->realize = imx_eth_realize;
     dc->desc    = "i.MX FEC/ENET Ethernet Controller";
 }
diff --git a/hw/net/lan9118.c b/hw/net/lan9118.c
index ed551f2178..da7e0bb0e8 100644
--- a/hw/net/lan9118.c
+++ b/hw/net/lan9118.c
@@ -1369,7 +1369,7 @@ static void lan9118_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = lan9118_reset;
-    dc->props = lan9118_properties;
+    device_class_set_props(dc, lan9118_properties);
     dc->vmsd = &vmstate_lan9118;
     dc->realize = lan9118_realize;
 }
diff --git a/hw/net/lance.c b/hw/net/lance.c
index 4d96299041..688724db0b 100644
--- a/hw/net/lance.c
+++ b/hw/net/lance.c
@@ -153,7 +153,7 @@ static void lance_class_init(ObjectClass *klass, void *data)
     dc->fw_name = "ethernet";
     dc->reset = lance_reset;
     dc->vmsd = &vmstate_lance;
-    dc->props = lance_properties;
+    device_class_set_props(dc, lance_properties);
 }
 
 static const TypeInfo lance_info = {
diff --git a/hw/net/mcf_fec.c b/hw/net/mcf_fec.c
index 8fcf354a4b..9327ac8a30 100644
--- a/hw/net/mcf_fec.c
+++ b/hw/net/mcf_fec.c
@@ -670,7 +670,7 @@ static void mcf_fec_class_init(ObjectClass *oc, void *data)
     dc->realize = mcf_fec_realize;
     dc->desc = "MCF Fast Ethernet Controller network device";
     dc->reset = mcf_fec_reset;
-    dc->props = mcf_fec_properties;
+    device_class_set_props(dc, mcf_fec_properties);
 }
 
 static const TypeInfo mcf_fec_info = {
diff --git a/hw/net/milkymist-minimac2.c b/hw/net/milkymist-minimac2.c
index 86b6d28033..1ba01754ee 100644
--- a/hw/net/milkymist-minimac2.c
+++ b/hw/net/milkymist-minimac2.c
@@ -530,7 +530,7 @@ static void milkymist_minimac2_class_init(ObjectClass *klass, void *data)
     dc->realize = milkymist_minimac2_realize;
     dc->reset = milkymist_minimac2_reset;
     dc->vmsd = &vmstate_milkymist_minimac2;
-    dc->props = milkymist_minimac2_properties;
+    device_class_set_props(dc, milkymist_minimac2_properties);
 }
 
 static const TypeInfo milkymist_minimac2_info = {
diff --git a/hw/net/mipsnet.c b/hw/net/mipsnet.c
index 380ff5a5f4..0c578c430c 100644
--- a/hw/net/mipsnet.c
+++ b/hw/net/mipsnet.c
@@ -278,7 +278,7 @@ static void mipsnet_class_init(ObjectClass *klass, void *data)
     dc->desc = "MIPS Simulator network device";
     dc->reset = mipsnet_sysbus_reset;
     dc->vmsd = &vmstate_mipsnet;
-    dc->props = mipsnet_properties;
+    device_class_set_props(dc, mipsnet_properties);
 }
 
 static const TypeInfo mipsnet_info = {
diff --git a/hw/net/ne2000-isa.c b/hw/net/ne2000-isa.c
index 6fcf3d5cd9..e744eff153 100644
--- a/hw/net/ne2000-isa.c
+++ b/hw/net/ne2000-isa.c
@@ -89,7 +89,7 @@ static void isa_ne2000_class_initfn(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = isa_ne2000_realizefn;
-    dc->props = ne2000_isa_properties;
+    device_class_set_props(dc, ne2000_isa_properties);
     dc->vmsd = &vmstate_isa_ne2000;
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 }
diff --git a/hw/net/ne2000-pci.c b/hw/net/ne2000-pci.c
index 9a20d427e3..e11d67bf75 100644
--- a/hw/net/ne2000-pci.c
+++ b/hw/net/ne2000-pci.c
@@ -112,7 +112,7 @@ static void ne2000_class_init(ObjectClass *klass, void *data)
     k->device_id = PCI_DEVICE_ID_REALTEK_8029;
     k->class_id = PCI_CLASS_NETWORK_ETHERNET;
     dc->vmsd = &vmstate_pci_ne2000;
-    dc->props = ne2000_properties;
+    device_class_set_props(dc, ne2000_properties);
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 }
 
diff --git a/hw/net/opencores_eth.c b/hw/net/opencores_eth.c
index 84a95da1d5..6b338c2f29 100644
--- a/hw/net/opencores_eth.c
+++ b/hw/net/opencores_eth.c
@@ -755,7 +755,7 @@ static void open_eth_class_init(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
     dc->desc = "Opencores 10/100 Mbit Ethernet";
     dc->reset = qdev_open_eth_reset;
-    dc->props = open_eth_properties;
+    device_class_set_props(dc, open_eth_properties);
 }
 
 static const TypeInfo open_eth_info = {
diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
index d067d21e2c..d1f31e0272 100644
--- a/hw/net/pcnet-pci.c
+++ b/hw/net/pcnet-pci.c
@@ -272,7 +272,7 @@ static void pcnet_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_NETWORK_ETHERNET;
     dc->reset = pci_reset;
     dc->vmsd = &vmstate_pci_pcnet;
-    dc->props = pcnet_properties;
+    device_class_set_props(dc, pcnet_properties);
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 }
 
diff --git a/hw/net/rocker/rocker.c b/hw/net/rocker/rocker.c
index 50f9e33e2f..81dd3b5f14 100644
--- a/hw/net/rocker/rocker.c
+++ b/hw/net/rocker/rocker.c
@@ -1519,7 +1519,7 @@ static void rocker_class_init(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
     dc->desc = "Rocker Switch";
     dc->reset = rocker_reset;
-    dc->props = rocker_properties;
+    device_class_set_props(dc, rocker_properties);
     dc->vmsd = &rocker_vmsd;
 }
 
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
index 88a97d756d..ae4739bc09 100644
--- a/hw/net/rtl8139.c
+++ b/hw/net/rtl8139.c
@@ -3435,7 +3435,7 @@ static void rtl8139_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_NETWORK_ETHERNET;
     dc->reset = rtl8139_reset;
     dc->vmsd = &vmstate_rtl8139;
-    dc->props = rtl8139_properties;
+    device_class_set_props(dc, rtl8139_properties);
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 }
 
diff --git a/hw/net/smc91c111.c b/hw/net/smc91c111.c
index e574635969..e9eb6f6c05 100644
--- a/hw/net/smc91c111.c
+++ b/hw/net/smc91c111.c
@@ -798,7 +798,7 @@ static void smc91c111_class_init(ObjectClass *klass, void *data)
     dc->realize = smc91c111_realize;
     dc->reset = smc91c111_reset;
     dc->vmsd = &vmstate_smc91c111;
-    dc->props = smc91c111_properties;
+    device_class_set_props(dc, smc91c111_properties);
 }
 
 static const TypeInfo smc91c111_info = {
diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
index 3d96884d66..80f5a1dd37 100644
--- a/hw/net/spapr_llan.c
+++ b/hw/net/spapr_llan.c
@@ -856,7 +856,7 @@ static void spapr_vlan_class_init(ObjectClass *klass, void *data)
     k->dt_compatible = "IBM,l-lan";
     k->signal_mask = 0x1;
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
-    dc->props = spapr_vlan_properties;
+    device_class_set_props(dc, spapr_vlan_properties);
     k->rtce_window_size = 0x10000000;
     dc->vmsd = &vmstate_spapr_llan;
 }
diff --git a/hw/net/stellaris_enet.c b/hw/net/stellaris_enet.c
index 3aca2a09f3..cb6e2509ea 100644
--- a/hw/net/stellaris_enet.c
+++ b/hw/net/stellaris_enet.c
@@ -507,7 +507,7 @@ static void stellaris_enet_class_init(ObjectClass *klass, void *data)
 
     dc->realize = stellaris_enet_realize;
     dc->reset = stellaris_enet_reset;
-    dc->props = stellaris_enet_properties;
+    device_class_set_props(dc, stellaris_enet_properties);
     dc->vmsd = &vmstate_stellaris_enet;
 }
 
diff --git a/hw/net/sungem.c b/hw/net/sungem.c
index f31d41ac5b..89da51f7f6 100644
--- a/hw/net/sungem.c
+++ b/hw/net/sungem.c
@@ -1429,7 +1429,7 @@ static void sungem_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_NETWORK_ETHERNET;
     dc->vmsd = &vmstate_sungem;
     dc->reset = sungem_reset;
-    dc->props = sungem_properties;
+    device_class_set_props(dc, sungem_properties);
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 }
 
diff --git a/hw/net/sunhme.c b/hw/net/sunhme.c
index 2243b7cf7b..8863601f6c 100644
--- a/hw/net/sunhme.c
+++ b/hw/net/sunhme.c
@@ -958,7 +958,7 @@ static void sunhme_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_NETWORK_ETHERNET;
     dc->vmsd = &vmstate_hme;
     dc->reset = sunhme_reset;
-    dc->props = sunhme_properties;
+    device_class_set_props(dc, sunhme_properties);
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 }
 
diff --git a/hw/net/tulip.c b/hw/net/tulip.c
index f85f54341f..cfac2719d3 100644
--- a/hw/net/tulip.c
+++ b/hw/net/tulip.c
@@ -1004,7 +1004,7 @@ static void tulip_class_init(ObjectClass *klass, void *data)
     k->subsystem_id = 0x104f;
     k->class_id = PCI_CLASS_NETWORK_ETHERNET;
     dc->vmsd = &vmstate_pci_tulip;
-    dc->props = tulip_properties;
+    device_class_set_props(dc, tulip_properties);
     dc->reset = tulip_qdev_reset;
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 }
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index d7d3ad6dc7..3627bb1717 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -3236,7 +3236,7 @@ static void virtio_net_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
 
-    dc->props = virtio_net_properties;
+    device_class_set_props(dc, virtio_net_properties);
     dc->vmsd = &vmstate_virtio_net;
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
     vdc->realize = virtio_net_device_realize;
diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
index 39ff6624c5..6d91cd8309 100644
--- a/hw/net/vmxnet3.c
+++ b/hw/net/vmxnet3.c
@@ -2506,7 +2506,7 @@ static void vmxnet3_class_init(ObjectClass *class, void *data)
     dc->desc = "VMWare Paravirtualized Ethernet v3";
     dc->reset = vmxnet3_qdev_reset;
     dc->vmsd = &vmstate_vmxnet3;
-    dc->props = vmxnet3_properties;
+    device_class_set_props(dc, vmxnet3_properties);
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 }
 
diff --git a/hw/net/xgmac.c b/hw/net/xgmac.c
index 2ea8d2ec72..574dd47b41 100644
--- a/hw/net/xgmac.c
+++ b/hw/net/xgmac.c
@@ -414,7 +414,7 @@ static void xgmac_enet_class_init(ObjectClass *klass, void *data)
 
     dc->realize = xgmac_enet_realize;
     dc->vmsd = &vmstate_xgmac;
-    dc->props = xgmac_properties;
+    device_class_set_props(dc, xgmac_properties);
 }
 
 static const TypeInfo xgmac_enet_info = {
diff --git a/hw/net/xilinx_axienet.c b/hw/net/xilinx_axienet.c
index 2c8c065401..704788811a 100644
--- a/hw/net/xilinx_axienet.c
+++ b/hw/net/xilinx_axienet.c
@@ -1025,7 +1025,7 @@ static void xilinx_enet_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = xilinx_enet_realize;
-    dc->props = xilinx_enet_properties;
+    device_class_set_props(dc, xilinx_enet_properties);
     dc->reset = xilinx_axienet_reset;
 }
 
diff --git a/hw/net/xilinx_ethlite.c b/hw/net/xilinx_ethlite.c
index 384e72b157..cf07e698b3 100644
--- a/hw/net/xilinx_ethlite.c
+++ b/hw/net/xilinx_ethlite.c
@@ -262,7 +262,7 @@ static void xilinx_ethlite_class_init(ObjectClass *klass, void *data)
 
     dc->realize = xilinx_ethlite_realize;
     dc->reset = xilinx_ethlite_reset;
-    dc->props = xilinx_ethlite_properties;
+    device_class_set_props(dc, xilinx_ethlite_properties);
 }
 
 static const TypeInfo xilinx_ethlite_info = {
diff --git a/hw/nvram/ds1225y.c b/hw/nvram/ds1225y.c
index 934e09bf75..d5cb922287 100644
--- a/hw/nvram/ds1225y.c
+++ b/hw/nvram/ds1225y.c
@@ -153,7 +153,7 @@ static void nvram_sysbus_class_init(ObjectClass *klass, void *data)
 
     dc->realize = nvram_sysbus_realize;
     dc->vmsd = &vmstate_nvram;
-    dc->props = nvram_sysbus_properties;
+    device_class_set_props(dc, nvram_sysbus_properties);
 }
 
 static const TypeInfo nvram_sysbus_info = {
diff --git a/hw/nvram/eeprom_at24c.c b/hw/nvram/eeprom_at24c.c
index 3416367523..d46a2bec3f 100644
--- a/hw/nvram/eeprom_at24c.c
+++ b/hw/nvram/eeprom_at24c.c
@@ -182,7 +182,7 @@ void at24c_eeprom_class_init(ObjectClass *klass, void *data)
     k->recv = &at24c_eeprom_recv;
     k->send = &at24c_eeprom_send;
 
-    dc->props = at24c_eeprom_props;
+    device_class_set_props(dc, at24c_eeprom_props);
     dc->reset = at24c_eeprom_reset;
 }
 
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index 5d879c471e..179b302f01 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -1171,7 +1171,7 @@ static void fw_cfg_io_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = fw_cfg_io_realize;
-    dc->props = fw_cfg_io_properties;
+    device_class_set_props(dc, fw_cfg_io_properties);
 }
 
 static const TypeInfo fw_cfg_io_info = {
@@ -1234,7 +1234,7 @@ static void fw_cfg_mem_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = fw_cfg_mem_realize;
-    dc->props = fw_cfg_mem_properties;
+    device_class_set_props(dc, fw_cfg_mem_properties);
 }
 
 static const TypeInfo fw_cfg_mem_info = {
diff --git a/hw/nvram/mac_nvram.c b/hw/nvram/mac_nvram.c
index 9a47e35b8e..2e8a1e3812 100644
--- a/hw/nvram/mac_nvram.c
+++ b/hw/nvram/mac_nvram.c
@@ -128,7 +128,7 @@ static void macio_nvram_class_init(ObjectClass *oc, void *data)
     dc->unrealize = macio_nvram_unrealizefn;
     dc->reset = macio_nvram_reset;
     dc->vmsd = &vmstate_macio_nvram;
-    dc->props = macio_nvram_properties;
+    device_class_set_props(dc, macio_nvram_properties);
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
 
diff --git a/hw/nvram/nrf51_nvm.c b/hw/nvram/nrf51_nvm.c
index 4d678f994e..f2283c1a8d 100644
--- a/hw/nvram/nrf51_nvm.c
+++ b/hw/nvram/nrf51_nvm.c
@@ -369,7 +369,7 @@ static void nrf51_nvm_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = nrf51_nvm_properties;
+    device_class_set_props(dc, nrf51_nvm_properties);
     dc->vmsd = &vmstate_nvm;
     dc->realize = nrf51_nvm_realize;
     dc->reset = nrf51_nvm_reset;
diff --git a/hw/nvram/spapr_nvram.c b/hw/nvram/spapr_nvram.c
index 838082b451..877ddef7b9 100644
--- a/hw/nvram/spapr_nvram.c
+++ b/hw/nvram/spapr_nvram.c
@@ -269,7 +269,7 @@ static void spapr_nvram_class_init(ObjectClass *klass, void *data)
     k->dt_type = "nvram";
     k->dt_compatible = "qemu,spapr-nvram";
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
-    dc->props = spapr_nvram_properties;
+    device_class_set_props(dc, spapr_nvram_properties);
     dc->vmsd = &vmstate_spapr_nvram;
     /* Reason: Internal device only, uses spapr_rtas_register() in realize() */
     dc->user_creatable = false;
diff --git a/hw/pci-bridge/gen_pcie_root_port.c b/hw/pci-bridge/gen_pcie_root_port.c
index 9eaefebca8..bb26e272c1 100644
--- a/hw/pci-bridge/gen_pcie_root_port.c
+++ b/hw/pci-bridge/gen_pcie_root_port.c
@@ -147,7 +147,7 @@ static void gen_rp_dev_class_init(ObjectClass *klass, void *data)
     k->device_id = PCI_DEVICE_ID_REDHAT_PCIE_RP;
     dc->desc = "PCI Express Root Port";
     dc->vmsd = &vmstate_rp_dev;
-    dc->props = gen_rp_props;
+    device_class_set_props(dc, gen_rp_props);
 
     device_class_set_parent_realize(dc, gen_rp_realize, &rpc->parent_realize);
 
diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
index cc80cb4898..4a080b7c7b 100644
--- a/hw/pci-bridge/pci_bridge_dev.c
+++ b/hw/pci-bridge/pci_bridge_dev.c
@@ -258,7 +258,7 @@ static void pci_bridge_dev_class_init(ObjectClass *klass, void *data)
     k->is_bridge = true;
     dc->desc = "Standard PCI Bridge";
     dc->reset = qdev_pci_bridge_dev_reset;
-    dc->props = pci_bridge_dev_properties;
+    device_class_set_props(dc, pci_bridge_dev_properties);
     dc->vmsd = &pci_bridge_dev_vmstate;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     hc->plug = pci_bridge_dev_plug_cb;
diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
index 0592818447..47aaaf8fd1 100644
--- a/hw/pci-bridge/pci_expander_bridge.c
+++ b/hw/pci-bridge/pci_expander_bridge.c
@@ -309,7 +309,7 @@ static void pxb_dev_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_BRIDGE_HOST;
 
     dc->desc = "PCI Expander Bridge";
-    dc->props = pxb_dev_properties;
+    device_class_set_props(dc, pxb_dev_properties);
     dc->hotpluggable = false;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
 }
@@ -347,7 +347,7 @@ static void pxb_pcie_dev_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_BRIDGE_HOST;
 
     dc->desc = "PCI Express Expander Bridge";
-    dc->props = pxb_dev_properties;
+    device_class_set_props(dc, pxb_dev_properties);
     dc->hotpluggable = false;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
 }
diff --git a/hw/pci-bridge/pcie_pci_bridge.c b/hw/pci-bridge/pcie_pci_bridge.c
index 7679bef6c1..eade133968 100644
--- a/hw/pci-bridge/pcie_pci_bridge.c
+++ b/hw/pci-bridge/pcie_pci_bridge.c
@@ -152,7 +152,7 @@ static void pcie_pci_bridge_class_init(ObjectClass *klass, void *data)
     k->exit = pcie_pci_bridge_exit;
     k->config_write = pcie_pci_bridge_write_config;
     dc->vmsd = &pcie_pci_bridge_dev_vmstate;
-    dc->props = pcie_pci_bridge_dev_properties;
+    device_class_set_props(dc, pcie_pci_bridge_dev_properties);
     dc->reset = &pcie_pci_bridge_reset;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     hc->plug = pci_bridge_dev_plug_cb;
diff --git a/hw/pci-bridge/pcie_root_port.c b/hw/pci-bridge/pcie_root_port.c
index 012c2cb12c..0ba4e4dea4 100644
--- a/hw/pci-bridge/pcie_root_port.c
+++ b/hw/pci-bridge/pcie_root_port.c
@@ -174,7 +174,7 @@ static void rp_class_init(ObjectClass *klass, void *data)
     k->exit = rp_exit;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     dc->reset = rp_reset;
-    dc->props = rp_props;
+    device_class_set_props(dc, rp_props);
 }
 
 static const TypeInfo rp_info = {
diff --git a/hw/pci-bridge/xio3130_downstream.c b/hw/pci-bridge/xio3130_downstream.c
index a9f084b863..153a4acad2 100644
--- a/hw/pci-bridge/xio3130_downstream.c
+++ b/hw/pci-bridge/xio3130_downstream.c
@@ -169,7 +169,7 @@ static void xio3130_downstream_class_init(ObjectClass *klass, void *data)
     dc->desc = "TI X3130 Downstream Port of PCI Express Switch";
     dc->reset = xio3130_downstream_reset;
     dc->vmsd = &vmstate_xio3130_downstream;
-    dc->props = xio3130_downstream_props;
+    device_class_set_props(dc, xio3130_downstream_props);
 }
 
 static const TypeInfo xio3130_downstream_info = {
diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c
index 537273e578..24ccdf6ceb 100644
--- a/hw/pci-host/grackle.c
+++ b/hw/pci-host/grackle.c
@@ -168,7 +168,7 @@ static void grackle_class_init(ObjectClass *klass, void *data)
     SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
 
     dc->realize = grackle_realize;
-    dc->props = grackle_properties;
+    device_class_set_props(dc, grackle_properties);
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     dc->fw_name = "pci";
     sbc->explicit_ofw_unit_address = grackle_ofw_unit_address;
diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c
index bae7b42327..11050a0f8b 100644
--- a/hw/pci-host/i440fx.c
+++ b/hw/pci-host/i440fx.c
@@ -396,7 +396,7 @@ static void i440fx_pcihost_class_init(ObjectClass *klass, void *data)
     hc->root_bus_path = i440fx_pcihost_root_bus_path;
     dc->realize = i440fx_pcihost_realize;
     dc->fw_name = "pci";
-    dc->props = i440fx_props;
+    device_class_set_props(dc, i440fx_props);
     /* Reason: needs to be wired up by pc_init1 */
     dc->user_creatable = false;
 }
diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
index 8bed8e8941..d71072731d 100644
--- a/hw/pci-host/ppce500.c
+++ b/hw/pci-host/ppce500.c
@@ -531,7 +531,7 @@ static void e500_pcihost_class_init(ObjectClass *klass, void *data)
 
     dc->realize = e500_pcihost_realize;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
-    dc->props = pcihost_properties;
+    device_class_set_props(dc, pcihost_properties);
     dc->vmsd = &vmstate_ppce500_pci;
 }
 
diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
index afa136ded3..f2f8821109 100644
--- a/hw/pci-host/prep.c
+++ b/hw/pci-host/prep.c
@@ -415,7 +415,7 @@ static void raven_pcihost_class_init(ObjectClass *klass, void *data)
 
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     dc->realize = raven_pcihost_realizefn;
-    dc->props = raven_pcihost_properties;
+    device_class_set_props(dc, raven_pcihost_properties);
     dc->fw_name = "pci";
 }
 
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index 158d270b9f..0d5dbbac56 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -202,7 +202,7 @@ static void q35_host_class_init(ObjectClass *klass, void *data)
 
     hc->root_bus_path = q35_host_root_bus_path;
     dc->realize = q35_host_realize;
-    dc->props = q35_host_props;
+    device_class_set_props(dc, q35_host_props);
     /* Reason: needs to be wired up by pc_q35_init */
     dc->user_creatable = false;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
@@ -612,7 +612,7 @@ static void mch_class_init(ObjectClass *klass, void *data)
     k->realize = mch_realize;
     k->config_write = mch_write_config;
     dc->reset = mch_reset;
-    dc->props = mch_props;
+    device_class_set_props(dc, mch_props);
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     dc->desc = "Host bridge";
     dc->vmsd = &vmstate_mch;
diff --git a/hw/pci-host/sabre.c b/hw/pci-host/sabre.c
index fae20ee97c..2b8503b709 100644
--- a/hw/pci-host/sabre.c
+++ b/hw/pci-host/sabre.c
@@ -521,7 +521,7 @@ static void sabre_class_init(ObjectClass *klass, void *data)
 
     dc->realize = sabre_realize;
     dc->reset = sabre_reset;
-    dc->props = sabre_properties;
+    device_class_set_props(dc, sabre_properties);
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     dc->fw_name = "pci";
     sbc->explicit_ofw_unit_address = sabre_ofw_unit_address;
diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
index 75bc506965..cf70b76fe2 100644
--- a/hw/pci-host/uninorth.c
+++ b/hw/pci-host/uninorth.c
@@ -476,7 +476,7 @@ static void pci_unin_main_class_init(ObjectClass *klass, void *data)
     SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
 
     dc->realize = pci_unin_main_realize;
-    dc->props = pci_unin_main_pci_host_props;
+    device_class_set_props(dc, pci_unin_main_pci_host_props);
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     dc->fw_name = "pci";
     sbc->explicit_ofw_unit_address = pci_unin_main_ofw_unit_address;
diff --git a/hw/pci-host/versatile.c b/hw/pci-host/versatile.c
index b731d0544f..cfb9a78ea6 100644
--- a/hw/pci-host/versatile.c
+++ b/hw/pci-host/versatile.c
@@ -509,7 +509,7 @@ static void pci_vpb_class_init(ObjectClass *klass, void *data)
     dc->realize = pci_vpb_realize;
     dc->reset = pci_vpb_reset;
     dc->vmsd = &pci_vpb_vmstate;
-    dc->props = pci_vpb_properties;
+    device_class_set_props(dc, pci_vpb_properties);
 }
 
 static const TypeInfo pci_vpb_info = {
diff --git a/hw/pci-host/xilinx-pcie.c b/hw/pci-host/xilinx-pcie.c
index 17d5024349..e06f2b59cf 100644
--- a/hw/pci-host/xilinx-pcie.c
+++ b/hw/pci-host/xilinx-pcie.c
@@ -177,7 +177,7 @@ static void xilinx_pcie_host_class_init(ObjectClass *klass, void *data)
     dc->realize = xilinx_pcie_host_realize;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     dc->fw_name = "pci";
-    dc->props = xilinx_pcie_host_props;
+    device_class_set_props(dc, xilinx_pcie_host_props);
 }
 
 static const TypeInfo xilinx_pcie_host_info = {
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index e3d310365d..0295a1c5da 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2624,7 +2624,7 @@ static void pci_device_class_init(ObjectClass *klass, void *data)
     k->realize = pci_qdev_realize;
     k->unrealize = pci_qdev_unrealize;
     k->bus_type = TYPE_PCI_BUS;
-    k->props = pci_props;
+    device_class_set_props(k, pci_props);
 }
 
 static void pci_device_class_base_init(ObjectClass *klass, void *data)
diff --git a/hw/pci/pcie_port.c b/hw/pci/pcie_port.c
index c19a9be592..f8263cb306 100644
--- a/hw/pci/pcie_port.c
+++ b/hw/pci/pcie_port.c
@@ -133,7 +133,7 @@ static void pcie_port_class_init(ObjectClass *oc, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(oc);
 
-    dc->props = pcie_port_props;
+    device_class_set_props(dc, pcie_port_props);
 }
 
 static const TypeInfo pcie_port_type_info = {
@@ -155,7 +155,7 @@ static void pcie_slot_class_init(ObjectClass *oc, void *data)
     DeviceClass *dc = DEVICE_CLASS(oc);
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
 
-    dc->props = pcie_slot_props;
+    device_class_set_props(dc, pcie_slot_props);
     hc->pre_plug = pcie_cap_slot_pre_plug_cb;
     hc->plug = pcie_cap_slot_plug_cb;
     hc->unplug = pcie_cap_slot_unplug_cb;
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index f77e7ca84e..6078c2322e 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1579,7 +1579,7 @@ static void pnv_chip_class_init(ObjectClass *klass, void *data)
 
     set_bit(DEVICE_CATEGORY_CPU, dc->categories);
     dc->realize = pnv_chip_realize;
-    dc->props = pnv_chip_properties;
+    device_class_set_props(dc, pnv_chip_properties);
     dc->desc = "PowerNV Chip";
 }
 
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index 2651044278..8ca5fbd1a9 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -323,7 +323,7 @@ static void pnv_core_class_init(ObjectClass *oc, void *data)
 
     dc->realize = pnv_core_realize;
     dc->unrealize = pnv_core_unrealize;
-    dc->props = pnv_core_properties;
+    device_class_set_props(dc, pnv_core_properties);
 }
 
 #define DEFINE_PNV_CORE_TYPE(family, cpu_model) \
@@ -421,7 +421,7 @@ static void pnv_quad_class_init(ObjectClass *oc, void *data)
     DeviceClass *dc = DEVICE_CLASS(oc);
 
     dc->realize = pnv_quad_realize;
-    dc->props = pnv_quad_properties;
+    device_class_set_props(dc, pnv_quad_properties);
 }
 
 static const TypeInfo pnv_quad_info = {
diff --git a/hw/ppc/pnv_homer.c b/hw/ppc/pnv_homer.c
index a08b7914f7..93ae42f7e4 100644
--- a/hw/ppc/pnv_homer.c
+++ b/hw/ppc/pnv_homer.c
@@ -359,7 +359,7 @@ static void pnv_homer_class_init(ObjectClass *klass, void *data)
 
     dc->realize = pnv_homer_realize;
     dc->desc = "PowerNV HOMER Memory";
-    dc->props = pnv_homer_properties;
+    device_class_set_props(dc, pnv_homer_properties);
 }
 
 static const TypeInfo pnv_homer_type_info = {
diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index 18256d9ba3..22b205532b 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -761,7 +761,7 @@ static void pnv_lpc_class_init(ObjectClass *klass, void *data)
 
     dc->realize = pnv_lpc_realize;
     dc->desc = "PowerNV LPC Controller";
-    dc->props = pnv_lpc_properties;
+    device_class_set_props(dc, pnv_lpc_properties);
 }
 
 static const TypeInfo pnv_lpc_info = {
diff --git a/hw/ppc/pnv_occ.c b/hw/ppc/pnv_occ.c
index 924fdabc9e..2173fac0e7 100644
--- a/hw/ppc/pnv_occ.c
+++ b/hw/ppc/pnv_occ.c
@@ -279,7 +279,7 @@ static void pnv_occ_class_init(ObjectClass *klass, void *data)
 
     dc->realize = pnv_occ_realize;
     dc->desc = "PowerNV OCC Controller";
-    dc->props = pnv_occ_properties;
+    device_class_set_props(dc, pnv_occ_properties);
 }
 
 static const TypeInfo pnv_occ_type_info = {
diff --git a/hw/ppc/pnv_pnor.c b/hw/ppc/pnv_pnor.c
index bfb1e92b03..34e1260236 100644
--- a/hw/ppc/pnv_pnor.c
+++ b/hw/ppc/pnv_pnor.c
@@ -117,7 +117,7 @@ static void pnv_pnor_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = pnv_pnor_realize;
-    dc->props = pnv_pnor_properties;
+    device_class_set_props(dc, pnv_pnor_properties);
 }
 
 static const TypeInfo pnv_pnor_info = {
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index 75e20d9da0..dc65575926 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -933,7 +933,7 @@ static void pnv_psi_class_init(ObjectClass *klass, void *data)
     xdc->dt_xscom = pnv_psi_dt_xscom;
 
     dc->desc = "PowerNV PSI Controller";
-    dc->props = pnv_psi_properties;
+    device_class_set_props(dc, pnv_psi_properties);
 }
 
 static const TypeInfo pnv_psi_info = {
diff --git a/hw/ppc/ppc440_uc.c b/hw/ppc/ppc440_uc.c
index 95475c9c5f..1a6a8fac22 100644
--- a/hw/ppc/ppc440_uc.c
+++ b/hw/ppc/ppc440_uc.c
@@ -1296,7 +1296,7 @@ static void ppc460ex_pcie_class_init(ObjectClass *klass, void *data)
 
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     dc->realize = ppc460ex_pcie_realize;
-    dc->props = ppc460ex_pcie_props;
+    device_class_set_props(dc, ppc460ex_pcie_props);
     dc->hotpluggable = false;
 }
 
diff --git a/hw/ppc/prep_systemio.c b/hw/ppc/prep_systemio.c
index 86e83e278f..bbc51b6e9a 100644
--- a/hw/ppc/prep_systemio.c
+++ b/hw/ppc/prep_systemio.c
@@ -289,7 +289,7 @@ static void prep_systemio_class_initfn(ObjectClass *klass, void *data)
 
     dc->realize = prep_systemio_realize;
     dc->vmsd = &vmstate_prep_systemio;
-    dc->props = prep_systemio_properties;
+    device_class_set_props(dc, prep_systemio_properties);
 }
 
 static TypeInfo prep_systemio800_info = {
diff --git a/hw/ppc/rs6000_mc.c b/hw/ppc/rs6000_mc.c
index 66b14db5fa..f8a498bd8a 100644
--- a/hw/ppc/rs6000_mc.c
+++ b/hw/ppc/rs6000_mc.c
@@ -222,7 +222,7 @@ static void rs6000mc_class_initfn(ObjectClass *klass, void *data)
 
     dc->realize = rs6000mc_realize;
     dc->vmsd = &vmstate_rs6000mc;
-    dc->props = rs6000mc_properties;
+    device_class_set_props(dc, rs6000mc_properties);
 }
 
 static const TypeInfo rs6000mc_info = {
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index 8339c4c0f8..d09125d9af 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -383,7 +383,7 @@ static void spapr_cpu_core_class_init(ObjectClass *oc, void *data)
     dc->realize = spapr_cpu_core_realize;
     dc->unrealize = spapr_cpu_core_unrealize;
     dc->reset = spapr_cpu_core_reset;
-    dc->props = spapr_cpu_core_properties;
+    device_class_set_props(dc, spapr_cpu_core_properties);
     scc->cpu_type = data;
 }
 
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 723373de73..e82bfc5ca7 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -2217,7 +2217,7 @@ static void spapr_phb_class_init(ObjectClass *klass, void *data)
     hc->root_bus_path = spapr_phb_root_bus_path;
     dc->realize = spapr_phb_realize;
     dc->unrealize = spapr_phb_unrealize;
-    dc->props = spapr_phb_properties;
+    device_class_set_props(dc, spapr_phb_properties);
     dc->reset = spapr_phb_reset;
     dc->vmsd = &vmstate_spapr_pci;
     /* Supported by TYPE_SPAPR_MACHINE */
diff --git a/hw/ppc/spapr_rng.c b/hw/ppc/spapr_rng.c
index 954e4aec4b..e8e8d65ec0 100644
--- a/hw/ppc/spapr_rng.c
+++ b/hw/ppc/spapr_rng.c
@@ -146,7 +146,7 @@ static void spapr_rng_class_init(ObjectClass *oc, void *data)
 
     dc->realize = spapr_rng_realize;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
-    dc->props = spapr_rng_properties;
+    device_class_set_props(dc, spapr_rng_properties);
     dc->hotpluggable = false;
 }
 
diff --git a/hw/ppc/spapr_tpm_proxy.c b/hw/ppc/spapr_tpm_proxy.c
index ca1caec113..991615d77a 100644
--- a/hw/ppc/spapr_tpm_proxy.c
+++ b/hw/ppc/spapr_tpm_proxy.c
@@ -159,7 +159,7 @@ static void spapr_tpm_proxy_class_init(ObjectClass *k, void *data)
     dk->realize = spapr_tpm_proxy_realize;
     dk->unrealize = spapr_tpm_proxy_unrealize;
     dk->user_creatable = true;
-    dk->props = spapr_tpm_proxy_properties;
+    device_class_set_props(dk, spapr_tpm_proxy_properties);
 }
 
 static const TypeInfo spapr_tpm_proxy_info = {
diff --git a/hw/rdma/vmw/pvrdma_main.c b/hw/rdma/vmw/pvrdma_main.c
index 6f0fc405c7..3254aadb6e 100644
--- a/hw/rdma/vmw/pvrdma_main.c
+++ b/hw/rdma/vmw/pvrdma_main.c
@@ -690,7 +690,7 @@ static void pvrdma_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_NETWORK_OTHER;
 
     dc->desc = "RDMA Device";
-    dc->props = pvrdma_dev_properties;
+    device_class_set_props(dc, pvrdma_dev_properties);
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 
     ir->print_statistics = pvrdma_print_statistics;
diff --git a/hw/riscv/riscv_hart.c b/hw/riscv/riscv_hart.c
index 5b98227db6..276a9baca0 100644
--- a/hw/riscv/riscv_hart.c
+++ b/hw/riscv/riscv_hart.c
@@ -74,7 +74,7 @@ static void riscv_harts_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = riscv_harts_props;
+    device_class_set_props(dc, riscv_harts_props);
     dc->realize = riscv_harts_realize;
 }
 
diff --git a/hw/riscv/sifive_clint.c b/hw/riscv/sifive_clint.c
index e5a8f75cee..e2feee871b 100644
--- a/hw/riscv/sifive_clint.c
+++ b/hw/riscv/sifive_clint.c
@@ -205,7 +205,7 @@ static void sifive_clint_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
     dc->realize = sifive_clint_realize;
-    dc->props = sifive_clint_properties;
+    device_class_set_props(dc, sifive_clint_properties);
 }
 
 static const TypeInfo sifive_clint_info = {
diff --git a/hw/riscv/sifive_plic.c b/hw/riscv/sifive_plic.c
index 98e4304b66..c1e04cbb98 100644
--- a/hw/riscv/sifive_plic.c
+++ b/hw/riscv/sifive_plic.c
@@ -466,7 +466,7 @@ static void sifive_plic_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = sifive_plic_properties;
+    device_class_set_props(dc, sifive_plic_properties);
     dc->realize = sifive_plic_realize;
 }
 
diff --git a/hw/riscv/sifive_u_otp.c b/hw/riscv/sifive_u_otp.c
index ea0eee5678..f6ecbaa2ca 100644
--- a/hw/riscv/sifive_u_otp.c
+++ b/hw/riscv/sifive_u_otp.c
@@ -171,7 +171,7 @@ static void sifive_u_otp_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = sifive_u_otp_properties;
+    device_class_set_props(dc, sifive_u_otp_properties);
     dc->realize = sifive_u_otp_realize;
     dc->reset = sifive_u_otp_reset;
 }
diff --git a/hw/rtc/m48t59-isa.c b/hw/rtc/m48t59-isa.c
index 7fde854c0f..131eb5b7d3 100644
--- a/hw/rtc/m48t59-isa.c
+++ b/hw/rtc/m48t59-isa.c
@@ -137,7 +137,7 @@ static void m48txx_isa_class_init(ObjectClass *klass, void *data)
 
     dc->realize = m48t59_isa_realize;
     dc->reset = m48t59_reset_isa;
-    dc->props = m48t59_isa_properties;
+    device_class_set_props(dc, m48t59_isa_properties);
     nc->read = m48txx_isa_read;
     nc->write = m48txx_isa_write;
     nc->toggle_lock = m48txx_isa_toggle_lock;
diff --git a/hw/rtc/m48t59.c b/hw/rtc/m48t59.c
index fc592b9fb1..1269134bcb 100644
--- a/hw/rtc/m48t59.c
+++ b/hw/rtc/m48t59.c
@@ -667,7 +667,7 @@ static void m48txx_sysbus_class_init(ObjectClass *klass, void *data)
 
     dc->realize = m48t59_realize;
     dc->reset = m48t59_reset_sysbus;
-    dc->props = m48t59_sysbus_properties;
+    device_class_set_props(dc, m48t59_sysbus_properties);
     dc->vmsd = &vmstate_m48t59;
     nc->read = m48txx_sysbus_read;
     nc->write = m48txx_sysbus_write;
diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
index 74ae74bc5c..dc4269cc55 100644
--- a/hw/rtc/mc146818rtc.c
+++ b/hw/rtc/mc146818rtc.c
@@ -1015,7 +1015,7 @@ static void rtc_class_initfn(ObjectClass *klass, void *data)
     dc->realize = rtc_realizefn;
     dc->reset = rtc_resetdev;
     dc->vmsd = &vmstate_rtc;
-    dc->props = mc146818rtc_properties;
+    device_class_set_props(dc, mc146818rtc_properties);
 }
 
 static const TypeInfo mc146818rtc_info = {
diff --git a/hw/rtc/pl031.c b/hw/rtc/pl031.c
index c57cf83165..ae47f09635 100644
--- a/hw/rtc/pl031.c
+++ b/hw/rtc/pl031.c
@@ -321,7 +321,7 @@ static void pl031_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->vmsd = &vmstate_pl031;
-    dc->props = pl031_properties;
+    device_class_set_props(dc, pl031_properties);
 }
 
 static const TypeInfo pl031_info = {
diff --git a/hw/s390x/3270-ccw.c b/hw/s390x/3270-ccw.c
index c19a75b9b7..821319eee6 100644
--- a/hw/s390x/3270-ccw.c
+++ b/hw/s390x/3270-ccw.c
@@ -155,7 +155,7 @@ static void emulated_ccw_3270_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = emulated_ccw_3270_properties;
+    device_class_set_props(dc, emulated_ccw_3270_properties);
     dc->bus_type = TYPE_VIRTUAL_CSS_BUS;
     dc->realize = emulated_ccw_3270_realize;
     dc->hotpluggable = false;
diff --git a/hw/s390x/ccw-device.c b/hw/s390x/ccw-device.c
index 4d222ad202..c9707110e9 100644
--- a/hw/s390x/ccw-device.c
+++ b/hw/s390x/ccw-device.c
@@ -57,7 +57,7 @@ static void ccw_device_class_init(ObjectClass *klass, void *data)
 
     k->realize = ccw_device_realize;
     k->refill_ids = ccw_device_refill_ids;
-    dc->props = ccw_device_properties;
+    device_class_set_props(dc, ccw_device_properties);
     dc->reset = ccw_device_reset;
 }
 
diff --git a/hw/s390x/css-bridge.c b/hw/s390x/css-bridge.c
index 15a8ed96de..a306a78e6c 100644
--- a/hw/s390x/css-bridge.c
+++ b/hw/s390x/css-bridge.c
@@ -139,7 +139,7 @@ static void virtual_css_bridge_class_init(ObjectClass *klass, void *data)
 
     hc->unplug = ccw_device_unplug;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
-    dc->props = virtual_css_bridge_properties;
+    device_class_set_props(dc, virtual_css_bridge_properties);
     object_class_property_add_bool(klass, "cssid-unrestricted",
                                    prop_get_true, NULL, NULL);
     object_class_property_set_description(klass, "cssid-unrestricted",
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index ca544d64c5..b3ae901529 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -666,7 +666,7 @@ static void s390_ipl_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = s390_ipl_realize;
-    dc->props = s390_ipl_properties;
+    device_class_set_props(dc, s390_ipl_properties);
     dc->reset = s390_ipl_reset;
     dc->vmsd = &vmstate_ipl;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 2d2f4a7c41..7c6a2b3c63 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -1314,7 +1314,7 @@ static void s390_pci_device_class_init(ObjectClass *klass, void *data)
     dc->reset = s390_pci_device_reset;
     dc->bus_type = TYPE_S390_PCI_BUS;
     dc->realize = s390_pci_device_realize;
-    dc->props = s390_pci_device_properties;
+    device_class_set_props(dc, s390_pci_device_properties);
     dc->vmsd = &s390_pci_device_vmstate;
 }
 
diff --git a/hw/s390x/vhost-vsock-ccw.c b/hw/s390x/vhost-vsock-ccw.c
index 1835812bd1..12dee15e11 100644
--- a/hw/s390x/vhost-vsock-ccw.c
+++ b/hw/s390x/vhost-vsock-ccw.c
@@ -35,7 +35,7 @@ static void vhost_vsock_ccw_class_init(ObjectClass *klass, void *data)
 
     k->realize = vhost_vsock_ccw_realize;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
-    dc->props = vhost_vsock_ccw_properties;
+    device_class_set_props(dc, vhost_vsock_ccw_properties);
 }
 
 static void vhost_vsock_ccw_instance_init(Object *obj)
diff --git a/hw/s390x/virtio-ccw-9p.c b/hw/s390x/virtio-ccw-9p.c
index 5453a964d2..08e1d5d416 100644
--- a/hw/s390x/virtio-ccw-9p.c
+++ b/hw/s390x/virtio-ccw-9p.c
@@ -47,7 +47,7 @@ static void virtio_ccw_9p_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = virtio_ccw_9p_realize;
-    dc->props = virtio_ccw_9p_properties;
+    device_class_set_props(dc, virtio_ccw_9p_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
 
diff --git a/hw/s390x/virtio-ccw-balloon.c b/hw/s390x/virtio-ccw-balloon.c
index 7088612f6b..5d28e72345 100644
--- a/hw/s390x/virtio-ccw-balloon.c
+++ b/hw/s390x/virtio-ccw-balloon.c
@@ -52,7 +52,7 @@ static void virtio_ccw_balloon_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = virtio_ccw_balloon_realize;
-    dc->props = virtio_ccw_balloon_properties;
+    device_class_set_props(dc, virtio_ccw_balloon_properties);
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
 
diff --git a/hw/s390x/virtio-ccw-blk.c b/hw/s390x/virtio-ccw-blk.c
index 1512af8974..bf8520e60a 100644
--- a/hw/s390x/virtio-ccw-blk.c
+++ b/hw/s390x/virtio-ccw-blk.c
@@ -49,7 +49,7 @@ static void virtio_ccw_blk_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = virtio_ccw_blk_realize;
-    dc->props = virtio_ccw_blk_properties;
+    device_class_set_props(dc, virtio_ccw_blk_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
 
diff --git a/hw/s390x/virtio-ccw-crypto.c b/hw/s390x/virtio-ccw-crypto.c
index 086b397ad2..1a2690cf9e 100644
--- a/hw/s390x/virtio-ccw-crypto.c
+++ b/hw/s390x/virtio-ccw-crypto.c
@@ -57,7 +57,7 @@ static void virtio_ccw_crypto_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = virtio_ccw_crypto_realize;
-    dc->props = virtio_ccw_crypto_properties;
+    device_class_set_props(dc, virtio_ccw_crypto_properties);
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
 
diff --git a/hw/s390x/virtio-ccw-gpu.c b/hw/s390x/virtio-ccw-gpu.c
index be46ca7a96..f69e3ff5a0 100644
--- a/hw/s390x/virtio-ccw-gpu.c
+++ b/hw/s390x/virtio-ccw-gpu.c
@@ -48,7 +48,7 @@ static void virtio_ccw_gpu_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = virtio_ccw_gpu_realize;
-    dc->props = virtio_ccw_gpu_properties;
+    device_class_set_props(dc, virtio_ccw_gpu_properties);
     dc->hotpluggable = false;
     set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
 }
diff --git a/hw/s390x/virtio-ccw-input.c b/hw/s390x/virtio-ccw-input.c
index 370b776790..b257dfd467 100644
--- a/hw/s390x/virtio-ccw-input.c
+++ b/hw/s390x/virtio-ccw-input.c
@@ -38,7 +38,7 @@ static void virtio_ccw_input_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = virtio_ccw_input_realize;
-    dc->props = virtio_ccw_input_properties;
+    device_class_set_props(dc, virtio_ccw_input_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
diff --git a/hw/s390x/virtio-ccw-net.c b/hw/s390x/virtio-ccw-net.c
index 12c03d73c4..cd02699934 100644
--- a/hw/s390x/virtio-ccw-net.c
+++ b/hw/s390x/virtio-ccw-net.c
@@ -52,7 +52,7 @@ static void virtio_ccw_net_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = virtio_ccw_net_realize;
-    dc->props = virtio_ccw_net_properties;
+    device_class_set_props(dc, virtio_ccw_net_properties);
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
 }
 
diff --git a/hw/s390x/virtio-ccw-rng.c b/hw/s390x/virtio-ccw-rng.c
index 854254dd50..d575e30cc6 100644
--- a/hw/s390x/virtio-ccw-rng.c
+++ b/hw/s390x/virtio-ccw-rng.c
@@ -56,7 +56,7 @@ static void virtio_ccw_rng_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = virtio_ccw_rng_realize;
-    dc->props = virtio_ccw_rng_properties;
+    device_class_set_props(dc, virtio_ccw_rng_properties);
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
 
diff --git a/hw/s390x/virtio-ccw-scsi.c b/hw/s390x/virtio-ccw-scsi.c
index 4662288b5b..3cb3ad669d 100644
--- a/hw/s390x/virtio-ccw-scsi.c
+++ b/hw/s390x/virtio-ccw-scsi.c
@@ -59,7 +59,7 @@ static void virtio_ccw_scsi_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = virtio_ccw_scsi_realize;
-    dc->props = virtio_ccw_scsi_properties;
+    device_class_set_props(dc, virtio_ccw_scsi_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
 
@@ -102,7 +102,7 @@ static void vhost_ccw_scsi_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = vhost_ccw_scsi_realize;
-    dc->props = vhost_ccw_scsi_properties;
+    device_class_set_props(dc, vhost_ccw_scsi_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 }
 
diff --git a/hw/s390x/virtio-ccw-serial.c b/hw/s390x/virtio-ccw-serial.c
index eafb7d5c1f..1764db2e70 100644
--- a/hw/s390x/virtio-ccw-serial.c
+++ b/hw/s390x/virtio-ccw-serial.c
@@ -60,7 +60,7 @@ static void virtio_ccw_serial_class_init(ObjectClass *klass, void *data)
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
 
     k->realize = virtio_ccw_serial_realize;
-    dc->props = virtio_ccw_serial_properties;
+    device_class_set_props(dc, virtio_ccw_serial_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
index de9bd20887..af18c88b65 100644
--- a/hw/scsi/megasas.c
+++ b/hw/scsi/megasas.c
@@ -2511,7 +2511,7 @@ static void megasas_class_init(ObjectClass *oc, void *data)
     e->osts = info->osts;
     e->product_name = info->product_name;
     e->product_version = info->product_version;
-    dc->props = info->props;
+    device_class_set_props(dc, info->props);
     dc->reset = megasas_scsi_reset;
     dc->vmsd = info->vmsd;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
diff --git a/hw/scsi/mptsas.c b/hw/scsi/mptsas.c
index b8a4b37cf3..14cbed84d0 100644
--- a/hw/scsi/mptsas.c
+++ b/hw/scsi/mptsas.c
@@ -1431,7 +1431,7 @@ static void mptsas1068_class_init(ObjectClass *oc, void *data)
     pc->subsystem_vendor_id = PCI_VENDOR_ID_LSI_LOGIC;
     pc->subsystem_id = 0x8000;
     pc->class_id = PCI_CLASS_STORAGE_SCSI;
-    dc->props = mptsas_properties;
+    device_class_set_props(dc, mptsas_properties);
     dc->reset = mptsas_reset;
     dc->vmsd = &vmstate_mptsas;
     dc->desc = "LSI SAS 1068";
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index ad0e7f6d88..1c980cab38 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -1728,7 +1728,7 @@ static void scsi_device_class_init(ObjectClass *klass, void *data)
     k->bus_type  = TYPE_SCSI_BUS;
     k->realize   = scsi_qdev_realize;
     k->unrealize = scsi_qdev_unrealize;
-    k->props     = scsi_props;
+    device_class_set_props(k, scsi_props);
 }
 
 static void scsi_dev_instance_init(Object *obj)
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
index e44c61eeb4..10d0794d60 100644
--- a/hw/scsi/scsi-disk.c
+++ b/hw/scsi/scsi-disk.c
@@ -3036,7 +3036,7 @@ static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
     sc->alloc_req    = scsi_new_request;
     sc->unit_attention_reported = scsi_disk_unit_attention_reported;
     dc->desc = "virtual SCSI disk";
-    dc->props = scsi_hd_properties;
+    device_class_set_props(dc, scsi_hd_properties);
     dc->vmsd  = &vmstate_scsi_disk_state;
 }
 
@@ -3067,7 +3067,7 @@ static void scsi_cd_class_initfn(ObjectClass *klass, void *data)
     sc->alloc_req    = scsi_new_request;
     sc->unit_attention_reported = scsi_disk_unit_attention_reported;
     dc->desc = "virtual SCSI CD-ROM";
-    dc->props = scsi_cd_properties;
+    device_class_set_props(dc, scsi_cd_properties);
     dc->vmsd  = &vmstate_scsi_disk_state;
 }
 
@@ -3106,7 +3106,7 @@ static void scsi_block_class_initfn(ObjectClass *klass, void *data)
     sdc->update_sense = scsi_block_update_sense;
     sdc->need_fua_emulation = scsi_block_no_fua;
     dc->desc = "SCSI block device passthrough";
-    dc->props = scsi_block_properties;
+    device_class_set_props(dc, scsi_block_properties);
     dc->vmsd  = &vmstate_scsi_disk_state;
 }
 
@@ -3146,7 +3146,7 @@ static void scsi_disk_class_initfn(ObjectClass *klass, void *data)
     dc->fw_name = "disk";
     dc->desc = "virtual SCSI disk or CD-ROM (legacy)";
     dc->reset = scsi_disk_reset;
-    dc->props = scsi_disk_properties;
+    device_class_set_props(dc, scsi_disk_properties);
     dc->vmsd  = &vmstate_scsi_disk_state;
 }
 
diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
index e7798ebcd0..86ed0a3822 100644
--- a/hw/scsi/scsi-generic.c
+++ b/hw/scsi/scsi-generic.c
@@ -768,7 +768,7 @@ static void scsi_generic_class_initfn(ObjectClass *klass, void *data)
     dc->fw_name = "disk";
     dc->desc = "pass through generic scsi device (/dev/sg*)";
     dc->reset = scsi_generic_reset;
-    dc->props = scsi_generic_properties;
+    device_class_set_props(dc, scsi_generic_properties);
     dc->vmsd  = &vmstate_scsi_device;
 }
 
diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
index 2120ceb051..7d584e7732 100644
--- a/hw/scsi/spapr_vscsi.c
+++ b/hw/scsi/spapr_vscsi.c
@@ -1267,7 +1267,7 @@ static void spapr_vscsi_class_init(ObjectClass *klass, void *data)
     k->dt_compatible = "IBM,v-scsi";
     k->signal_mask = 0x00000001;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
-    dc->props = spapr_vscsi_properties;
+    device_class_set_props(dc, spapr_vscsi_properties);
     k->rtce_window_size = 0x10000000;
     dc->vmsd = &vmstate_spapr_vscsi;
 }
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index 26f710d3ec..f052377b7e 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -293,7 +293,7 @@ static void vhost_scsi_class_init(ObjectClass *klass, void *data)
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
     FWPathProviderClass *fwc = FW_PATH_PROVIDER_CLASS(klass);
 
-    dc->props = vhost_scsi_properties;
+    device_class_set_props(dc, vhost_scsi_properties);
     dc->vmsd = &vmstate_virtio_vhost_scsi;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     vdc->realize = vhost_scsi_realize;
diff --git a/hw/scsi/vhost-user-scsi.c b/hw/scsi/vhost-user-scsi.c
index 23f972df59..a01bf63a08 100644
--- a/hw/scsi/vhost-user-scsi.c
+++ b/hw/scsi/vhost-user-scsi.c
@@ -197,7 +197,7 @@ static void vhost_user_scsi_class_init(ObjectClass *klass, void *data)
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
     FWPathProviderClass *fwc = FW_PATH_PROVIDER_CLASS(klass);
 
-    dc->props = vhost_user_scsi_properties;
+    device_class_set_props(dc, vhost_user_scsi_properties);
     dc->vmsd = &vmstate_vhost_scsi;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     vdc->realize = vhost_user_scsi_realize;
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index 4bc73a370e..71cdf73af6 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -1000,7 +1000,7 @@ static void virtio_scsi_class_init(ObjectClass *klass, void *data)
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
 
-    dc->props = virtio_scsi_properties;
+    device_class_set_props(dc, virtio_scsi_properties);
     dc->vmsd = &vmstate_virtio_scsi;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     vdc->realize = virtio_scsi_device_realize;
diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
index 452a3b63b2..8f1aaf9c87 100644
--- a/hw/scsi/vmw_pvscsi.c
+++ b/hw/scsi/vmw_pvscsi.c
@@ -1292,7 +1292,7 @@ static void pvscsi_class_init(ObjectClass *klass, void *data)
                                     &pvs_k->parent_dc_realize);
     dc->reset = pvscsi_reset;
     dc->vmsd = &vmstate_pvscsi;
-    dc->props = pvscsi_properties;
+    device_class_set_props(dc, pvscsi_properties);
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     hc->unplug = pvscsi_hot_unplug;
     hc->plug = pvscsi_hotplug;
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 49b83576e7..71a9af09ab 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -2118,7 +2118,7 @@ static void sd_class_init(ObjectClass *klass, void *data)
     SDCardClass *sc = SD_CARD_CLASS(klass);
 
     dc->realize = sd_realize;
-    dc->props = sd_properties;
+    device_class_set_props(dc, sd_properties);
     dc->vmsd = &sd_vmstate;
     dc->reset = sd_reset;
     dc->bus_type = TYPE_SD_BUS;
diff --git a/hw/sd/sdhci-pci.c b/hw/sd/sdhci-pci.c
index 2c8d8f59b5..19fa8bd8ed 100644
--- a/hw/sd/sdhci-pci.c
+++ b/hw/sd/sdhci-pci.c
@@ -64,7 +64,7 @@ static void sdhci_pci_class_init(ObjectClass *klass, void *data)
     k->vendor_id = PCI_VENDOR_ID_REDHAT;
     k->device_id = PCI_DEVICE_ID_REDHAT_SDHCI;
     k->class_id = PCI_CLASS_SYSTEM_SDHCI;
-    dc->props = sdhci_pci_properties;
+    device_class_set_props(dc, sdhci_pci_properties);
 
     sdhci_common_class_init(klass, data);
 }
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 18c0c052ce..69dc3e6b90 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1499,7 +1499,7 @@ static void sdhci_sysbus_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = sdhci_sysbus_properties;
+    device_class_set_props(dc, sdhci_sysbus_properties);
     dc->realize = sdhci_sysbus_realize;
     dc->unrealize = sdhci_sysbus_unrealize;
 
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 2aaa5bf1ae..df33b32dde 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -761,7 +761,7 @@ static void prom_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = prom_properties;
+    device_class_set_props(dc, prom_properties);
     dc->realize = prom_realize;
 }
 
@@ -827,7 +827,7 @@ static void ram_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = ram_realize;
-    dc->props = ram_properties;
+    device_class_set_props(dc, ram_properties);
 }
 
 static const TypeInfo ram_info = {
diff --git a/hw/sparc/sun4m_iommu.c b/hw/sparc/sun4m_iommu.c
index ccf46a5147..71f5465249 100644
--- a/hw/sparc/sun4m_iommu.c
+++ b/hw/sparc/sun4m_iommu.c
@@ -379,7 +379,7 @@ static void iommu_class_init(ObjectClass *klass, void *data)
 
     dc->reset = iommu_reset;
     dc->vmsd = &vmstate_iommu;
-    dc->props = iommu_properties;
+    device_class_set_props(dc, iommu_properties);
 }
 
 static const TypeInfo iommu_info = {
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 955082773b..5d710d6b7a 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -389,7 +389,7 @@ static void ebus_class_init(ObjectClass *klass, void *data)
     k->device_id = PCI_DEVICE_ID_SUN_EBUS;
     k->revision = 0x01;
     k->class_id = PCI_CLASS_BRIDGE_OTHER;
-    dc->props = ebus_properties;
+    device_class_set_props(dc, ebus_properties);
 }
 
 static const TypeInfo ebus_info = {
@@ -479,7 +479,7 @@ static void prom_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = prom_properties;
+    device_class_set_props(dc, prom_properties);
     dc->realize = prom_realize;
 }
 
@@ -540,7 +540,7 @@ static void ram_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = ram_realize;
-    dc->props = ram_properties;
+    device_class_set_props(dc, ram_properties);
 }
 
 static const TypeInfo ram_info = {
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
index 7755eca349..23c8d2f062 100644
--- a/hw/ssi/aspeed_smc.c
+++ b/hw/ssi/aspeed_smc.c
@@ -1401,7 +1401,7 @@ static void aspeed_smc_class_init(ObjectClass *klass, void *data)
 
     dc->realize = aspeed_smc_realize;
     dc->reset = aspeed_smc_reset;
-    dc->props = aspeed_smc_properties;
+    device_class_set_props(dc, aspeed_smc_properties);
     dc->vmsd = &vmstate_aspeed_smc;
     mc->ctrl = data;
 }
diff --git a/hw/ssi/xilinx_spi.c b/hw/ssi/xilinx_spi.c
index a1be0de039..eba7ccd46a 100644
--- a/hw/ssi/xilinx_spi.c
+++ b/hw/ssi/xilinx_spi.c
@@ -372,7 +372,7 @@ static void xilinx_spi_class_init(ObjectClass *klass, void *data)
 
     dc->realize = xilinx_spi_realize;
     dc->reset = xlx_spi_reset;
-    dc->props = xilinx_spi_properties;
+    device_class_set_props(dc, xilinx_spi_properties);
     dc->vmsd = &vmstate_xilinx_spi;
 }
 
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
index 0d6c2e1a61..6c9ef59779 100644
--- a/hw/ssi/xilinx_spips.c
+++ b/hw/ssi/xilinx_spips.c
@@ -1455,7 +1455,7 @@ static void xilinx_spips_class_init(ObjectClass *klass, void *data)
 
     dc->realize = xilinx_spips_realize;
     dc->reset = xilinx_spips_reset;
-    dc->props = xilinx_spips_properties;
+    device_class_set_props(dc, xilinx_spips_properties);
     dc->vmsd = &vmstate_xilinx_spips;
 
     xsc->reg_ops = &spips_ops;
@@ -1471,7 +1471,7 @@ static void xlnx_zynqmp_qspips_class_init(ObjectClass *klass, void * data)
     dc->realize = xlnx_zynqmp_qspips_realize;
     dc->reset = xlnx_zynqmp_qspips_reset;
     dc->vmsd = &vmstate_xlnx_zynqmp_qspips;
-    dc->props = xilinx_zynqmp_qspips_properties;
+    device_class_set_props(dc, xilinx_zynqmp_qspips_properties);
     xsc->reg_ops = &xlnx_zynqmp_qspips_ops;
     xsc->rx_fifo_size = RXFF_A_Q;
     xsc->tx_fifo_size = TXFF_A_Q;
diff --git a/hw/timer/a9gtimer.c b/hw/timer/a9gtimer.c
index 4c634c83b1..7233068a37 100644
--- a/hw/timer/a9gtimer.c
+++ b/hw/timer/a9gtimer.c
@@ -359,7 +359,7 @@ static void a9_gtimer_class_init(ObjectClass *klass, void *data)
     dc->realize = a9_gtimer_realize;
     dc->vmsd = &vmstate_a9_gtimer;
     dc->reset = a9_gtimer_reset;
-    dc->props = a9_gtimer_properties;
+    device_class_set_props(dc, a9_gtimer_properties);
 }
 
 static const TypeInfo a9_gtimer_info = {
diff --git a/hw/timer/allwinner-a10-pit.c b/hw/timer/allwinner-a10-pit.c
index aae880f5b3..f84fc0ea25 100644
--- a/hw/timer/allwinner-a10-pit.c
+++ b/hw/timer/allwinner-a10-pit.c
@@ -284,7 +284,7 @@ static void a10_pit_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = a10_pit_reset;
-    dc->props = a10_pit_properties;
+    device_class_set_props(dc, a10_pit_properties);
     dc->desc = "allwinner a10 timer";
     dc->vmsd = &vmstate_a10_pit;
 }
diff --git a/hw/timer/altera_timer.c b/hw/timer/altera_timer.c
index 79fc381252..be81b7a518 100644
--- a/hw/timer/altera_timer.c
+++ b/hw/timer/altera_timer.c
@@ -224,7 +224,7 @@ static void altera_timer_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = altera_timer_realize;
-    dc->props = altera_timer_properties;
+    device_class_set_props(dc, altera_timer_properties);
     dc->reset = altera_timer_reset;
 }
 
diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
index 2bf11f788c..cdfca3000b 100644
--- a/hw/timer/arm_mptimer.c
+++ b/hw/timer/arm_mptimer.c
@@ -312,7 +312,7 @@ static void arm_mptimer_class_init(ObjectClass *klass, void *data)
     dc->realize = arm_mptimer_realize;
     dc->vmsd = &vmstate_arm_mptimer;
     dc->reset = arm_mptimer_reset;
-    dc->props = arm_mptimer_properties;
+    device_class_set_props(dc, arm_mptimer_properties);
 }
 
 static const TypeInfo arm_mptimer_info = {
diff --git a/hw/timer/arm_timer.c b/hw/timer/arm_timer.c
index af524fabf7..c1f2b876ab 100644
--- a/hw/timer/arm_timer.c
+++ b/hw/timer/arm_timer.c
@@ -397,7 +397,7 @@ static void sp804_class_init(ObjectClass *klass, void *data)
     DeviceClass *k = DEVICE_CLASS(klass);
 
     k->realize = sp804_realize;
-    k->props = sp804_properties;
+    device_class_set_props(k, sp804_properties);
     k->vmsd = &vmstate_sp804;
 }
 
diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c
index a8c38cc118..9be407ecc8 100644
--- a/hw/timer/aspeed_timer.c
+++ b/hw/timer/aspeed_timer.c
@@ -685,7 +685,7 @@ static void timer_class_init(ObjectClass *klass, void *data)
     dc->reset = aspeed_timer_reset;
     dc->desc = "ASPEED Timer";
     dc->vmsd = &vmstate_aspeed_timer_state;
-    dc->props = aspeed_timer_properties;
+    device_class_set_props(dc, aspeed_timer_properties);
 }
 
 static const TypeInfo aspeed_timer_info = {
diff --git a/hw/timer/cmsdk-apb-dualtimer.c b/hw/timer/cmsdk-apb-dualtimer.c
index e28ba9c90a..f6534241b9 100644
--- a/hw/timer/cmsdk-apb-dualtimer.c
+++ b/hw/timer/cmsdk-apb-dualtimer.c
@@ -510,7 +510,7 @@ static void cmsdk_apb_dualtimer_class_init(ObjectClass *klass, void *data)
     dc->realize = cmsdk_apb_dualtimer_realize;
     dc->vmsd = &cmsdk_apb_dualtimer_vmstate;
     dc->reset = cmsdk_apb_dualtimer_reset;
-    dc->props = cmsdk_apb_dualtimer_properties;
+    device_class_set_props(dc, cmsdk_apb_dualtimer_properties);
 }
 
 static const TypeInfo cmsdk_apb_dualtimer_info = {
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
index 40728e85e2..f85f1309f3 100644
--- a/hw/timer/cmsdk-apb-timer.c
+++ b/hw/timer/cmsdk-apb-timer.c
@@ -260,7 +260,7 @@ static void cmsdk_apb_timer_class_init(ObjectClass *klass, void *data)
     dc->realize = cmsdk_apb_timer_realize;
     dc->vmsd = &cmsdk_apb_timer_vmstate;
     dc->reset = cmsdk_apb_timer_reset;
-    dc->props = cmsdk_apb_timer_properties;
+    device_class_set_props(dc, cmsdk_apb_timer_properties);
 }
 
 static const TypeInfo cmsdk_apb_timer_info = {
diff --git a/hw/timer/grlib_gptimer.c b/hw/timer/grlib_gptimer.c
index 7a9371c0e3..eff0ee3491 100644
--- a/hw/timer/grlib_gptimer.c
+++ b/hw/timer/grlib_gptimer.c
@@ -415,7 +415,7 @@ static void grlib_gptimer_class_init(ObjectClass *klass, void *data)
 
     dc->realize = grlib_gptimer_realize;
     dc->reset = grlib_gptimer_reset;
-    dc->props = grlib_gptimer_properties;
+    device_class_set_props(dc, grlib_gptimer_properties);
 }
 
 static const TypeInfo grlib_gptimer_info = {
diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
index 9f17aaa278..8dbcbdca16 100644
--- a/hw/timer/hpet.c
+++ b/hw/timer/hpet.c
@@ -800,7 +800,7 @@ static void hpet_device_class_init(ObjectClass *klass, void *data)
     dc->realize = hpet_realize;
     dc->reset = hpet_reset;
     dc->vmsd = &vmstate_hpet;
-    dc->props = hpet_device_properties;
+    device_class_set_props(dc, hpet_device_properties);
 }
 
 static const TypeInfo hpet_device_info = {
diff --git a/hw/timer/i8254.c b/hw/timer/i8254.c
index a4be7330ef..29f62e5356 100644
--- a/hw/timer/i8254.c
+++ b/hw/timer/i8254.c
@@ -364,7 +364,7 @@ static void pit_class_initfn(ObjectClass *klass, void *data)
     k->get_channel_info = pit_get_channel_info_common;
     k->post_load = pit_post_load;
     dc->reset = pit_reset;
-    dc->props = pit_properties;
+    device_class_set_props(dc, pit_properties);
 }
 
 static const TypeInfo pit_info = {
diff --git a/hw/timer/lm32_timer.c b/hw/timer/lm32_timer.c
index 3fdecd09fe..f703f407f5 100644
--- a/hw/timer/lm32_timer.c
+++ b/hw/timer/lm32_timer.c
@@ -230,7 +230,7 @@ static void lm32_timer_class_init(ObjectClass *klass, void *data)
     dc->realize = lm32_timer_realize;
     dc->reset = timer_reset;
     dc->vmsd = &vmstate_lm32_timer;
-    dc->props = lm32_timer_properties;
+    device_class_set_props(dc, lm32_timer_properties);
 }
 
 static const TypeInfo lm32_timer_info = {
diff --git a/hw/timer/milkymist-sysctl.c b/hw/timer/milkymist-sysctl.c
index 7a62e212c3..94389820b2 100644
--- a/hw/timer/milkymist-sysctl.c
+++ b/hw/timer/milkymist-sysctl.c
@@ -343,7 +343,7 @@ static void milkymist_sysctl_class_init(ObjectClass *klass, void *data)
     dc->realize = milkymist_sysctl_realize;
     dc->reset = milkymist_sysctl_reset;
     dc->vmsd = &vmstate_milkymist_sysctl;
-    dc->props = milkymist_sysctl_properties;
+    device_class_set_props(dc, milkymist_sysctl_properties);
 }
 
 static const TypeInfo milkymist_sysctl_info = {
diff --git a/hw/timer/mss-timer.c b/hw/timer/mss-timer.c
index b1c9a80501..29943fd744 100644
--- a/hw/timer/mss-timer.c
+++ b/hw/timer/mss-timer.c
@@ -278,7 +278,7 @@ static void mss_timer_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = mss_timer_properties;
+    device_class_set_props(dc, mss_timer_properties);
     dc->vmsd = &vmstate_mss_timer;
 }
 
diff --git a/hw/timer/pxa2xx_timer.c b/hw/timer/pxa2xx_timer.c
index 311cd38aac..cd172cc1e9 100644
--- a/hw/timer/pxa2xx_timer.c
+++ b/hw/timer/pxa2xx_timer.c
@@ -562,7 +562,7 @@ static void pxa25x_timer_dev_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->desc = "PXA25x timer";
-    dc->props = pxa25x_timer_dev_properties;
+    device_class_set_props(dc, pxa25x_timer_dev_properties);
 }
 
 static const TypeInfo pxa25x_timer_dev_info = {
@@ -584,7 +584,7 @@ static void pxa27x_timer_dev_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->desc = "PXA27x timer";
-    dc->props = pxa27x_timer_dev_properties;
+    device_class_set_props(dc, pxa27x_timer_dev_properties);
 }
 
 static const TypeInfo pxa27x_timer_dev_info = {
diff --git a/hw/timer/slavio_timer.c b/hw/timer/slavio_timer.c
index c55e8d0bf4..4c5d65e391 100644
--- a/hw/timer/slavio_timer.c
+++ b/hw/timer/slavio_timer.c
@@ -427,7 +427,7 @@ static void slavio_timer_class_init(ObjectClass *klass, void *data)
 
     dc->reset = slavio_timer_reset;
     dc->vmsd = &vmstate_slavio_timer;
-    dc->props = slavio_timer_properties;
+    device_class_set_props(dc, slavio_timer_properties);
 }
 
 static const TypeInfo slavio_timer_info = {
diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index edc557a4b9..fb370ce0f0 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -323,7 +323,7 @@ static void stm32f2xx_timer_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = stm32f2xx_timer_reset;
-    dc->props = stm32f2xx_timer_properties;
+    device_class_set_props(dc, stm32f2xx_timer_properties);
     dc->vmsd = &vmstate_stm32f2xx_timer;
 }
 
diff --git a/hw/timer/xilinx_timer.c b/hw/timer/xilinx_timer.c
index 7191ea54f5..0190aa47d0 100644
--- a/hw/timer/xilinx_timer.c
+++ b/hw/timer/xilinx_timer.c
@@ -253,7 +253,7 @@ static void xilinx_timer_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = xilinx_timer_realize;
-    dc->props = xilinx_timer_properties;
+    device_class_set_props(dc, xilinx_timer_properties);
 }
 
 static const TypeInfo xilinx_timer_info = {
diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c
index faae733120..cd004e7f8e 100644
--- a/hw/tpm/tpm_crb.c
+++ b/hw/tpm/tpm_crb.c
@@ -313,7 +313,7 @@ static void tpm_crb_class_init(ObjectClass *klass, void *data)
     TPMIfClass *tc = TPM_IF_CLASS(klass);
 
     dc->realize = tpm_crb_realize;
-    dc->props = tpm_crb_properties;
+    device_class_set_props(dc, tpm_crb_properties);
     dc->vmsd  = &vmstate_tpm_crb;
     dc->user_creatable = true;
     tc->model = TPM_MODEL_TPM_CRB;
diff --git a/hw/tpm/tpm_tis.c b/hw/tpm/tpm_tis.c
index 7aaf9b946d..5362df2711 100644
--- a/hw/tpm/tpm_tis.c
+++ b/hw/tpm/tpm_tis.c
@@ -1023,7 +1023,7 @@ static void tpm_tis_class_init(ObjectClass *klass, void *data)
     TPMIfClass *tc = TPM_IF_CLASS(klass);
 
     dc->realize = tpm_tis_realizefn;
-    dc->props = tpm_tis_properties;
+    device_class_set_props(dc, tpm_tis_properties);
     dc->reset = tpm_tis_reset;
     dc->vmsd  = &vmstate_tpm_tis;
     tc->model = TPM_MODEL_TPM_TIS;
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index a6522f5429..c9a390063f 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -768,7 +768,7 @@ static void usb_device_class_init(ObjectClass *klass, void *data)
     k->bus_type = TYPE_USB_BUS;
     k->realize  = usb_qdev_realize;
     k->unrealize = usb_qdev_unrealize;
-    k->props    = usb_props;
+    device_class_set_props(k, usb_props);
 }
 
 static const TypeInfo usb_device_type_info = {
diff --git a/hw/usb/ccid-card-emulated.c b/hw/usb/ccid-card-emulated.c
index 291e41db8a..3083124556 100644
--- a/hw/usb/ccid-card-emulated.c
+++ b/hw/usb/ccid-card-emulated.c
@@ -603,7 +603,7 @@ static void emulated_class_initfn(ObjectClass *klass, void *data)
     cc->apdu_from_guest = emulated_apdu_from_guest;
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
     dc->desc = "emulated smartcard";
-    dc->props = emulated_card_properties;
+    device_class_set_props(dc, emulated_card_properties);
 }
 
 static const TypeInfo emulated_card_info = {
diff --git a/hw/usb/ccid-card-passthru.c b/hw/usb/ccid-card-passthru.c
index 267ed9a8a0..13414423fb 100644
--- a/hw/usb/ccid-card-passthru.c
+++ b/hw/usb/ccid-card-passthru.c
@@ -398,7 +398,7 @@ static void passthru_class_initfn(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
     dc->desc = "passthrough smartcard";
     dc->vmsd = &passthru_vmstate;
-    dc->props = passthru_card_properties;
+    device_class_set_props(dc, passthru_card_properties);
 }
 
 static const TypeInfo passthru_card_info = {
diff --git a/hw/usb/dev-audio.c b/hw/usb/dev-audio.c
index ea604bbb8e..6fa213fad5 100644
--- a/hw/usb/dev-audio.c
+++ b/hw/usb/dev-audio.c
@@ -1002,7 +1002,7 @@ static void usb_audio_class_init(ObjectClass *klass, void *data)
     USBDeviceClass *k = USB_DEVICE_CLASS(klass);
 
     dc->vmsd          = &vmstate_usb_audio;
-    dc->props         = usb_audio_properties;
+    device_class_set_props(dc, usb_audio_properties);
     set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
     k->product_desc   = "QEMU USB Audio Interface";
     k->realize        = usb_audio_realize;
diff --git a/hw/usb/dev-hid.c b/hw/usb/dev-hid.c
index 88492f26e6..67ec8b69ec 100644
--- a/hw/usb/dev-hid.c
+++ b/hw/usb/dev-hid.c
@@ -819,7 +819,7 @@ static void usb_tablet_class_initfn(ObjectClass *klass, void *data)
     uc->realize        = usb_tablet_realize;
     uc->product_desc   = "QEMU USB Tablet";
     dc->vmsd = &vmstate_usb_ptr;
-    dc->props = usb_tablet_properties;
+    device_class_set_props(dc, usb_tablet_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
@@ -842,7 +842,7 @@ static void usb_mouse_class_initfn(ObjectClass *klass, void *data)
     uc->realize        = usb_mouse_realize;
     uc->product_desc   = "QEMU USB Mouse";
     dc->vmsd = &vmstate_usb_ptr;
-    dc->props = usb_mouse_properties;
+    device_class_set_props(dc, usb_mouse_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
@@ -866,7 +866,7 @@ static void usb_keyboard_class_initfn(ObjectClass *klass, void *data)
     uc->realize        = usb_keyboard_realize;
     uc->product_desc   = "QEMU USB Keyboard";
     dc->vmsd = &vmstate_usb_kbd;
-    dc->props = usb_keyboard_properties;
+    device_class_set_props(dc, usb_keyboard_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
diff --git a/hw/usb/dev-hub.c b/hw/usb/dev-hub.c
index 07ecfefc12..49a573b346 100644
--- a/hw/usb/dev-hub.c
+++ b/hw/usb/dev-hub.c
@@ -686,7 +686,7 @@ static void usb_hub_class_initfn(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     dc->fw_name = "hub";
     dc->vmsd = &vmstate_usb_hub;
-    dc->props = usb_hub_properties;
+    device_class_set_props(dc, usb_hub_properties);
 }
 
 static const TypeInfo hub_info = {
diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c
index 7c07295519..20717f026b 100644
--- a/hw/usb/dev-mtp.c
+++ b/hw/usb/dev-mtp.c
@@ -2105,7 +2105,7 @@ static void usb_mtp_class_initfn(ObjectClass *klass, void *data)
     dc->desc = "USB Media Transfer Protocol device";
     dc->fw_name = "mtp";
     dc->vmsd = &vmstate_usb_mtp;
-    dc->props = mtp_properties;
+    device_class_set_props(dc, mtp_properties);
 }
 
 static TypeInfo mtp_info = {
diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c
index b81a8abe83..9a78ad928b 100644
--- a/hw/usb/dev-network.c
+++ b/hw/usb/dev-network.c
@@ -1409,7 +1409,7 @@ static void usb_net_class_initfn(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
     dc->fw_name = "network";
     dc->vmsd = &vmstate_usb_net;
-    dc->props = net_properties;
+    device_class_set_props(dc, net_properties);
 }
 
 static const TypeInfo net_info = {
diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
index 45cc74128a..8341448923 100644
--- a/hw/usb/dev-serial.c
+++ b/hw/usb/dev-serial.c
@@ -563,7 +563,7 @@ static void usb_serial_class_initfn(ObjectClass *klass, void *data)
 
     uc->product_desc   = "QEMU USB Serial";
     uc->usb_desc       = &desc_serial;
-    dc->props = serial_properties;
+    device_class_set_props(dc, serial_properties);
 }
 
 static const TypeInfo serial_info = {
@@ -584,7 +584,7 @@ static void usb_braille_class_initfn(ObjectClass *klass, void *data)
 
     uc->product_desc   = "QEMU USB Braille";
     uc->usb_desc       = &desc_braille;
-    dc->props = braille_properties;
+    device_class_set_props(dc, braille_properties);
 }
 
 static const TypeInfo braille_info = {
diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.c
index 4568db2568..02693a26ad 100644
--- a/hw/usb/dev-smartcard-reader.c
+++ b/hw/usb/dev-smartcard-reader.c
@@ -1456,7 +1456,7 @@ static void ccid_class_initfn(ObjectClass *klass, void *data)
     uc->unrealize      = ccid_unrealize;
     dc->desc = "CCID Rev 1.1 smartcard reader";
     dc->vmsd = &ccid_vmstate;
-    dc->props = ccid_properties;
+    device_class_set_props(dc, ccid_properties);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
     hc->unplug = qdev_simple_device_unplug_cb;
 }
@@ -1478,7 +1478,7 @@ static void ccid_card_class_init(ObjectClass *klass, void *data)
     k->bus_type = TYPE_CCID_BUS;
     k->realize = ccid_card_realize;
     k->unrealize = ccid_card_unrealize;
-    k->props = ccid_props;
+    device_class_set_props(k, ccid_props);
 }
 
 static const TypeInfo ccid_card_type_info = {
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index 8545193488..90da008df1 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -702,7 +702,7 @@ static void usb_msd_class_storage_initfn(ObjectClass *klass, void *data)
     USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
 
     uc->realize = usb_msd_storage_realize;
-    dc->props = msd_properties;
+    device_class_set_props(dc, msd_properties);
 }
 
 static void usb_msd_get_bootindex(Object *obj, Visitor *v, const char *name,
diff --git a/hw/usb/dev-uas.c b/hw/usb/dev-uas.c
index 6d6d1073b9..9825ec37d0 100644
--- a/hw/usb/dev-uas.c
+++ b/hw/usb/dev-uas.c
@@ -952,7 +952,7 @@ static void usb_uas_class_initfn(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     dc->fw_name = "storage";
     dc->vmsd = &vmstate_usb_uas;
-    dc->props = uas_properties;
+    device_class_set_props(dc, uas_properties);
 }
 
 static const TypeInfo uas_info = {
diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c
index 5b9a8d3dc1..fc73a054c6 100644
--- a/hw/usb/hcd-ehci-pci.c
+++ b/hw/usb/hcd-ehci-pci.c
@@ -161,7 +161,7 @@ static void ehci_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_SERIAL_USB;
     k->config_write = usb_ehci_pci_write_config;
     dc->vmsd = &vmstate_ehci_pci;
-    dc->props = ehci_pci_properties;
+    device_class_set_props(dc, ehci_pci_properties);
     dc->reset = usb_ehci_pci_reset;
 }
 
diff --git a/hw/usb/hcd-ehci-sysbus.c b/hw/usb/hcd-ehci-sysbus.c
index 020211fd10..8d4738565e 100644
--- a/hw/usb/hcd-ehci-sysbus.c
+++ b/hw/usb/hcd-ehci-sysbus.c
@@ -82,7 +82,7 @@ static void ehci_sysbus_class_init(ObjectClass *klass, void *data)
 
     dc->realize = usb_ehci_sysbus_realize;
     dc->vmsd = &vmstate_ehci_sysbus;
-    dc->props = ehci_sysbus_properties;
+    device_class_set_props(dc, ehci_sysbus_properties);
     dc->reset = usb_ehci_sysbus_reset;
     set_bit(DEVICE_CATEGORY_USB, dc->categories);
 }
diff --git a/hw/usb/hcd-ohci-pci.c b/hw/usb/hcd-ohci-pci.c
index c052f10521..a7fb1666af 100644
--- a/hw/usb/hcd-ohci-pci.c
+++ b/hw/usb/hcd-ohci-pci.c
@@ -139,7 +139,7 @@ static void ohci_pci_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_SERIAL_USB;
     set_bit(DEVICE_CATEGORY_USB, dc->categories);
     dc->desc = "Apple USB Controller";
-    dc->props = ohci_pci_properties;
+    device_class_set_props(dc, ohci_pci_properties);
     dc->hotpluggable = false;
     dc->vmsd = &vmstate_ohci;
     dc->reset = usb_ohci_reset_pci;
diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 145ee21fd6..8a94bd004a 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -2000,7 +2000,7 @@ static void ohci_sysbus_class_init(ObjectClass *klass, void *data)
     dc->realize = ohci_realize_pxa;
     set_bit(DEVICE_CATEGORY_USB, dc->categories);
     dc->desc = "OHCI USB Controller";
-    dc->props = ohci_sysbus_properties;
+    device_class_set_props(dc, ohci_sysbus_properties);
     dc->reset = usb_ohci_reset_sysbus;
 }
 
diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
index 23507ad3b5..37f7beb3fa 100644
--- a/hw/usb/hcd-uhci.c
+++ b/hw/usb/hcd-uhci.c
@@ -1349,9 +1349,9 @@ static void uhci_data_class_init(ObjectClass *klass, void *data)
     if (!info->unplug) {
         /* uhci controllers in companion setups can't be hotplugged */
         dc->hotpluggable = false;
-        dc->props = uhci_properties_companion;
+        device_class_set_props(dc, uhci_properties_companion);
     } else {
-        dc->props = uhci_properties_standalone;
+        device_class_set_props(dc, uhci_properties_standalone);
     }
     u->info = *info;
 }
diff --git a/hw/usb/hcd-xhci-nec.c b/hw/usb/hcd-xhci-nec.c
index 05fb3f54b3..e6a5a22b6d 100644
--- a/hw/usb/hcd-xhci-nec.c
+++ b/hw/usb/hcd-xhci-nec.c
@@ -44,7 +44,7 @@ static void nec_xhci_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props       = nec_xhci_properties;
+    device_class_set_props(dc, nec_xhci_properties);
     k->vendor_id    = PCI_VENDOR_ID_NEC;
     k->device_id    = PCI_DEVICE_ID_NEC_UPD720200;
     k->revision     = 0x03;
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index 80988bb305..ec1ca01e3e 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -3697,7 +3697,7 @@ static void xhci_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->vmsd    = &vmstate_xhci;
-    dc->props   = xhci_properties;
+    device_class_set_props(dc, xhci_properties);
     dc->reset   = xhci_reset;
     set_bit(DEVICE_CATEGORY_USB, dc->categories);
     k->realize      = usb_xhci_realize;
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index fcf48c0193..5574767c65 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -1615,7 +1615,7 @@ static void usb_host_class_initfn(ObjectClass *klass, void *data)
     uc->alloc_streams  = usb_host_alloc_streams;
     uc->free_streams   = usb_host_free_streams;
     dc->vmsd = &vmstate_usb_host;
-    dc->props = usb_host_dev_properties;
+    device_class_set_props(dc, usb_host_dev_properties);
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
 }
 
diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
index e0f5ca6f81..5a6b7e21de 100644
--- a/hw/usb/redirect.c
+++ b/hw/usb/redirect.c
@@ -2550,7 +2550,7 @@ static void usbredir_class_initfn(ObjectClass *klass, void *data)
     uc->alloc_streams  = usbredir_alloc_streams;
     uc->free_streams   = usbredir_free_streams;
     dc->vmsd           = &usbredir_vmstate;
-    dc->props          = usbredir_properties;
+    device_class_set_props(dc, usbredir_properties);
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
 
diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
index 8fbaa724c2..8649ac15f9 100644
--- a/hw/vfio/ap.c
+++ b/hw/vfio/ap.c
@@ -161,7 +161,7 @@ static void vfio_ap_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = vfio_ap_properties;
+    device_class_set_props(dc, vfio_ap_properties);
     dc->vmsd = &vfio_ap_vmstate;
     dc->desc = "VFIO-based AP device assignment";
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
index 3b5520ae75..50cc2ec75c 100644
--- a/hw/vfio/ccw.c
+++ b/hw/vfio/ccw.c
@@ -561,7 +561,7 @@ static void vfio_ccw_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     S390CCWDeviceClass *cdc = S390_CCW_DEVICE_CLASS(klass);
 
-    dc->props = vfio_ccw_properties;
+    device_class_set_props(dc, vfio_ccw_properties);
     dc->vmsd = &vfio_ccw_vmstate;
     dc->desc = "VFIO-based subchannel assignment";
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 337a173ce7..5e75a95129 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -3199,7 +3199,7 @@ static void vfio_pci_dev_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pdc = PCI_DEVICE_CLASS(klass);
 
     dc->reset = vfio_pci_reset;
-    dc->props = vfio_pci_dev_properties;
+    device_class_set_props(dc, vfio_pci_dev_properties);
     dc->desc = "VFIO-based PCI device assignment";
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     pdc->realize = vfio_realize;
@@ -3231,7 +3231,7 @@ static void vfio_pci_nohotplug_dev_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = vfio_pci_dev_nohotplug_properties;
+    device_class_set_props(dc, vfio_pci_dev_nohotplug_properties);
     dc->hotpluggable = false;
 }
 
diff --git a/hw/vfio/platform.c b/hw/vfio/platform.c
index d7598c6152..6b2952c034 100644
--- a/hw/vfio/platform.c
+++ b/hw/vfio/platform.c
@@ -699,7 +699,7 @@ static void vfio_platform_class_init(ObjectClass *klass, void *data)
     SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
 
     dc->realize = vfio_platform_realize;
-    dc->props = vfio_platform_dev_properties;
+    device_class_set_props(dc, vfio_platform_dev_properties);
     dc->vmsd = &vfio_platform_vmstate;
     dc->desc = "VFIO-based platform device assignment";
     sbc->connect_irq_notifier = vfio_start_irqfd_injection;
diff --git a/hw/virtio/vhost-scsi-pci.c b/hw/virtio/vhost-scsi-pci.c
index e8dfbfc60f..5dce640eaf 100644
--- a/hw/virtio/vhost-scsi-pci.c
+++ b/hw/virtio/vhost-scsi-pci.c
@@ -64,7 +64,7 @@ static void vhost_scsi_pci_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
     k->realize = vhost_scsi_pci_realize;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
-    dc->props = vhost_scsi_pci_properties;
+    device_class_set_props(dc, vhost_scsi_pci_properties);
     pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_SCSI;
     pcidev_k->revision = 0x00;
diff --git a/hw/virtio/vhost-user-blk-pci.c b/hw/virtio/vhost-user-blk-pci.c
index 1dc834a3ff..8d3d766427 100644
--- a/hw/virtio/vhost-user-blk-pci.c
+++ b/hw/virtio/vhost-user-blk-pci.c
@@ -69,7 +69,7 @@ static void vhost_user_blk_pci_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
 
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
-    dc->props = vhost_user_blk_pci_properties;
+    device_class_set_props(dc, vhost_user_blk_pci_properties);
     k->realize = vhost_user_blk_pci_realize;
     pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_BLOCK;
diff --git a/hw/virtio/vhost-user-fs-pci.c b/hw/virtio/vhost-user-fs-pci.c
index e3a649d4a6..ae36f1172d 100644
--- a/hw/virtio/vhost-user-fs-pci.c
+++ b/hw/virtio/vhost-user-fs-pci.c
@@ -55,7 +55,7 @@ static void vhost_user_fs_pci_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
     k->realize = vhost_user_fs_pci_realize;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
-    dc->props = vhost_user_fs_pci_properties;
+    device_class_set_props(dc, vhost_user_fs_pci_properties);
     pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     pcidev_k->device_id = 0; /* Set by virtio-pci based on virtio id */
     pcidev_k->revision = 0x00;
diff --git a/hw/virtio/vhost-user-fs.c b/hw/virtio/vhost-user-fs.c
index ca0b7fc9de..33b17848c2 100644
--- a/hw/virtio/vhost-user-fs.c
+++ b/hw/virtio/vhost-user-fs.c
@@ -271,7 +271,7 @@ static void vuf_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
 
-    dc->props = vuf_properties;
+    device_class_set_props(dc, vuf_properties);
     dc->vmsd = &vuf_vmstate;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     vdc->realize = vuf_device_realize;
diff --git a/hw/virtio/vhost-user-scsi-pci.c b/hw/virtio/vhost-user-scsi-pci.c
index ff13af7030..32febb2daa 100644
--- a/hw/virtio/vhost-user-scsi-pci.c
+++ b/hw/virtio/vhost-user-scsi-pci.c
@@ -70,7 +70,7 @@ static void vhost_user_scsi_pci_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
     k->realize = vhost_user_scsi_pci_realize;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
-    dc->props = vhost_user_scsi_pci_properties;
+    device_class_set_props(dc, vhost_user_scsi_pci_properties);
     pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_SCSI;
     pcidev_k->revision = 0x00;
diff --git a/hw/virtio/vhost-vsock-pci.c b/hw/virtio/vhost-vsock-pci.c
index 4ca097ffff..01effe3d52 100644
--- a/hw/virtio/vhost-vsock-pci.c
+++ b/hw/virtio/vhost-vsock-pci.c
@@ -55,7 +55,7 @@ static void vhost_vsock_pci_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
     k->realize = vhost_vsock_pci_realize;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
-    dc->props = vhost_vsock_pci_properties;
+    device_class_set_props(dc, vhost_vsock_pci_properties);
     pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_VSOCK;
     pcidev_k->revision = 0x00;
diff --git a/hw/virtio/vhost-vsock.c b/hw/virtio/vhost-vsock.c
index f5744363a8..87c45d81f6 100644
--- a/hw/virtio/vhost-vsock.c
+++ b/hw/virtio/vhost-vsock.c
@@ -393,7 +393,7 @@ static void vhost_vsock_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
 
-    dc->props = vhost_vsock_properties;
+    device_class_set_props(dc, vhost_vsock_properties);
     dc->vmsd = &vmstate_virtio_vhost_vsock;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     vdc->realize = vhost_vsock_device_realize;
diff --git a/hw/virtio/virtio-9p-pci.c b/hw/virtio/virtio-9p-pci.c
index 22a183cca7..6507ce340b 100644
--- a/hw/virtio/virtio-9p-pci.c
+++ b/hw/virtio/virtio-9p-pci.c
@@ -61,7 +61,7 @@ static void virtio_9p_pci_class_init(ObjectClass *klass, void *data)
     pcidev_k->revision = VIRTIO_PCI_ABI_VERSION;
     pcidev_k->class_id = 0x2;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
-    dc->props = virtio_9p_pci_properties;
+    device_class_set_props(dc, virtio_9p_pci_properties);
 }
 
 static void virtio_9p_pci_instance_init(Object *obj)
diff --git a/hw/virtio/virtio-balloon-pci.c b/hw/virtio/virtio-balloon-pci.c
index 69ca057911..56962aeb43 100644
--- a/hw/virtio/virtio-balloon-pci.c
+++ b/hw/virtio/virtio-balloon-pci.c
@@ -59,7 +59,7 @@ static void virtio_balloon_pci_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
     k->realize = virtio_balloon_pci_realize;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
-    dc->props = virtio_balloon_pci_properties;
+    device_class_set_props(dc, virtio_balloon_pci_properties);
     pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_BALLOON;
     pcidev_k->revision = VIRTIO_PCI_ABI_VERSION;
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index 57f3b9f22d..a4729f7fc9 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -932,7 +932,7 @@ static void virtio_balloon_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
 
-    dc->props = virtio_balloon_properties;
+    device_class_set_props(dc, virtio_balloon_properties);
     dc->vmsd = &vmstate_virtio_balloon;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     vdc->realize = virtio_balloon_device_realize;
diff --git a/hw/virtio/virtio-blk-pci.c b/hw/virtio/virtio-blk-pci.c
index d9b69a5af3..efb2c22a1d 100644
--- a/hw/virtio/virtio-blk-pci.c
+++ b/hw/virtio/virtio-blk-pci.c
@@ -66,7 +66,7 @@ static void virtio_blk_pci_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
 
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
-    dc->props = virtio_blk_pci_properties;
+    device_class_set_props(dc, virtio_blk_pci_properties);
     k->realize = virtio_blk_pci_realize;
     pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_BLOCK;
diff --git a/hw/virtio/virtio-crypto-pci.c b/hw/virtio/virtio-crypto-pci.c
index d853dc460c..0bebe0149d 100644
--- a/hw/virtio/virtio-crypto-pci.c
+++ b/hw/virtio/virtio-crypto-pci.c
@@ -69,7 +69,7 @@ static void virtio_crypto_pci_class_init(ObjectClass *klass, void *data)
 
     k->realize = virtio_crypto_pci_realize;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
-    dc->props = virtio_crypto_pci_properties;
+    device_class_set_props(dc, virtio_crypto_pci_properties);
     pcidev_k->class_id = PCI_CLASS_OTHERS;
 }
 
diff --git a/hw/virtio/virtio-crypto.c b/hw/virtio/virtio-crypto.c
index 6d42f95a89..7351ab0a19 100644
--- a/hw/virtio/virtio-crypto.c
+++ b/hw/virtio/virtio-crypto.c
@@ -955,7 +955,7 @@ static void virtio_crypto_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
 
-    dc->props = virtio_crypto_properties;
+    device_class_set_props(dc, virtio_crypto_properties);
     dc->vmsd = &vmstate_virtio_crypto;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     vdc->realize = virtio_crypto_device_realize;
diff --git a/hw/virtio/virtio-input-pci.c b/hw/virtio/virtio-input-pci.c
index 80b1172c90..5a965408df 100644
--- a/hw/virtio/virtio-input-pci.c
+++ b/hw/virtio/virtio-input-pci.c
@@ -60,7 +60,7 @@ static void virtio_input_pci_class_init(ObjectClass *klass, void *data)
     VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass);
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
 
-    dc->props = virtio_input_pci_properties;
+    device_class_set_props(dc, virtio_input_pci_properties);
     k->realize = virtio_input_pci_realize;
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 
diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
index 872f2cd237..f12d1595aa 100644
--- a/hw/virtio/virtio-mmio.c
+++ b/hw/virtio/virtio-mmio.c
@@ -712,7 +712,7 @@ static void virtio_mmio_class_init(ObjectClass *klass, void *data)
     dc->realize = virtio_mmio_realizefn;
     dc->reset = virtio_mmio_reset;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
-    dc->props = virtio_mmio_properties;
+    device_class_set_props(dc, virtio_mmio_properties);
 }
 
 static const TypeInfo virtio_mmio_info = {
diff --git a/hw/virtio/virtio-net-pci.c b/hw/virtio/virtio-net-pci.c
index f670aed0a7..5ca71d4c34 100644
--- a/hw/virtio/virtio-net-pci.c
+++ b/hw/virtio/virtio-net-pci.c
@@ -68,7 +68,7 @@ static void virtio_net_pci_class_init(ObjectClass *klass, void *data)
     k->revision = VIRTIO_PCI_ABI_VERSION;
     k->class_id = PCI_CLASS_NETWORK_ETHERNET;
     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
-    dc->props = virtio_net_properties;
+    device_class_set_props(dc, virtio_net_properties);
     vpciklass->realize = virtio_net_pci_realize;
 }
 
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index f723b9f631..4cb784389c 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1886,7 +1886,7 @@ static void virtio_pci_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
     VirtioPCIClass *vpciklass = VIRTIO_PCI_CLASS(klass);
 
-    dc->props = virtio_pci_properties;
+    device_class_set_props(dc, virtio_pci_properties);
     k->realize = virtio_pci_realize;
     k->exit = virtio_pci_exit;
     k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
@@ -1925,7 +1925,7 @@ static void virtio_pci_generic_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = virtio_pci_generic_properties;
+    device_class_set_props(dc, virtio_pci_generic_properties);
 }
 
 static void virtio_pci_transitional_instance_init(Object *obj)
diff --git a/hw/virtio/virtio-pmem.c b/hw/virtio/virtio-pmem.c
index c0c9395e55..97287e923b 100644
--- a/hw/virtio/virtio-pmem.c
+++ b/hw/virtio/virtio-pmem.c
@@ -165,7 +165,7 @@ static void virtio_pmem_class_init(ObjectClass *klass, void *data)
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
     VirtIOPMEMClass *vpc = VIRTIO_PMEM_CLASS(klass);
 
-    dc->props = virtio_pmem_properties;
+    device_class_set_props(dc, virtio_pmem_properties);
 
     vdc->realize = virtio_pmem_realize;
     vdc->unrealize = virtio_pmem_unrealize;
diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c
index b498a20332..1e363ad07b 100644
--- a/hw/virtio/virtio-rng.c
+++ b/hw/virtio/virtio-rng.c
@@ -269,7 +269,7 @@ static void virtio_rng_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
 
-    dc->props = virtio_rng_properties;
+    device_class_set_props(dc, virtio_rng_properties);
     dc->vmsd = &vmstate_virtio_rng;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     vdc->realize = virtio_rng_device_realize;
diff --git a/hw/virtio/virtio-scsi-pci.c b/hw/virtio/virtio-scsi-pci.c
index 3c55dc19a1..e82e7e5680 100644
--- a/hw/virtio/virtio-scsi-pci.c
+++ b/hw/virtio/virtio-scsi-pci.c
@@ -76,7 +76,7 @@ static void virtio_scsi_pci_class_init(ObjectClass *klass, void *data)
 
     k->realize = virtio_scsi_pci_realize;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
-    dc->props = virtio_scsi_pci_properties;
+    device_class_set_props(dc, virtio_scsi_pci_properties);
     pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_SCSI;
     pcidev_k->revision = 0x00;
diff --git a/hw/virtio/virtio-serial-pci.c b/hw/virtio/virtio-serial-pci.c
index 953abbd13a..22ab4d8562 100644
--- a/hw/virtio/virtio-serial-pci.c
+++ b/hw/virtio/virtio-serial-pci.c
@@ -84,7 +84,7 @@ static void virtio_serial_pci_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
     k->realize = virtio_serial_pci_realize;
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
-    dc->props = virtio_serial_pci_properties;
+    device_class_set_props(dc, virtio_serial_pci_properties);
     pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_CONSOLE;
     pcidev_k->revision = VIRTIO_PCI_ABI_VERSION;
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 7b861e0ca0..2c5410e981 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -3713,7 +3713,7 @@ static void virtio_device_class_init(ObjectClass *klass, void *data)
     dc->realize = virtio_device_realize;
     dc->unrealize = virtio_device_unrealize;
     dc->bus_type = TYPE_VIRTIO_BUS;
-    dc->props = virtio_properties;
+    device_class_set_props(dc, virtio_properties);
     vdc->start_ioeventfd = virtio_device_start_ioeventfd_impl;
     vdc->stop_ioeventfd = virtio_device_stop_ioeventfd_impl;
 
diff --git a/hw/watchdog/cmsdk-apb-watchdog.c b/hw/watchdog/cmsdk-apb-watchdog.c
index e6f3b93c44..1541365914 100644
--- a/hw/watchdog/cmsdk-apb-watchdog.c
+++ b/hw/watchdog/cmsdk-apb-watchdog.c
@@ -371,7 +371,7 @@ static void cmsdk_apb_watchdog_class_init(ObjectClass *klass, void *data)
     dc->realize = cmsdk_apb_watchdog_realize;
     dc->vmsd = &cmsdk_apb_watchdog_vmstate;
     dc->reset = cmsdk_apb_watchdog_reset;
-    dc->props = cmsdk_apb_watchdog_properties;
+    device_class_set_props(dc, cmsdk_apb_watchdog_properties);
 }
 
 static const TypeInfo cmsdk_apb_watchdog_info = {
diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c
index f50dab922e..6352ba1b0e 100644
--- a/hw/watchdog/wdt_aspeed.c
+++ b/hw/watchdog/wdt_aspeed.c
@@ -271,7 +271,7 @@ static void aspeed_wdt_class_init(ObjectClass *klass, void *data)
     dc->reset = aspeed_wdt_reset;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     dc->vmsd = &vmstate_aspeed_wdt;
-    dc->props = aspeed_wdt_properties;
+    device_class_set_props(dc, aspeed_wdt_properties);
 }
 
 static const TypeInfo aspeed_wdt_info = {
diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c
index c2ad22a42d..919e66162a 100644
--- a/hw/xen/xen-bus.c
+++ b/hw/xen/xen-bus.c
@@ -1332,7 +1332,7 @@ static void xen_device_class_init(ObjectClass *class, void *data)
 
     dev_class->realize = xen_device_realize;
     dev_class->unrealize = xen_device_unrealize;
-    dev_class->props = xen_device_props;
+    device_class_set_props(dev_class, xen_device_props);
     dev_class->bus_type = TYPE_XEN_BUS;
 }
 
diff --git a/hw/xen/xen-legacy-backend.c b/hw/xen/xen-legacy-backend.c
index 4412d7aa76..4a373b2373 100644
--- a/hw/xen/xen-legacy-backend.c
+++ b/hw/xen/xen-legacy-backend.c
@@ -786,7 +786,7 @@ static void xendev_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = xendev_properties;
+    device_class_set_props(dc, xendev_properties);
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     /* xen-backend devices can be plugged/unplugged dynamically */
     dc->user_creatable = true;
@@ -824,7 +824,7 @@ static void xen_sysdev_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    dc->props = xen_sysdev_properties;
+    device_class_set_props(dc, xen_sysdev_properties);
     dc->bus_type = TYPE_XENSYSBUS;
 }
 
diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c
index 9e767d4244..b91082cb8b 100644
--- a/hw/xen/xen_pt.c
+++ b/hw/xen/xen_pt.c
@@ -964,7 +964,7 @@ static void xen_pci_passthrough_class_init(ObjectClass *klass, void *data)
     k->config_write = xen_pt_pci_write_config;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     dc->desc = "Assign an host PCI device with Xen";
-    dc->props = xen_pci_passthrough_properties;
+    device_class_set_props(dc, xen_pci_passthrough_properties);
 };
 
 static void xen_pci_passthrough_finalize(Object *obj)
diff --git a/migration/migration.c b/migration/migration.c
index 354ad072fa..afce2d9a6a 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -3518,7 +3518,7 @@ static void migration_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->user_creatable = false;
-    dc->props = migration_properties;
+    device_class_set_props(dc, migration_properties);
 }
 
 static void migration_instance_finalize(Object *obj)
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 6921464e2b..9f581ff904 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -2693,7 +2693,7 @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
 
     device_class_set_parent_realize(dc, arm_cpu_realizefn,
                                     &acc->parent_realize);
-    dc->props = arm_cpu_properties;
+    device_class_set_props(dc, arm_cpu_properties);
 
     acc->parent_reset = cc->reset;
     cc->reset = arm_cpu_reset;
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 31556b7ec4..8873fb414e 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -4095,7 +4095,7 @@ static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
     xcc->model_description =
         "Enables all features supported by the accelerator in the current host";
 
-    dc->props = max_x86_cpu_properties;
+    device_class_set_props(dc, max_x86_cpu_properties);
 }
 
 static void max_x86_cpu_initfn(Object *obj)
@@ -7098,7 +7098,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
                                     &xcc->parent_realize);
     device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
                                       &xcc->parent_unrealize);
-    dc->props = x86_cpu_properties;
+    device_class_set_props(dc, x86_cpu_properties);
 
     xcc->parent_reset = cc->reset;
     cc->reset = x86_cpu_reset;
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
index 9cfd7445e7..b7426285db 100644
--- a/target/microblaze/cpu.c
+++ b/target/microblaze/cpu.c
@@ -309,7 +309,7 @@ static void mb_cpu_class_init(ObjectClass *oc, void *data)
     cc->get_phys_page_debug = mb_cpu_get_phys_page_debug;
 #endif
     dc->vmsd = &vmstate_mb_cpu;
-    dc->props = mb_properties;
+    device_class_set_props(dc, mb_properties);
     cc->gdb_num_core_regs = 32 + 5;
 
     cc->disas_set_info = mb_disas_set_info;
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
index ca9c7a6df5..7adaab1c0f 100644
--- a/target/nios2/cpu.c
+++ b/target/nios2/cpu.c
@@ -187,7 +187,7 @@ static void nios2_cpu_class_init(ObjectClass *oc, void *data)
 
     device_class_set_parent_realize(dc, nios2_cpu_realizefn,
                                     &ncc->parent_realize);
-    dc->props = nios2_properties;
+    device_class_set_props(dc, nios2_properties);
     ncc->parent_reset = cc->reset;
     cc->reset = nios2_cpu_reset;
 
diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
index d33d65dff7..4e52788223 100644
--- a/target/ppc/translate_init.inc.c
+++ b/target/ppc/translate_init.inc.c
@@ -8599,7 +8599,7 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
 
     dc->fw_name = "PowerPC,POWER7";
     dc->desc = "POWER7";
-    dc->props = powerpc_servercpu_properties;
+    device_class_set_props(dc, powerpc_servercpu_properties);
     pcc->pvr_match = ppc_pvr_match_power7;
     pcc->pcr_mask = PCR_VEC_DIS | PCR_VSX_DIS | PCR_COMPAT_2_05;
     pcc->pcr_supported = PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
@@ -8764,7 +8764,7 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
 
     dc->fw_name = "PowerPC,POWER8";
     dc->desc = "POWER8";
-    dc->props = powerpc_servercpu_properties;
+    device_class_set_props(dc, powerpc_servercpu_properties);
     pcc->pvr_match = ppc_pvr_match_power8;
     pcc->pcr_mask = PCR_TM_DIS | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
     pcc->pcr_supported = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
@@ -8976,7 +8976,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
 
     dc->fw_name = "PowerPC,POWER9";
     dc->desc = "POWER9";
-    dc->props = powerpc_servercpu_properties;
+    device_class_set_props(dc, powerpc_servercpu_properties);
     pcc->pvr_match = ppc_pvr_match_power9;
     pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07;
     pcc->pcr_supported = PCR_COMPAT_3_00 | PCR_COMPAT_2_07 | PCR_COMPAT_2_06 |
@@ -9186,7 +9186,7 @@ POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data)
 
     dc->fw_name = "PowerPC,POWER10";
     dc->desc = "POWER10";
-    dc->props = powerpc_servercpu_properties;
+    device_class_set_props(dc, powerpc_servercpu_properties);
     pcc->pvr_match = ppc_pvr_match_power10;
     pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07 |
                     PCR_COMPAT_3_00;
@@ -10871,7 +10871,7 @@ static void ppc_cpu_class_init(ObjectClass *oc, void *data)
                                       &pcc->parent_unrealize);
     pcc->pvr_match = ppc_pvr_match_default;
     pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_always;
-    dc->props = ppc_cpu_properties;
+    device_class_set_props(dc, ppc_cpu_properties);
 
     pcc->parent_reset = cc->reset;
     cc->reset = ppc_cpu_reset;
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index d37861a430..49f54acdb8 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -493,7 +493,7 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
 #endif
     /* For now, mark unmigratable: */
     cc->vmsd = &vmstate_riscv_cpu;
-    dc->props = riscv_cpu_properties;
+    device_class_set_props(dc, riscv_cpu_properties);
 }
 
 char *riscv_isa_string(RISCVCPU *cpu)
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 625daeedd1..aa80cdab06 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -453,7 +453,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)
 
     device_class_set_parent_realize(dc, s390_cpu_realizefn,
                                     &scc->parent_realize);
-    dc->props = s390x_cpu_properties;
+    device_class_set_props(dc, s390x_cpu_properties);
     dc->user_creatable = true;
 
     scc->parent_reset = cc->reset;
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index bc65929552..9578503acc 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -857,7 +857,7 @@ static void sparc_cpu_class_init(ObjectClass *oc, void *data)
 
     device_class_set_parent_realize(dc, sparc_cpu_realizefn,
                                     &scc->parent_realize);
-    dc->props = sparc_cpu_properties;
+    device_class_set_props(dc, sparc_cpu_properties);
 
     scc->parent_reset = cc->reset;
     cc->reset = sparc_cpu_reset;
diff --git a/tests/test-qdev-global-props.c b/tests/test-qdev-global-props.c
index 4ed3d06f4e..270c690479 100644
--- a/tests/test-qdev-global-props.c
+++ b/tests/test-qdev-global-props.c
@@ -55,7 +55,7 @@ static void static_prop_class_init(ObjectClass *oc, void *data)
     DeviceClass *dc = DEVICE_CLASS(oc);
 
     dc->realize = NULL;
-    dc->props = static_props;
+    device_class_set_props(dc, static_props);
 }
 
 static const TypeInfo static_prop_type = {
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 20/26] qdev: move instance properties to class properties
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (18 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 19/26] qdev: set properties with device_class_set_props() Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 21/26] qdev: register properties as " Marc-André Lureau
                   ` (6 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/core/qdev.c | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 0e314c051e..062106b067 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -943,14 +943,6 @@ static void device_initfn(Object *obj)
     dev->realized = false;
     dev->allow_unplug_during_migration = false;
 
-    object_property_add_bool(obj, "realized",
-                             device_get_realized, device_set_realized, NULL);
-    object_property_add_bool(obj, "hotpluggable",
-                             device_get_hotpluggable, NULL, NULL);
-    object_property_add_bool(obj, "hotplugged",
-                             device_get_hotplugged, NULL,
-                             &error_abort);
-
     class = object_get_class(OBJECT(dev));
     do {
         for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
@@ -960,9 +952,6 @@ static void device_initfn(Object *obj)
         class = object_class_get_parent(class);
     } while (class != object_class_by_name(TYPE_DEVICE));
 
-    object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
-                             (Object **)&dev->parent_bus, NULL, 0,
-                             &error_abort);
     QLIST_INIT(&dev->gpios);
 }
 
@@ -1058,6 +1047,19 @@ static void device_class_init(ObjectClass *class, void *data)
     dc->hotpluggable = true;
     dc->user_creatable = true;
     vc->get_id = device_vmstate_if_get_id;
+
+    object_class_property_add_bool(class, "realized",
+                                   device_get_realized, device_set_realized,
+                                   &error_abort);
+    object_class_property_add_bool(class, "hotpluggable",
+                                   device_get_hotpluggable, NULL,
+                                   &error_abort);
+    object_class_property_add_bool(class, "hotplugged",
+                                   device_get_hotplugged, NULL,
+                                   &error_abort);
+    object_class_property_add_link(class, "parent_bus", TYPE_BUS,
+                                   offsetof(DeviceState, parent_bus), NULL, 0,
+                                   &error_abort);
 }
 
 void device_class_set_props(DeviceClass *dc, Property *props)
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 21/26] qdev: register properties as class properties
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (19 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 20/26] qdev: move instance properties to class properties Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 22/26] vl: print default value in object help Marc-André Lureau
                   ` (5 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Use class properties facilities to add properties to the class during
device_class_set_props().

qdev_property_add_static() must be adapted as PropertyInfo now
operates with classes (and not instances), so we must
set_default_value() on the ObjectProperty, before calling its init()
method on the object instance.

Also, PropertyInfo.create() is now exclusively used for class
properties. Fortunately, qdev_property_add_static() is only used in
target/arm/cpu.c so far, which doesn't use "link" properties (that
require create()).

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/qdev-core.h    |  4 +-
 hw/core/qdev-properties.c | 38 ++++++++----------
 hw/core/qdev.c            | 83 ++++++++++++++++++++++-----------------
 3 files changed, 65 insertions(+), 60 deletions(-)

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 4065162251..e3bdfb669f 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -258,8 +258,8 @@ struct PropertyInfo {
     const char *description;
     const QEnumLookup *enum_table;
     int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
-    void (*set_default_value)(Object *obj, const Property *prop);
-    void (*create)(Object *obj, Property *prop, Error **errp);
+    void (*set_default_value)(ObjectProperty *op, const Property *prop);
+    void (*create)(ObjectClass *oc, Property *prop, Error **errp);
     ObjectPropertyAccessor *get;
     ObjectPropertyAccessor *set;
     ObjectPropertyRelease *release;
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 6ca7697599..ba97a34ee3 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -73,12 +73,10 @@ static void set_enum(Object *obj, Visitor *v, const char *name, void *opaque,
     visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
 }
 
-static void set_default_value_enum(Object *obj, const Property *prop)
+static void set_default_value_enum(ObjectProperty *op, const Property *prop)
 {
-    object_property_set_str(obj,
-                            qapi_enum_lookup(prop->info->enum_table,
-                                             prop->defval.i),
-                            prop->name, &error_abort);
+    object_property_set_defaut_str(op,
+        qapi_enum_lookup(prop->info->enum_table, prop->defval.i));
 }
 
 /* Bit */
@@ -132,9 +130,9 @@ static void prop_set_bit(Object *obj, Visitor *v, const char *name,
     bit_prop_set(dev, prop, value);
 }
 
-static void set_default_value_bool(Object *obj, const Property *prop)
+static void set_default_value_bool(ObjectProperty *op, const Property *prop)
 {
-    object_property_set_bool(obj, prop->defval.u, prop->name, &error_abort);
+    object_property_set_defaut_bool(op, prop->defval.u);
 }
 
 const PropertyInfo qdev_prop_bit = {
@@ -265,14 +263,14 @@ static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
     visit_type_uint8(v, name, ptr, errp);
 }
 
-static void set_default_value_int(Object *obj, const Property *prop)
+static void set_default_value_int(ObjectProperty *op, const Property *prop)
 {
-    object_property_set_int(obj, prop->defval.i, prop->name, &error_abort);
+    object_property_set_defaut_int(op, prop->defval.i);
 }
 
-static void set_default_value_uint(Object *obj, const Property *prop)
+static void set_default_value_uint(ObjectProperty *op, const Property *prop)
 {
-    object_property_set_uint(obj, prop->defval.u, prop->name, &error_abort);
+    object_property_set_defaut_uint(op, prop->defval.u);
 }
 
 const PropertyInfo qdev_prop_uint8 = {
@@ -925,9 +923,9 @@ static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
     g_free(str);
 }
 
-static void set_default_uuid_auto(Object *obj, const Property *prop)
+static void set_default_uuid_auto(ObjectProperty *op, const Property *prop)
 {
-    object_property_set_str(obj, UUID_VALUE_AUTO, prop->name, &error_abort);
+    object_property_set_defaut_str(op, UUID_VALUE_AUTO);
 }
 
 const PropertyInfo qdev_prop_uuid = {
@@ -1243,15 +1241,13 @@ const PropertyInfo qdev_prop_size = {
 
 /* --- object link property --- */
 
-static void create_link_property(Object *obj, Property *prop, Error **errp)
+static void create_link_property(ObjectClass *oc, Property *prop, Error **errp)
 {
-    Object **child = qdev_get_prop_ptr(DEVICE(obj), prop);
-
-    object_property_add_link(obj, prop->name, prop->link_type,
-                             child,
-                             qdev_prop_allow_set_link_before_realize,
-                             OBJ_PROP_LINK_STRONG,
-                             errp);
+    object_class_property_add_link(oc, prop->name, prop->link_type,
+                                   prop->offset,
+                                   qdev_prop_allow_set_link_before_realize,
+                                   OBJ_PROP_LINK_STRONG,
+                                   errp);
 }
 
 const PropertyInfo qdev_prop_link = {
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 062106b067..7df2afbb73 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -678,13 +678,11 @@ static void qdev_get_legacy_property(Object *obj, Visitor *v,
 }
 
 /**
- * qdev_property_add_legacy:
+ * qdev_class_add_legacy_property:
  * @dev: Device to add the property to.
  * @prop: The qdev property definition.
- * @errp: location to store error information.
  *
  * Add a legacy QOM property to @dev for qdev property @prop.
- * On error, store error in @errp.
  *
  * Legacy properties are string versions of QOM properties.  The format of
  * the string depends on the property type.  Legacy properties are only
@@ -693,52 +691,68 @@ static void qdev_get_legacy_property(Object *obj, Visitor *v,
  * Do not use this in new code!  QOM Properties added through this interface
  * will be given names in the "legacy" namespace.
  */
-static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
-                                     Error **errp)
+static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
 {
-    gchar *name;
+    g_autofree char *name = NULL;
 
     /* Register pointer properties as legacy properties */
     if (!prop->info->print && prop->info->get) {
         return;
     }
 
-    if (prop->info->create) {
-        return;
-    }
-
     name = g_strdup_printf("legacy-%s", prop->name);
-    object_property_add(OBJECT(dev), name, "str",
-                        prop->info->print ? qdev_get_legacy_property : prop->info->get,
-                        NULL,
-                        NULL,
-                        prop, errp);
-
-    g_free(name);
+    object_class_property_add(OBJECT_CLASS(dc), name, "str",
+        prop->info->print ? qdev_get_legacy_property : prop->info->get,
+        NULL, NULL, prop, &error_abort);
 }
 
 void qdev_property_add_static(DeviceState *dev, Property *prop)
 {
     Object *obj = OBJECT(dev);
+    ObjectProperty *op;
 
-    if (prop->info->create) {
-        prop->info->create(obj, prop, &error_abort);
-    } else {
-        object_property_add(obj, prop->name, prop->info->name,
-                            prop->info->get, prop->info->set,
-                            prop->info->release,
-                            prop, &error_abort);
-    }
+    assert(!prop->info->create);
+
+    op = object_property_add(obj, prop->name, prop->info->name,
+                             prop->info->get, prop->info->set,
+                             prop->info->release,
+                             prop, &error_abort);
 
     object_property_set_description(obj, prop->name,
                                     prop->info->description,
                                     &error_abort);
 
     if (prop->set_default) {
-        prop->info->set_default_value(obj, prop);
+        prop->info->set_default_value(op, prop);
+        if (op->init) {
+            op->init(obj, op);
+        }
     }
 }
 
+static void qdev_class_add_property(DeviceClass *klass, Property *prop)
+{
+    ObjectClass *oc = OBJECT_CLASS(klass);
+
+    if (prop->info->create) {
+        prop->info->create(oc, prop, &error_abort);
+    } else {
+        ObjectProperty *op;
+
+        op = object_class_property_add(oc,
+                                       prop->name, prop->info->name,
+                                       prop->info->get, prop->info->set,
+                                       prop->info->release,
+                                       prop, &error_abort);
+        if (prop->set_default) {
+            prop->info->set_default_value(op, prop);
+        }
+    }
+    object_class_property_set_description(oc, prop->name,
+                                          prop->info->description,
+                                          &error_abort);
+}
+
 /* @qdev_alias_all_properties - Add alias properties to the source object for
  * all qdev properties on the target DeviceState.
  */
@@ -931,8 +945,6 @@ static bool device_get_hotplugged(Object *obj, Error **errp)
 static void device_initfn(Object *obj)
 {
     DeviceState *dev = DEVICE(obj);
-    ObjectClass *class;
-    Property *prop;
 
     if (qdev_hotplug) {
         dev->hotplugged = 1;
@@ -943,15 +955,6 @@ static void device_initfn(Object *obj)
     dev->realized = false;
     dev->allow_unplug_during_migration = false;
 
-    class = object_get_class(OBJECT(dev));
-    do {
-        for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
-            qdev_property_add_legacy(dev, prop, &error_abort);
-            qdev_property_add_static(dev, prop);
-        }
-        class = object_class_get_parent(class);
-    } while (class != object_class_by_name(TYPE_DEVICE));
-
     QLIST_INIT(&dev->gpios);
 }
 
@@ -1064,7 +1067,13 @@ static void device_class_init(ObjectClass *class, void *data)
 
 void device_class_set_props(DeviceClass *dc, Property *props)
 {
+    Property *prop;
+
     dc->props = props;
+    for (prop = dc->props; prop && prop->name; prop++) {
+        qdev_class_add_legacy_property(dc, prop);
+        qdev_class_add_property(dc, prop);
+    }
 }
 
 void device_class_set_parent_reset(DeviceClass *dc,
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 22/26] vl: print default value in object help
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (20 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 21/26] qdev: register properties as " Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 23/26] qom: simplify qmp_device_list_properties() Marc-André Lureau
                   ` (4 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qom/object_interfaces.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 46cd6eab5c..edb4cc4a3d 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -185,6 +185,7 @@ bool user_creatable_print_help(const char *type, QemuOpts *opts)
         object_class_property_iter_init(&iter, klass);
         while ((prop = object_property_iter_next(&iter))) {
             GString *str;
+            char *defval;
 
             if (!prop->set) {
                 continue;
@@ -192,6 +193,11 @@ bool user_creatable_print_help(const char *type, QemuOpts *opts)
 
             str = g_string_new(NULL);
             g_string_append_printf(str, "  %s=<%s>", prop->name, prop->type);
+            defval = object_property_get_default(prop);
+            if (defval) {
+                g_string_append_printf(str, " (default: %s)", defval);
+                g_free(defval);
+            }
             if (prop->description) {
                 if (str->len < 24) {
                     g_string_append_printf(str, "%*s", 24 - (int)str->len, "");
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 23/26] qom: simplify qmp_device_list_properties()
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (21 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 22/26] vl: print default value in object help Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 24/26] qom: introduce object_property_help() Marc-André Lureau
                   ` (3 subsequent siblings)
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

All qdev properties are object properties, no need for
make_device_property_info() helper.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qom/qom-qmp-cmds.c | 52 +++++-----------------------------------------
 1 file changed, 5 insertions(+), 47 deletions(-)

diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index f4494f98ac..8785816c1f 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -121,48 +121,6 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
     return ret;
 }
 
-/* Return a DevicePropertyInfo for a qdev property.
- *
- * If a qdev property with the given name does not exist, use the given default
- * type.  If the qdev property info should not be shown, return NULL.
- *
- * The caller must free the return value.
- */
-static ObjectPropertyInfo *make_device_property_info(ObjectClass *klass,
-                                                  const char *name,
-                                                  const char *default_type,
-                                                  const char *description)
-{
-    ObjectPropertyInfo *info;
-    Property *prop;
-
-    do {
-        for (prop = DEVICE_CLASS(klass)->props; prop && prop->name; prop++) {
-            if (strcmp(name, prop->name) != 0) {
-                continue;
-            }
-
-            info = g_malloc0(sizeof(*info));
-            info->name = g_strdup(prop->name);
-            info->type = default_type ? g_strdup(default_type)
-                                      : g_strdup(prop->info->name);
-            info->has_description = !!prop->info->description;
-            info->description = g_strdup(prop->info->description);
-            return info;
-        }
-        klass = object_class_get_parent(klass);
-    } while (klass != object_class_by_name(TYPE_DEVICE));
-
-    /* Not a qdev property, use the default type */
-    info = g_malloc0(sizeof(*info));
-    info->name = g_strdup(name);
-    info->type = g_strdup(default_type);
-    info->has_description = !!description;
-    info->description = g_strdup(description);
-
-    return info;
-}
-
 ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
                                                 Error **errp)
 {
@@ -214,11 +172,11 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
             continue;
         }
 
-        info = make_device_property_info(klass, prop->name, prop->type,
-                                         prop->description);
-        if (!info) {
-            continue;
-        }
+        info = g_new0(ObjectPropertyInfo, 1);
+        info->name = g_strdup(prop->name);
+        info->type = g_strdup(prop->type);
+        info->has_description = !!prop->description;
+        info->description = g_strdup(prop->description);
 
         entry = g_malloc0(sizeof(*entry));
         entry->value = info;
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 24/26] qom: introduce object_property_help()
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (22 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 23/26] qom: simplify qmp_device_list_properties() Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2021-03-12 12:54   ` Thomas Huth
  2020-01-10 15:30 ` [PATCH 25/26] qapi/qmp: add ObjectPropertyInfo.default-value Marc-André Lureau
                   ` (2 subsequent siblings)
  26 siblings, 1 reply; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Let's factor out the code to format a help string for a property. We
are going to reuse it in qdev next, which will bring some consistency.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h    | 13 +++++++++++++
 qom/object_interfaces.c | 39 +++++++++++++++++++++++----------------
 2 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 933e5c6cb9..a28e37a648 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1854,6 +1854,19 @@ Object *container_get(Object *root, const char *path);
  */
 size_t object_type_get_instance_size(const char *typename);
 
+/**
+ * object_property_help:
+ * @name: the name of the property
+ * @type: the type of the property
+ * @defval: the default value
+ * @description: description of the property
+ *
+ * Returns: a user-friendly formatted string describing the property
+ * for help purposes.
+ */
+char *object_property_help(const char *name, const char *type,
+                           const char *defval, const char *description);
+
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(Object, object_unref)
 
 #endif
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index edb4cc4a3d..b7157d6ab0 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -158,6 +158,25 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
     return 0;
 }
 
+char *object_property_help(const char *name, const char *type,
+                           const char *defval, const char *description)
+{
+    GString *str = g_string_new(NULL);
+
+    g_string_append_printf(str, "  %s=<%s>", name, type);
+    if (defval) {
+        g_string_append_printf(str, " (default: %s)", defval);
+    }
+    if (description) {
+        if (str->len < 24) {
+            g_string_append_printf(str, "%*s", 24 - (int)str->len, "");
+        }
+        g_string_append_printf(str, " - %s", description);
+    }
+
+    return g_string_free(str, false);
+}
+
 bool user_creatable_print_help(const char *type, QemuOpts *opts)
 {
     ObjectClass *klass;
@@ -184,27 +203,15 @@ bool user_creatable_print_help(const char *type, QemuOpts *opts)
 
         object_class_property_iter_init(&iter, klass);
         while ((prop = object_property_iter_next(&iter))) {
-            GString *str;
-            char *defval;
+            g_autofree char *defval = object_property_get_default(prop);
 
             if (!prop->set) {
                 continue;
             }
 
-            str = g_string_new(NULL);
-            g_string_append_printf(str, "  %s=<%s>", prop->name, prop->type);
-            defval = object_property_get_default(prop);
-            if (defval) {
-                g_string_append_printf(str, " (default: %s)", defval);
-                g_free(defval);
-            }
-            if (prop->description) {
-                if (str->len < 24) {
-                    g_string_append_printf(str, "%*s", 24 - (int)str->len, "");
-                }
-                g_string_append_printf(str, " - %s", prop->description);
-            }
-            g_ptr_array_add(array, g_string_free(str, false));
+            g_ptr_array_add(array,
+                            object_property_help(prop->name, prop->type,
+                                                 defval, prop->description));
         }
         g_ptr_array_sort(array, (GCompareFunc)qemu_pstrcmp0);
         if (array->len > 0) {
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 25/26] qapi/qmp: add ObjectPropertyInfo.default-value
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (23 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 24/26] qom: introduce object_property_help() Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:30 ` [PATCH 26/26] qdev: use object_property_help() Marc-André Lureau
  2020-01-10 15:38 ` [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Report the default value associated with a property.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qapi/qom.json      | 7 ++++++-
 qom/qom-qmp-cmds.c | 4 ++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/qapi/qom.json b/qapi/qom.json
index 32db96ffc4..471e4b484b 100644
--- a/qapi/qom.json
+++ b/qapi/qom.json
@@ -26,10 +26,15 @@
 #
 # @description: if specified, the description of the property.
 #
+# @default-value: the default value, if any (since 5.0)
+#
 # Since: 1.2
 ##
 { 'struct': 'ObjectPropertyInfo',
-  'data': { 'name': 'str', 'type': 'str', '*description': 'str' } }
+  'data': { 'name': 'str',
+            'type': 'str',
+            '*description': 'str',
+            '*default-value': 'str' } }
 
 ##
 # @qom-list:
diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index 8785816c1f..68f0a41bca 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -177,6 +177,10 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
         info->type = g_strdup(prop->type);
         info->has_description = !!prop->description;
         info->description = g_strdup(prop->description);
+        if (prop->get_default) {
+            info->default_value = prop->get_default(prop);
+            info->has_default_value = !!info->default_value;
+        }
 
         entry = g_malloc0(sizeof(*entry));
         entry->value = info;
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 26/26] qdev: use object_property_help()
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (24 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 25/26] qapi/qmp: add ObjectPropertyInfo.default-value Marc-André Lureau
@ 2020-01-10 15:30 ` Marc-André Lureau
  2020-01-10 15:38 ` [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
  26 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Philippe Mathieu-Daudé,
	Eduardo Habkost, Marc-André Lureau

Use the common function introduced earlier, and report default value.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qdev-monitor.c | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/qdev-monitor.c b/qdev-monitor.c
index 3465a1e2d0..0f83770e02 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -286,16 +286,11 @@ int qdev_device_help(QemuOpts *opts)
         qemu_printf("There are no options for %s.\n", driver);
     }
     for (prop = prop_list; prop; prop = prop->next) {
-        int len;
-        qemu_printf("  %s=<%s>%n", prop->value->name, prop->value->type, &len);
-        if (prop->value->has_description) {
-            if (len < 24) {
-                qemu_printf("%*s", 24 - len, "");
-            }
-            qemu_printf(" - %s\n", prop->value->description);
-        } else {
-            qemu_printf("\n");
-        }
+        g_autofree char *help = object_property_help(prop->value->name,
+                                                     prop->value->type,
+                                                     prop->value->default_value,
+                                                     prop->value->description);
+        qemu_printf("%s\n", help);
     }
 
     qapi_free_ObjectPropertyInfoList(prop_list);
-- 
2.25.0.rc1.20.g2443f3f80d.dirty



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 00/26] Various qom & qdev enhancements
  2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
                   ` (25 preceding siblings ...)
  2020-01-10 15:30 ` [PATCH 26/26] qdev: use object_property_help() Marc-André Lureau
@ 2020-01-10 15:38 ` Marc-André Lureau
  2020-01-20 16:45   ` Stefan Hajnoczi
  2020-01-21 16:57   ` Paolo Bonzini
  26 siblings, 2 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-10 15:38 UTC (permalink / raw)
  To: QEMU, Stefan Hajnoczi
  Cc: Paolo Bonzini, Daniel P . Berrange, Eduardo Habkost,
	Philippe Mathieu-Daudé

Hi


Something went wrong with git-publish & "git branch
--edit-description" interaction (which I started to play with - I
think git-publish should make use of it). It seems it got the mail
summary from git-publish and content from git description, fun :)

On Fri, Jan 10, 2020 at 7:31 PM Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> aa bpkwef

That should read instead:

The following series has some qom/qdev cleanups, moves qdev instance
properties to class properites, and return the default values in help
and QMP commands.

Thanks

> Marc-André Lureau (26):
>   object: add extra sanity checks
>   qdev: remove duplicated qdev_property_add_static() doc
>   qdev: remove extraneous error
>   qdev: move helper function to monitor/misc
>   object: avoid extra class property key duplication
>   object: add class property initializer
>   object: add object_property_get_defaut()
>   object: make object_class_property_add* return property
>   qstring: add qstring_free()
>   object: add object_property_set_defaut_{bool,str,int,uint}()
>   object: do not free class properties
>   object: check strong flag with &
>   object: rename link "child" to "target"
>   object: add direct link flag
>   object: express const link with link property
>   object: add object_class_property_add_link()
>   object: release all props
>   object: return self in object_ref()
>   qdev: set properties with device_class_set_props()
>   qdev: move instance properties to class properties
>   qdev: register properties as class properties
>   vl: print default value in object help
>   qom: simplify qmp_device_list_properties()
>   qom: introduce object_property_help()
>   qapi/qmp: add ObjectPropertyInfo.default-value
>   qdev: use object_property_help()
>
>  qapi/qom.json                       |   7 +-
>  include/hw/qdev-core.h              |   8 +-
>  include/hw/qdev-properties.h        |   3 +-
>  include/qapi/qmp/qstring.h          |   1 +
>  include/qom/object.h                | 126 ++++++++++--
>  hw/9pfs/virtio-9p-device.c          |   2 +-
>  hw/acpi/generic_event_device.c      |   2 +-
>  hw/acpi/piix4.c                     |   2 +-
>  hw/acpi/vmgenid.c                   |   2 +-
>  hw/arm/armsse.c                     |   2 +-
>  hw/arm/armv7m.c                     |   4 +-
>  hw/arm/aspeed_soc.c                 |   2 +-
>  hw/arm/bcm2836.c                    |   2 +-
>  hw/arm/integratorcp.c               |   2 +-
>  hw/arm/msf2-soc.c                   |   2 +-
>  hw/arm/musicpal.c                   |   2 +-
>  hw/arm/nrf51_soc.c                  |   2 +-
>  hw/arm/pxa2xx.c                     |   4 +-
>  hw/arm/pxa2xx_gpio.c                |   2 +-
>  hw/arm/smmu-common.c                |   2 +-
>  hw/arm/spitz.c                      |   2 +-
>  hw/arm/stm32f205_soc.c              |   2 +-
>  hw/arm/strongarm.c                  |   2 +-
>  hw/arm/xlnx-versal.c                |   2 +-
>  hw/arm/xlnx-zynqmp.c                |   2 +-
>  hw/audio/ac97.c                     |   2 +-
>  hw/audio/adlib.c                    |   2 +-
>  hw/audio/cs4231.c                   |   2 +-
>  hw/audio/cs4231a.c                  |   2 +-
>  hw/audio/es1370.c                   |   2 +-
>  hw/audio/gus.c                      |   2 +-
>  hw/audio/hda-codec.c                |   2 +-
>  hw/audio/intel-hda.c                |   4 +-
>  hw/audio/milkymist-ac97.c           |   2 +-
>  hw/audio/pcspk.c                    |   2 +-
>  hw/audio/pl041.c                    |   2 +-
>  hw/audio/sb16.c                     |   2 +-
>  hw/audio/wm8750.c                   |   2 +-
>  hw/block/fdc.c                      |   8 +-
>  hw/block/m25p80.c                   |   2 +-
>  hw/block/nand.c                     |   2 +-
>  hw/block/nvme.c                     |   2 +-
>  hw/block/onenand.c                  |   2 +-
>  hw/block/pflash_cfi01.c             |   2 +-
>  hw/block/pflash_cfi02.c             |   2 +-
>  hw/block/swim.c                     |   2 +-
>  hw/block/vhost-user-blk.c           |   2 +-
>  hw/block/virtio-blk.c               |   2 +-
>  hw/block/xen-block.c                |   2 +-
>  hw/char/bcm2835_aux.c               |   2 +-
>  hw/char/cadence_uart.c              |   2 +-
>  hw/char/cmsdk-apb-uart.c            |   2 +-
>  hw/char/debugcon.c                  |   2 +-
>  hw/char/digic-uart.c                |   2 +-
>  hw/char/escc.c                      |   2 +-
>  hw/char/etraxfs_ser.c               |   2 +-
>  hw/char/exynos4210_uart.c           |   2 +-
>  hw/char/grlib_apbuart.c             |   2 +-
>  hw/char/imx_serial.c                |   2 +-
>  hw/char/ipoctal232.c                |   2 +-
>  hw/char/lm32_juart.c                |   2 +-
>  hw/char/lm32_uart.c                 |   2 +-
>  hw/char/mcf_uart.c                  |   2 +-
>  hw/char/milkymist-uart.c            |   2 +-
>  hw/char/nrf51_uart.c                |   2 +-
>  hw/char/parallel.c                  |   2 +-
>  hw/char/pl011.c                     |   2 +-
>  hw/char/sclpconsole-lm.c            |   2 +-
>  hw/char/sclpconsole.c               |   2 +-
>  hw/char/serial-isa.c                |   2 +-
>  hw/char/serial-pci-multi.c          |   4 +-
>  hw/char/serial-pci.c                |   2 +-
>  hw/char/serial.c                    |   4 +-
>  hw/char/spapr_vty.c                 |   2 +-
>  hw/char/stm32f2xx_usart.c           |   2 +-
>  hw/char/terminal3270.c              |   2 +-
>  hw/char/virtio-console.c            |   2 +-
>  hw/char/virtio-serial-bus.c         |   4 +-
>  hw/char/xilinx_uartlite.c           |   2 +-
>  hw/core/cpu.c                       |   2 +-
>  hw/core/generic-loader.c            |   2 +-
>  hw/core/or-irq.c                    |   2 +-
>  hw/core/platform-bus.c              |   2 +-
>  hw/core/qdev-properties.c           |  38 ++--
>  hw/core/qdev.c                      | 155 ++++++--------
>  hw/core/split-irq.c                 |   2 +-
>  hw/cpu/a15mpcore.c                  |   2 +-
>  hw/cpu/a9mpcore.c                   |   2 +-
>  hw/cpu/arm11mpcore.c                |   2 +-
>  hw/cpu/cluster.c                    |   2 +-
>  hw/cpu/realview_mpcore.c            |   2 +-
>  hw/display/ati.c                    |   2 +-
>  hw/display/bcm2835_fb.c             |   2 +-
>  hw/display/bochs-display.c          |   2 +-
>  hw/display/cg3.c                    |   2 +-
>  hw/display/cirrus_vga.c             |   2 +-
>  hw/display/cirrus_vga_isa.c         |   2 +-
>  hw/display/g364fb.c                 |   2 +-
>  hw/display/i2c-ddc.c                |   2 +-
>  hw/display/macfb.c                  |   4 +-
>  hw/display/milkymist-vgafb.c        |   2 +-
>  hw/display/qxl.c                    |   2 +-
>  hw/display/ramfb-standalone.c       |   2 +-
>  hw/display/sm501.c                  |   4 +-
>  hw/display/tcx.c                    |   2 +-
>  hw/display/vga-isa.c                |   2 +-
>  hw/display/vga-pci.c                |   4 +-
>  hw/display/vhost-user-gpu.c         |   2 +-
>  hw/display/virtio-gpu-pci.c         |   2 +-
>  hw/display/virtio-gpu.c             |   2 +-
>  hw/display/virtio-vga.c             |   2 +-
>  hw/display/vmware_vga.c             |   2 +-
>  hw/dma/i82374.c                     |   2 +-
>  hw/dma/i8257.c                      |   2 +-
>  hw/dma/pl080.c                      |   2 +-
>  hw/dma/pl330.c                      |   2 +-
>  hw/dma/pxa2xx_dma.c                 |   2 +-
>  hw/dma/xilinx_axidma.c              |   2 +-
>  hw/dma/xlnx-zdma.c                  |   2 +-
>  hw/gpio/imx_gpio.c                  |   2 +-
>  hw/gpio/omap_gpio.c                 |   4 +-
>  hw/i2c/aspeed_i2c.c                 |   2 +-
>  hw/i2c/core.c                       |   2 +-
>  hw/i2c/omap_i2c.c                   |   2 +-
>  hw/i386/intel_iommu.c               |   2 +-
>  hw/i386/kvm/clock.c                 |   2 +-
>  hw/i386/kvm/i8254.c                 |   2 +-
>  hw/i386/kvm/ioapic.c                |   2 +-
>  hw/i386/vmmouse.c                   |   2 +-
>  hw/i386/x86-iommu.c                 |   2 +-
>  hw/i386/xen/xen_pvdevice.c          |   2 +-
>  hw/ide/ahci.c                       |   2 +-
>  hw/ide/cmd646.c                     |   2 +-
>  hw/ide/isa.c                        |   2 +-
>  hw/ide/macio.c                      |   2 +-
>  hw/ide/mmio.c                       |   2 +-
>  hw/ide/qdev.c                       |   8 +-
>  hw/input/adb.c                      |   2 +-
>  hw/input/milkymist-softusb.c        |   2 +-
>  hw/input/virtio-input-hid.c         |   6 +-
>  hw/input/virtio-input-host.c        |   2 +-
>  hw/input/virtio-input.c             |   2 +-
>  hw/intc/apic_common.c               |   2 +-
>  hw/intc/arm_gic_common.c            |   2 +-
>  hw/intc/arm_gicv2m.c                |   2 +-
>  hw/intc/arm_gicv3_common.c          |   2 +-
>  hw/intc/arm_gicv3_its_kvm.c         |   2 +-
>  hw/intc/armv7m_nvic.c               |   2 +-
>  hw/intc/exynos4210_combiner.c       |   2 +-
>  hw/intc/exynos4210_gic.c            |   4 +-
>  hw/intc/i8259_common.c              |   2 +-
>  hw/intc/ioapic.c                    |   2 +-
>  hw/intc/mips_gic.c                  |   2 +-
>  hw/intc/omap_intc.c                 |   4 +-
>  hw/intc/ompic.c                     |   2 +-
>  hw/intc/openpic.c                   |   2 +-
>  hw/intc/openpic_kvm.c               |   2 +-
>  hw/intc/pnv_xive.c                  |   2 +-
>  hw/intc/s390_flic.c                 |   2 +-
>  hw/intc/spapr_xive.c                |   2 +-
>  hw/intc/xics.c                      |   4 +-
>  hw/intc/xilinx_intc.c               |   2 +-
>  hw/intc/xive.c                      |   6 +-
>  hw/intc/xlnx-pmu-iomod-intc.c       |   2 +-
>  hw/ipack/ipack.c                    |   2 +-
>  hw/ipmi/ipmi.c                      |   2 +-
>  hw/ipmi/ipmi_bmc_extern.c           |   2 +-
>  hw/ipmi/ipmi_bmc_sim.c              |   2 +-
>  hw/ipmi/isa_ipmi_bt.c               |   2 +-
>  hw/ipmi/isa_ipmi_kcs.c              |   2 +-
>  hw/isa/lpc_ich9.c                   |   2 +-
>  hw/isa/pc87312.c                    |   2 +-
>  hw/isa/vt82c686.c                   |   2 +-
>  hw/mem/nvdimm.c                     |   2 +-
>  hw/mem/pc-dimm.c                    |   2 +-
>  hw/mips/cps.c                       |   2 +-
>  hw/misc/a9scu.c                     |   2 +-
>  hw/misc/applesmc.c                  |   2 +-
>  hw/misc/arm11scu.c                  |   2 +-
>  hw/misc/arm_l2x0.c                  |   2 +-
>  hw/misc/arm_sysctl.c                |   2 +-
>  hw/misc/armsse-cpuid.c              |   2 +-
>  hw/misc/aspeed_scu.c                |   2 +-
>  hw/misc/aspeed_sdmc.c               |   2 +-
>  hw/misc/bcm2835_property.c          |   2 +-
>  hw/misc/debugexit.c                 |   2 +-
>  hw/misc/eccmemctl.c                 |   2 +-
>  hw/misc/iotkit-sysctl.c             |   2 +-
>  hw/misc/iotkit-sysinfo.c            |   2 +-
>  hw/misc/ivshmem.c                   |   4 +-
>  hw/misc/mac_via.c                   |   2 +-
>  hw/misc/macio/cuda.c                |   2 +-
>  hw/misc/macio/macio.c               |   4 +-
>  hw/misc/macio/pmu.c                 |   2 +-
>  hw/misc/mips_cmgcr.c                |   2 +-
>  hw/misc/mips_cpc.c                  |   2 +-
>  hw/misc/mips_itu.c                  |   2 +-
>  hw/misc/mos6522.c                   |   2 +-
>  hw/misc/mps2-fpgaio.c               |   2 +-
>  hw/misc/mps2-scc.c                  |   2 +-
>  hw/misc/msf2-sysreg.c               |   2 +-
>  hw/misc/nrf51_rng.c                 |   2 +-
>  hw/misc/pci-testdev.c               |   2 +-
>  hw/misc/pvpanic.c                   |   2 +-
>  hw/misc/tz-mpc.c                    |   2 +-
>  hw/misc/tz-msc.c                    |   2 +-
>  hw/misc/tz-ppc.c                    |   2 +-
>  hw/misc/unimp.c                     |   2 +-
>  hw/net/allwinner_emac.c             |   2 +-
>  hw/net/cadence_gem.c                |   2 +-
>  hw/net/dp8393x.c                    |   2 +-
>  hw/net/e1000.c                      |   2 +-
>  hw/net/e1000e.c                     |   2 +-
>  hw/net/eepro100.c                   |   2 +-
>  hw/net/etraxfs_eth.c                |   2 +-
>  hw/net/fsl_etsec/etsec.c            |   2 +-
>  hw/net/ftgmac100.c                  |   4 +-
>  hw/net/imx_fec.c                    |   2 +-
>  hw/net/lan9118.c                    |   2 +-
>  hw/net/lance.c                      |   2 +-
>  hw/net/mcf_fec.c                    |   2 +-
>  hw/net/milkymist-minimac2.c         |   2 +-
>  hw/net/mipsnet.c                    |   2 +-
>  hw/net/ne2000-isa.c                 |   2 +-
>  hw/net/ne2000-pci.c                 |   2 +-
>  hw/net/opencores_eth.c              |   2 +-
>  hw/net/pcnet-pci.c                  |   2 +-
>  hw/net/rocker/rocker.c              |   2 +-
>  hw/net/rtl8139.c                    |   2 +-
>  hw/net/smc91c111.c                  |   2 +-
>  hw/net/spapr_llan.c                 |   2 +-
>  hw/net/stellaris_enet.c             |   2 +-
>  hw/net/sungem.c                     |   2 +-
>  hw/net/sunhme.c                     |   2 +-
>  hw/net/tulip.c                      |   2 +-
>  hw/net/virtio-net.c                 |   2 +-
>  hw/net/vmxnet3.c                    |   2 +-
>  hw/net/xgmac.c                      |   2 +-
>  hw/net/xilinx_axienet.c             |   2 +-
>  hw/net/xilinx_ethlite.c             |   2 +-
>  hw/nvram/ds1225y.c                  |   2 +-
>  hw/nvram/eeprom_at24c.c             |   2 +-
>  hw/nvram/fw_cfg.c                   |   4 +-
>  hw/nvram/mac_nvram.c                |   2 +-
>  hw/nvram/nrf51_nvm.c                |   2 +-
>  hw/nvram/spapr_nvram.c              |   2 +-
>  hw/pci-bridge/gen_pcie_root_port.c  |   2 +-
>  hw/pci-bridge/pci_bridge_dev.c      |   2 +-
>  hw/pci-bridge/pci_expander_bridge.c |   4 +-
>  hw/pci-bridge/pcie_pci_bridge.c     |   2 +-
>  hw/pci-bridge/pcie_root_port.c      |   2 +-
>  hw/pci-bridge/xio3130_downstream.c  |   2 +-
>  hw/pci-host/grackle.c               |   2 +-
>  hw/pci-host/i440fx.c                |   2 +-
>  hw/pci-host/ppce500.c               |   2 +-
>  hw/pci-host/prep.c                  |   2 +-
>  hw/pci-host/q35.c                   |   4 +-
>  hw/pci-host/sabre.c                 |   2 +-
>  hw/pci-host/uninorth.c              |   2 +-
>  hw/pci-host/versatile.c             |   2 +-
>  hw/pci-host/xilinx-pcie.c           |   2 +-
>  hw/pci/pci.c                        |   2 +-
>  hw/pci/pcie_port.c                  |   4 +-
>  hw/ppc/pnv.c                        |   2 +-
>  hw/ppc/pnv_core.c                   |   4 +-
>  hw/ppc/pnv_homer.c                  |   2 +-
>  hw/ppc/pnv_lpc.c                    |   2 +-
>  hw/ppc/pnv_occ.c                    |   2 +-
>  hw/ppc/pnv_pnor.c                   |   2 +-
>  hw/ppc/pnv_psi.c                    |   2 +-
>  hw/ppc/ppc440_uc.c                  |   2 +-
>  hw/ppc/prep_systemio.c              |   2 +-
>  hw/ppc/rs6000_mc.c                  |   2 +-
>  hw/ppc/spapr_cpu_core.c             |   2 +-
>  hw/ppc/spapr_pci.c                  |   2 +-
>  hw/ppc/spapr_rng.c                  |   2 +-
>  hw/ppc/spapr_tpm_proxy.c            |   2 +-
>  hw/rdma/vmw/pvrdma_main.c           |   2 +-
>  hw/riscv/riscv_hart.c               |   2 +-
>  hw/riscv/sifive_clint.c             |   2 +-
>  hw/riscv/sifive_plic.c              |   2 +-
>  hw/riscv/sifive_u_otp.c             |   2 +-
>  hw/rtc/m48t59-isa.c                 |   2 +-
>  hw/rtc/m48t59.c                     |   2 +-
>  hw/rtc/mc146818rtc.c                |   2 +-
>  hw/rtc/pl031.c                      |   2 +-
>  hw/s390x/3270-ccw.c                 |   2 +-
>  hw/s390x/ccw-device.c               |   2 +-
>  hw/s390x/css-bridge.c               |   2 +-
>  hw/s390x/ipl.c                      |   2 +-
>  hw/s390x/s390-pci-bus.c             |   2 +-
>  hw/s390x/vhost-vsock-ccw.c          |   2 +-
>  hw/s390x/virtio-ccw-9p.c            |   2 +-
>  hw/s390x/virtio-ccw-balloon.c       |   2 +-
>  hw/s390x/virtio-ccw-blk.c           |   2 +-
>  hw/s390x/virtio-ccw-crypto.c        |   2 +-
>  hw/s390x/virtio-ccw-gpu.c           |   2 +-
>  hw/s390x/virtio-ccw-input.c         |   2 +-
>  hw/s390x/virtio-ccw-net.c           |   2 +-
>  hw/s390x/virtio-ccw-rng.c           |   2 +-
>  hw/s390x/virtio-ccw-scsi.c          |   4 +-
>  hw/s390x/virtio-ccw-serial.c        |   2 +-
>  hw/scsi/megasas.c                   |   2 +-
>  hw/scsi/mptsas.c                    |   2 +-
>  hw/scsi/scsi-bus.c                  |   2 +-
>  hw/scsi/scsi-disk.c                 |   8 +-
>  hw/scsi/scsi-generic.c              |   2 +-
>  hw/scsi/spapr_vscsi.c               |   2 +-
>  hw/scsi/vhost-scsi.c                |   2 +-
>  hw/scsi/vhost-user-scsi.c           |   2 +-
>  hw/scsi/virtio-scsi.c               |   2 +-
>  hw/scsi/vmw_pvscsi.c                |   2 +-
>  hw/sd/sd.c                          |   2 +-
>  hw/sd/sdhci-pci.c                   |   2 +-
>  hw/sd/sdhci.c                       |   2 +-
>  hw/sparc/sun4m.c                    |   4 +-
>  hw/sparc/sun4m_iommu.c              |   2 +-
>  hw/sparc64/sun4u.c                  |   6 +-
>  hw/ssi/aspeed_smc.c                 |   2 +-
>  hw/ssi/xilinx_spi.c                 |   2 +-
>  hw/ssi/xilinx_spips.c               |   4 +-
>  hw/timer/a9gtimer.c                 |   2 +-
>  hw/timer/allwinner-a10-pit.c        |   2 +-
>  hw/timer/altera_timer.c             |   2 +-
>  hw/timer/arm_mptimer.c              |   2 +-
>  hw/timer/arm_timer.c                |   2 +-
>  hw/timer/aspeed_timer.c             |   2 +-
>  hw/timer/cmsdk-apb-dualtimer.c      |   2 +-
>  hw/timer/cmsdk-apb-timer.c          |   2 +-
>  hw/timer/grlib_gptimer.c            |   2 +-
>  hw/timer/hpet.c                     |   2 +-
>  hw/timer/i8254.c                    |   2 +-
>  hw/timer/lm32_timer.c               |   2 +-
>  hw/timer/milkymist-sysctl.c         |   2 +-
>  hw/timer/mss-timer.c                |   2 +-
>  hw/timer/pxa2xx_timer.c             |   4 +-
>  hw/timer/slavio_timer.c             |   2 +-
>  hw/timer/stm32f2xx_timer.c          |   2 +-
>  hw/timer/xilinx_timer.c             |   2 +-
>  hw/tpm/tpm_crb.c                    |   2 +-
>  hw/tpm/tpm_tis.c                    |   2 +-
>  hw/usb/bus.c                        |   2 +-
>  hw/usb/ccid-card-emulated.c         |   2 +-
>  hw/usb/ccid-card-passthru.c         |   2 +-
>  hw/usb/dev-audio.c                  |   2 +-
>  hw/usb/dev-hid.c                    |   6 +-
>  hw/usb/dev-hub.c                    |   2 +-
>  hw/usb/dev-mtp.c                    |   2 +-
>  hw/usb/dev-network.c                |   2 +-
>  hw/usb/dev-serial.c                 |   4 +-
>  hw/usb/dev-smartcard-reader.c       |   4 +-
>  hw/usb/dev-storage.c                |   2 +-
>  hw/usb/dev-uas.c                    |   2 +-
>  hw/usb/hcd-ehci-pci.c               |   2 +-
>  hw/usb/hcd-ehci-sysbus.c            |   2 +-
>  hw/usb/hcd-ohci-pci.c               |   2 +-
>  hw/usb/hcd-ohci.c                   |   2 +-
>  hw/usb/hcd-uhci.c                   |   4 +-
>  hw/usb/hcd-xhci-nec.c               |   2 +-
>  hw/usb/hcd-xhci.c                   |   2 +-
>  hw/usb/host-libusb.c                |   2 +-
>  hw/usb/redirect.c                   |   2 +-
>  hw/vfio/ap.c                        |   2 +-
>  hw/vfio/ccw.c                       |   2 +-
>  hw/vfio/pci.c                       |   4 +-
>  hw/vfio/platform.c                  |   2 +-
>  hw/virtio/vhost-scsi-pci.c          |   2 +-
>  hw/virtio/vhost-user-blk-pci.c      |   2 +-
>  hw/virtio/vhost-user-fs-pci.c       |   2 +-
>  hw/virtio/vhost-user-fs.c           |   2 +-
>  hw/virtio/vhost-user-scsi-pci.c     |   2 +-
>  hw/virtio/vhost-vsock-pci.c         |   2 +-
>  hw/virtio/vhost-vsock.c             |   2 +-
>  hw/virtio/virtio-9p-pci.c           |   2 +-
>  hw/virtio/virtio-balloon-pci.c      |   2 +-
>  hw/virtio/virtio-balloon.c          |   2 +-
>  hw/virtio/virtio-blk-pci.c          |   2 +-
>  hw/virtio/virtio-crypto-pci.c       |   2 +-
>  hw/virtio/virtio-crypto.c           |   2 +-
>  hw/virtio/virtio-input-pci.c        |   2 +-
>  hw/virtio/virtio-mmio.c             |   2 +-
>  hw/virtio/virtio-net-pci.c          |   2 +-
>  hw/virtio/virtio-pci.c              |   4 +-
>  hw/virtio/virtio-pmem.c             |   2 +-
>  hw/virtio/virtio-rng.c              |   2 +-
>  hw/virtio/virtio-scsi-pci.c         |   2 +-
>  hw/virtio/virtio-serial-pci.c       |   2 +-
>  hw/virtio/virtio.c                  |   2 +-
>  hw/watchdog/cmsdk-apb-watchdog.c    |   2 +-
>  hw/watchdog/wdt_aspeed.c            |   2 +-
>  hw/xen/xen-bus.c                    |   2 +-
>  hw/xen/xen-legacy-backend.c         |   4 +-
>  hw/xen/xen_pt.c                     |   2 +-
>  migration/migration.c               |   2 +-
>  monitor/misc.c                      |  26 +++
>  qdev-monitor.c                      |  15 +-
>  qobject/qstring.c                   |  27 ++-
>  qom/object.c                        | 305 +++++++++++++++++++++-------
>  qom/object_interfaces.c             |  33 ++-
>  qom/qom-qmp-cmds.c                  |  54 +----
>  target/arm/cpu.c                    |  38 ++--
>  target/i386/cpu.c                   |   4 +-
>  target/microblaze/cpu.c             |   2 +-
>  target/nios2/cpu.c                  |   2 +-
>  target/ppc/translate_init.inc.c     |  10 +-
>  target/riscv/cpu.c                  |   2 +-
>  target/s390x/cpu.c                  |   2 +-
>  target/sparc/cpu.c                  |   2 +-
>  tests/test-qdev-global-props.c      |   2 +-
>  409 files changed, 987 insertions(+), 745 deletions(-)
>
> --
> 2.25.0.rc1.20.g2443f3f80d.dirty
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 01/26] object: add extra sanity checks
  2020-01-10 15:30 ` [PATCH 01/26] object: add extra sanity checks Marc-André Lureau
@ 2020-01-10 19:18   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 41+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-10 19:18 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Eduardo Habkost

On 1/10/20 4:30 PM, Marc-André Lureau wrote:
> Type system checked that children class_size >= parent class_size, but
> not instances. Fix that.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   qom/object.c | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/qom/object.c b/qom/object.c
> index 0d971ca897..8453e4ac91 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -303,6 +303,7 @@ static void type_initialize(TypeImpl *ti)
>           int i;
>   
>           g_assert(parent->class_size <= ti->class_size);
> +        g_assert(parent->instance_size <= ti->instance_size);
>           memcpy(ti->class, parent->class, parent->class_size);
>           ti->class->interfaces = NULL;
>           ti->class->properties = g_hash_table_new_full(
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 04/26] qdev: move helper function to monitor/misc
  2020-01-10 15:30 ` [PATCH 04/26] qdev: move helper function to monitor/misc Marc-André Lureau
@ 2020-01-10 19:18   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 41+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-10 19:18 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Eduardo Habkost

On 1/10/20 4:30 PM, Marc-André Lureau wrote:
> Move the one-user function to the place it is being used.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   include/hw/qdev-core.h |  2 --
>   hw/core/qdev.c         | 26 --------------------------
>   monitor/misc.c         | 26 ++++++++++++++++++++++++++
>   3 files changed, 26 insertions(+), 28 deletions(-)
> 
> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> index 1518495b1e..6b0e7b265d 100644
> --- a/include/hw/qdev-core.h
> +++ b/include/hw/qdev-core.h
> @@ -457,8 +457,6 @@ extern bool qdev_hot_removed;
>   
>   char *qdev_get_dev_path(DeviceState *dev);
>   
> -GSList *qdev_build_hotpluggable_device_list(Object *peripheral);
> -
>   void qbus_set_hotplug_handler(BusState *bus, Object *handler, Error **errp);
>   
>   void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp);
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index c2aa7f91a6..a520d7fa89 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -760,32 +760,6 @@ void qdev_alias_all_properties(DeviceState *target, Object *source)
>       } while (class != object_class_by_name(TYPE_DEVICE));
>   }
>   
> -static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
> -{
> -    GSList **list = opaque;
> -    DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
> -                                                          TYPE_DEVICE);
> -
> -    if (dev == NULL) {
> -        return 0;
> -    }
> -
> -    if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
> -        *list = g_slist_append(*list, dev);
> -    }
> -
> -    return 0;
> -}
> -
> -GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
> -{
> -    GSList *list = NULL;
> -
> -    object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
> -
> -    return list;
> -}
> -
>   static bool device_get_realized(Object *obj, Error **errp)
>   {
>       DeviceState *dev = DEVICE(obj);
> diff --git a/monitor/misc.c b/monitor/misc.c
> index a04d7edde0..be3c700511 100644
> --- a/monitor/misc.c
> +++ b/monitor/misc.c
> @@ -1954,6 +1954,32 @@ void object_add_completion(ReadLineState *rs, int nb_args, const char *str)
>       g_slist_free(list);
>   }
>   
> +static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
> +{
> +    GSList **list = opaque;
> +    DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
> +                                                          TYPE_DEVICE);
> +
> +    if (dev == NULL) {
> +        return 0;
> +    }
> +
> +    if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
> +        *list = g_slist_append(*list, dev);
> +    }
> +
> +    return 0;
> +}
> +
> +static GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
> +{
> +    GSList *list = NULL;
> +
> +    object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
> +
> +    return list;
> +}
> +
>   static void peripheral_device_del_completion(ReadLineState *rs,
>                                                const char *str, size_t len)
>   {
> 



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 18/26] object: return self in object_ref()
  2020-01-10 15:30 ` [PATCH 18/26] object: return self in object_ref() Marc-André Lureau
@ 2020-01-10 19:22   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 41+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-10 19:22 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Eduardo Habkost

On 1/10/20 4:30 PM, Marc-André Lureau wrote:
> This allow for simpler assignment with ref: foo = object_ref(bar)
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   include/qom/object.h | 3 ++-
>   qom/object.c         | 5 +++--
>   2 files changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/include/qom/object.h b/include/qom/object.h
> index ead9129ac8..933e5c6cb9 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1013,8 +1013,9 @@ GSList *object_class_get_list_sorted(const char *implements_type,
>    *
>    * Increase the reference count of a object.  A object cannot be freed as long
>    * as its reference count is greater than zero.
> + * Returns: @obj
>    */
> -void object_ref(Object *obj);
> +Object *object_ref(Object *obj);
>   
>   /**
>    * object_unref:
> diff --git a/qom/object.c b/qom/object.c
> index 3924678ec3..9f76a330ff 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -1098,12 +1098,13 @@ GSList *object_class_get_list_sorted(const char *implements_type,
>                           object_class_cmp);
>   }
>   
> -void object_ref(Object *obj)
> +Object *object_ref(Object *obj)
>   {
>       if (!obj) {
> -        return;
> +        return NULL;
>       }
>       atomic_inc(&obj->ref);
> +    return obj;
>   }
>   
>   void object_unref(Object *obj)
> 



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 00/26] Various qom & qdev enhancements
  2020-01-10 15:38 ` [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
@ 2020-01-20 16:45   ` Stefan Hajnoczi
  2020-01-21 16:57   ` Paolo Bonzini
  1 sibling, 0 replies; 41+ messages in thread
From: Stefan Hajnoczi @ 2020-01-20 16:45 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Paolo Bonzini, Daniel P . Berrange, QEMU, Eduardo Habkost,
	Philippe Mathieu-Daudé

[-- Attachment #1: Type: text/plain, Size: 445 bytes --]

On Fri, Jan 10, 2020 at 07:38:02PM +0400, Marc-André Lureau wrote:
> Something went wrong with git-publish & "git branch
> --edit-description" interaction (which I started to play with - I
> think git-publish should make use of it). It seems it got the mail
> summary from git-publish and content from git description, fun :)

Yes, the branch description might be a good place to stash the cover
letter or at least part of it.

Stefan

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 00/26] Various qom & qdev enhancements
  2020-01-10 15:38 ` [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
  2020-01-20 16:45   ` Stefan Hajnoczi
@ 2020-01-21 16:57   ` Paolo Bonzini
  1 sibling, 0 replies; 41+ messages in thread
From: Paolo Bonzini @ 2020-01-21 16:57 UTC (permalink / raw)
  To: Marc-André Lureau, QEMU, Stefan Hajnoczi
  Cc: Philippe Mathieu-Daudé, Daniel P . Berrange, Eduardo Habkost

On 10/01/20 16:38, Marc-André Lureau wrote:
> Hi
> 
> 
> Something went wrong with git-publish & "git branch
> --edit-description" interaction (which I started to play with - I
> think git-publish should make use of it). It seems it got the mail
> summary from git-publish and content from git description, fun :)
> 
> On Fri, Jan 10, 2020 at 7:31 PM Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
>> aa bpkwef
> That should read instead:
> 
> The following series has some qom/qdev cleanups, moves qdev instance
> properties to class properites, and return the default values in help
> and QMP commands.

Queued, thanks.

Paolo



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 19/26] qdev: set properties with device_class_set_props()
  2020-01-10 15:30 ` [PATCH 19/26] qdev: set properties with device_class_set_props() Marc-André Lureau
@ 2020-01-23 11:08   ` Paolo Bonzini
  2020-01-23 11:11     ` Marc-André Lureau
  0 siblings, 1 reply; 41+ messages in thread
From: Paolo Bonzini @ 2020-01-23 11:08 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Philippe Mathieu-Daudé, Daniel P . Berrange, Eduardo Habkost

On 10/01/20 16:30, Marc-André Lureau wrote:
> The following patch will need to handle properties registration during
> class_init time. Let's use a device_class_set_props() setter.

If you don't mind, I'll also rename "props" to "props_" so that we can
more easily catch conflicts (which will be syntax errors and not just
bugs) in the future.

Paolo



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 19/26] qdev: set properties with device_class_set_props()
  2020-01-23 11:08   ` Paolo Bonzini
@ 2020-01-23 11:11     ` Marc-André Lureau
  0 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-23 11:11 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: Daniel P . Berrange, Philippe Mathieu-Daudé, QEMU, Eduardo Habkost

Hi

On Thu, Jan 23, 2020 at 3:09 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> On 10/01/20 16:30, Marc-André Lureau wrote:
> > The following patch will need to handle properties registration during
> > class_init time. Let's use a device_class_set_props() setter.
>
> If you don't mind, I'll also rename "props" to "props_" so that we can
> more easily catch conflicts (which will be syntax errors and not just
> bugs) in the future.

Yes, I wanted to do something like that too.
thanks


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 10/26] object: add object_property_set_defaut_{bool, str,  int, uint}()
  2020-01-10 15:30 ` [PATCH 10/26] object: add object_property_set_defaut_{bool, str, int, uint}() Marc-André Lureau
@ 2020-01-23 11:28   ` Paolo Bonzini
  2020-01-23 11:39     ` Marc-André Lureau
  0 siblings, 1 reply; 41+ messages in thread
From: Paolo Bonzini @ 2020-01-23 11:28 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel

This patch caught my attention because of the typo in the function, but 
I also noticed that get_default is never set to anything but 
object_property_get_defval.

What do you think about removing the method and just relying on defval?
In practice there would be a new patch that squashes 7, 10 and the thing
after my signature.

Paolo

diff --git a/include/qom/object.h b/include/qom/object.h
index 1ea5c8c..035e41c 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -367,13 +367,6 @@ typedef void (ObjectPropertyRelease)(Object *obj,
  */
 typedef void (ObjectPropertyInit)(Object *obj, ObjectProperty *prop);
 
-/**
- * ObjectPropertyGetDefault:
- *
- * Get an allocated string representation of the default value.
- */
-typedef char *(ObjectPropertyGetDefault)(ObjectProperty *prop);
-
 struct ObjectProperty
 {
     gchar *name;
@@ -384,7 +377,6 @@ struct ObjectProperty
     ObjectPropertyResolve *resolve;
     ObjectPropertyRelease *release;
     ObjectPropertyInit *init;
-    ObjectPropertyGetDefault *get_default;
     void *opaque;
     QObject *defval;
 };
diff --git a/qom/object.c b/qom/object.c
index 2464a9f..aa6cf19 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1444,15 +1444,6 @@ int64_t object_property_get_int(Object *obj, const char *name,
     return retval;
 }
 
-char *object_property_get_default(ObjectProperty *prop)
-{
-    if (!prop->get_default) {
-        return NULL;
-    }
-
-    return prop->get_default(prop);
-}
-
 static void object_property_init_defval(Object *obj, ObjectProperty *prop)
 {
     Visitor *v = qobject_input_visitor_new(prop->defval);
@@ -1463,8 +1454,12 @@ static void object_property_init_defval(Object *obj, ObjectProperty *prop)
     visit_free(v);
 }
 
-static char *object_property_get_defval(ObjectProperty *prop)
+char *object_property_get_default(ObjectProperty *prop)
 {
+    if (!prop->defval) {
+        return NULL;
+    }
+
     return qstring_free(qobject_to_json(prop->defval), TRUE);
 }
 
@@ -1472,11 +1467,9 @@ static void object_property_set_default(ObjectProperty *prop, QObject *defval)
 {
     assert(!prop->defval);
     assert(!prop->init);
-    assert(!prop->get_default);
 
     prop->defval = defval;
     prop->init = object_property_init_defval;
-    prop->get_default = object_property_get_defval;
 }
 
 void object_property_set_default_bool(ObjectProperty *prop, bool value)
@@ -2610,8 +2603,7 @@ void object_property_add_alias(Object *obj, const char *name,
         goto out;
     }
     op->resolve = property_resolve_alias;
-    if (target_prop->get_default) {
-        op->get_default = target_prop->get_default;
+    if (target_prop->defval) {
         op->defval = qobject_ref(target_prop->defval);
     }
 



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 10/26] object: add object_property_set_defaut_{bool, str,  int, uint}()
  2020-01-23 11:28   ` Paolo Bonzini
@ 2020-01-23 11:39     ` Marc-André Lureau
  2020-01-23 14:34       ` Paolo Bonzini
  0 siblings, 1 reply; 41+ messages in thread
From: Marc-André Lureau @ 2020-01-23 11:39 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Hi

On Thu, Jan 23, 2020 at 3:29 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> This patch caught my attention because of the typo in the function, but

Ah! a french "défaut".

> I also noticed that get_default is never set to anything but
> object_property_get_defval.
>
> What do you think about removing the method and just relying on defval?
> In practice there would be a new patch that squashes 7, 10 and the thing
> after my signature.

Indeed, we could remove the get_default callback. I can't find the
reason I added it now.

Are you resending the series then?

>
> Paolo
>
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 1ea5c8c..035e41c 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -367,13 +367,6 @@ typedef void (ObjectPropertyRelease)(Object *obj,
>   */
>  typedef void (ObjectPropertyInit)(Object *obj, ObjectProperty *prop);
>
> -/**
> - * ObjectPropertyGetDefault:
> - *
> - * Get an allocated string representation of the default value.
> - */
> -typedef char *(ObjectPropertyGetDefault)(ObjectProperty *prop);
> -
>  struct ObjectProperty
>  {
>      gchar *name;
> @@ -384,7 +377,6 @@ struct ObjectProperty
>      ObjectPropertyResolve *resolve;
>      ObjectPropertyRelease *release;
>      ObjectPropertyInit *init;
> -    ObjectPropertyGetDefault *get_default;
>      void *opaque;
>      QObject *defval;
>  };
> diff --git a/qom/object.c b/qom/object.c
> index 2464a9f..aa6cf19 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -1444,15 +1444,6 @@ int64_t object_property_get_int(Object *obj, const char *name,
>      return retval;
>  }
>
> -char *object_property_get_default(ObjectProperty *prop)
> -{
> -    if (!prop->get_default) {
> -        return NULL;
> -    }
> -
> -    return prop->get_default(prop);
> -}
> -
>  static void object_property_init_defval(Object *obj, ObjectProperty *prop)
>  {
>      Visitor *v = qobject_input_visitor_new(prop->defval);
> @@ -1463,8 +1454,12 @@ static void object_property_init_defval(Object *obj, ObjectProperty *prop)
>      visit_free(v);
>  }
>
> -static char *object_property_get_defval(ObjectProperty *prop)
> +char *object_property_get_default(ObjectProperty *prop)
>  {
> +    if (!prop->defval) {
> +        return NULL;
> +    }
> +
>      return qstring_free(qobject_to_json(prop->defval), TRUE);
>  }
>
> @@ -1472,11 +1467,9 @@ static void object_property_set_default(ObjectProperty *prop, QObject *defval)
>  {
>      assert(!prop->defval);
>      assert(!prop->init);
> -    assert(!prop->get_default);
>
>      prop->defval = defval;
>      prop->init = object_property_init_defval;
> -    prop->get_default = object_property_get_defval;
>  }
>
>  void object_property_set_default_bool(ObjectProperty *prop, bool value)
> @@ -2610,8 +2603,7 @@ void object_property_add_alias(Object *obj, const char *name,
>          goto out;
>      }
>      op->resolve = property_resolve_alias;
> -    if (target_prop->get_default) {
> -        op->get_default = target_prop->get_default;
> +    if (target_prop->defval) {
>          op->defval = qobject_ref(target_prop->defval);
>      }
>
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 10/26] object: add object_property_set_defaut_{bool, str,  int, uint}()
  2020-01-23 11:39     ` Marc-André Lureau
@ 2020-01-23 14:34       ` Paolo Bonzini
  0 siblings, 0 replies; 41+ messages in thread
From: Paolo Bonzini @ 2020-01-23 14:34 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel

On 23/01/20 12:39, Marc-André Lureau wrote:
> Hi
> 
> On Thu, Jan 23, 2020 at 3:29 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>>
>> This patch caught my attention because of the typo in the function, but
> 
> Ah! a french "défaut".

I suspected that. :)

>> I also noticed that get_default is never set to anything but
>> object_property_get_defval.
>>
>> What do you think about removing the method and just relying on defval?
>> In practice there would be a new patch that squashes 7, 10 and the thing
>> after my signature.
> 
> Indeed, we could remove the get_default callback. I can't find the
> reason I added it now.
> 
> Are you resending the series then?

I have already sent a pull request.  In the end even
object_property_get_default was only used once so I just inlined it and
dropped patch 7.

Paolo



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 24/26] qom: introduce object_property_help()
  2020-01-10 15:30 ` [PATCH 24/26] qom: introduce object_property_help() Marc-André Lureau
@ 2021-03-12 12:54   ` Thomas Huth
  2021-03-12 13:00     ` Marc-André Lureau
  0 siblings, 1 reply; 41+ messages in thread
From: Thomas Huth @ 2021-03-12 12:54 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Paolo Bonzini, Daniel P . Berrange, Eduardo Habkost,
	Markus Armbruster, Philippe Mathieu-Daudé

On 10/01/2020 16.30, Marc-André Lureau wrote:
> Let's factor out the code to format a help string for a property. We
> are going to reuse it in qdev next, which will bring some consistency.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   include/qom/object.h    | 13 +++++++++++++
>   qom/object_interfaces.c | 39 +++++++++++++++++++++++----------------
>   2 files changed, 36 insertions(+), 16 deletions(-)
> 
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 933e5c6cb9..a28e37a648 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1854,6 +1854,19 @@ Object *container_get(Object *root, const char *path);
>    */
>   size_t object_type_get_instance_size(const char *typename);
>   
> +/**
> + * object_property_help:
> + * @name: the name of the property
> + * @type: the type of the property
> + * @defval: the default value
> + * @description: description of the property
> + *
> + * Returns: a user-friendly formatted string describing the property
> + * for help purposes.
> + */
> +char *object_property_help(const char *name, const char *type,
> +                           const char *defval, const char *description);
> +
>   G_DEFINE_AUTOPTR_CLEANUP_FUNC(Object, object_unref)
>   
>   #endif
> diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
> index edb4cc4a3d..b7157d6ab0 100644
> --- a/qom/object_interfaces.c
> +++ b/qom/object_interfaces.c
> @@ -158,6 +158,25 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
>       return 0;
>   }
>   
> +char *object_property_help(const char *name, const char *type,
> +                           const char *defval, const char *description)
> +{
> +    GString *str = g_string_new(NULL);
> +
> +    g_string_append_printf(str, "  %s=<%s>", name, type);
> +    if (defval) {
> +        g_string_append_printf(str, " (default: %s)", defval);
> +    }

  Hi!

There is something weird going on wit the default value text...

When I run:

$ qemu-system-x86_64 -device isa-fdc,help

I get:

isa-fdc options:
   bootindexA=<int32>
   bootindexB=<int32>
   dma=<uint32>           -  (default: (null))
   driveA=<str>           - Node name or ID of a block device to use as a backend
   driveB=<str>           - Node name or ID of a block device to use as a backend
   fallback=<FdcDriveType> - FDC drive type, 144/288/120/none/auto (default: (null))
   fdtypeA=<FdcDriveType> - FDC drive type, 144/288/120/none/auto (default: (null))
   fdtypeB=<FdcDriveType> - FDC drive type, 144/288/120/none/auto (default: (null))
   iobase=<uint32>        -  (default: (null))
   irq=<uint32>           -  (default: (null))

Why is it showing "(null)" as default values?

  Thomas



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 24/26] qom: introduce object_property_help()
  2021-03-12 12:54   ` Thomas Huth
@ 2021-03-12 13:00     ` Marc-André Lureau
  0 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2021-03-12 13:00 UTC (permalink / raw)
  To: Thomas Huth
  Cc: Daniel P . Berrange, Eduardo Habkost, Markus Armbruster,
	qemu-devel, Paolo Bonzini, Philippe Mathieu-Daudé

[-- Attachment #1: Type: text/plain, Size: 3842 bytes --]

Hi

On Fri, Mar 12, 2021 at 4:54 PM Thomas Huth <thuth@redhat.com> wrote:

> On 10/01/2020 16.30, Marc-André Lureau wrote:
> > Let's factor out the code to format a help string for a property. We
> > are going to reuse it in qdev next, which will bring some consistency.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >   include/qom/object.h    | 13 +++++++++++++
> >   qom/object_interfaces.c | 39 +++++++++++++++++++++++----------------
> >   2 files changed, 36 insertions(+), 16 deletions(-)
> >
> > diff --git a/include/qom/object.h b/include/qom/object.h
> > index 933e5c6cb9..a28e37a648 100644
> > --- a/include/qom/object.h
> > +++ b/include/qom/object.h
> > @@ -1854,6 +1854,19 @@ Object *container_get(Object *root, const char
> *path);
> >    */
> >   size_t object_type_get_instance_size(const char *typename);
> >
> > +/**
> > + * object_property_help:
> > + * @name: the name of the property
> > + * @type: the type of the property
> > + * @defval: the default value
> > + * @description: description of the property
> > + *
> > + * Returns: a user-friendly formatted string describing the property
> > + * for help purposes.
> > + */
> > +char *object_property_help(const char *name, const char *type,
> > +                           const char *defval, const char *description);
> > +
> >   G_DEFINE_AUTOPTR_CLEANUP_FUNC(Object, object_unref)
> >
> >   #endif
> > diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
> > index edb4cc4a3d..b7157d6ab0 100644
> > --- a/qom/object_interfaces.c
> > +++ b/qom/object_interfaces.c
> > @@ -158,6 +158,25 @@ int user_creatable_add_opts_foreach(void *opaque,
> QemuOpts *opts, Error **errp)
> >       return 0;
> >   }
> >
> > +char *object_property_help(const char *name, const char *type,
> > +                           const char *defval, const char *description)
> > +{
> > +    GString *str = g_string_new(NULL);
> > +
> > +    g_string_append_printf(str, "  %s=<%s>", name, type);
> > +    if (defval) {
> > +        g_string_append_printf(str, " (default: %s)", defval);
> > +    }
>
>   Hi!
>
> There is something weird going on wit the default value text...
>
> When I run:
>
> $ qemu-system-x86_64 -device isa-fdc,help
>
> I get:
>
> isa-fdc options:
>    bootindexA=<int32>
>    bootindexB=<int32>
>    dma=<uint32>           -  (default: (null))
>    driveA=<str>           - Node name or ID of a block device to use as a
> backend
>    driveB=<str>           - Node name or ID of a block device to use as a
> backend
>    fallback=<FdcDriveType> - FDC drive type, 144/288/120/none/auto
> (default: (null))
>    fdtypeA=<FdcDriveType> - FDC drive type, 144/288/120/none/auto
> (default: (null))
>    fdtypeB=<FdcDriveType> - FDC drive type, 144/288/120/none/auto
> (default: (null))
>    iobase=<uint32>        -  (default: (null))
>    irq=<uint32>           -  (default: (null))
>
> Why is it showing "(null)" as default values?
>

Congratulations, you found a regression! :)

QEMU emulator version 5.2.0 (qemu-5.2.0-6.fc33.1)
qemu-system-x86_64 -device isa-fdc,help
isa-fdc options:
  bootindexA=<int32>
  bootindexB=<int32>
  check_media_rate=<bool> - on/off (default: true)
  dma=<uint32>           -  (default: 2)
  driveA=<str>           - Node name or ID of a block device to use as a
backend
  driveB=<str>           - Node name or ID of a block device to use as a
backend
  fallback=<FdcDriveType> - FDC drive type, 144/288/120/none/auto (default:
"288")
  fdtypeA=<FdcDriveType> - FDC drive type, 144/288/120/none/auto (default:
"auto")
  fdtypeB=<FdcDriveType> - FDC drive type, 144/288/120/none/auto (default:
"auto")
  iobase=<uint32>        -  (default: 1008)
  irq=<uint32>           -  (default: 6)

[-- Attachment #2: Type: text/html, Size: 4949 bytes --]

^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 06/26] object: add class property initializer
  2019-12-01 11:15 [PATCH 00/26] Make QDev use class properties Marc-André Lureau
@ 2019-12-01 11:15 ` Marc-André Lureau
  0 siblings, 0 replies; 41+ messages in thread
From: Marc-André Lureau @ 2019-12-01 11:15 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, berrange, ehabkost, Marc-André Lureau

This callback is used to set default value in following patch "object:
add object_property_set_defaut_{bool,str,int,uint}()".

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h | 16 ++++++++++++++--
 qom/object.c         | 14 ++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 128d00c77f..e15ebd486b 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -303,6 +303,8 @@ typedef struct InterfaceInfo InterfaceInfo;
  */
 
 
+typedef struct ObjectProperty ObjectProperty;
+
 /**
  * ObjectPropertyAccessor:
  * @obj: the object that owns the property
@@ -350,7 +352,16 @@ typedef void (ObjectPropertyRelease)(Object *obj,
                                      const char *name,
                                      void *opaque);
 
-typedef struct ObjectProperty
+/**
+ * ObjectPropertyInit:
+ * @obj: the object that owns the property
+ * @prop: the property to set
+ *
+ * Called when a property is initialized.
+ */
+typedef void (ObjectPropertyInit)(Object *obj, ObjectProperty *prop);
+
+struct ObjectProperty
 {
     gchar *name;
     gchar *type;
@@ -359,8 +370,9 @@ typedef struct ObjectProperty
     ObjectPropertyAccessor *set;
     ObjectPropertyResolve *resolve;
     ObjectPropertyRelease *release;
+    ObjectPropertyInit *init;
     void *opaque;
-} ObjectProperty;
+};
 
 /**
  * ObjectUnparent:
diff --git a/qom/object.c b/qom/object.c
index f1e1e0947b..4b9f8d8668 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -450,6 +450,19 @@ void object_apply_compat_props(Object *obj)
     }
 }
 
+static void object_class_property_init_all(Object *obj)
+{
+    ObjectPropertyIterator iter;
+    ObjectProperty *prop;
+
+    object_class_property_iter_init(&iter, object_get_class(obj));
+    while ((prop = object_property_iter_next(&iter))) {
+        if (prop->init) {
+            prop->init(obj, prop);
+        }
+    }
+}
+
 static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
 {
     Object *obj = data;
@@ -463,6 +476,7 @@ static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
     memset(obj, 0, type->instance_size);
     obj->class = type->class;
     object_ref(obj);
+    object_class_property_init_all(obj);
     obj->properties = g_hash_table_new_full(g_str_hash, g_str_equal,
                                             NULL, object_property_free);
     object_init_with_type(obj, type);
-- 
2.24.0



^ permalink raw reply	[flat|nested] 41+ messages in thread

end of thread, other threads:[~2021-03-12 13:02 UTC | newest]

Thread overview: 41+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-10 15:30 [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
2020-01-10 15:30 ` [PATCH 01/26] object: add extra sanity checks Marc-André Lureau
2020-01-10 19:18   ` Philippe Mathieu-Daudé
2020-01-10 15:30 ` [PATCH 02/26] qdev: remove duplicated qdev_property_add_static() doc Marc-André Lureau
2020-01-10 15:30 ` [PATCH 03/26] qdev: remove extraneous error Marc-André Lureau
2020-01-10 15:30 ` [PATCH 04/26] qdev: move helper function to monitor/misc Marc-André Lureau
2020-01-10 19:18   ` Philippe Mathieu-Daudé
2020-01-10 15:30 ` [PATCH 05/26] object: avoid extra class property key duplication Marc-André Lureau
2020-01-10 15:30 ` [PATCH 06/26] object: add class property initializer Marc-André Lureau
2020-01-10 15:30 ` [PATCH 07/26] object: add object_property_get_defaut() Marc-André Lureau
2020-01-10 15:30 ` [PATCH 08/26] object: make object_class_property_add* return property Marc-André Lureau
2020-01-10 15:30 ` [PATCH 09/26] qstring: add qstring_free() Marc-André Lureau
2020-01-10 15:30 ` [PATCH 10/26] object: add object_property_set_defaut_{bool, str, int, uint}() Marc-André Lureau
2020-01-23 11:28   ` Paolo Bonzini
2020-01-23 11:39     ` Marc-André Lureau
2020-01-23 14:34       ` Paolo Bonzini
2020-01-10 15:30 ` [PATCH 11/26] object: do not free class properties Marc-André Lureau
2020-01-10 15:30 ` [PATCH 12/26] object: check strong flag with & Marc-André Lureau
2020-01-10 15:30 ` [PATCH 13/26] object: rename link "child" to "target" Marc-André Lureau
2020-01-10 15:30 ` [PATCH 14/26] object: add direct link flag Marc-André Lureau
2020-01-10 15:30 ` [PATCH 15/26] object: express const link with link property Marc-André Lureau
2020-01-10 15:30 ` [PATCH 16/26] object: add object_class_property_add_link() Marc-André Lureau
2020-01-10 15:30 ` [PATCH 17/26] object: release all props Marc-André Lureau
2020-01-10 15:30 ` [PATCH 18/26] object: return self in object_ref() Marc-André Lureau
2020-01-10 19:22   ` Philippe Mathieu-Daudé
2020-01-10 15:30 ` [PATCH 19/26] qdev: set properties with device_class_set_props() Marc-André Lureau
2020-01-23 11:08   ` Paolo Bonzini
2020-01-23 11:11     ` Marc-André Lureau
2020-01-10 15:30 ` [PATCH 20/26] qdev: move instance properties to class properties Marc-André Lureau
2020-01-10 15:30 ` [PATCH 21/26] qdev: register properties as " Marc-André Lureau
2020-01-10 15:30 ` [PATCH 22/26] vl: print default value in object help Marc-André Lureau
2020-01-10 15:30 ` [PATCH 23/26] qom: simplify qmp_device_list_properties() Marc-André Lureau
2020-01-10 15:30 ` [PATCH 24/26] qom: introduce object_property_help() Marc-André Lureau
2021-03-12 12:54   ` Thomas Huth
2021-03-12 13:00     ` Marc-André Lureau
2020-01-10 15:30 ` [PATCH 25/26] qapi/qmp: add ObjectPropertyInfo.default-value Marc-André Lureau
2020-01-10 15:30 ` [PATCH 26/26] qdev: use object_property_help() Marc-André Lureau
2020-01-10 15:38 ` [PATCH 00/26] Various qom & qdev enhancements Marc-André Lureau
2020-01-20 16:45   ` Stefan Hajnoczi
2020-01-21 16:57   ` Paolo Bonzini
  -- strict thread matches above, loose matches on Subject: below --
2019-12-01 11:15 [PATCH 00/26] Make QDev use class properties Marc-André Lureau
2019-12-01 11:15 ` [PATCH 06/26] object: add class property initializer Marc-André Lureau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.