@@ -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);
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 <peterx@redhat.com> --- hw/core/qdev.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)