* Call to clean up QOM onboard devices lacking a parent
@ 2026-07-09 14:59 Markus Armbruster
2026-07-09 16:02 ` BALATON Zoltan
0 siblings, 1 reply; 9+ messages in thread
From: Markus Armbruster @ 2026-07-09 14:59 UTC (permalink / raw)
To: qemu-devel
Cc: Aditya Gupta, Alexander Graf, Alexandre Iooss,
Alexey Kardashevskiy, Alistair Francis, Alistair Francis,
Antony Pavlov, Artyom Tarasenko, BALATON Zoltan, Bernhard Beschow,
Bibo Mao, Brian Cain, Chao Liu, Christian Borntraeger,
Clément Chigot, Cédric Le Goater, Dorjoy Chowdhury,
Edgar E. Iglesias, Eric Farman, Farhan Ali, Felipe Balbi,
Francisco Iglesias, Frederic Konrad, Gaurav Sharma, Gautam Gala,
Glenn Miles, Halil Pasic, Hao Wu, Harsh Prateek Bora,
Helge Deller, Hendrik Brueckner, Hervé Poussineau,
Huacai Chen, Jan Kiszka, Jared Rossi, Joel Stanley,
Laurent Vivier, Manos Pitsidianakis, Mark Cave-Ayland,
Matthew Rosato, Max Filippov, Michael Rolnik, Michael S. Tsirkin,
Nicholas Piggin, Niek Linnenbank, Palmer Dabbelt, Paolo Bonzini,
Peter Maydell, Philippe Mathieu-Daudé, Pierrick Bouvier,
Ran Wang, Richard Henderson, Sai Pavan Boddu, Samuel Tardieu,
Sergio Lopez, Song Gao, Stafford Horne, Subbaraya Sundeep,
Thomas Huth, Tyrone Ting, qemu-arm, qemu-ppc, qemu-riscv,
qemu-s390x
A QOM object must be the child of exactly one parent. This defines the
QOM composition tree. The link from parent to child is a property of
the parent, and therefore has a name that is unique within its parent.
An object's canonical QOM path is these names on the path from root to
object in the QOM composition tree separated by '/'.
For devices:
* If a device is plugged in with -device / device_add, and it has an ID,
we make it a child of /machine/peripheral/ with name ID. If it
doesn't have an ID, we make it a child of /machine/peripheral-anon/
with name device[N], where N counts up from zero. The canonical QOM
path /machine/peripheral/ID is stable. The canonical QOM path
/machine/peripheral-anon/device[N] isn't: it depends on the number of
devices already there.
* If a device is part of another device, it should be its child. The
child's canonical QOM path is the parent's plus '/CHILD-NAME'. Stable
as long as the parent's path and the child name are.
* "Should" because we have a lot of code that fails to pick the parent.
When such a device gets realized, we make it a child of
/machine/unattached/ orphanage with name device[N], where N counts up
from zero. The canonical QOM path /machine/unattached/device[N]
depends on the number of children already in the orphanage, which
makes it unstable.
Letting code get away with not picking a parent was a mistake. I
guess it "saved" us some thinking about what's part of what when
converting existing devices to QOM. In other words, it enabled sloppy
hardware modeling. We've been "saving" thinking ever since.
I want /machine/unattached/ to be empty. If an onboard device isn't
part of another device, put it into /machine/ with a sensible name.
How big is the problem? I put a printf() into device_set_realized() to
show me devices being put into the orphanage, then ran every machine
with arguments "-nodefaults -S -display none -monitor stdio". A few
machines crash, which I just reported[*]. For these, my results are
incomplete.
Of course, a device being put into the orphanage is not the device's
fault, but the code's that creates and realizes it.
The following machines don't trigger the printf:
target machines
------------------------------------------------
<any> none
aarch64 arm kzm musca-a musca-b1 netduino2
i386 x64_64 x-remote
microblaze xlnx-zynqmp-pmu
ppc ppc64 ppe42_machine
rx gdbsim-r5f562n7 gdbsim-r5f562n8
tricore KIT_AURIX_TC277_TRB
Most machines do, i.e. they put onboard devices into the orphanage.
Often just a few. If you maintain a machine, please having a look.
= target
== machine type
device-type count
------------------------------------------------
= ../qemu/bld/qemu-system-aarch64
== amd-versal-virt
mt35xu01g 4
== amd-versal2-virt
mt35xu01g 4
== anacapa-bmc
aspeed.i2c.slave 16
at24c-eeprom 10
pca9546 3
pca9548 4
pca9552 6
== ast1030-evb
aspeed.i2c.slave 14
smbus-eeprom 1
tmp105 1
== ast1040-evb
aspeed.i2c.slave 14
smbus-eeprom 1
tmp105 1
== ast1060-evb
aspeed.i2c.slave 14
== ast2500-evb
aspeed.i2c.slave 14
smbus-eeprom 1
tmp105 1
unimplemented-device 1
== ast2600-evb
aspeed.i2c.slave 16
smbus-eeprom 1
tmp105 1
unimplemented-device 1
== ast2700a1-evb
aspeed.i2c.slave 48
tmp105 1
== ast2700a2-evb
aspeed.i2c.slave 48
tmp105 1
== ast2700fc
aspeed.i2c.slave 48
tmp105 1
w25q01jvq 2
w25q512jv 1
== b-l475e-iot01a
unimplemented-device 44
== bletchley-bmc
aspeed.i2c.slave 16
at24c-eeprom 2
ds1338 1
pca9552 14
tmp421 10
== bpim2u
axp221_pmu 1
sd-card 4
serial-mm 8
unimplemented-device 76
== canon-a1100
cfi.pflash02 1
digic 1
== catalina-bmc
aspeed.i2c.slave 16
at24c-eeprom 17
ds1338 1
pca9535 2
pca9546 6
pca9548 2
pca9552 12
pca9554 1
tmp105 3
tmp421 2
== collie
cfi.pflash01 2
pxa25x-timer 1
sa1110-arm-cpu 1
scoop 1
strongarm-gpio 1
strongarm-ppc 1
strongarm-rtc 1
strongarm-ssp 1
strongarm-uart 3
strongarm_pic 1
== cubieboard
axp209_pmu 1
sd-card 1
serial-mm 1
unimplemented-device 1
== emcraft-sf2
s25sl12801 1
unimplemented-device 10
== fby35-bmc
adm1272 1
aspeed.i2c.slave 16
at24c-eeprom 5
tmp105 3
tmp421 1
== fuji-bmc
aspeed.i2c.slave 16
at24c-eeprom 24
pca9548 15
tmp105 39
tmp422 1
== g220a-bmc
aspeed.i2c.slave 14
emc1413 3
smbus-eeprom 1
== gb200nvl-bmc
aspeed.i2c.slave 16
at24c-eeprom 3
pca9546 6
pca9554 3
unimplemented-device 1
== imx25-pdk
sd-card 2
== imx8mm-evk
unimplemented-device 68
== imx8mp-evk
unimplemented-device 101
== integratorcp
arm926-arm-cpu 1
icp-ctrl-regs 1
integrator_core 1
integrator_debug 1
integrator_pic 2
integrator_pit 1
pl011 2
pl031 1
pl041 1
pl050_keyboard 1
pl050_mouse 1
pl181 1
== kudo-bmc
at24c-eeprom 2
l2x0 1
mx66u51235f 2
pca9548 4
sd-card 1
serial-mm 4
tmp105 8
unimplemented-device 33
== kzm
== lm3s6965evb
pl022 1
pl061_luminary 7
sd-card-spi 1
ssi-sd 1
stellaris-adc 1
stellaris-i2c 2
unimplemented-device 6
== lm3s811evb
pl022 1
pl061_luminary 5
ssd0303 1
stellaris-adc 1
stellaris-i2c 1
unimplemented-device 6
== max78000fthr
unimplemented-device 43
== mcimx6ul-evk
sd-card 2
unimplemented-device 28
== mcimx7d-sabre
sd-card 3
unimplemented-device 25
== microbit
unimplemented-device 2
== mori-bmc
l2x0 1
mx66u51235f 1
serial-mm 4
unimplemented-device 33
== mps2-an385
cmsdk-apb-uart 5
lan9118 1
or-irq 3
pl022 5
unimplemented-device 16
versatile_i2c 4
== mps2-an386
cmsdk-apb-uart 5
lan9118 1
or-irq 3
pl022 5
unimplemented-device 16
versatile_i2c 4
== mps2-an500
cmsdk-apb-uart 5
lan9118 1
or-irq 3
pl022 5
unimplemented-device 16
versatile_i2c 4
== mps2-an505
lan9118 1
unimplemented-device 1
== mps2-an511
cmsdk-apb-uart 5
lan9118 1
or-irq 8
pl022 5
unimplemented-device 16
versatile_i2c 4
== mps2-an521
lan9118 1
unimplemented-device 1
== mps3-an524
lan9118 1
unimplemented-device 1
== mps3-an536
cortex-r52-arm-cpu 1
lan9118 1
unimplemented-device 8
== mps3-an547
lan9118 1
unimplemented-device 3
== musca-a
== musca-b1
== musicpal
arm926-arm-cpu 1
gpio_i2c 1
musicpal-misc 1
musicpal_gpio 1
musicpal_key 1
musicpal_lcd 1
mv88w8618_eth 1
mv88w8618_flashcfg 1
mv88w8618_pic 1
mv88w8618_pit 1
mv88w8618_wlan 1
or-irq 1
serial-mm 2
wm8750 1
== netduino2
== netduinoplus2
unimplemented-device 42
== none
== npcm750-evb
l2x0 1
serial-mm 4
tmp105 4
unimplemented-device 33
w25q256 1
== npcm845-evb
serial-mm 7
tmp105 1
unimplemented-device 60
w25q256 1
== nuri
arm_gic 1
exynos4210-ehci-usb 1
exynos4210.clk 1
exynos4210.fimd 1
exynos4210.i2c 9
exynos4210.mct 1
exynos4210.pmu 1
exynos4210.pwm 1
exynos4210.rng 1
exynos4210.rtc 1
exynos4210.uart 4
l2x0 1
pl330 3
s3c-sdhci 4
sd-card 4
== olimex-stm32-h405
unimplemented-device 42
== orangepi-pc
aw-h3-ehci-usb 4
sd-card 1
serial-mm 4
sysbus-ohci 4
unimplemented-device 57
== palmetto-bmc
aspeed.i2c.slave 14
ds1338 1
smbus-eeprom 1
tmp423 1
unimplemented-device 1
== quanta-gbs-bmc
l2x0 1
mx66u51235f 1
sd-card 1
serial-mm 4
unimplemented-device 33
== quanta-gsj
at24c-eeprom 2
l2x0 1
mx25l25635e 1
pca9548 1
serial-mm 4
tmp105 4
unimplemented-device 33
== quanta-q71l-bmc
aspeed.i2c.slave 14
pca9546 2
pca9548 1
tmp105 3
unimplemented-device 1
== rainier-bmc
aspeed.i2c.slave 16
at24c-eeprom 21
dps310 1
max31785 1
pca9546 4
pca9552 16
tmp105 13
tmp423 4
unimplemented-device 1
== raspi0
sd-card 1
== raspi1ap
sd-card 1
== raspi2b
sd-card 1
== raspi3ap
sd-card 1
== raspi3b
sd-card 1
== raspi4b
sd-card 1
== realview-eb
arm926-arm-cpu 1
pl041 1
realview_gic 1
realview_sysctl 1
== realview-eb-mpcore
arm11mpcore-arm-cpu 1
l2x0 1
pl041 1
realview_mpcore 1
realview_sysctl 1
== realview-pb-a8
cortex-a8-arm-cpu 1
pl041 1
realview_gic 1
realview_sysctl 1
== realview-pbx-a9
a9mpcore_priv 1
cortex-a9-arm-cpu 1
l2x0 1
pl041 1
realview_sysctl 1
== romulus-bmc
aspeed.i2c.slave 14
ds1338 1
unimplemented-device 1
== sabrelite
l2x0 1
sst25vf016b 1
unimplemented-device 1
== sbsa-ref
arm-gicv3 1
arm-gicv3-its 1
arm-smmuv3 1
bochs-display 1
gpex-pcihost 1
gpio-key 1
neoverse-n2-arm-cpu 4
pl011 3
pl031 1
pl061 1
sbsa-gwdt 1
sysbus-ahci 1
sysbus-xhci 1
== smdkc210
arm_gic 1
exynos4210-ehci-usb 1
exynos4210.clk 1
exynos4210.fimd 1
exynos4210.i2c 9
exynos4210.mct 1
exynos4210.pmu 1
exynos4210.pwm 1
exynos4210.rng 1
exynos4210.rtc 1
exynos4210.uart 4
l2x0 1
pl330 3
s3c-sdhci 4
sd-card 4
== stm32vldiscovery
unimplemented-device 30
== supermicro-x11spi-bmc
aspeed.i2c.slave 14
ds1338 1
smbus-eeprom 1
tmp423 1
unimplemented-device 1
== supermicrox11-bmc
aspeed.i2c.slave 14
ds1338 1
smbus-eeprom 1
tmp423 1
unimplemented-device 1
== sx1
omap-gpio 1
omap-intc 2
omap-mmc 1
omap_i2c 1
serial-mm 3
ti925t-arm-cpu 1
== sx1-v1
omap-gpio 1
omap-intc 2
omap-mmc 1
omap_i2c 1
serial-mm 3
ti925t-arm-cpu 1
== tiogapass-bmc
aspeed.i2c.slave 14
at24c-eeprom 2
tmp421 3
== versatileab
arm926-arm-cpu 1
ds1338 1
pl011 4
pl031 1
pl041 1
pl050_keyboard 1
pl050_mouse 1
pl061 4
pl080 1
pl110_versatile 1
pl181 2
pl190 1
realview_sysctl 1
sp804 2
versatile_i2c 1
versatile_pci 1
versatile_pci_host 1
versatilepb_sic 1
== versatilepb
arm926-arm-cpu 1
ds1338 1
pl011 4
pl031 1
pl041 1
pl050_keyboard 1
pl050_mouse 1
pl061 4
pl080 1
pl110_versatile 1
pl181 2
pl190 1
realview_sysctl 1
sp804 2
versatile_i2c 1
versatile_pci 1
versatile_pci_host 1
versatilepb_sic 1
== vexpress-a15
a15mpcore_priv 1
cortex-a15-arm-cpu 1
pl041 1
realview_sysctl 1
== vexpress-a9
a9mpcore_priv 1
cortex-a9-arm-cpu 1
l2x0 1
pl041 1
pl111 1
realview_sysctl 1
sp804 1
== virt-10.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-10.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-10.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-11.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-11.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-5.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-6.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-6.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-6.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-7.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-7.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-7.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-8.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-8.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-8.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-9.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-9.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-9.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== witherspoon-bmc
aspeed.i2c.slave 14
dps310 1
ds1338 1
max31785 1
pca9552 2
smbus-eeprom 1
tmp105 1
tmp423 2
unimplemented-device 1
== xilinx-zynq-a9
a9mpcore_priv 1
cadence_gem 2
cadence_ttc 2
cadence_uart 2
cfi.pflash02 1
cortex-a9-arm-cpu 1
generic-sdhci 2
l2x0 1
n25q128 12
pl330 1
sd-card 2
unimplemented-device 30
usb-chipidea 2
xilinx-zynq_slcr 1
xlnx-zynq-xadc 1
xlnx.ps7-dev-cfg 1
xlnx.ps7-qspi 1
xlnx.ps7-spi 2
zynq.ddr-ctlr 1
== xlnx-zcu102
== yosemitev2-bmc
aspeed.i2c.slave 14
at24c-eeprom 2
tmp421 3
unimplemented-device 1
= ../qemu/bld/qemu-system-alpha
== clipper
cmd646-ide 1
ev67-alpha-cpu 1
i82374 1
i82378 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
mc146818rtc 1
smc37c669-superio 1
typhoon-pcihost 1
== none
= ../qemu/bld/qemu-system-arm
== anacapa-bmc
aspeed.i2c.slave 16
at24c-eeprom 10
pca9546 3
pca9548 4
pca9552 6
== ast1030-evb
aspeed.i2c.slave 14
smbus-eeprom 1
tmp105 1
== ast1040-evb
aspeed.i2c.slave 14
smbus-eeprom 1
tmp105 1
== ast1060-evb
aspeed.i2c.slave 14
== ast2500-evb
aspeed.i2c.slave 14
smbus-eeprom 1
tmp105 1
unimplemented-device 1
== ast2600-evb
aspeed.i2c.slave 16
smbus-eeprom 1
tmp105 1
unimplemented-device 1
== b-l475e-iot01a
unimplemented-device 44
== bletchley-bmc
aspeed.i2c.slave 16
at24c-eeprom 2
ds1338 1
pca9552 14
tmp421 10
== bpim2u
axp221_pmu 1
sd-card 4
serial-mm 8
unimplemented-device 76
== canon-a1100
cfi.pflash02 1
digic 1
== catalina-bmc
aspeed.i2c.slave 16
at24c-eeprom 17
ds1338 1
pca9535 2
pca9546 6
pca9548 2
pca9552 12
pca9554 1
tmp105 3
tmp421 2
== collie
cfi.pflash01 2
pxa25x-timer 1
sa1110-arm-cpu 1
scoop 1
strongarm-gpio 1
strongarm-ppc 1
strongarm-rtc 1
strongarm-ssp 1
strongarm-uart 3
strongarm_pic 1
== cubieboard
axp209_pmu 1
sd-card 1
serial-mm 1
unimplemented-device 1
== emcraft-sf2
s25sl12801 1
unimplemented-device 10
== fby35-bmc
adm1272 1
aspeed.i2c.slave 16
at24c-eeprom 5
tmp105 3
tmp421 1
== fuji-bmc
aspeed.i2c.slave 16
at24c-eeprom 24
pca9548 15
tmp105 39
tmp422 1
== g220a-bmc
aspeed.i2c.slave 14
emc1413 3
smbus-eeprom 1
== gb200nvl-bmc
aspeed.i2c.slave 16
at24c-eeprom 3
pca9546 6
pca9554 3
unimplemented-device 1
== imx25-pdk
sd-card 2
== integratorcp
arm926-arm-cpu 1
icp-ctrl-regs 1
integrator_core 1
integrator_debug 1
integrator_pic 2
integrator_pit 1
pl011 2
pl031 1
pl041 1
pl050_keyboard 1
pl050_mouse 1
pl181 1
== kudo-bmc
at24c-eeprom 2
l2x0 1
mx66u51235f 2
pca9548 4
sd-card 1
serial-mm 4
tmp105 8
unimplemented-device 33
== kzm
== lm3s6965evb
pl022 1
pl061_luminary 7
sd-card-spi 1
ssi-sd 1
stellaris-adc 1
stellaris-i2c 2
unimplemented-device 6
== lm3s811evb
pl022 1
pl061_luminary 5
ssd0303 1
stellaris-adc 1
stellaris-i2c 1
unimplemented-device 6
== max78000fthr
unimplemented-device 43
== mcimx6ul-evk
sd-card 2
unimplemented-device 28
== mcimx7d-sabre
sd-card 3
unimplemented-device 25
== microbit
unimplemented-device 2
== mori-bmc
l2x0 1
mx66u51235f 1
serial-mm 4
unimplemented-device 33
== mps2-an385
cmsdk-apb-uart 5
lan9118 1
or-irq 3
pl022 5
unimplemented-device 16
versatile_i2c 4
== mps2-an386
cmsdk-apb-uart 5
lan9118 1
or-irq 3
pl022 5
unimplemented-device 16
versatile_i2c 4
== mps2-an500
cmsdk-apb-uart 5
lan9118 1
or-irq 3
pl022 5
unimplemented-device 16
versatile_i2c 4
== mps2-an505
lan9118 1
unimplemented-device 1
== mps2-an511
cmsdk-apb-uart 5
lan9118 1
or-irq 8
pl022 5
unimplemented-device 16
versatile_i2c 4
== mps2-an521
lan9118 1
unimplemented-device 1
== mps3-an524
lan9118 1
unimplemented-device 1
== mps3-an536
cortex-r52-arm-cpu 1
lan9118 1
unimplemented-device 8
== mps3-an547
lan9118 1
unimplemented-device 3
== musca-a
== musca-b1
== musicpal
arm926-arm-cpu 1
gpio_i2c 1
musicpal-misc 1
musicpal_gpio 1
musicpal_key 1
musicpal_lcd 1
mv88w8618_eth 1
mv88w8618_flashcfg 1
mv88w8618_pic 1
mv88w8618_pit 1
mv88w8618_wlan 1
or-irq 1
serial-mm 2
wm8750 1
== netduino2
== netduinoplus2
unimplemented-device 42
== none
== npcm750-evb
l2x0 1
serial-mm 4
tmp105 4
unimplemented-device 33
w25q256 1
== nuri
arm_gic 1
exynos4210-ehci-usb 1
exynos4210.clk 1
exynos4210.fimd 1
exynos4210.i2c 9
exynos4210.mct 1
exynos4210.pmu 1
exynos4210.pwm 1
exynos4210.rng 1
exynos4210.rtc 1
exynos4210.uart 4
l2x0 1
pl330 3
s3c-sdhci 4
sd-card 4
== olimex-stm32-h405
unimplemented-device 42
== orangepi-pc
aw-h3-ehci-usb 4
sd-card 1
serial-mm 4
sysbus-ohci 4
unimplemented-device 57
== palmetto-bmc
aspeed.i2c.slave 14
ds1338 1
smbus-eeprom 1
tmp423 1
unimplemented-device 1
== quanta-gbs-bmc
l2x0 1
mx66u51235f 1
sd-card 1
serial-mm 4
unimplemented-device 33
== quanta-gsj
at24c-eeprom 2
l2x0 1
mx25l25635e 1
pca9548 1
serial-mm 4
tmp105 4
unimplemented-device 33
== quanta-q71l-bmc
aspeed.i2c.slave 14
pca9546 2
pca9548 1
tmp105 3
unimplemented-device 1
== rainier-bmc
aspeed.i2c.slave 16
at24c-eeprom 21
dps310 1
max31785 1
pca9546 4
pca9552 16
tmp105 13
tmp423 4
unimplemented-device 1
== raspi0
sd-card 1
== raspi1ap
sd-card 1
== raspi2b
sd-card 1
== realview-eb
arm926-arm-cpu 1
pl041 1
realview_gic 1
realview_sysctl 1
== realview-eb-mpcore
arm11mpcore-arm-cpu 1
l2x0 1
pl041 1
realview_mpcore 1
realview_sysctl 1
== realview-pb-a8
cortex-a8-arm-cpu 1
pl041 1
realview_gic 1
realview_sysctl 1
== realview-pbx-a9
a9mpcore_priv 1
cortex-a9-arm-cpu 1
l2x0 1
pl041 1
realview_sysctl 1
== romulus-bmc
aspeed.i2c.slave 14
ds1338 1
unimplemented-device 1
== sabrelite
l2x0 1
sst25vf016b 1
unimplemented-device 1
== smdkc210
arm_gic 1
exynos4210-ehci-usb 1
exynos4210.clk 1
exynos4210.fimd 1
exynos4210.i2c 9
exynos4210.mct 1
exynos4210.pmu 1
exynos4210.pwm 1
exynos4210.rng 1
exynos4210.rtc 1
exynos4210.uart 4
l2x0 1
pl330 3
s3c-sdhci 4
sd-card 4
== stm32vldiscovery
unimplemented-device 30
== supermicro-x11spi-bmc
aspeed.i2c.slave 14
ds1338 1
smbus-eeprom 1
tmp423 1
unimplemented-device 1
== supermicrox11-bmc
aspeed.i2c.slave 14
ds1338 1
smbus-eeprom 1
tmp423 1
unimplemented-device 1
== sx1
omap-gpio 1
omap-intc 2
omap-mmc 1
omap_i2c 1
serial-mm 3
ti925t-arm-cpu 1
== sx1-v1
omap-gpio 1
omap-intc 2
omap-mmc 1
omap_i2c 1
serial-mm 3
ti925t-arm-cpu 1
== tiogapass-bmc
aspeed.i2c.slave 14
at24c-eeprom 2
tmp421 3
== versatileab
arm926-arm-cpu 1
ds1338 1
pl011 4
pl031 1
pl041 1
pl050_keyboard 1
pl050_mouse 1
pl061 4
pl080 1
pl110_versatile 1
pl181 2
pl190 1
realview_sysctl 1
sp804 2
versatile_i2c 1
versatile_pci 1
versatile_pci_host 1
versatilepb_sic 1
== versatilepb
arm926-arm-cpu 1
ds1338 1
pl011 4
pl031 1
pl041 1
pl050_keyboard 1
pl050_mouse 1
pl061 4
pl080 1
pl110_versatile 1
pl181 2
pl190 1
realview_sysctl 1
sp804 2
versatile_i2c 1
versatile_pci 1
versatile_pci_host 1
versatilepb_sic 1
== vexpress-a15
a15mpcore_priv 1
cortex-a15-arm-cpu 1
pl041 1
realview_sysctl 1
== vexpress-a9
a9mpcore_priv 1
cortex-a9-arm-cpu 1
l2x0 1
pl041 1
pl111 1
realview_sysctl 1
sp804 1
== virt-10.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-10.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-10.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-11.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-11.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-5.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-6.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-6.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-6.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-7.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-7.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-7.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-8.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-8.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-8.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-9.0
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-9.1
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== virt-9.2
arm-gicv2m 1
arm_gic 1
cortex-a15-arm-cpu 1
gpex-pcihost 1
gpio-key 1
pl011 1
pl031 1
pl061 1
platform-bus-device 1
virtio-mmio 32
== witherspoon-bmc
aspeed.i2c.slave 14
dps310 1
ds1338 1
max31785 1
pca9552 2
smbus-eeprom 1
tmp105 1
tmp423 2
unimplemented-device 1
== xilinx-zynq-a9
a9mpcore_priv 1
cadence_gem 2
cadence_ttc 2
cadence_uart 2
cfi.pflash02 1
cortex-a9-arm-cpu 1
generic-sdhci 2
l2x0 1
n25q128 12
pl330 1
sd-card 2
unimplemented-device 30
usb-chipidea 2
xilinx-zynq_slcr 1
xlnx-zynq-xadc 1
xlnx.ps7-dev-cfg 1
xlnx.ps7-qspi 1
xlnx.ps7-spi 2
zynq.ddr-ctlr 1
== yosemitev2-bmc
aspeed.i2c.slave 14
at24c-eeprom 2
tmp421 3
unimplemented-device 1
= ../qemu/bld/qemu-system-avr
== arduino-duemilanove
unimplemented-device 16
== arduino-mega-2560-v3
unimplemented-device 24
== arduino-mega
unimplemented-device 24
== arduino-uno
unimplemented-device 16
== none
= ../qemu/bld/qemu-system-hexagon
== V66G_1024
v66-hexagon-cpu 4
== none
== virt
pl011 1
v68-hexagon-cpu 8
= ../qemu/bld/qemu-system-hppa
== 715
isa-i8259 2
isabus-bridge 1
lasi-chip 1
lasips2 1
pa-7300lc-hppa-cpu 1
serial-mm 1
== A400
astro-chip 1
diva-gsp 1
elroy-pcihost 4
pa-8500-hppa-cpu 1
== B160L
dino-pcihost 1
isa-i8259 2
isabus-bridge 1
lasi-chip 1
lasips2 1
pa-7300lc-hppa-cpu 1
serial-mm 2
== C3700
astro-chip 1
diva-gsp 1
elroy-pcihost 4
pa-8700-hppa-cpu 1
== none
= ../qemu/bld/qemu-system-i386
== microvm
acpi-ged 1
ioapic 1
isa-i8259 2
isa-pit 1
isabus-bridge 1
kvmvapic 1
mc146818rtc 1
qemu32-i386-cpu 1
virtio-mmio 24
== xenfv-4.2
== pc-i440fx-9.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-9.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-9.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-8.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-8.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-8.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-7.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-7.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-7.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-6.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-6.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-6.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-5.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-11.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-11.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-10.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-10.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-10.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-9.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-9.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-9.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-8.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-8.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-8.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-7.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-7.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-7.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-6.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-6.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-6.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-5.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-11.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-11.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-10.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-10.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-10.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu32-i386-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== isapc
486-i386-cpu 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-ide 2
isa-pcspk 1
isa-pit 1
isabus-bridge 1
mc146818rtc 1
port92 1
vmmouse 1
vmport 1
== none
== x-remote
== xenpv
== xenpvh
= ../qemu/bld/qemu-system-loongarch64
== none
== virt-11.1
acpi-ged 1
gpex-pcihost 1
la464-loongarch-cpu 1
loongarch.extioi 1
loongarch_ipi 1
loongarch_pch_msi 1
loongarch_pic 1
ls7a_rtc 1
platform-bus-device 1
serial-mm 4
unimplemented-device 1
= ../qemu/bld/qemu-system-m68k
== an5206
m5206-m68k-cpu 1
mcf-uart 2
mcf5206-mbar 1
== mcf5208evb
m5208-m68k-cpu 1
mcf-intc 1
mcf-uart 3
== next-cube
empty_slot 3
m68040-m68k-cpu 1
next-fb 1
next-kbd 1
next-pc 1
== none
== q800
adb-keyboard 1
adb-mouse 1
== virt-10.0
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-10.1
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-10.2
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-11.0
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-11.1
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-6.0
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-6.1
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-6.2
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-7.0
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-7.1
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-7.2
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-8.0
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-8.1
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-8.2
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-9.0
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-9.1
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
== virt-9.2
goldfish_pic 6
goldfish_rtc 2
goldfish_tty 1
m68040-m68k-cpu 1
m68k-irq-controller 1
virt-ctrl 1
virtio-mmio 128
= ../qemu/bld/qemu-system-microblaze
== none
== petalogix-ml605
cfi.pflash01 1
microblaze-cpu 1
n25q128 4
serial-mm 1
xlnx.xps-intc 1
xlnx.xps-spi 1
xlnx.xps-timer 1
== petalogix-s3adsp1800
cfi.pflash01 1
microblaze-cpu 1
unimplemented-device 1
xlnx.xps-ethernetlite 1
xlnx.xps-intc 1
xlnx.xps-timer 1
xlnx.xps-uartlite 1
== xlnx-zynqmp-pmu
= ../qemu/bld/qemu-system-mips
== malta
24Kf-mips-cpu 1
cfi.pflash01 1
empty_slot 1
fdc37m81x-superio 1
gt64120 1
gt64120_pci 1
isa-i8259 2
isa-pit 1
mips-malta 1
piix4-isa 1
serial-mm 1
smbus-eeprom 8
== none
= ../qemu/bld/qemu-system-mips64
== magnum
R4000-mips64-cpu 1
ds1225y 1
i8042-mmio 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
isabus-bridge 1
jazz-led 1
mc146818rtc 1
rc4030 1
serial-mm 2
sysbus-esp 1
sysbus-fdc 1
sysbus-g364 1
== malta
20Kc-mips64-cpu 1
cfi.pflash01 1
empty_slot 1
fdc37m81x-superio 1
gt64120 1
gt64120_pci 1
isa-i8259 2
isa-pit 1
mips-malta 1
piix4-isa 1
serial-mm 1
smbus-eeprom 8
== none
== pica61
R4000-mips64-cpu 1
ds1225y 1
i8042-mmio 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
isabus-bridge 1
jazz-led 1
mc146818rtc 1
rc4030 1
serial-mm 2
sysbus-esp 1
sysbus-fdc 1
vga-mmio 1
= ../qemu/bld/qemu-system-mips64el
== boston
I6400-mips64-cpu 1
ich9-ahci 1
mips-boston 1
serial-mm 1
xilinx-pcie-host 3
== fuloong2e
Bonito 1
Bonito-pcihost 1
Loongson-2E-mips64-cpu 1
isa-i8259 2
isa-pit 1
unimplemented-device 7
vt82c686b-isa 1
== loongson3-virt
Loongson-3A1000-mips64-cpu 1
goldfish_rtc 1
loongson.liointc 1
loongson_ipi 1
serial-mm 1
unimplemented-device 2
== magnum
R4000-mips64-cpu 1
ds1225y 1
i8042-mmio 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
isabus-bridge 1
jazz-led 1
mc146818rtc 1
rc4030 1
serial-mm 2
sysbus-esp 1
sysbus-fdc 1
sysbus-g364 1
== malta
20Kc-mips64-cpu 1
cfi.pflash01 1
empty_slot 1
fdc37m81x-superio 1
gt64120 1
gt64120_pci 1
isa-i8259 2
isa-pit 1
mips-malta 1
piix4-isa 1
serial-mm 1
smbus-eeprom 8
== none
== pica61
R4000-mips64-cpu 1
ds1225y 1
i8042-mmio 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
isabus-bridge 1
jazz-led 1
mc146818rtc 1
rc4030 1
serial-mm 2
sysbus-esp 1
sysbus-fdc 1
vga-mmio 1
= ../qemu/bld/qemu-system-mipsel
== malta
24Kf-mips-cpu 1
cfi.pflash01 1
empty_slot 1
fdc37m81x-superio 1
gt64120 1
gt64120_pci 1
isa-i8259 2
isa-pit 1
mips-malta 1
piix4-isa 1
serial-mm 1
smbus-eeprom 8
== none
= ../qemu/bld/qemu-system-or1k
== none
== or1k-sim
or1200-or1k-cpu 1
serial-mm 4
== virt
goldfish_rtc 1
gpex-pcihost 1
or1200-or1k-cpu 1
riscv.sifive.test 1
serial-mm 1
virtio-mmio 8
= ../qemu/bld/qemu-system-ppc
== 40p
604-powerpc-cpu 1
i82374 1
i82378 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
mc146818rtc 1
or-irq 1
prep-systemio 1
raven 1
rs6000-mc 1
== amigaone
7457_v1.2-powerpc-cpu 1
a1-nvram 1
articia 1
articia-pci-bridge 1
articia-pci-host 1
isa-i8259 2
isa-pit 1
smbus-eeprom 1
vt82c686b-isa 1
== bamboo
440epb-powerpc-cpu 1
ppc-uic 1
ppc4xx-host-bridge 1
ppc4xx-pci-host 1
ppc4xx-sdram-ddr 1
== g3beige
750_v3.1-powerpc-cpu 1
adb-keyboard 1
adb-mouse 1
grackle 1
grackle-pcihost 1
macio-oldworld 1
== mac99
7400_v2.9-powerpc-cpu 1
adb-keyboard 1
adb-mouse 1
macio-newworld 1
macio-nvram 1
uni-north 1
uni-north-agp 1
uni-north-agp-pcihost 1
uni-north-internal-pci 1
uni-north-internal-pci-pcihost 1
uni-north-pci 1
uni-north-pci-pcihost 1
== mpc8544ds
ds1338 1
e500-host-bridge 1
e500-spin 1
e500v2_v30-powerpc-cpu 1
mpc-i2c 1
mpc8544-guts 1
platform-bus-device 1
== none
== pegasos1
750cxe_v3.1b-powerpc-cpu 1
articia 1
articia-pci-bridge 1
articia-pci-host 1
isa-i8259 2
isa-pit 1
vt8231-isa 1
== pegasos2
7457_v1.2-powerpc-cpu 1
isa-i8259 2
isa-pit 1
mv64361 1
mv64361-pcibridge 2
vt8231-isa 1
== ppce500
ds1338 1
e500-host-bridge 1
e500-spin 1
e500v2_v30-powerpc-cpu 1
fsl-esdhc-be 1
mpc-i2c 1
mpc8544-guts 1
mpc8xxx_gpio 1
platform-bus-device 1
unimplemented-device 1
== ppe42_machine
== sam460ex
460exb-powerpc-cpu 1
cfi.pflash01 1
i2c-ddc 1
m41t80 1
ppc-uic 4
ppc440-pcix-host 1
ppc460ex-pcie-host 2
ppc4xx-ebc 1
ppc4xx-ehci-usb 1
ppc4xx-i2c 2
ppc4xx-mal 1
ppc4xx-plb 1
ppc4xx-sdram-ddr2 1
sm501 1
smbus-eeprom 1
sysbus-ohci 1
usb-kbd 1
usb-mouse 1
== virtex-ml507
440-xilinx-powerpc-cpu 1
cfi.pflash01 1
ppc-uic 1
serial-mm 1
xlnx.xps-intc 1
xlnx.xps-timer 1
= ../qemu/bld/qemu-system-ppc64
== 40p
604-powerpc64-cpu 1
i82374 1
i82378 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
mc146818rtc 1
or-irq 1
prep-systemio 1
raven 1
rs6000-mc 1
== amigaone
7457_v1.2-powerpc64-cpu 1
a1-nvram 1
articia 1
articia-pci-bridge 1
articia-pci-host 1
isa-i8259 2
isa-pit 1
smbus-eeprom 1
vt82c686b-isa 1
== bamboo
440epb-powerpc64-cpu 1
ppc-uic 1
ppc4xx-host-bridge 1
ppc4xx-pci-host 1
ppc4xx-sdram-ddr 1
== g3beige
750_v3.1-powerpc64-cpu 1
adb-keyboard 1
adb-mouse 1
grackle 1
grackle-pcihost 1
macio-oldworld 1
== mac99
970fx_v3.1-powerpc64-cpu 1
adb-keyboard 1
adb-mouse 1
macio-newworld 1
macio-nvram 1
u3-agp 1
u3-agp-pcihost 1
uni-north 1
== mpc8544ds
ds1338 1
e500-host-bridge 1
e500-spin 1
e500v2_v30-powerpc64-cpu 1
mpc-i2c 1
mpc8544-guts 1
platform-bus-device 1
== none
== pegasos1
750cxe_v3.1b-powerpc64-cpu 1
articia 1
articia-pci-bridge 1
articia-pci-host 1
isa-i8259 2
isa-pit 1
vt8231-isa 1
== pegasos2
7457_v1.2-powerpc64-cpu 1
isa-i8259 2
isa-pit 1
mv64361 1
mv64361-pcibridge 2
vt8231-isa 1
== powernv10
isabus-bridge 1
mc146818rtc 1
pnv-pnor 1
== powernv10-rainier
isabus-bridge 1
mc146818rtc 1
pca9552 1
pca9554 1
pnv-pnor 1
== powernv11
isabus-bridge 1
mc146818rtc 1
pnv-pnor 1
== powernv8
isabus-bridge 1
mc146818rtc 1
pnv-pnor 1
== powernv9
isabus-bridge 1
mc146818rtc 1
pnv-pnor 1
== ppce500
ds1338 1
e500-host-bridge 1
e500-spin 1
e500v2_v30-powerpc64-cpu 1
fsl-esdhc-be 1
mpc-i2c 1
mpc8544-guts 1
mpc8xxx_gpio 1
platform-bus-device 1
unimplemented-device 1
== ppe42_machine
== pseries-10.0
power10_v2.0-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-10.1
power10_v2.0-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-10.2
power10_v2.0-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-11.0
power10_v2.0-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-11.1
power11_v2.0-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-5.2
power9_v2.2-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-6.0
power9_v2.2-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-6.1
power9_v2.2-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-6.2
power9_v2.2-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-7.0
power9_v2.2-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-7.1
power9_v2.2-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-7.2
power9_v2.2-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-8.0
power9_v2.2-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-8.1
power9_v2.2-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-8.2
power9_v2.2-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-9.0
power10_v2.0-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-9.1
power10_v2.0-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== pseries-9.2
power10_v2.0-spapr-cpu-core 1
spapr-nvram 1
spapr-pci-host-bridge 1
spapr-vio-bridge 1
spapr-xive 1
== sam460ex
460exb-powerpc64-cpu 1
cfi.pflash01 1
i2c-ddc 1
m41t80 1
ppc-uic 4
ppc440-pcix-host 1
ppc460ex-pcie-host 2
ppc4xx-ebc 1
ppc4xx-ehci-usb 1
ppc4xx-i2c 2
ppc4xx-mal 1
ppc4xx-plb 1
ppc4xx-sdram-ddr2 1
sm501 1
smbus-eeprom 1
sysbus-ohci 1
usb-kbd 1
usb-mouse 1
== virtex-ml507
440-xilinx-powerpc64-cpu 1
cfi.pflash01 1
ppc-uic 1
serial-mm 1
xlnx.xps-intc 1
xlnx.xps-timer 1
= ../qemu/bld/qemu-system-riscv32
== amd-microblaze-v-generic
rv32-riscv-cpu 1
serial-mm 1
unimplemented-device 5
xlnx.xps-ethernetlite 1
xlnx.xps-intc 1
xlnx.xps-timer 2
xlnx.xps-uartlite 1
== none
== opentitan
unimplemented-device 26
== sifive_e
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.sifive.e.prci 1
riscv.sifive.plic 1
riscv.sifive.uart 2
unimplemented-device 6
== sifive_u
is25wp256 1
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.sifive.plic 1
riscv.sifive.uart 2
sd-card-spi 1
ssi-sd 1
unimplemented-device 3
== spike
riscv.aclint.mtimer 1
riscv.aclint.swi 1
== virt
goldfish_rtc 1
gpex-pcihost 1
platform-bus-device 1
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.sifive.plic 1
riscv.sifive.test 1
serial-mm 1
virtio-mmio 8
= ../qemu/bld/qemu-system-riscv64
== amd-microblaze-v-generic
rv64-riscv-cpu 1
serial-mm 1
unimplemented-device 5
xlnx.xps-ethernetlite 1
xlnx.xps-intc 1
xlnx.xps-timer 2
xlnx.xps-uartlite 1
== boston-aia
ich9-ahci 1
mips-boston-aia 1
mips-p8700-riscv-cpu 1
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.aplic 2
serial-mm 1
xilinx-pcie-host 1
== k230
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.sifive.plic 1
serial-mm 5
unimplemented-device 57
== microchip-icicle-kit
mchp.pfsoc.uart 5
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.sifive.plic 1
unimplemented-device 27
== none
== shakti_c
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.sifive.plic 1
== sifive_e
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.sifive.e.prci 1
riscv.sifive.plic 1
riscv.sifive.uart 2
unimplemented-device 6
== sifive_u
is25wp256 1
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.sifive.plic 1
riscv.sifive.uart 2
sd-card-spi 1
ssi-sd 1
unimplemented-device 3
== spike
riscv.aclint.mtimer 1
riscv.aclint.swi 1
== tt-atlantis
ds1338 1
riscv.aclint.mtimer 1
riscv.aplic 2
riscv.imsic 16
serial-mm 1
tmp105 1
unimplemented-device 1
== virt
goldfish_rtc 1
gpex-pcihost 1
platform-bus-device 1
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.sifive.plic 1
riscv.sifive.test 1
serial-mm 1
virtio-mmio 8
== xiangshan-kunminghu
riscv.aclint.mtimer 1
riscv.aclint.swi 1
riscv.aplic 2
riscv.imsic 2
serial-mm 1
= ../qemu/bld/qemu-system-rx
== gdbsim-r5f562n7
== gdbsim-r5f562n8
== none
= ../qemu/bld/qemu-system-s390x
== none
== s390-ccw-virtio-10.0
qemu-s390x-cpu 1
== s390-ccw-virtio-10.1
qemu-s390x-cpu 1
== s390-ccw-virtio-10.2
qemu-s390x-cpu 1
== s390-ccw-virtio-11.0
qemu-s390x-cpu 1
== s390-ccw-virtio-11.1
qemu-s390x-cpu 1
== s390-ccw-virtio-5.2
qemu-s390x-cpu 1
== s390-ccw-virtio-6.0
qemu-s390x-cpu 1
== s390-ccw-virtio-6.1
qemu-s390x-cpu 1
== s390-ccw-virtio-6.2
qemu-s390x-cpu 1
== s390-ccw-virtio-7.0
qemu-s390x-cpu 1
== s390-ccw-virtio-7.1
qemu-s390x-cpu 1
== s390-ccw-virtio-7.2
qemu-s390x-cpu 1
== s390-ccw-virtio-8.0
qemu-s390x-cpu 1
== s390-ccw-virtio-8.1
qemu-s390x-cpu 1
== s390-ccw-virtio-8.2
qemu-s390x-cpu 1
== s390-ccw-virtio-9.0
qemu-s390x-cpu 1
== s390-ccw-virtio-9.1
qemu-s390x-cpu 1
== s390-ccw-virtio-9.2
qemu-s390x-cpu 1
= ../qemu/bld/qemu-system-sh4
== none
== r2d
cfi.pflash02 1
i2c-ddc 1
mmio-ide 1
sh-serial 2
sh7751r-superh-cpu 1
sh_pci 1
sh_pci_host 1
sysbus-sm501 1
usb-kbd 1
= ../qemu/bld/qemu-system-sh4eb
== none
== r2d
cfi.pflash02 1
i2c-ddc 1
mmio-ide 1
sh-serial 2
sh7751r-superh-cpu 1
sh_pci 1
sh_pci_host 1
sysbus-sm501 1
usb-kbd 1
= ../qemu/bld/qemu-system-sparc
== LX
TI-MicroSparc-I-sparc-cpu 1
empty_slot 2
escc 2
macio_idreg 1
memory 1
openprom 1
or-irq 2
slavio_intctl 1
slavio_misc 1
slavio_timer 1
sparc32-dma 1
sun-fdtwo 1
sun4m-iommu 1
sysbus-m48t08 1
== SPARCClassic
TI-MicroSparc-I-sparc-cpu 1
apc 1
empty_slot 1
escc 2
macio_idreg 1
memory 1
openprom 1
or-irq 2
slavio_intctl 1
slavio_misc 1
slavio_timer 1
sparc32-dma 1
sun-fdtwo 1
sun4m-iommu 1
sysbus-m48t08 1
== SPARCbook
TI-MicroSparc-I-sparc-cpu 1
apc 1
empty_slot 1
escc 2
macio_idreg 1
memory 1
openprom 1
or-irq 2
slavio_intctl 1
slavio_misc 1
slavio_timer 1
sparc32-dma 1
sun-fdtwo 1
sun4m-iommu 1
sysbus-m48t08 1
== SS-10
TI-SuperSparc-II-sparc-cpu 1
apc 1
eccmemctl 1
escc 2
macio_idreg 1
memory 1
openprom 1
or-irq 2
slavio_intctl 1
slavio_misc 1
slavio_timer 1
sparc32-dma 1
sun-fdtwo 1
sun4m-iommu 1
sysbus-m48t08 1
== SS-20
TI-SuperSparc-II-sparc-cpu 1
apc 1
eccmemctl 1
empty_slot 4
escc 2
macio_idreg 1
memory 1
openprom 1
or-irq 2
slavio_intctl 1
slavio_misc 1
slavio_timer 1
sparc32-dma 1
sun-fdtwo 1
sun4m-iommu 1
sysbus-m48t08 1
unimplemented-device 4
== SS-4
Fujitsu-MB86904-sparc-cpu 1
apc 1
empty_slot 1
escc 2
macio_idreg 1
memory 1
openprom 1
or-irq 2
slavio_intctl 1
slavio_misc 1
slavio_timer 1
sparc32-dma 1
sun-CS4231 1
sun-fdtwo 1
sun4m-iommu 1
sysbus-m48t08 1
== SS-5
Fujitsu-MB86904-sparc-cpu 1
apc 1
empty_slot 2
escc 2
macio_idreg 1
memory 1
openprom 1
or-irq 2
slavio_intctl 1
slavio_misc 1
slavio_timer 1
sparc32-dma 1
sun-CS4231 1
sun-fdtwo 1
sun4m-iommu 1
sysbus-m48t08 1
tcx_afx 1
== SS-600MP
TI-SuperSparc-II-sparc-cpu 1
apc 1
eccmemctl 1
escc 2
memory 1
openprom 1
or-irq 2
slavio_intctl 1
slavio_misc 1
slavio_timer 1
sparc32-dma 1
sun4m-iommu 1
sysbus-m48t08 1
== Voyager
Fujitsu-MB86904-sparc-cpu 1
apc 1
empty_slot 1
escc 2
macio_idreg 1
memory 1
openprom 1
or-irq 2
slavio_intctl 1
slavio_misc 1
slavio_timer 1
sparc32-dma 1
sun-fdtwo 1
sun4m-iommu 1
sysbus-m48t08 1
== leon3_generic
LEON3-sparc-cpu 1
grlib-ahbpnp 1
grlib-apbpnp 1
grlib-irqmp 1
== none
= ../qemu/bld/qemu-system-sparc64
== niagara
Sun-UltraSparc-T1-sparc64-cpu 1
== none
== sun4u
TI-UltraSparc-IIi-sparc64-cpu 1
cmd646-ide 1
ebus 1
i8042 1
isa-fdc 1
memory 1
openprom 1
pbm-bridge 2
power 1
sabre 1
sabre-pci 1
sun4u-iommu 1
sysbus-m48t59 1
== sun4v
Sun-UltraSparc-T1-sparc64-cpu 1
cmd646-ide 1
ebus 1
i8042 1
isa-fdc 1
memory 1
openprom 1
pbm-bridge 2
power 1
sabre 1
sabre-pci 1
sun4u-iommu 1
sysbus-m48t59 1
= ../qemu/bld/qemu-system-tricore
== KIT_AURIX_TC277_TRB
== none
== tricore_testboard
tc1796-tricore-cpu 1
= ../qemu/bld/qemu-system-x86_64
== microvm
acpi-ged 1
ioapic 1
isa-i8259 2
isa-pit 1
isabus-bridge 1
kvmvapic 1
mc146818rtc 1
qemu64-x86_64-cpu 1
virtio-mmio 24
== xenfv-4.2
== pc-i440fx-9.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-9.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-9.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-8.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-8.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-8.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-7.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-7.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-7.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-6.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-6.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-6.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-5.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-11.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-11.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-10.2
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-10.1
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-i440fx-10.0
PIIX3 1
hpet 1
i440FX 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-9.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-9.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-9.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-8.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-8.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-8.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-7.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-7.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-7.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-6.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-6.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-6.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-5.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-11.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-11.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-10.2
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-10.1
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== pc-q35-10.0
ICH9-LPC 1
ICH9-SMB 1
hpet 1
i8042 1
ich9-ahci 1
isa-i8259 2
isa-pcspk 1
isa-pit 1
kvmvapic 1
port92 1
qemu64-x86_64-cpu 1
smbus-eeprom 8
vmmouse 1
vmport 1
== isapc
486-x86_64-cpu 1
i8042 1
isa-fdc 1
isa-i8259 2
isa-ide 2
isa-pcspk 1
isa-pit 1
isabus-bridge 1
mc146818rtc 1
port92 1
vmmouse 1
vmport 1
== nitro
== none
== x-remote
== xenpv
== xenpvh
= ../qemu/bld/qemu-system-xtensa
== kc705
dc232b-xtensa-cpu 1
serial-mm 1
== kc705-nommu
de212-xtensa-cpu 1
serial-mm 1
== lx200
dc232b-xtensa-cpu 1
serial-mm 1
== lx200-nommu
de212-xtensa-cpu 1
serial-mm 1
== lx60
dc232b-xtensa-cpu 1
serial-mm 1
== lx60-nommu
de212-xtensa-cpu 1
serial-mm 1
== ml605
dc232b-xtensa-cpu 1
serial-mm 1
== ml605-nommu
de212-xtensa-cpu 1
serial-mm 1
== none
== sim
dc232b-xtensa-cpu 1
== virt
dc232b-xtensa-cpu 1
gpex-pcihost 1
= ../qemu/bld/qemu-system-xtensaeb
== kc705
fsf-xtensa-cpu 1
serial-mm 1
== kc705-nommu
fsf-xtensa-cpu 1
serial-mm 1
== lx200
fsf-xtensa-cpu 1
serial-mm 1
== lx200-nommu
fsf-xtensa-cpu 1
serial-mm 1
== lx60
fsf-xtensa-cpu 1
serial-mm 1
== lx60-nommu
fsf-xtensa-cpu 1
serial-mm 1
== ml605
fsf-xtensa-cpu 1
serial-mm 1
== ml605-nommu
fsf-xtensa-cpu 1
serial-mm 1
== none
== sim
fsf-xtensa-cpu 1
== virt
fsf-xtensa-cpu 1
gpex-pcihost 1
[*] Subject: A few Machines crash when "no default audio driver available"
Date: Thu, 09 Jul 2026 13:44:19 +0200
Message-ID: <87o6gge6b0.fsf@pond.sub.org>
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: Call to clean up QOM onboard devices lacking a parent 2026-07-09 14:59 Call to clean up QOM onboard devices lacking a parent Markus Armbruster @ 2026-07-09 16:02 ` BALATON Zoltan 2026-07-09 16:45 ` Graf (AWS), Alexander 2026-07-10 7:05 ` Markus Armbruster 0 siblings, 2 replies; 9+ messages in thread From: BALATON Zoltan @ 2026-07-09 16:02 UTC (permalink / raw) To: Markus Armbruster Cc: qemu-devel, Aditya Gupta, Alexander Graf, Alexandre Iooss, Alexey Kardashevskiy, Alistair Francis, Alistair Francis, Antony Pavlov, Artyom Tarasenko, Bernhard Beschow, Bibo Mao, Brian Cain, Chao Liu, Christian Borntraeger, Clément Chigot, Cédric Le Goater, Dorjoy Chowdhury, Edgar E. Iglesias, Eric Farman, Farhan Ali, Felipe Balbi, Francisco Iglesias, Frederic Konrad, Gaurav Sharma, Gautam Gala, Glenn Miles, Halil Pasic, Hao Wu, Harsh Prateek Bora, Helge Deller, Hendrik Brueckner, Hervé Poussineau, Huacai Chen, Jan Kiszka, Jared Rossi, Joel Stanley, Laurent Vivier, Manos Pitsidianakis, Mark Cave-Ayland, Matthew Rosato, Max Filippov, Michael Rolnik, Michael S. Tsirkin, Nicholas Piggin, Niek Linnenbank, Palmer Dabbelt, Paolo Bonzini, Peter Maydell, Philippe Mathieu-Daudé, Pierrick Bouvier, Ran Wang, Richard Henderson, Sai Pavan Boddu, Samuel Tardieu, Sergio Lopez, Song Gao, Stafford Horne, Subbaraya Sundeep, Thomas Huth, Tyrone Ting, qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x On Thu, 9 Jul 2026, Markus Armbruster wrote: > A QOM object must be the child of exactly one parent. This defines the > QOM composition tree. The link from parent to child is a property of > the parent, and therefore has a name that is unique within its parent. > An object's canonical QOM path is these names on the path from root to > object in the QOM composition tree separated by '/'. > > For devices: > > * If a device is plugged in with -device / device_add, and it has an ID, > we make it a child of /machine/peripheral/ with name ID. If it > doesn't have an ID, we make it a child of /machine/peripheral-anon/ > with name device[N], where N counts up from zero. The canonical QOM > path /machine/peripheral/ID is stable. The canonical QOM path > /machine/peripheral-anon/device[N] isn't: it depends on the number of > devices already there. > > * If a device is part of another device, it should be its child. The > child's canonical QOM path is the parent's plus '/CHILD-NAME'. Stable > as long as the parent's path and the child name are. > > * "Should" because we have a lot of code that fails to pick the parent. > When such a device gets realized, we make it a child of > /machine/unattached/ orphanage with name device[N], where N counts up > from zero. The canonical QOM path /machine/unattached/device[N] > depends on the number of children already in the orphanage, which > makes it unstable. > > Letting code get away with not picking a parent was a mistake. I > guess it "saved" us some thinking about what's part of what when > converting existing devices to QOM. In other words, it enabled sloppy > hardware modeling. We've been "saving" thinking ever since. > > I want /machine/unattached/ to be empty. If an onboard device isn't > part of another device, put it into /machine/ with a sensible name. The last time this came up I've asked a few questions but did not get an answer: 1. What's the use of the QOM composition tree? I never needed it and apart from being able to admire it in info qom-tree I don't know if it's used for anything. For a long time I did not even know about info qom-tree because I only needed info qtree and info mtree and rarely if ever need to look at the qom-tree. If it has no real use I'm happy to not think about it. 2. What is a QOM parent? There were proposals to parent devices to their bus if they have any, that's what qtree shows anyway. If it's something else it should be better defined somewhere. Without getting answers for these questions I don't think I'm able to fix the machines I maintain. Regards, BALATON Zoltan ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Call to clean up QOM onboard devices lacking a parent 2026-07-09 16:02 ` BALATON Zoltan @ 2026-07-09 16:45 ` Graf (AWS), Alexander 2026-07-10 6:25 ` Markus Armbruster 2026-07-10 7:05 ` Markus Armbruster 1 sibling, 1 reply; 9+ messages in thread From: Graf (AWS), Alexander @ 2026-07-09 16:45 UTC (permalink / raw) To: BALATON Zoltan, Markus Armbruster Cc: qemu-devel@nongnu.org, Aditya Gupta, Alexandre Iooss, Alexey Kardashevskiy, Alistair Francis, Alistair Francis, Antony Pavlov, Artyom Tarasenko, Bernhard Beschow, Bibo Mao, Brian Cain, Chao Liu, Christian Borntraeger, Clément Chigot, Cédric Le Goater, Dorjoy Chowdhury, Edgar E. Iglesias, Eric Farman, Farhan Ali, Felipe Balbi, Francisco Iglesias, Frederic Konrad, Gaurav Sharma, Gautam Gala, Glenn Miles, Halil Pasic, Hao Wu, Harsh Prateek Bora, Helge Deller, Hendrik Brueckner, Hervé Poussineau, Huacai Chen, Jan Kiszka, Jared Rossi, Joel Stanley, Laurent Vivier, Manos Pitsidianakis, Mark Cave-Ayland, Matthew Rosato, Max Filippov, Michael Rolnik, Michael S. Tsirkin, Nicholas Piggin, Niek Linnenbank, Palmer Dabbelt, Paolo Bonzini, Peter Maydell, Philippe Mathieu-Daudé, Pierrick Bouvier, Ran Wang, Richard Henderson, Sai Pavan Boddu, Samuel Tardieu, Sergio Lopez, Song Gao, Stafford Horne, Subbaraya Sundeep, Thomas Huth, Tyrone Ting, qemu-arm@nongnu.org, qemu-ppc@nongnu.org, qemu-riscv@nongnu.org, qemu-s390x@nongnu.org Hi Markus, On 09.07.26 18:02, BALATON Zoltan wrote: > > On Thu, 9 Jul 2026, Markus Armbruster wrote: >> A QOM object must be the child of exactly one parent. This defines the >> QOM composition tree. The link from parent to child is a property of >> the parent, and therefore has a name that is unique within its parent. >> An object's canonical QOM path is these names on the path from root to >> object in the QOM composition tree separated by '/'. >> >> For devices: >> >> * If a device is plugged in with -device / device_add, and it has an ID, >> we make it a child of /machine/peripheral/ with name ID. If it >> doesn't have an ID, we make it a child of /machine/peripheral-anon/ >> with name device[N], where N counts up from zero. The canonical QOM >> path /machine/peripheral/ID is stable. The canonical QOM path >> /machine/peripheral-anon/device[N] isn't: it depends on the number of >> devices already there. >> >> * If a device is part of another device, it should be its child. The >> child's canonical QOM path is the parent's plus '/CHILD-NAME'. Stable >> as long as the parent's path and the child name are. >> >> * "Should" because we have a lot of code that fails to pick the parent. >> When such a device gets realized, we make it a child of >> /machine/unattached/ orphanage with name device[N], where N counts up >> from zero. The canonical QOM path /machine/unattached/device[N] >> depends on the number of children already in the orphanage, which >> makes it unstable. >> >> Letting code get away with not picking a parent was a mistake. I >> guess it "saved" us some thinking about what's part of what when >> converting existing devices to QOM. In other words, it enabled sloppy >> hardware modeling. We've been "saving" thinking ever since. >> >> I want /machine/unattached/ to be empty. If an onboard device isn't >> part of another device, put it into /machine/ with a sensible name. > > The last time this came up I've asked a few questions but did not get an > answer: > > 1. What's the use of the QOM composition tree? I never needed it and > apart > from being able to admire it in info qom-tree I don't know if it's used > for anything. For a long time I did not even know about info qom-tree > because I only needed info qtree and info mtree and rarely if ever > need to > look at the qom-tree. If it has no real use I'm happy to not think about > it. > > 2. What is a QOM parent? There were proposals to parent devices to their > bus if they have any, that's what qtree shows anyway. If it's something > else it should be better defined somewhere. > > Without getting answers for these questions I don't think I'm able to fix > the machines I maintain. I'm also curious on whether there is anything that makes sysbus device spawns both easy (as they are today) and at the same time fully QOM parent compliant. I had a quick look at the vmapple machine and most of the offenders are sysbus devices I spawn via qdev_new(). Would you want all of these to get their parent declared via object_property_add_child()? If that's the case, why don't we introduce a new qdev_new_child() which does that automatically? Alex ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Call to clean up QOM onboard devices lacking a parent 2026-07-09 16:45 ` Graf (AWS), Alexander @ 2026-07-10 6:25 ` Markus Armbruster 2026-07-10 7:38 ` Graf (AWS), Alexander 0 siblings, 1 reply; 9+ messages in thread From: Markus Armbruster @ 2026-07-10 6:25 UTC (permalink / raw) To: Graf (AWS), Alexander Cc: BALATON Zoltan, Markus Armbruster, qemu-devel@nongnu.org, Aditya Gupta, Alexandre Iooss, Alexey Kardashevskiy, Alistair Francis, Alistair Francis, Antony Pavlov, Artyom Tarasenko, Bernhard Beschow, Bibo Mao, Brian Cain, Chao Liu, Christian Borntraeger, Clément Chigot, Cédric Le Goater, Dorjoy Chowdhury, Edgar E. Iglesias, Eric Farman, Farhan Ali, Felipe Balbi, Francisco Iglesias, Frederic Konrad, Gaurav Sharma, Gautam Gala, Glenn Miles, Halil Pasic, Hao Wu, Harsh Prateek Bora, Helge Deller, Hendrik Brueckner, Hervé Poussineau, Huacai Chen, Jan Kiszka, Jared Rossi, Joel Stanley, Laurent Vivier, Manos Pitsidianakis, Mark Cave-Ayland, Matthew Rosato, Max Filippov, Michael Rolnik, Michael S. Tsirkin, Nicholas Piggin, Niek Linnenbank, Palmer Dabbelt, Paolo Bonzini, Peter Maydell, Philippe Mathieu-Daudé, Pierrick Bouvier, Ran Wang, Richard Henderson, Sai Pavan Boddu, Samuel Tardieu, Sergio Lopez, Song Gao, Stafford Horne, Subbaraya Sundeep, Thomas Huth, Tyrone Ting, qemu-arm@nongnu.org, qemu-ppc@nongnu.org, qemu-riscv@nongnu.org, qemu-s390x@nongnu.org "Graf (AWS), Alexander" <graf@amazon.de> writes: > Hi Markus, [...] > I'm also curious on whether there is anything that makes sysbus device > spawns both easy (as they are today) and at the same time fully QOM > parent compliant. > > I had a quick look at the vmapple machine and most of the offenders are > sysbus devices I spawn via qdev_new(). Would you want all of these to > get their parent declared via object_property_add_child()? If that's the > case, why don't we introduce a new qdev_new_child() which does that > automatically? We do have such convenience functions at the QOM layer: object_new() and object_property_add_child() etc., are basic building blocks, and object_new_with_props() etc. combine them in useful ways. We don't have such convenience functions at the qdev layer. Can't see why we couldn't add them. Number of orphaned device types I see by bus_type: 69 busless 15 ISA 33 PCI 11 SSI 209 System 2 apple-desktop-bus 23 i2c-bus 2 sd-bus 1 spapr-vio-bus 2 usb-bus Again, not a problem with the device types, but the code that creates and realizes them. Bus types commonly provide a layer above qdev for that. Perhaps these layers could also use convenience functions to more easily deal with setting the QOM parent. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Call to clean up QOM onboard devices lacking a parent 2026-07-10 6:25 ` Markus Armbruster @ 2026-07-10 7:38 ` Graf (AWS), Alexander 2026-07-10 8:03 ` Markus Armbruster 0 siblings, 1 reply; 9+ messages in thread From: Graf (AWS), Alexander @ 2026-07-10 7:38 UTC (permalink / raw) To: Markus Armbruster Cc: BALATON Zoltan, qemu-devel@nongnu.org, Aditya Gupta, Alexandre Iooss, Alexey Kardashevskiy, Alistair Francis, Alistair Francis, Antony Pavlov, Artyom Tarasenko, Bernhard Beschow, Bibo Mao, Brian Cain, Chao Liu, Christian Borntraeger, Clément Chigot, Cédric Le Goater, Dorjoy Chowdhury, Edgar E. Iglesias, Eric Farman, Farhan Ali, Felipe Balbi, Francisco Iglesias, Frederic Konrad, Gaurav Sharma, Gautam Gala, Glenn Miles, Halil Pasic, Hao Wu, Harsh Prateek Bora, Helge Deller, Hendrik Brueckner, Hervé Poussineau, Huacai Chen, Jan Kiszka, Jared Rossi, Joel Stanley, Laurent Vivier, Manos Pitsidianakis, Mark Cave-Ayland, Matthew Rosato, Max Filippov, Michael Rolnik, Michael S. Tsirkin, Nicholas Piggin, Niek Linnenbank, Palmer Dabbelt, Paolo Bonzini, Peter Maydell, Philippe Mathieu-Daudé, Pierrick Bouvier, Ran Wang, Richard Henderson, Sai Pavan Boddu, Samuel Tardieu, Sergio Lopez, Song Gao, Stafford Horne, Subbaraya Sundeep, Thomas Huth, Tyrone Ting, qemu-arm@nongnu.org, qemu-ppc@nongnu.org, qemu-riscv@nongnu.org, qemu-s390x@nongnu.org On 10.07.26 08:25, Markus Armbruster wrote: > "Graf (AWS), Alexander" <graf@amazon.de> writes: > >> Hi Markus, > [...] > >> I'm also curious on whether there is anything that makes sysbus device >> spawns both easy (as they are today) and at the same time fully QOM >> parent compliant. >> >> I had a quick look at the vmapple machine and most of the offenders are >> sysbus devices I spawn via qdev_new(). Would you want all of these to >> get their parent declared via object_property_add_child()? If that's the >> case, why don't we introduce a new qdev_new_child() which does that >> automatically? > We do have such convenience functions at the QOM layer: object_new() and > object_property_add_child() etc., are basic building blocks, and > object_new_with_props() etc. combine them in useful ways. > > We don't have such convenience functions at the qdev layer. Can't see > why we couldn't add them. > > Number of orphaned device types I see by bus_type: > > 69 busless > 15 ISA > 33 PCI > 11 SSI > 209 System > 2 apple-desktop-bus > 23 i2c-bus > 2 sd-bus > 1 spapr-vio-bus > 2 usb-bus > > Again, not a problem with the device types, but the code that creates > and realizes them. > > Bus types commonly provide a layer above qdev for that. Perhaps these > layers could also use convenience functions to more easily deal with > setting the QOM parent. I think the crux of the problem is that we ended up inheriting creation APIs that didn't necessarily express a clear parent/child relationship, so we end up orphaning these type of objects in the QOM tree. So the *real* answer IMHO is to rebuild all these APIs into something that enforces that. This way we also won't have new offenders sneaking in. I won't be able to spend the weeks it requires to do this by hand, but I can have a stab at it with AI - which is likely much more reliable at getting this done correctly than me too :). I can post it as RFC and then we decide whether we want to take it or leave it. Alex ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Call to clean up QOM onboard devices lacking a parent 2026-07-10 7:38 ` Graf (AWS), Alexander @ 2026-07-10 8:03 ` Markus Armbruster 0 siblings, 0 replies; 9+ messages in thread From: Markus Armbruster @ 2026-07-10 8:03 UTC (permalink / raw) To: Graf (AWS), Alexander Cc: BALATON Zoltan, qemu-devel@nongnu.org, Aditya Gupta, Alexandre Iooss, Alexey Kardashevskiy, Alistair Francis, Alistair Francis, Antony Pavlov, Artyom Tarasenko, Bernhard Beschow, Bibo Mao, Brian Cain, Chao Liu, Christian Borntraeger, Clément Chigot, Cédric Le Goater, Dorjoy Chowdhury, Edgar E. Iglesias, Eric Farman, Farhan Ali, Felipe Balbi, Francisco Iglesias, Frederic Konrad, Gaurav Sharma, Gautam Gala, Glenn Miles, Halil Pasic, Hao Wu, Harsh Prateek Bora, Helge Deller, Hendrik Brueckner, Hervé Poussineau, Huacai Chen, Jan Kiszka, Jared Rossi, Joel Stanley, Laurent Vivier, Manos Pitsidianakis, Mark Cave-Ayland, Matthew Rosato, Max Filippov, Michael Rolnik, Michael S. Tsirkin, Nicholas Piggin, Niek Linnenbank, Palmer Dabbelt, Paolo Bonzini, Peter Maydell, Philippe Mathieu-Daudé, Pierrick Bouvier, Ran Wang, Richard Henderson, Sai Pavan Boddu, Samuel Tardieu, Sergio Lopez, Song Gao, Stafford Horne, Subbaraya Sundeep, Thomas Huth, Tyrone Ting, qemu-arm@nongnu.org, qemu-ppc@nongnu.org, qemu-riscv@nongnu.org, qemu-s390x@nongnu.org "Graf (AWS), Alexander" <graf@amazon.de> writes: > On 10.07.26 08:25, Markus Armbruster wrote: >> "Graf (AWS), Alexander" <graf@amazon.de> writes: >> >>> Hi Markus, >> [...] >> >>> I'm also curious on whether there is anything that makes sysbus device >>> spawns both easy (as they are today) and at the same time fully QOM >>> parent compliant. >>> >>> I had a quick look at the vmapple machine and most of the offenders are >>> sysbus devices I spawn via qdev_new(). Would you want all of these to >>> get their parent declared via object_property_add_child()? If that's the >>> case, why don't we introduce a new qdev_new_child() which does that >>> automatically? >> >> We do have such convenience functions at the QOM layer: object_new() and >> object_property_add_child() etc., are basic building blocks, and >> object_new_with_props() etc. combine them in useful ways. >> >> We don't have such convenience functions at the qdev layer. Can't see >> why we couldn't add them. >> >> Number of orphaned device types I see by bus_type: >> >> 69 busless >> 15 ISA >> 33 PCI >> 11 SSI >> 209 System >> 2 apple-desktop-bus >> 23 i2c-bus >> 2 sd-bus >> 1 spapr-vio-bus >> 2 usb-bus >> >> Again, not a problem with the device types, but the code that creates >> and realizes them. >> >> Bus types commonly provide a layer above qdev for that. Perhaps these >> layers could also use convenience functions to more easily deal with >> setting the QOM parent. > > > I think the crux of the problem is that we ended up inheriting creation > APIs that didn't necessarily express a clear parent/child relationship, > so we end up orphaning these type of objects in the QOM tree. So the > *real* answer IMHO is to rebuild all these APIs into something that > enforces that. This way we also won't have new offenders sneaking in. The appended trivial patch will keep new offenders out. Drawback: it breaks almost everything due to existing offenders ;) Kidding aside, the code it deletes was a mistake. We likely added it for quicker initial conversions. The technical debt's compound interest has been piling up ever since. > I won't be able to spend the weeks it requires to do this by hand, but I > can have a stab at it with AI - which is likely much more reliable at > getting this done correctly than me too :). I can post it as RFC and > then we decide whether we want to take it or leave it. The part that requires actual thought is the hardware modeling: what's part of what. diff --git a/hw/core/qdev.c b/hw/core/qdev.c index e2aab3d1fc..058f89fa55 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -493,15 +493,6 @@ static void device_set_realized(Object *obj, bool value, Error **errp) goto fail; } - if (!obj->parent) { - gchar *name = g_strdup_printf("device[%d]", unattached_count++); - - object_property_add_child(machine_get_container("unattached"), - name, obj); - unattached_parent = true; - g_free(name); - } - hotplug_ctrl = qdev_get_hotplug_handler(dev); if (hotplug_ctrl) { hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err); ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: Call to clean up QOM onboard devices lacking a parent 2026-07-09 16:02 ` BALATON Zoltan 2026-07-09 16:45 ` Graf (AWS), Alexander @ 2026-07-10 7:05 ` Markus Armbruster 2026-07-10 12:13 ` BALATON Zoltan 1 sibling, 1 reply; 9+ messages in thread From: Markus Armbruster @ 2026-07-10 7:05 UTC (permalink / raw) To: BALATON Zoltan Cc: qemu-devel, Aditya Gupta, Alexander Graf, Alexandre Iooss, Alexey Kardashevskiy, Alistair Francis, Alistair Francis, Antony Pavlov, Artyom Tarasenko, Bernhard Beschow, Bibo Mao, Brian Cain, Chao Liu, Christian Borntraeger, Clément Chigot, Cédric Le Goater, Dorjoy Chowdhury, Edgar E. Iglesias, Eric Farman, Farhan Ali, Felipe Balbi, Francisco Iglesias, Frederic Konrad, Gaurav Sharma, Gautam Gala, Glenn Miles, Halil Pasic, Hao Wu, Harsh Prateek Bora, Helge Deller, Hendrik Brueckner, Hervé Poussineau, Huacai Chen, Jan Kiszka, Jared Rossi, Joel Stanley, Laurent Vivier, Manos Pitsidianakis, Mark Cave-Ayland, Matthew Rosato, Max Filippov, Michael Rolnik, Michael S. Tsirkin, Nicholas Piggin, Niek Linnenbank, Palmer Dabbelt, Paolo Bonzini, Peter Maydell, Philippe Mathieu-Daudé, Pierrick Bouvier, Ran Wang, Richard Henderson, Sai Pavan Boddu, Samuel Tardieu, Sergio Lopez, Song Gao, Stafford Horne, Subbaraya Sundeep, Thomas Huth, Tyrone Ting, qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x BALATON Zoltan <balaton@eik.bme.hu> writes: > On Thu, 9 Jul 2026, Markus Armbruster wrote: >> A QOM object must be the child of exactly one parent. This defines the >> QOM composition tree. The link from parent to child is a property of >> the parent, and therefore has a name that is unique within its parent. >> An object's canonical QOM path is these names on the path from root to >> object in the QOM composition tree separated by '/'. >> >> For devices: >> >> * If a device is plugged in with -device / device_add, and it has an ID, >> we make it a child of /machine/peripheral/ with name ID. If it >> doesn't have an ID, we make it a child of /machine/peripheral-anon/ >> with name device[N], where N counts up from zero. The canonical QOM >> path /machine/peripheral/ID is stable. The canonical QOM path >> /machine/peripheral-anon/device[N] isn't: it depends on the number of >> devices already there. >> >> * If a device is part of another device, it should be its child. The >> child's canonical QOM path is the parent's plus '/CHILD-NAME'. Stable >> as long as the parent's path and the child name are. >> >> * "Should" because we have a lot of code that fails to pick the parent. >> When such a device gets realized, we make it a child of >> /machine/unattached/ orphanage with name device[N], where N counts up >> from zero. The canonical QOM path /machine/unattached/device[N] >> depends on the number of children already in the orphanage, which >> makes it unstable. >> >> Letting code get away with not picking a parent was a mistake. I >> guess it "saved" us some thinking about what's part of what when >> converting existing devices to QOM. In other words, it enabled sloppy >> hardware modeling. We've been "saving" thinking ever since. >> >> I want /machine/unattached/ to be empty. If an onboard device isn't >> part of another device, put it into /machine/ with a sensible name. > > The last time this came up I've asked a few questions but did not get an answer: > > 1. What's the use of the QOM composition tree? I never needed it and apart from being able to admire it in info qom-tree I don't know if it's used for anything. For a long time I did not even know about info qom-tree because I only needed info qtree and info mtree and rarely if ever need to look at the qom-tree. If it has no real use I'm happy to not think about it. > > 2. What is a QOM parent? There were proposals to parent devices to their bus if they have any, that's what qtree shows anyway. If it's something else it should be better defined somewhere. > > Without getting answers for these questions I don't think I'm able to fix the machines I maintain. Unfortunately, I don't have the time to teach a class on QOM basics today. The text you quoted explains what QOM parent and canonical QOM path are, albeit briefly. It also explains how to pick the QOM parent properly, what happens when you neglect to pick one, and why that's undesirable. I'm going to elaborate a bit. A fully constructed QOM object is part of the QOM composition tree. This is a fundamental property of QOM's design. A QOM object can be composed of sub-objects. Its sub-objects are its children in the composition tree. That's why it's named *composition* tree. Canonical QOM paths are visible at external interfaces both as input and as output. A few quick examples: * QMP command query-cpus-fast reports a CPU's canonical QOM path. For some machines, we get something like "/machine/unattached/device[0]". Fine as long as the client treats it as an opaque handle. For other machines, we get something like "/machine/soc/cpu", which is clearly better. * Error messages use canonical QOM paths to identify devices. With properly modeled hardware, these paths are actually helpful for humans. Something like "/machine/unattached/device[7]" not so much. * QMP command device-sync-config accepts a QOM path argument. With properly modeled hardware, you can use a stable canonical QOM path. But when the device is in the /machine/unattached orphanage, its canonical QOM path is unstable. A client has to first search the orphanage to find today's path. Further questions? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Call to clean up QOM onboard devices lacking a parent 2026-07-10 7:05 ` Markus Armbruster @ 2026-07-10 12:13 ` BALATON Zoltan 2026-07-13 6:43 ` Markus Armbruster 0 siblings, 1 reply; 9+ messages in thread From: BALATON Zoltan @ 2026-07-10 12:13 UTC (permalink / raw) To: Markus Armbruster Cc: qemu-devel, Aditya Gupta, Alexander Graf, Alexandre Iooss, Alexey Kardashevskiy, Alistair Francis, Alistair Francis, Antony Pavlov, Artyom Tarasenko, Bernhard Beschow, Bibo Mao, Brian Cain, Chao Liu, Christian Borntraeger, Clément Chigot, Cédric Le Goater, Dorjoy Chowdhury, Edgar E. Iglesias, Eric Farman, Farhan Ali, Felipe Balbi, Francisco Iglesias, Frederic Konrad, Gaurav Sharma, Gautam Gala, Glenn Miles, Halil Pasic, Hao Wu, Harsh Prateek Bora, Helge Deller, Hendrik Brueckner, Hervé Poussineau, Huacai Chen, Jan Kiszka, Jared Rossi, Joel Stanley, Laurent Vivier, Manos Pitsidianakis, Mark Cave-Ayland, Matthew Rosato, Max Filippov, Michael Rolnik, Michael S. Tsirkin, Nicholas Piggin, Niek Linnenbank, Palmer Dabbelt, Paolo Bonzini, Peter Maydell, Philippe Mathieu-Daudé, Pierrick Bouvier, Ran Wang, Richard Henderson, Sai Pavan Boddu, Samuel Tardieu, Sergio Lopez, Song Gao, Stafford Horne, Subbaraya Sundeep, Thomas Huth, Tyrone Ting, qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x On Fri, 10 Jul 2026, Markus Armbruster wrote: > BALATON Zoltan <balaton@eik.bme.hu> writes: > >> On Thu, 9 Jul 2026, Markus Armbruster wrote: >>> A QOM object must be the child of exactly one parent. This defines the >>> QOM composition tree. The link from parent to child is a property of >>> the parent, and therefore has a name that is unique within its parent. >>> An object's canonical QOM path is these names on the path from root to >>> object in the QOM composition tree separated by '/'. >>> >>> For devices: >>> >>> * If a device is plugged in with -device / device_add, and it has an ID, >>> we make it a child of /machine/peripheral/ with name ID. If it >>> doesn't have an ID, we make it a child of /machine/peripheral-anon/ >>> with name device[N], where N counts up from zero. The canonical QOM >>> path /machine/peripheral/ID is stable. The canonical QOM path >>> /machine/peripheral-anon/device[N] isn't: it depends on the number of >>> devices already there. >>> >>> * If a device is part of another device, it should be its child. The >>> child's canonical QOM path is the parent's plus '/CHILD-NAME'. Stable >>> as long as the parent's path and the child name are. >>> >>> * "Should" because we have a lot of code that fails to pick the parent. >>> When such a device gets realized, we make it a child of >>> /machine/unattached/ orphanage with name device[N], where N counts up >>> from zero. The canonical QOM path /machine/unattached/device[N] >>> depends on the number of children already in the orphanage, which >>> makes it unstable. >>> >>> Letting code get away with not picking a parent was a mistake. I >>> guess it "saved" us some thinking about what's part of what when >>> converting existing devices to QOM. In other words, it enabled sloppy >>> hardware modeling. We've been "saving" thinking ever since. >>> >>> I want /machine/unattached/ to be empty. If an onboard device isn't >>> part of another device, put it into /machine/ with a sensible name. >> >> The last time this came up I've asked a few questions but did not get an answer: >> >> 1. What's the use of the QOM composition tree? I never needed it and apart from being able to admire it in info qom-tree I don't know if it's used for anything. For a long time I did not even know about info qom-tree because I only needed info qtree and info mtree and rarely if ever need to look at the qom-tree. If it has no real use I'm happy to not think about it. >> >> 2. What is a QOM parent? There were proposals to parent devices to their bus if they have any, that's what qtree shows anyway. If it's something else it should be better defined somewhere. >> >> Without getting answers for these questions I don't think I'm able to fix the machines I maintain. > > Unfortunately, I don't have the time to teach a class on QOM basics > today. The text you quoted explains what QOM parent and canonical QOM > path are, albeit briefly. It also explains how to pick the QOM parent > properly, what happens when you neglect to pick one, and why that's > undesirable. I'm going to elaborate a bit. I read that text but understood it describes what is done now and missed the part where it says how to pick a parent. > A fully constructed QOM object is part of the QOM composition tree. > This is a fundamental property of QOM's design. > > A QOM object can be composed of sub-objects. Its sub-objects are its > children in the composition tree. That's why it's named *composition* > tree. OK so this is clear for a SoC or a multifunction device where we mostly do that now, for example hw/isa/vt82c686.c has object_initialize_child for its parts (which is the only reason we need an init method and could do without it otherwise). For PPC460EX we don't model the SoC as this is old code that was cleaned up a bit but never completed to convert everything so the machine still creates the SoC parts and wires them as a lot of older machines did. I intended to improve the PCIe emulation on sam460ex and clean up that part during that but haven't got to it yet. I guess other devices like isa have the same problem that they predate even QOM so was not fully converted yet. What should own sysbus devices? The machine? Or is it the bus which owns the devices connected to it? Another problem is that machines usually use convenience functions to create devices such as sysbus_create_simple and pci_create_simple so if these devices need to be attached to the machine then these convenience functions should take care of that not the board code. It's rare that a device does object_new or object_initialize to get a device and it would be inconvenient to then cast the result to object and parent it somewhere where the functions that created the device could do this. > Canonical QOM paths are visible at external interfaces both as input and > as output. A few quick examples: > > * QMP command query-cpus-fast reports a CPU's canonical QOM path. For > some machines, we get something like "/machine/unattached/device[0]". > Fine as long as the client treats it as an opaque handle. For other > machines, we get something like "/machine/soc/cpu", which is clearly > better. As you say does not matter what is it called if it's just a handle. > * Error messages use canonical QOM paths to identify devices. With > properly modeled hardware, these paths are actually helpful for > humans. Something like "/machine/unattached/device[7]" not so much. Never seen such error message. Usually errors also say what device it is from so usually straightforward to know where it comes from. > * QMP command device-sync-config accepts a QOM path argument. With > properly modeled hardware, you can use a stable canonical QOM path. > But when the device is in the /machine/unattached orphanage, its > canonical QOM path is unstable. A client has to first search the > orphanage to find today's path. Never needed to use device-sync-config. It's not even documented at https://www.qemu.org/docs/master/system/monitor.html#qemu-monitor so I have no idea what this command does. Found some info here: https://www.qemu.org/docs/master/devel/qdev-api.html but I don't know about any device implementing that so it's probably a rare thing. > Further questions? Basically the question was why should I think about this if things work now and nobody complained about it so it looked like it just bothers you that there are some unparented objects that could be put in some other category, but it's not a real issue for any common problem other than esthetics. I'm OK with solving that within QOM or qdev or somewhere where I don't have to think about it when writing board code. Imposing it on the board code looks like additional complexity and yet another thing to confuse new people trying to create a machine so unless there's a good reason to require that I'd do without it. Where are stable QOM paths needed? If you can't predict them and still need to query it first then it likely does not matter what is the path as it's just used to query and refer to a device as a handle so in that case we may just forget the path hierarchy and make it flat and that would also solve your issue with unparented devices. Regards, BALATON Zoltan ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Call to clean up QOM onboard devices lacking a parent 2026-07-10 12:13 ` BALATON Zoltan @ 2026-07-13 6:43 ` Markus Armbruster 0 siblings, 0 replies; 9+ messages in thread From: Markus Armbruster @ 2026-07-13 6:43 UTC (permalink / raw) To: BALATON Zoltan Cc: qemu-devel, Aditya Gupta, Alexander Graf, Alexandre Iooss, Alexey Kardashevskiy, Alistair Francis, Alistair Francis, Antony Pavlov, Artyom Tarasenko, Bernhard Beschow, Bibo Mao, Brian Cain, Chao Liu, Christian Borntraeger, Clément Chigot, Cédric Le Goater, Dorjoy Chowdhury, Edgar E. Iglesias, Eric Farman, Farhan Ali, Felipe Balbi, Francisco Iglesias, Frederic Konrad, Gaurav Sharma, Gautam Gala, Glenn Miles, Halil Pasic, Hao Wu, Harsh Prateek Bora, Helge Deller, Hendrik Brueckner, Hervé Poussineau, Huacai Chen, Jan Kiszka, Jared Rossi, Joel Stanley, Laurent Vivier, Manos Pitsidianakis, Mark Cave-Ayland, Matthew Rosato, Max Filippov, Michael Rolnik, Michael S. Tsirkin, Nicholas Piggin, Niek Linnenbank, Palmer Dabbelt, Paolo Bonzini, Peter Maydell, Philippe Mathieu-Daudé, Pierrick Bouvier, Ran Wang, Richard Henderson, Sai Pavan Boddu, Samuel Tardieu, Sergio Lopez, Song Gao, Stafford Horne, Subbaraya Sundeep, Thomas Huth, Tyrone Ting, qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x BALATON Zoltan <balaton@eik.bme.hu> writes: > On Fri, 10 Jul 2026, Markus Armbruster wrote: >> BALATON Zoltan <balaton@eik.bme.hu> writes: >> >>> On Thu, 9 Jul 2026, Markus Armbruster wrote: >>>> A QOM object must be the child of exactly one parent. This defines the >>>> QOM composition tree. The link from parent to child is a property of >>>> the parent, and therefore has a name that is unique within its parent. >>>> An object's canonical QOM path is these names on the path from root to >>>> object in the QOM composition tree separated by '/'. >>>> >>>> For devices: >>>> >>>> * If a device is plugged in with -device / device_add, and it has an ID, >>>> we make it a child of /machine/peripheral/ with name ID. If it >>>> doesn't have an ID, we make it a child of /machine/peripheral-anon/ >>>> with name device[N], where N counts up from zero. The canonical QOM >>>> path /machine/peripheral/ID is stable. The canonical QOM path >>>> /machine/peripheral-anon/device[N] isn't: it depends on the number of >>>> devices already there. >>>> >>>> * If a device is part of another device, it should be its child. The >>>> child's canonical QOM path is the parent's plus '/CHILD-NAME'. Stable >>>> as long as the parent's path and the child name are. >>>> >>>> * "Should" because we have a lot of code that fails to pick the parent. >>>> When such a device gets realized, we make it a child of >>>> /machine/unattached/ orphanage with name device[N], where N counts up >>>> from zero. The canonical QOM path /machine/unattached/device[N] >>>> depends on the number of children already in the orphanage, which >>>> makes it unstable. >>>> >>>> Letting code get away with not picking a parent was a mistake. I >>>> guess it "saved" us some thinking about what's part of what when >>>> converting existing devices to QOM. In other words, it enabled sloppy >>>> hardware modeling. We've been "saving" thinking ever since. >>>> >>>> I want /machine/unattached/ to be empty. If an onboard device isn't >>>> part of another device, put it into /machine/ with a sensible name. >>> >>> The last time this came up I've asked a few questions but did not get an answer: >>> >>> 1. What's the use of the QOM composition tree? I never needed it and apart from being able to admire it in info qom-tree I don't know if it's used for anything. For a long time I did not even know about info qom-tree because I only needed info qtree and info mtree and rarely if ever need to look at the qom-tree. If it has no real use I'm happy to not think about it. >>> >>> 2. What is a QOM parent? There were proposals to parent devices to their bus if they have any, that's what qtree shows anyway. If it's something else it should be better defined somewhere. >>> >>> Without getting answers for these questions I don't think I'm able to fix the machines I maintain. >> >> Unfortunately, I don't have the time to teach a class on QOM basics >> today. The text you quoted explains what QOM parent and canonical QOM >> path are, albeit briefly. It also explains how to pick the QOM parent >> properly, what happens when you neglect to pick one, and why that's >> undesirable. I'm going to elaborate a bit. > > I read that text but understood it describes what is done now and missed the part where it says how to pick a parent. > >> A fully constructed QOM object is part of the QOM composition tree. >> This is a fundamental property of QOM's design. >> >> A QOM object can be composed of sub-objects. Its sub-objects are its >> children in the composition tree. That's why it's named *composition* >> tree. > > OK so this is clear for a SoC or a multifunction device where we mostly do that now, for example hw/isa/vt82c686.c has object_initialize_child for its parts (which is the only reason we need an init method and could do without it otherwise). For PPC460EX we don't model the SoC as this is old code that was cleaned up a bit but never completed to convert everything so the machine still creates the SoC parts and wires them as a lot of older machines did. I intended to improve the PCIe emulation on sam460ex and clean up that part during that but haven't got to it yet. I guess other devices like isa have the same problem that they predate even QOM so was not fully converted yet. Yes, many of the early conversions were superficial. Once problematic code exists, it gets imitated. We shouldn't blame the victims. > What should own sysbus devices? The machine? Or is it the bus which owns the devices connected to it? If the sysbus device is part of another device, it should be below it in the composition tree. Whether to connect it directly or via its bus is arguably a matter of taste. Would be nice if we could agree on a convention there. If it's not part of another device (say a chip soldered onto the mainboard), then put it into /machine with a sensible name. > Another problem is that machines usually use convenience functions to create devices such as sysbus_create_simple and pci_create_simple so if these devices need to be attached to the machine then these convenience functions should take care of that not the board code. It's rare that a device does object_new or object_initialize to get a device and it would be inconvenient to then cast the result to object and parent it somewhere where the functions that created the device could do this. Alex Graf just posted RFC patches "qom: Make composition-tree parenting mandatory". I haven't hat a chance to examine them, but patch titles suggest the series takes care of that. >> Canonical QOM paths are visible at external interfaces both as input and >> as output. A few quick examples: >> >> * QMP command query-cpus-fast reports a CPU's canonical QOM path. For >> some machines, we get something like "/machine/unattached/device[0]". >> Fine as long as the client treats it as an opaque handle. For other >> machines, we get something like "/machine/soc/cpu", which is clearly >> better. > > As you say does not matter what is it called if it's just a handle. True! Still, nice names help humans with debugging and such. We should go for them whenever practical. >> * Error messages use canonical QOM paths to identify devices. With >> properly modeled hardware, these paths are actually helpful for >> humans. Something like "/machine/unattached/device[7]" not so much. > > Never seen such error message. Usually errors also say what device it is from so usually straightforward to know where it comes from. Such error messages definitely exist. Random pick, hw/net/can/flexcan.c: error_setg(errp, "%s: flexcan_connect_to_bus failed", dev->canonical_path); Many trace points and log entries show canonical QOM paths, too. >> * QMP command device-sync-config accepts a QOM path argument. With >> properly modeled hardware, you can use a stable canonical QOM path. >> But when the device is in the /machine/unattached orphanage, its >> canonical QOM path is unstable. A client has to first search the >> orphanage to find today's path. > > Never needed to use device-sync-config. It's not even documented at https://www.qemu.org/docs/master/system/monitor.html#qemu-monitor so I have no idea what this command does. Found some info here: > https://www.qemu.org/docs/master/devel/qdev-api.html but I don't know about any device implementing that so it's probably a rare thing. To learn what a QMP command does, start with the "QEMU QMP Reference Manual". All commands are documented there, or else QEMU fails to build. Can't enforce the documentation to be *good*, though. So if you find something that's bad, post a patch or file a bug. If my point was "device-sync-config needs this", an argument "who cares for device-sync-config" could perhaps be made. It is not. My point is that canonical QOM paths are part of external interfaces *by design*. device-sync-config is merely the first example I found for use of QOM paths in QMP input. >> Further questions? > > Basically the question was why should I think about this if things work now and nobody complained about it so it looked like it just bothers you that there are some unparented objects that could be put in some other category, but it's not a real issue for any common problem other than esthetics. I'm OK with solving that within QOM or qdev or somewhere where I don't have to think about it when writing board code. Imposing it on the board code looks like additional complexity and yet another thing to confuse new people trying to create a machine so unless there's a good reason to require that I'd do without it. > > Where are stable QOM paths needed? Once again: they are part of external interfaces. > If you can't predict them and still need to query it first then it likely does not matter what is the path as it's just used to query and refer to a device as a handle so in that case we may just forget the path hierarchy and make it flat and that would also solve your issue with unparented devices. That's not how QOM works. You are welcome to propose a redesign of QOM. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-07-13 6:43 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-07-09 14:59 Call to clean up QOM onboard devices lacking a parent Markus Armbruster 2026-07-09 16:02 ` BALATON Zoltan 2026-07-09 16:45 ` Graf (AWS), Alexander 2026-07-10 6:25 ` Markus Armbruster 2026-07-10 7:38 ` Graf (AWS), Alexander 2026-07-10 8:03 ` Markus Armbruster 2026-07-10 7:05 ` Markus Armbruster 2026-07-10 12:13 ` BALATON Zoltan 2026-07-13 6:43 ` Markus Armbruster
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.