hw/intc/exynos4210_gic: Turn instance_init into realize function
PATCH 1/1 hw/intc/exynos4210_gic: Turn instance_init into realize function
The instance_init function of the "exynos4210.gic" device creates a new "arm_gic" device and immediately realizes it with qdev_init_nofail(). This will leave a lot of object in the QOM tree during introspection of the "exynos4210.gic" device, e.g. reproducible by starting QEMU like this:
qemu-system-aarch64 -M none -nodefaults -nographic -monitor stdio
And then by running "info qom-tree" at the HMP monitor, followed by "device_add exynos4210.gic,help" and finally checking "info qom-tree" again.
Also note that qdev_init_nofail() can exit QEMU in case of errors - and this must never happen during an instance_init function, otherwise QEMU could terminate unexpectedly during introspection of a device.
Since most of the code that follows the qdev_init_nofail() depends on the realized "gicbusdev", the easiest solution to the problem is to turn the whole instance_init function into a realize function instead.
--- hw/intc/exynos4210_gic.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
hw/intc/exynos4210_gic.c +3 -3
@@ -281,9 +281,9 @@ static void exynos4210_gic_set_irq(void *opaque, int irq, int level)qemu_set_irq (qdev_get_gpio_in (s->gic, irq), level); } -static void exynos4210_gic_init (Object *obj) +static void exynos4210_gic_realize (DeviceState *dev,Error **errp) { -DeviceState *dev =DEVICE (obj); +Object *obj =OBJECT (dev);Exynos4210GicState *s =EXYNOS4210_GIC (obj);SysBusDevice *sbd =SYS_BUS_DEVICE (obj);const char cpu_prefix[] ="exynos4210-gic-alias_cpu" ;
@@ -347,13 +347,13 @@ static void exynos4210_gic_class_init(ObjectClass *klass, void *data)DeviceClass *dc =DEVICE_CLASS (klass); dc->props = exynos4210_gic_properties; + dc->realize = exynos4210_gic_realize; }static const TypeInfo exynos4210_gic_info = { .name =TYPE_EXYNOS4210_GIC , .parent =TYPE_SYS_BUS_DEVICE , .instance_size =sizeof (Exynos4210GicState), - .instance_init = exynos4210_gic_init, .class_init = exynos4210_gic_class_init, };
Signature · 1 line
1.8.3.1
Peter Maydell
AppliedQuoted 15 lines · Thomas Huth
The
instance_initfunction of the "exynos4210.gic" device creates a new "arm_gic" device and immediately realizes it withqdev_init_nofail(). This will leave a lot of object in the QOM tree during introspection of the "exynos4210.gic" device, e.g. reproducible by starting QEMU like this:qemu-system-aarch64 -M none -nodefaults -nographic -monitor stdio
And then by running "info qom-tree" at the HMP monitor, followed by "
device_addexynos4210.gic,help" and finally checking "info qom-tree" again.Also note that
qdev_init_nofail()can exit QEMU in case of errors - and this must never happen during aninstance_initfunction, otherwise QEMU could terminate unexpectedly during introspection of a device.
Quoted 5 lines
Since most of the code that follows the
qdev_init_nofail()depends on the realized "gicbusdev", the easiest solution to the problem is to turn the wholeinstance_initfunction into a realize function instead.Signed-off-by Thomas Huth <[email protected]>
Applied to target-arm.next, thanks.
-- PMM