diff options
Diffstat (limited to 'hw')
-rw-r--r-- | hw/qdev.c | 25 | ||||
-rw-r--r-- | hw/qdev.h | 1 |
2 files changed, 25 insertions, 1 deletions
@@ -232,14 +232,37 @@ void scsi_bus_new(DeviceState *host, SCSIAttachFn attach) BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name) { BusState *bus; + char *buf; + int i,len; bus = qemu_mallocz(info->size); bus->info = info; bus->parent = parent; - bus->name = qemu_strdup(name); + + if (name) { + /* use supplied name */ + bus->name = qemu_strdup(name); + } else if (parent && parent->id) { + /* parent device has id -> use it for bus name */ + len = strlen(parent->id) + 16; + buf = qemu_malloc(len); + snprintf(buf, len, "%s.%d", parent->id, parent->num_child_bus); + bus->name = buf; + } else { + /* no id -> use lowercase bus type for bus name */ + len = strlen(info->name) + 16; + buf = qemu_malloc(len); + len = snprintf(buf, len, "%s.%d", info->name, + parent ? parent->num_child_bus : 0); + for (i = 0; i < len; i++) + buf[i] = tolower(buf[i]); + bus->name = buf; + } + LIST_INIT(&bus->children); if (parent) { LIST_INSERT_HEAD(&parent->child_bus, bus, sibling); + parent->num_child_bus++; } return bus; } @@ -27,6 +27,7 @@ struct DeviceState { int num_gpio_in; qemu_irq *gpio_in; LIST_HEAD(, BusState) child_bus; + int num_child_bus; NICInfo *nd; LIST_ENTRY(DeviceState) sibling; }; |