Am 11. Juli 2026 22:34:53 UTC schrieb Alexander Graf <[email protected]>:
>
>Motivation
>----------
>Markus observed [1] that a device reaching realize without a
>composition-tree parent is a modeling bug, and that the
>/machine/unattached container that catches such devices today is a
>bug attractor rather than a safety net: it hides the fact that nobody
>decided "what is part of what", and it gives the object an unstable,
>implementation-defined QOM path that is useless for qom-get/qom-set and
>for management tools that want to address board-created devices.
>
>This series makes composition-tree parenting mandatory. After it,
>device_set_realized() errors on a device with no parent,
>memory_region_do_init() asserts that a named region has an owner,
>qdev_connect_gpio_out_named() asserts that the pin being wired has a
>parent, and /machine/unattached is deleted. Every board-created object
>has a stable, human-chosen path.
Hi Alex,
Thanks for the cleanup! I hope the series will eventually find its way into the
codebase.
>
>[1] https://lore.kernel.org/qemu-devel/[email protected]/
>
>Approach
>--------
>Rather than add a parallel "parented" API and migrate callers over
>years, each creation helper is converted in a single rename->reintroduce
>pair: a tree-wide Coccinelle rename of foo() to foo_orphan(), followed
>immediately by a patch that reintroduces foo() with a leading
>(Object *parent, const char *id, ...) signature.
Perhaps I'd have appended the two parameters at the end. This way, the most
interesting parameters, especially the type, stand out most, helping me
mentally "parse" the code more easily. But maybe this is just me, so this
comment shall be no blocker.
>The tree builds after
>every patch and never carries two spellings of the same helper.
>
>The bulk of the series then converts *_orphan() call sites to the
>parented form, one hw/ subdirectory per patch. Most of those commits
>carry a per-callsite table in the commit message giving the chosen
>parent expression, the chosen child name, and the one-line reason
>("board init -> machine", "realize of X -> X", ...); the smaller ones
>carry a prose summary of the same. Those tables are the substance the
>RFC is asking maintainers to review: the mechanical part is trivial,
>the modeling decisions are not.
>
>Some hw/arm commit messages carry wide per-callsite tables that exceed
>76 columns; please view with a fixed-width, non-wrapping mail reader.
>
>Once no *_orphan() callers remain the _orphan variants are deleted, the
>enforcement checks are armed, and /machine/unattached is removed.
>
>Series shape
>------------
> 001-009 core API: object_new_child(); rename->reintroduce for
> qdev_new, sysbus_create_*, pci_new*, isa_new*,
> i2c_slave_*, ssi/usb/sd/adb/virtio/hda/aux/spapr-vio,
> cpu_create
> 010-082 hw/*: convert *_orphan() call sites to the parented form,
> one subdirectory per patch, each with a per-callsite
> reasoning table (or prose summary) in the commit message
> 083-088 delete the qdev/sysbus/pci/isa/i2c/ssi/usb/cpu *_orphan()
> creator variants
> 089-107 memory: give the remaining owner==NULL memory regions an
> owner, then assert on owner==NULL for named regions
> 108-116 irq: rename->reintroduce qemu_allocate_irq*() with an
> owner and name; convert callers; delete _orphan variants
> 117-130 parent the remaining non-device singletons and per-device
> helper objects (main-system-bus, accel, reset container,
> per-MR helpers, per-devfn IOMMU objects, board-created
> CPUs, ...)
> 131-132 arm the enforcement checks and delete /machine/unattached
> 133-134 docs/devel/qom.rst: parenting contract; MAINTAINERS
>
>The Coccinelle scripts used for the rename steps are included under
>scripts/coccinelle/qom-parent/ and referenced from the corresponding
>commit messages.
>
>Not converted in this series
>----------------------------
>A handful of long-lived objects are deliberately left path-less for
>now, each for a specific lifecycle reason called out in the relevant
>commit message:
>
> * TYPE_MIGRATION is a TYPE_DEVICE that is never realized, per the
> upstream comment "TODO make this TYPE_OBJECT once QOM provides
> -global for objects". Parenting it under /machine trips the
> qdev_assert_realized_properly() walk. It can move under /machine
> once it becomes a plain TYPE_OBJECT.
> * RamDiscardManager is unref'd from memory_region_finalize() itself,
> so making it a child<> of the MR would use-after-free during MR
> teardown.
> * TPM backends and VFIO IOMMU containers are user-configurable and
> dynamically created; they belong under /objects/<id> or a
> dedicated /machine/vfio container respectively, and are best
> handled in a follow-up on top of this series.
> * QIOChannel* and per-mapping virtio-shmem objects remain path-less
> by design (transient, refcounted, no stable identity).
>
>Verification
>------------
> * The tree builds for 20 softmmu targets after every patch.
> * Every machine type across those targets was smoke-tested with
> "-M <machine> -S"; none abort on the new assertions.
> * "info qom-tree" on q35 and on aarch64 virt shows no
> /machine/unattached node after the final patch.
> * grep -r 'machine_get_container("unattached")' returns no hits.
>
>AI-assistance disclosure (docs/devel/code-provenance.rst)
This series seems to affect migration. For example, it gives the "ocram" memory
region in various imx devices a parent which has been identified as migration
breaking before [1]. Migration isn't an issue for imx devices, so no objection
there.
How shall we deal with machines where we do care about migration compatibility?
Or was migration always broken there due to unstable QOM paths, and so far we
were just lucky?
Best regards,
Bernhard
[1]
https://lore.kernel.org/qemu-devel/CAFEAcA9cfiDB3+=k+mshptujvhcpexwaf+1y8khav692ora...@mail.gmail.com/
>----------------------------------------------------------
>Every patch in this series was produced with AI assistance and
>reviewed by the human submitter. Each commit carries an
>
> Assisted-by: Kiro
>
>trailer following the format documented in the Linux kernel's
>Documentation/process/coding-assistants.rst. The tree-wide rename
>patches are Coccinelle-equivalent mechanical transforms; the
>per-callsite parent/name choices in the hw/* commits are the
>AI-assisted modeling decisions this RFC is asking maintainers to
>review.
>
>QEMU's current policy in docs/devel/code-provenance.rst is to decline
>AI-generated contributions absent an explicit exception. This RFC is
>therefore posted to open that discussion: I am requesting an exception
>for this series (or, if the community prefers, will reauthor the parts
>the policy requires) and will not post a non-RFC v1 until that is
>resolved on qemu-devel. The Signed-off-by DCO certification is mine
>as the human reviewer taking full responsibility for the contribution.
>
>
>Alexander Graf (134):
> qom: Introduce object_new_child()
> qdev: Rename qdev_new()/qdev_try_new() to *_orphan()
> qdev: Reintroduce qdev_new() with a mandatory QOM parent
> sysbus: Make sysbus_create_simple()/_varargs() take a QOM parent
> pci: Make pci_new*()/pci_create_simple*() take a QOM parent
> isa: Make isa_new()/isa_try_new()/isa_create_simple() take a QOM
> parent
> i2c: Make i2c_slave_new()/i2c_slave_create_simple() take a QOM parent
> ssi, usb: Make bus-layer creators take a QOM parent
> cpu: Make cpu_create() take a QOM parent
> hw/avr: Give onboard devices a QOM parent
> hw/tricore: Give onboard devices a QOM parent
> hw/xtensa: Give onboard devices a QOM parent
> hw/alpha: Give onboard devices a QOM parent
> hw/nitro: Give onboard devices a QOM parent
> hw/vmapple: Give onboard devices a QOM parent
> hw/hppa: Give onboard devices a QOM parent
> hw/microblaze: Give onboard devices a QOM parent
> hw/sh4: Give onboard devices a QOM parent
> hw/s390x: Give onboard devices a QOM parent
> hw/or1k: Give onboard devices a QOM parent
> hw/loongarch: Give onboard devices a QOM parent
> hw/intc: Give onboard devices a QOM parent
> hw/pci-host: Give onboard devices a QOM parent
> hw/core: Give onboard devices a QOM parent
> hw/remote: Give onboard devices a QOM parent
> hw/ufs: Give onboard devices a QOM parent
> hw/nvme: Give onboard devices a QOM parent
> hw/vfio: Give onboard devices a QOM parent
> hw/mem: Give onboard devices a QOM parent
> hw/cxl: Give onboard devices a QOM parent
> hw/hexagon: Give onboard devices a QOM parent
> hw/xen: Give onboard devices a QOM parent
> hw/display: Give onboard devices a QOM parent
> hw/nvram: Give onboard devices a QOM parent
> hw/dma: Give onboard devices a QOM parent
> hw/misc: Give onboard devices a QOM parent
> hw/scsi: Give onboard devices a QOM parent
> hw/net: Give onboard devices a QOM parent
> hw/ide: Give onboard devices a QOM parent
> hw/i3c: Give onboard devices a QOM parent
> hw/pci-bridge: Give onboard devices a QOM parent
> hw/sparc64: Give onboard devices a QOM parent
> hw/sparc: Give onboard devices a QOM parent
> hw/m68k: Give onboard devices a QOM parent
> hw/rtc: Give onboard devices a QOM parent
> hw/i2c: Give onboard devices a QOM parent
> hw/block: Give onboard devices a QOM parent
> hw/char: Give onboard devices a QOM parent
> hw/isa: Give onboard devices a QOM parent
> hw/pci: Give onboard devices a QOM parent
> hw/riscv: Give onboard devices a QOM parent
> hw/mips: Give onboard devices a QOM parent
> hw/i386: Give onboard devices a QOM parent
> hw/ppc: Give onboard devices a QOM parent
> hw/pci, hw/isa: Give VGA and slot-NIC helpers a QOM parent
> hw/arm/virt: Give onboard devices a QOM parent
> hw/arm/sbsa-ref: Give onboard devices a QOM parent
> hw/arm/xilinx-zynq: Give onboard devices a QOM parent
> hw/arm/xlnx-versal, xlnx-zynqmp: Give onboard devices a QOM parent
> hw/arm/realview, integratorcp: Give onboard devices a QOM parent
> hw/arm/npcm: Give onboard devices a QOM parent
> hw/arm/versatile, vexpress: Give onboard devices a QOM parent
> hw/arm/stellaris, musicpal: Give onboard devices a QOM parent
> hw/arm/exynos: Give onboard devices a QOM parent
> hw/arm/allwinner: Give onboard devices a QOM parent
> hw/arm/strongarm: Give onboard devices a QOM parent
> hw/arm/omap: Give onboard devices a QOM parent
> hw/arm/mps2: Give onboard devices a QOM parent
> hw/arm/imx: Give onboard devices a QOM parent
> hw/arm/misc: Give onboard devices a QOM parent
> hw/arm/aspeed: Give onboard devices a QOM parent (part 1)
> hw/arm/aspeed: Give onboard devices a QOM parent (part 2)
> hw/nvram/at24c: Give at24c_eeprom_init() a QOM parent
> hw/i386/pc: Give pcspk a QOM parent
> hw/timer, hw/net: Give i8254 and isa-ne2000 helpers a QOM parent
> hw/misc/unimp: Give create_unimplemented_device() a QOM parent
> hw/usb: Give -usbdevice and auto-hub devices a QOM parent
> hw/audio: Give -audio model= devices a QOM parent
> hw/xen: Give xenstore-driven backend devices a QOM parent
> hw/nitro: Give the vsock bridge a QOM parent
> hw/isa: Give the isabus-bridge a QOM parent
> net, target/mips: Give -nic and CPU-with-clock helpers a QOM parent
> usb, ssi, i2c: Remove *_orphan() creator variants
> isa: Remove *_orphan() creator variants
> pci: Remove *_orphan() creator variants
> cpu: Remove cpu_create_orphan()
> sysbus: Remove *_orphan() creator variants
> qdev: Remove qdev_new_orphan() and qdev_try_new_orphan()
> memory: Accept non-device owners in memory_region_init_ram()
> hw/misc-boards: Give memory regions an explicit owner
> hw/mips: Give memory regions an explicit owner
> hw/riscv: Give memory regions an explicit owner
> hw/i386: Give memory regions an explicit owner
> hw/arm: Give memory regions an explicit owner
> hw/arm/omap1: Give memory regions an explicit owner
> hw/sh4: Give memory regions an explicit owner
> hw/m68k: Give memory regions an explicit owner
> hw/ppc: Give memory regions an explicit owner
> hw/tricore: Give memory regions an explicit owner
> hw/xtensa: Give memory regions an explicit owner
> hw/display: Give memory regions an explicit owner
> hw/arm/omap: Give lcdc and dma memory regions an explicit owner
> hw/char: Give parallel and htif memory regions an explicit owner
> hw/remote: Give memory regions an explicit owner
> system, backends: Give named memory regions an explicit owner
> hw/ide: Let ide_init_ioport() take an explicit owner
> memory: Require an owner for named memory regions
> irq: Rename qemu_allocate_irq*() and friends to *_orphan()
> irq: Reintroduce qemu_allocate_irq*() with a mandatory owner and name
> hw/pci, hw/usb, system: Give allocated IRQs an owner and name
> hw/i386, hw/xen: Give allocated IRQs an owner and name
> hw/arm: Give allocated IRQs an owner and name
> hw/xtensa: Give allocated IRQs an owner and name
> hw: Give allocated IRQs an owner and name
> hw/core: Parent GPIO input IRQs and embedded IRQState via QOM
> irq: Delete the *_orphan() IRQ allocation variants
> sysbus: Parent main-system-bus directly under /machine
> accel: Parent the accelerator singleton under /machine
> hw/core/reset: Give the root reset container and legacy shims a QOM
> path
> system: Parent per-MR helper objects under their owner
> hw/virtio, hw/display: Parent per-device helper objects
> hw/i386/amd_iommu: Parent internally-created AMDVI-PCI under the IOMMU
> hw/s390x, hw/remote: Parent per-devfn IOMMU objects
> hw/pci-host/raven: Parent the OR-IRQ under the host bridge
> hw/arm/mps2: Parent the OR-IRQ gates under the machine
> hw/arm/digic: Parent the DIGIC SoC under the machine
> hw/microblaze: Parent the CPU under the machine
> hw: Pair object_initialize_child() with plain realize()
> hw: Parent board-created CPUs under the machine
> hw/pci-host/versatile: Use object_initialize_child() for pci_dev
> docs, qapi, scripts, iotests: Update /machine/unattached path
> references
> qom: Delete /machine/unattached and error on unparented realize
> docs/devel/qom: Document the composition-tree parenting contract
> MAINTAINERS: Add scripts/coccinelle/qom-parent/ under QOM
>
> MAINTAINERS | 1 +
> accel/accel-system.c | 4 +-
> backends/igvm.c | 6 +-
> bsd-user/main.c | 3 +-
> docs/devel/qom.rst | 96 +++++++
> docs/devel/s390-cpu-topology.rst | 2 +-
> docs/system/cpu-hotplug.rst | 4 +-
> hw/alpha/alpha_sys.h | 3 +-
> hw/alpha/dp264.c | 16 +-
> hw/alpha/typhoon.c | 10 +-
> hw/arm/allwinner-a10.c | 4 +-
> hw/arm/allwinner-h3.c | 34 ++-
> hw/arm/allwinner-r40.c | 4 +-
> hw/arm/armsse.c | 13 +-
> hw/arm/aspeed.c | 39 +--
> hw/arm/aspeed_ast1040_evb.c | 6 +-
> hw/arm/aspeed_ast10x0_evb.c | 12 +-
> hw/arm/aspeed_ast2400_palmetto.c | 8 +-
> hw/arm/aspeed_ast2400_quanta-q71l.c | 18 +-
> hw/arm/aspeed_ast2400_supermicrox11.c | 8 +-
> hw/arm/aspeed_ast2500_evb.c | 7 +-
> hw/arm/aspeed_ast2500_g220a.c | 11 +-
> hw/arm/aspeed_ast2500_romulus.c | 3 +-
> hw/arm/aspeed_ast2500_supermicro-x11spi.c | 8 +-
> hw/arm/aspeed_ast2500_tiogapass.c | 13 +-
> hw/arm/aspeed_ast2500_witherspoon.c | 34 +--
> hw/arm/aspeed_ast2500_yosemitev2.c | 13 +-
> hw/arm/aspeed_ast2600_anacapa.c | 51 ++--
> hw/arm/aspeed_ast2600_bletchley.c | 33 ++-
> hw/arm/aspeed_ast2600_catalina.c | 99 +++----
> hw/arm/aspeed_ast2600_evb.c | 7 +-
> hw/arm/aspeed_ast2600_fby35.c | 20 +-
> hw/arm/aspeed_ast2600_fuji.c | 111 ++++----
> hw/arm/aspeed_ast2600_gb200nvl.c | 24 +-
> hw/arm/aspeed_ast2600_rainier.c | 188 ++++++++------
> hw/arm/aspeed_ast27x0-fc.c | 9 +-
> hw/arm/aspeed_ast27x0_evb.c | 3 +-
> hw/arm/aspeed_soc_common.c | 14 +-
> hw/arm/bananapi_m2u.c | 6 +-
> hw/arm/collie.c | 6 +-
> hw/arm/cubieboard.c | 6 +-
> hw/arm/digic_boards.c | 5 +-
> hw/arm/exynos4210.c | 70 ++---
> hw/arm/exynos4_boards.c | 15 +-
> hw/arm/fsl-imx25.c | 2 +-
> hw/arm/fsl-imx31.c | 2 +-
> hw/arm/fsl-imx6.c | 7 +-
> hw/arm/fsl-imx6ul.c | 37 +--
> hw/arm/fsl-imx7.c | 41 +--
> hw/arm/fsl-imx8mm.c | 2 +-
> hw/arm/fsl-imx8mp.c | 2 +-
> hw/arm/imx25_pdk.c | 6 +-
> hw/arm/imx8mm-evk.c | 6 +-
> hw/arm/imx8mp-evk.c | 6 +-
> hw/arm/integratorcp.c | 56 ++--
> hw/arm/kzm.c | 6 +-
> hw/arm/max78000_soc.c | 107 ++++----
> hw/arm/max78000fthr.c | 5 +-
> hw/arm/mcimx6ul-evk.c | 4 +-
> hw/arm/mcimx7d-sabre.c | 4 +-
> hw/arm/mps2-tz.c | 27 +-
> hw/arm/mps2.c | 91 ++++---
> hw/arm/mps3r.c | 20 +-
> hw/arm/msf2-soc.c | 24 +-
> hw/arm/msf2-som.c | 12 +-
> hw/arm/musca.c | 4 +-
> hw/arm/musicpal.c | 50 ++--
> hw/arm/netduino2.c | 5 +-
> hw/arm/netduinoplus2.c | 5 +-
> hw/arm/npcm7xx.c | 95 +++----
> hw/arm/npcm7xx_boards.c | 117 +++++----
> hw/arm/npcm8xx.c | 147 +++++------
> hw/arm/npcm8xx_boards.c | 19 +-
> hw/arm/nrf51_soc.c | 4 +-
> hw/arm/olimex-stm32-h405.c | 5 +-
> hw/arm/omap1.c | 244 ++++++++++--------
> hw/arm/omap_sx1.c | 20 +-
> hw/arm/orangepi.c | 4 +-
> hw/arm/raspi.c | 4 +-
> hw/arm/realview.c | 113 ++++----
> hw/arm/sabrelite.c | 5 +-
> hw/arm/sbsa-ref.c | 76 +++---
> hw/arm/stellaris.c | 99 ++++---
> hw/arm/stm32f100_soc.c | 62 ++---
> hw/arm/stm32f205_soc.c | 2 +-
> hw/arm/stm32f405_soc.c | 88 +++----
> hw/arm/stm32l4x5_soc.c | 88 +++----
> hw/arm/stm32vldiscovery.c | 5 +-
> hw/arm/strongarm.c | 27 +-
> hw/arm/strongarm.h | 2 +-
> hw/arm/versatilepb.c | 85 +++---
> hw/arm/vexpress.c | 87 ++++---
> hw/arm/virt.c | 97 +++----
> hw/arm/xilinx_zynq.c | 160 ++++++------
> hw/arm/xlnx-versal-virt.c | 5 +-
> hw/arm/xlnx-versal.c | 197 ++++++--------
> hw/arm/xlnx-zcu102.c | 14 +-
> hw/arm/xlnx-zynqmp.c | 8 +-
> hw/audio/intel-hda.c | 4 +-
> hw/audio/model.c | 5 +-
> hw/avr/atmega.c | 24 +-
> hw/block/fdc-sysbus.c | 13 +-
> hw/block/fdc.c | 4 +-
> hw/block/pflash_cfi01.c | 6 +-
> hw/block/pflash_cfi02.c | 6 +-
> hw/block/xen-block.c | 5 +-
> hw/char/diva-gsp.c | 3 +-
> hw/char/exynos4210_uart.c | 6 +-
> hw/char/mcf_uart.c | 11 +-
> hw/char/mchp_pfsoc_mmuart.c | 4 +-
> hw/char/omap_uart.c | 4 +-
> hw/char/parallel-isa.c | 10 +-
> hw/char/parallel.c | 5 +-
> hw/char/pl011.c | 6 +-
> hw/char/riscv_htif.c | 5 +-
> hw/char/serial-isa.c | 11 +-
> hw/char/serial-mm.c | 6 +-
> hw/char/sifive_uart.c | 8 +-
> hw/char/spapr_vty.c | 6 +-
> hw/char/xen_console.c | 7 +-
> hw/core/cpu-common.c | 6 +-
> hw/core/gpio.c | 24 +-
> hw/core/irq.c | 38 +--
> hw/core/null-machine.c | 2 +-
> hw/core/qdev-user.c | 6 +-
> hw/core/qdev.c | 39 ++-
> hw/core/reset.c | 13 +-
> hw/core/sysbus.c | 22 +-
> hw/cxl/cxl-host.c | 9 +-
> hw/display/cg3.c | 2 +-
> hw/display/g364fb.c | 2 +-
> hw/display/macfb.c | 2 +-
> hw/display/omap_lcdc.c | 5 +-
> hw/display/sii9022.c | 2 +-
> hw/display/sm501.c | 6 +-
> hw/display/vhost-user-gpu.c | 12 +-
> hw/display/virtio-gpu-gl.c | 2 +-
> hw/display/vmware_vga.c | 2 +-
> hw/display/xlnx_dp.c | 14 +-
> hw/dma/i8257.c | 10 +-
> hw/dma/omap_dma.c | 9 +-
> hw/dma/rc4030.c | 7 +-
> hw/hexagon/hexagon_dsp.c | 21 +-
> hw/hexagon/virt.c | 29 +--
> hw/hppa/machine.c | 96 ++++---
> hw/i2c/aspeed_i2c.c | 4 +-
> hw/i2c/core.c | 22 +-
> hw/i2c/smbus_eeprom.c | 11 +-
> hw/i386/amd_iommu.c | 3 +-
> hw/i386/isapc.c | 17 +-
> hw/i386/kvm/clock.c | 4 +-
> hw/i386/kvm/clock.h | 2 +-
> hw/i386/kvm/i8259.c | 8 +-
> hw/i386/kvm/xen-stubs.c | 2 +-
> hw/i386/kvm/xen_evtchn.c | 6 +-
> hw/i386/kvm/xen_evtchn.h | 3 +-
> hw/i386/kvm/xen_gnttab.c | 6 +-
> hw/i386/kvm/xen_gnttab.h | 2 +-
> hw/i386/kvm/xen_overlay.c | 6 +-
> hw/i386/kvm/xen_overlay.h | 2 +-
> hw/i386/kvm/xen_primary_console.c | 5 +-
> hw/i386/kvm/xen_primary_console.h | 2 +-
> hw/i386/kvm/xen_xenstore.c | 5 +-
> hw/i386/kvm/xen_xenstore.h | 2 +-
> hw/i386/microvm.c | 34 +--
> hw/i386/nitro_enclave.c | 9 +-
> hw/i386/pc.c | 96 +++----
> hw/i386/pc_piix.c | 28 +-
> hw/i386/pc_q35.c | 42 +--
> hw/i386/pc_sysfw.c | 16 +-
> hw/i386/sgx.c | 5 +-
> hw/i386/x86-common.c | 33 ++-
> hw/i386/x86-cpu.c | 4 +-
> hw/i386/xen/xen-hvm.c | 12 +-
> hw/i386/xen/xen-pvh.c | 5 +-
> hw/i386/xen/xen_pvdevice.c | 2 +-
> hw/i3c/core.c | 19 +-
> hw/ide/ahci.c | 2 +-
> hw/ide/ide-bus.c | 5 +-
> hw/ide/ide-internal.h | 2 +-
> hw/ide/ioport.c | 37 ++-
> hw/ide/isa.c | 9 +-
> hw/ide/pci.c | 2 +-
> hw/ide/piix.c | 2 +-
> hw/intc/apic_common.c | 3 +-
> hw/intc/exynos4210_gic.c | 4 +-
> hw/intc/i8259.c | 6 +-
> hw/intc/i8259_common.c | 7 +-
> hw/intc/riscv_aclint.c | 16 +-
> hw/intc/riscv_aplic.c | 13 +-
> hw/intc/riscv_imsic.c | 7 +-
> hw/intc/s390_flic.c | 12 +-
> hw/intc/sh_intc.c | 21 +-
> hw/intc/sifive_plic.c | 7 +-
> hw/ipack/ipack.c | 11 +-
> hw/ipmi/ipmi_bt.c | 2 +-
> hw/ipmi/ipmi_kcs.c | 2 +-
> hw/isa/i82378.c | 13 +-
> hw/isa/isa-bus.c | 44 ++--
> hw/isa/isa-superio.c | 25 +-
> hw/isa/lpc_ich9.c | 2 +-
> hw/isa/piix.c | 4 +-
> hw/isa/vt82c686.c | 7 +-
> hw/loongarch/virt.c | 56 ++--
> hw/m68k/an5206.c | 13 +-
> hw/m68k/mcf5206.c | 8 +-
> hw/m68k/mcf5208.c | 32 ++-
> hw/m68k/mcf_intc.c | 7 +-
> hw/m68k/next-cube.c | 26 +-
> hw/m68k/q800.c | 28 +-
> hw/m68k/virt.c | 25 +-
> hw/mem/sparse-mem.c | 6 +-
> hw/microblaze/petalogix_ml605_mmu.c | 40 ++-
> hw/microblaze/petalogix_s3adsp1800_mmu.c | 27 +-
> hw/microblaze/xlnx-zynqmp-pmu.c | 4 +-
> hw/mips/boston.c | 32 +--
> hw/mips/cps.c | 5 +-
> hw/mips/fuloong2e.c | 24 +-
> hw/mips/jazz.c | 73 +++---
> hw/mips/loongson3_virt.c | 40 +--
> hw/mips/malta.c | 49 ++--
> hw/mips/mips_int.c | 2 +-
> hw/misc/empty_slot.c | 7 +-
> hw/misc/led.c | 15 +-
> hw/misc/macio/macio.c | 2 +-
> hw/misc/sifive_e_prci.c | 6 +-
> hw/misc/sifive_test.c | 6 +-
> hw/net/can/can_kvaser_pci.c | 2 +-
> hw/net/imx_fec.c | 4 +-
> hw/net/lan9118.c | 10 +-
> hw/net/smc91c111.c | 6 +-
> hw/net/spapr_llan.c | 6 +-
> hw/net/xen_nic.c | 5 +-
> hw/nitro/machine.c | 11 +-
> hw/nitro/nitro-vsock-bus.c | 9 +-
> hw/nubus/nubus-virtio-mmio.c | 2 +-
> hw/nvme/ctrl.c | 2 +-
> hw/nvram/eeprom_at24c.c | 12 +-
> hw/nvram/fw_cfg.c | 16 +-
> hw/or1k/or1k-sim.c | 25 +-
> hw/or1k/virt.c | 43 +--
> hw/pci-bridge/pci_expander_bridge.c | 13 +-
> hw/pci-host/articia.c | 6 +-
> hw/pci-host/astro.c | 8 +-
> hw/pci-host/bonito.c | 28 +-
> hw/pci-host/grackle.c | 2 +-
> hw/pci-host/gt64120.c | 5 +-
> hw/pci-host/i440fx.c | 2 +-
> hw/pci-host/mv64361.c | 4 +-
> hw/pci-host/pnv_phb.c | 5 +-
> hw/pci-host/pnv_phb3.c | 3 +-
> hw/pci-host/pnv_phb3_msi.c | 3 +-
> hw/pci-host/pnv_phb4.c | 3 +-
> hw/pci-host/pnv_phb4_pec.c | 3 +-
> hw/pci-host/ppc4xx_pci.c | 2 +-
> hw/pci-host/ppce500.c | 2 +-
> hw/pci-host/raven.c | 6 +-
> hw/pci-host/sabre.c | 12 +-
> hw/pci-host/sh_pci.c | 3 +-
> hw/pci-host/uninorth.c | 11 +-
> hw/pci-host/versatile.c | 3 +-
> hw/pci/pci.c | 60 +++--
> hw/pci/pcie_sriov.c | 3 +-
> hw/ppc/amigaone.c | 24 +-
> hw/ppc/e500.c | 70 ++---
> hw/ppc/mac_newworld.c | 58 +++--
> hw/ppc/mac_oldworld.c | 32 +--
> hw/ppc/pegasos.c | 22 +-
> hw/ppc/pnv.c | 33 +--
> hw/ppc/pnv_bmc.c | 4 +-
> hw/ppc/pnv_lpc.c | 6 +-
> hw/ppc/pnv_psi.c | 6 +-
> hw/ppc/ppc440.h | 2 +-
> hw/ppc/ppc440_bamboo.c | 17 +-
> hw/ppc/ppc440_uc.c | 10 +-
> hw/ppc/ppc4xx_sdram.c | 34 +--
> hw/ppc/prep.c | 50 ++--
> hw/ppc/sam460ex.c | 72 +++---
> hw/ppc/spapr.c | 37 +--
> hw/ppc/spapr_irq.c | 6 +-
> hw/ppc/spapr_vio.c | 6 +-
> hw/ppc/virtex_ml507.c | 23 +-
> hw/remote/iommu.c | 5 +-
> hw/remote/machine.c | 6 +-
> hw/remote/memory.c | 3 +-
> hw/remote/vfio-user-obj.c | 2 +-
> hw/riscv/aia.c | 12 +-
> hw/riscv/aia.h | 3 +-
> hw/riscv/boston-aia.c | 31 ++-
> hw/riscv/cps.c | 14 +-
> hw/riscv/k230.c | 127 ++++-----
> hw/riscv/microblaze-v-generic.c | 51 ++--
> hw/riscv/microchip_pfsoc.c | 90 +++----
> hw/riscv/opentitan.c | 52 ++--
> hw/riscv/shakti_c.c | 8 +-
> hw/riscv/sifive_e.c | 25 +-
> hw/riscv/sifive_u.c | 39 +--
> hw/riscv/spike.c | 8 +-
> hw/riscv/tt_atlantis.c | 17 +-
> hw/riscv/virt.c | 57 ++--
> hw/riscv/xiangshan_kmh.c | 20 +-
> hw/rtc/ls7a_rtc.c | 2 +-
> hw/rtc/mc146818rtc.c | 6 +-
> hw/rtc/sun4v-rtc.c | 6 +-
> hw/s390x/ap-bridge.c | 6 +-
> hw/s390x/css-bridge.c | 7 +-
> hw/s390x/s390-pci-bus.c | 12 +-
> hw/s390x/s390-virtio-ccw.c | 41 ++-
> hw/scsi/esp-pci.c | 2 +-
> hw/scsi/lasi_ncr710.c | 8 +-
> hw/scsi/lasi_ncr710.h | 4 +-
> hw/scsi/ncr53c710.c | 15 +-
> hw/scsi/ncr53c710.h | 7 +-
> hw/scsi/scsi-bus.c | 5 +-
> hw/scsi/spapr_vscsi.c | 6 +-
> hw/sh4/r2d.c | 38 +--
> hw/sh4/sh7750.c | 35 +--
> hw/sparc/leon3.c | 27 +-
> hw/sparc/sun4m.c | 167 ++++++------
> hw/sparc64/niagara.c | 20 +-
> hw/sparc64/sparc64.c | 3 +-
> hw/sparc64/sun4u.c | 69 ++---
> hw/ssi/ssi.c | 7 +-
> hw/timer/arm_timer.c | 6 +-
> hw/timer/sh_timer.c | 9 +-
> hw/tricore/tc27x_soc.c | 77 +++---
> hw/tricore/tricore_testboard.c | 19 +-
> hw/ufs/lu.c | 5 +-
> hw/usb/bus.c | 15 +-
> hw/usb/dev-serial.c | 3 +-
> hw/usb/vt82c686-uhci-pci.c | 4 +-
> hw/vfio/igd.c | 5 +-
> hw/virtio/virtio-mem.c | 5 +-
> hw/vmapple/vmapple.c | 66 ++---
> hw/xen/xen-bus.c | 5 +-
> hw/xen/xen-legacy-backend.c | 5 +-
> hw/xen/xen-pvh-common.c | 26 +-
> hw/xen/xen_pt_graphics.c | 3 +-
> hw/xtensa/mx_pic.c | 8 +-
> hw/xtensa/pic_cpu.c | 5 +-
> hw/xtensa/sim.c | 15 +-
> hw/xtensa/virt.c | 4 +-
> hw/xtensa/xtensa_memory.c | 5 +-
> hw/xtensa/xtensa_memory.h | 3 +-
> hw/xtensa/xtfpga.c | 51 ++--
> include/hw/arm/aspeed.h | 6 +-
> include/hw/arm/aspeed_soc.h | 3 +-
> include/hw/arm/exynos4210.h | 2 +-
> include/hw/arm/omap.h | 11 +-
> include/hw/block/fdc.h | 5 +-
> include/hw/block/flash.h | 4 +-
> include/hw/char/mchp_pfsoc_mmuart.h | 2 +-
> include/hw/char/parallel.h | 5 +-
> include/hw/char/pl011.h | 2 +-
> include/hw/char/riscv_htif.h | 3 +-
> include/hw/char/serial-isa.h | 2 +-
> include/hw/char/serial-mm.h | 2 +-
> include/hw/char/sifive_uart.h | 4 +-
> include/hw/core/cpu.h | 11 +-
> include/hw/core/irq.h | 27 +-
> include/hw/core/qdev.h | 50 ++--
> include/hw/core/sysbus.h | 29 ++-
> include/hw/i2c/i2c.h | 29 ++-
> include/hw/i2c/smbus_eeprom.h | 5 +-
> include/hw/i386/pc.h | 6 +-
> include/hw/i386/vmport.h | 5 -
> include/hw/i386/x86.h | 7 +-
> include/hw/i3c/i3c.h | 9 +-
> include/hw/ide/isa.h | 3 +-
> include/hw/intc/i8259.h | 4 +-
> include/hw/intc/riscv_aclint.h | 6 +-
> include/hw/intc/riscv_aplic.h | 5 +-
> include/hw/intc/riscv_imsic.h | 3 +-
> include/hw/intc/sifive_plic.h | 3 +-
> include/hw/isa/i8259_internal.h | 3 +-
> include/hw/isa/isa.h | 11 +-
> include/hw/m68k/mcf.h | 7 +-
> include/hw/mem/sparse-mem.h | 2 +-
> include/hw/mips/mips.h | 5 +-
> include/hw/misc/empty_slot.h | 3 +-
> include/hw/misc/sifive_e_prci.h | 2 +-
> include/hw/misc/sifive_test.h | 2 +-
> include/hw/misc/unimp.h | 9 +-
> include/hw/net/lan9118.h | 2 +-
> include/hw/net/ne2000-isa.h | 8 +-
> include/hw/net/smc91c111.h | 2 +-
> include/hw/nitro/nitro-vsock-bus.h | 2 +-
> include/hw/nvram/eeprom_at24c.h | 6 +-
> include/hw/pci/pci.h | 19 +-
> include/hw/ppc/pnv.h | 2 +-
> include/hw/ppc/spapr_vio.h | 8 +-
> include/hw/rtc/mc146818rtc.h | 2 +-
> include/hw/rtc/sun4v-rtc.h | 2 +-
> include/hw/sh4/sh.h | 3 +-
> include/hw/sh4/sh_intc.h | 3 +-
> include/hw/ssi/ssi.h | 3 +-
> include/hw/timer/i8254.h | 13 +-
> include/hw/timer/tmu012.h | 3 +-
> include/hw/usb/usb.h | 13 +-
> include/hw/xen/xen.h | 2 +-
> include/hw/xtensa/mx_pic.h | 4 +-
> include/net/net.h | 5 +-
> include/qom/object.h | 25 ++
> linux-user/main.c | 6 +-
> net/net.c | 10 +-
> qapi/block-core.json | 12 +-
> qapi/block.json | 2 +-
> qapi/machine.json | 12 +-
> qapi/qom.json | 4 +-
> qom/object.c | 13 +
> scripts/arm_processor_error.py | 3 +-
> .../qom-parent/cpu-create-orphan.cocci | 13 +
> .../qom-parent/i2c-slave-new-orphan.cocci | 18 ++
> .../coccinelle/qom-parent/irq-rename.cocci | 14 +
> .../qom-parent/isa-new-orphan.cocci | 23 ++
> .../qom-parent/pci-new-orphan.cocci | 28 ++
> .../qom-parent/qdev-new-orphan.cocci | 18 ++
> .../qom-parent/ssi-usb-orphan.cocci | 18 ++
> .../qom-parent/sysbus-create-orphan.cocci | 18 ++
> scripts/qmp_helper.py | 2 +-
> stubs/xen-hw-stub.c | 2 +-
> system/ioport.c | 12 +-
> system/memory.c | 23 +-
> system/physmem.c | 4 +-
> system/qdev-monitor.c | 2 +-
> system/qtest.c | 2 +-
> system/ram-block-attributes.c | 7 +-
> system/vl.c | 3 +-
> target/mips/cpu.c | 5 +-
> target/mips/cpu.h | 3 +-
> target/xtensa/cpu.c | 11 -
> target/xtensa/cpu.h | 2 -
> tests/qemu-iotests/172.out | 72 +++---
> tests/qemu-iotests/186.out | 10 +-
> tests/qemu-iotests/common.filter | 2 +-
> tests/qtest/fuzz/generic_fuzz.c | 2 +-
> tests/unit/test-qdev-global-props.c | 17 +-
> tests/unit/test-qdev.c | 12 +-
> 438 files changed, 4515 insertions(+), 3784 deletions(-)
> create mode 100644 scripts/coccinelle/qom-parent/cpu-create-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/i2c-slave-new-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/irq-rename.cocci
> create mode 100644 scripts/coccinelle/qom-parent/isa-new-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/pci-new-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/qdev-new-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/ssi-usb-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/sysbus-create-orphan.cocci
>