We're going to enable qdev_get_machine() to work even before machine is created. Make device_set_realized() be prepared with it.
Currently, a device can be realized even before machine is created, but only in one of QEMU's qtest, test-global-qdev-props.c. Right now, the test_static_prop_subprocess() test (which creates one simple object without machine created) will internally make "/machine" to be a container. Now explicitly support that case when there's no real "/machine" object around, then unattached devices will be put under root ("/") rather than "/machine". Mostly only for this test case, or for any future test cases only. Note that this shouldn't affect anything else that relies on a real machine being there but only unit tests like mentioned, because if "/machine" is created as a container as of now, it'll fail QEMU very soon later on qemu_create_machine() trying to create the real machine, seeing that there's a conflict. Signed-off-by: Peter Xu <pet...@redhat.com> --- hw/core/qdev.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/hw/core/qdev.c b/hw/core/qdev.c index db36f54d91..5c83f48b33 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -490,9 +490,17 @@ static void device_set_realized(Object *obj, bool value, Error **errp) if (!obj->parent) { gchar *name = g_strdup_printf("device[%d]", unattached_count++); + Object *root = qdev_get_machine(); - object_property_add_child(container_get(qdev_get_machine(), - "/unattached"), + /* + * We could have qdev test cases trying to realize() a device + * without machine created. In that case we use the root. + */ + if (!root) { + root = object_get_root(); + } + + object_property_add_child(container_get(root, "/unattached"), name, obj); unattached_parent = true; g_free(name); -- 2.45.0