From 0c17542d90a3863048ad6daff5de31c5c4d367d4 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Fri, 19 Feb 2010 19:12:18 +0100 Subject: [PATCH] qdev: Factor qdev_create_from_info() out of qdev_create() To make it obvious that -device and device_add can't die in hw_error(). --- hw/qdev.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 3fe811f632..de60108b1a 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -78,26 +78,11 @@ static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name) return NULL; } -/* Create a new device. This only initializes the device state structure - and allows properties to be set. qdev_init should be called to - initialize the actual device emulation. */ -DeviceState *qdev_create(BusState *bus, const char *name) +static DeviceState *qdev_create_from_info(BusState *bus, DeviceInfo *info) { - DeviceInfo *info; DeviceState *dev; - if (!bus) { - if (!main_system_bus) { - main_system_bus = qbus_create(&system_bus_info, NULL, "main-system-bus"); - } - bus = main_system_bus; - } - - info = qdev_find_info(bus->info, name); - if (!info) { - hw_error("Unknown device '%s' for bus '%s'\n", name, bus->info->name); - } - + assert(bus->info == info->bus_info); dev = qemu_mallocz(info->size); dev->info = info; dev->parent_bus = bus; @@ -113,6 +98,28 @@ DeviceState *qdev_create(BusState *bus, const char *name) return dev; } +/* Create a new device. This only initializes the device state structure + and allows properties to be set. qdev_init should be called to + initialize the actual device emulation. */ +DeviceState *qdev_create(BusState *bus, const char *name) +{ + DeviceInfo *info; + + if (!bus) { + if (!main_system_bus) { + main_system_bus = qbus_create(&system_bus_info, NULL, "main-system-bus"); + } + bus = main_system_bus; + } + + info = qdev_find_info(bus->info, name); + if (!info) { + hw_error("Unknown device '%s' for bus '%s'\n", name, bus->info->name); + } + + return qdev_create_from_info(bus, info); +} + static void qdev_print_devinfo(DeviceInfo *info) { error_printf("name \"%s\", bus %s", @@ -224,7 +231,7 @@ DeviceState *qdev_device_add(QemuOpts *opts) } /* create device, set properties */ - qdev = qdev_create(bus, driver); + qdev = qdev_create_from_info(bus, info); id = qemu_opts_id(opts); if (id) { qdev->id = id;