Commit 7426aa72c36c908a7d0eae3e38568bb0a70de479 (nand: Don't inherit from Sysbus) made NAND a device rather than SysBus device. This led to all boards using the device (akita, borzoi, spitz, terrier, tosa, axis-dev88) crashing on "info qtree".
The difference to the bus-less ARMCPU is that the device was still being created by qdev_create() rather than object_new(), which makes assumptions about a NULL BusState being the SysBus. Fix that. A longer-term solution will be to stop using qdev_create(). Reported-by: Markus Armbruster <arm...@redhat.com> Cc: Peter Crosthwaite <peter.crosthwa...@xilinx.com> Signed-off-by: Andreas Färber <afaer...@suse.de> --- hw/core/qdev.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/hw/core/qdev.c b/hw/core/qdev.c index 82a9123..14c8765 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -131,21 +131,27 @@ DeviceState *qdev_create(BusState *bus, const char *name) DeviceState *qdev_try_create(BusState *bus, const char *type) { DeviceState *dev; + ObjectClass *oc; + DeviceClass *dc; - if (object_class_by_name(type) == NULL) { + oc = object_class_by_name(type); + if (oc == NULL) { return NULL; } + dc = DEVICE_CLASS(oc); dev = DEVICE(object_new(type)); if (!dev) { return NULL; } - if (!bus) { + if (!bus && dc->bus_type && strcmp(dc->bus_type, "System") == 0) { bus = sysbus_get_default(); } - qdev_set_parent_bus(dev, bus); - object_unref(OBJECT(dev)); + if (bus != NULL) { + qdev_set_parent_bus(dev, bus); + object_unref(OBJECT(dev)); + } return dev; } -- 1.8.4.5