hw/*/realview: Fix introspection problem with 'realview_mpcore' & 'realview_gic'

echo "{'execute':'qmp_capabilities'} {'execute':'device-list-properties'," \
 "'arguments':{'typename':'realview_mpcore'}}" \
 "{'execute': 'human-monitor-command', " \
 "'arguments': {'command-line': 'info qtree'}}" | \
 valgrind -q aarch64-softmmu/qemu-system-aarch64 -M none,accel=qtest -qmp stdio
[...]
==2654== Invalid read of size 8
==2654==    at 0x61878A: qdev_print (qdev-monitor.c:686)
==2654==    by 0x61878A: qbus_print (qdev-monitor.c:719)
==2654==    by 0x452B38: handle_hmp_command (monitor.c:3446)
==2654==    by 0x452D70: qmp_human_monitor_command (monitor.c:821)
[...]

Use sysbus_init_child_obj() to fix it.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-id: 1531745974-17187-14-git-send-email-thuth@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Thomas Huth 2018-07-16 14:59:30 +02:00 committed by Peter Maydell
parent b2bc349822
commit 32db1b58ca
2 changed files with 6 additions and 9 deletions

View File

@ -101,14 +101,14 @@ static void mpcore_rirq_init(Object *obj)
SysBusDevice *privbusdev; SysBusDevice *privbusdev;
int i; int i;
object_initialize(&s->priv, sizeof(s->priv), TYPE_ARM11MPCORE_PRIV); sysbus_init_child_obj(obj, "a11priv", &s->priv, sizeof(s->priv),
qdev_set_parent_bus(DEVICE(&s->priv), sysbus_get_default()); TYPE_ARM11MPCORE_PRIV);
privbusdev = SYS_BUS_DEVICE(&s->priv); privbusdev = SYS_BUS_DEVICE(&s->priv);
sysbus_init_mmio(sbd, sysbus_mmio_get_region(privbusdev, 0)); sysbus_init_mmio(sbd, sysbus_mmio_get_region(privbusdev, 0));
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
object_initialize(&s->gic[i], sizeof(s->gic[i]), TYPE_REALVIEW_GIC); sysbus_init_child_obj(obj, "gic[*]", &s->gic[i], sizeof(s->gic[i]),
qdev_set_parent_bus(DEVICE(&s->gic[i]), sysbus_get_default()); TYPE_REALVIEW_GIC);
} }
} }

View File

@ -54,16 +54,13 @@ static void realview_gic_init(Object *obj)
{ {
SysBusDevice *sbd = SYS_BUS_DEVICE(obj); SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
RealViewGICState *s = REALVIEW_GIC(obj); RealViewGICState *s = REALVIEW_GIC(obj);
DeviceState *gicdev;
memory_region_init(&s->container, OBJECT(s), memory_region_init(&s->container, OBJECT(s),
"realview-gic-container", 0x2000); "realview-gic-container", 0x2000);
sysbus_init_mmio(sbd, &s->container); sysbus_init_mmio(sbd, &s->container);
object_initialize(&s->gic, sizeof(s->gic), TYPE_ARM_GIC); sysbus_init_child_obj(obj, "gic", &s->gic, sizeof(s->gic), TYPE_ARM_GIC);
gicdev = DEVICE(&s->gic); qdev_prop_set_uint32(DEVICE(&s->gic), "num-cpu", 1);
qdev_set_parent_bus(gicdev, sysbus_get_default());
qdev_prop_set_uint32(gicdev, "num-cpu", 1);
} }
static void realview_gic_class_init(ObjectClass *oc, void *data) static void realview_gic_class_init(ObjectClass *oc, void *data)