Signed-off-by: Anthony Liguori <aligu...@us.ibm.com> --- hw/qdev.c | 36 +++++++++++++++++++++++++++++++++++- 1 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/hw/qdev.c b/hw/qdev.c index a6c4c02..d305128 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -101,7 +101,6 @@ static void bus_add_child(BusState *bus, DeviceState *child) void qdev_set_parent_bus(DeviceState *dev, BusState *bus) { dev->parent_bus = bus; - bus_add_child(bus, dev); } /* Create a new device. This only initializes the device state structure @@ -157,6 +156,10 @@ int qdev_init(DeviceState *dev) assert(dev->state == DEV_STATE_CREATED); + if (dev->parent_bus) { + bus_add_child(dev->parent_bus, dev); + } + rc = dc->init(dev); if (rc < 0) { object_unparent(OBJECT(dev)); @@ -663,6 +666,33 @@ void qdev_property_add_static(DeviceState *dev, Property *prop, assert_no_error(local_err); } +static bool qdev_prop_get_realized(Object *obj, Error **errp) +{ + DeviceState *dev = DEVICE(obj); + + return (dev->state == DEV_STATE_INITIALIZED); +} + +static void qdev_prop_set_realized(Object *obj, bool value, Error **errp) +{ + DeviceState *dev = DEVICE(obj); + bool realized = (dev->state == DEV_STATE_INITIALIZED); + + if (realized == value) { + return; + } + + if (realized && !value) { + error_set(errp, QERR_PERMISSION_DENIED); + return; + } + + if (qdev_init(dev) < 0) { + error_set(errp, QERR_DEVICE_INIT_FAILED, ""); + return; + } +} + static void device_initfn(Object *obj) { DeviceState *dev = DEVICE(obj); @@ -687,6 +717,10 @@ static void device_initfn(Object *obj) } while (class != object_class_by_name(TYPE_DEVICE)); qdev_prop_set_globals(dev); + object_property_add_bool(obj, "realized", + qdev_prop_get_realized, qdev_prop_set_realized, + NULL); + object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS, (Object **)&dev->parent_bus, NULL); } -- 1.7.5.4