diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2009-06-30 14:12:09 +0200 |
---|---|---|
committer | Paul Brook <paul@codesourcery.com> | 2009-07-09 13:07:03 +0100 |
commit | 042f84d0af0e6c654d836f57ce916d7dec2b263d (patch) | |
tree | b7595a3d02e7c474a11d361278629f7c60fe7e49 /hw/qdev.c | |
parent | 10c4c98ab7dc18169b37b76f6ea5e60ebe65222b (diff) | |
download | qemu-042f84d0af0e6c654d836f57ce916d7dec2b263d.tar.gz qemu-042f84d0af0e6c654d836f57ce916d7dec2b263d.tar.bz2 qemu-042f84d0af0e6c654d836f57ce916d7dec2b263d.zip |
qdev: remove DeviceType
The only purpose DeviceType serves is creating a linked list of
DeviceInfo structs. This removes DeviceType and add a next field to
DeviceInfo instead, so the DeviceInfo structs can be changed that way.
Elimitates a pointless extra level of indirection.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/qdev.c')
-rw-r--r-- | hw/qdev.c | 38 |
1 files changed, 15 insertions, 23 deletions
@@ -41,28 +41,20 @@ struct DeviceProperty { DeviceProperty *next; }; -struct DeviceType { - DeviceInfo *info; - DeviceType *next; -}; - /* This is a nasty hack to allow passing a NULL bus to qdev_create. */ static BusState *main_system_bus; extern struct BusInfo system_bus_info; -static DeviceType *device_type_list; +static DeviceInfo *device_info_list; /* Register a new device type. */ void qdev_register(DeviceInfo *info) { - DeviceType *t; - assert(info->size >= sizeof(DeviceState)); + assert(!info->next); - t = qemu_mallocz(sizeof(DeviceType)); - t->next = device_type_list; - device_type_list = t; - t->info = info; + info->next = device_info_list; + device_info_list = info; } /* Create a new device. This only initializes the device state structure @@ -70,7 +62,7 @@ void qdev_register(DeviceInfo *info) initialize the actual device emulation. */ DeviceState *qdev_create(BusState *bus, const char *name) { - DeviceType *t; + DeviceInfo *info; DeviceState *dev; if (!bus) { @@ -80,19 +72,19 @@ DeviceState *qdev_create(BusState *bus, const char *name) bus = main_system_bus; } - for (t = device_type_list; t; t = t->next) { - if (t->info->bus_info != bus->info) + for (info = device_info_list; info != NULL; info = info->next) { + if (info->bus_info != bus->info) continue; - if (strcmp(t->info->name, name) != 0) + if (strcmp(info->name, name) != 0) continue; break; } - if (!t) { + if (!info) { hw_error("Unknown device '%s' for bus '%s'\n", name, bus->info->name); } - dev = qemu_mallocz(t->info->size); - dev->type = t; + dev = qemu_mallocz(info->size); + dev->info = info; dev->parent_bus = bus; LIST_INSERT_HEAD(&bus->children, dev, sibling); return dev; @@ -103,7 +95,7 @@ DeviceState *qdev_create(BusState *bus, const char *name) calling this function. */ void qdev_init(DeviceState *dev) { - dev->type->info->init(dev, dev->type->info); + dev->info->init(dev, dev->info); } /* Unlink device from bus and free the structure. */ @@ -165,7 +157,7 @@ CharDriverState *qdev_init_chardev(DeviceState *dev) static int next_serial; static int next_virtconsole; /* FIXME: This is a nasty hack that needs to go away. */ - if (strncmp(dev->type->info->name, "virtio", 6) == 0) { + if (strncmp(dev->info->name, "virtio", 6) == 0) { return virtcon_hds[next_virtconsole++]; } else { return serial_hds[next_serial++]; @@ -338,7 +330,7 @@ static void qdev_print(Monitor *mon, DeviceState *dev, int indent) { DeviceProperty *prop; BusState *child; - qdev_printf("dev: %s\n", dev->type->info->name); + qdev_printf("dev: %s\n", dev->info->name); indent += 2; if (dev->num_gpio_in) { qdev_printf("gpio-in %d\n", dev->num_gpio_in); @@ -357,7 +349,7 @@ static void qdev_print(Monitor *mon, DeviceState *dev, int indent) break; case PROP_TYPE_DEV: qdev_printf("prop-dev %s %s\n", prop->name, - ((DeviceState *)prop->value.ptr)->type->info->name); + ((DeviceState *)prop->value.ptr)->info->name); break; default: qdev_printf("prop-unknown%d %s\n", prop->type, prop->name); |