diff options
-rw-r--r-- | hw/qdev.c | 38 | ||||
-rw-r--r-- | hw/qdev.h | 7 |
2 files changed, 18 insertions, 27 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); @@ -4,7 +4,7 @@ #include "hw.h" #include "sys-queue.h" -typedef struct DeviceType DeviceType; +typedef struct DeviceInfo DeviceInfo; typedef struct DeviceProperty DeviceProperty; @@ -15,7 +15,7 @@ typedef struct BusInfo BusInfo; /* This structure should not be accessed directly. We declare it here so that it can be embedded in individual device state structures. */ struct DeviceState { - DeviceType *type; + DeviceInfo *info; BusState *parent_bus; DeviceProperty *props; int num_gpio_out; @@ -72,8 +72,6 @@ typedef struct { DevicePropType type; } DevicePropList; -typedef struct DeviceInfo DeviceInfo; - typedef void (*qdev_initfn)(DeviceState *dev, DeviceInfo *info); typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv, int unit); @@ -86,6 +84,7 @@ struct DeviceInfo { /* Private to qdev / bus. */ qdev_initfn init; BusInfo *bus_info; + struct DeviceInfo *next; }; void qdev_register(DeviceInfo *info); |