]> xenbits.xensource.com Git - libvirt.git/commitdiff
Assign addresses to USB devices
authorJán Tomko <jtomko@redhat.com>
Wed, 12 Aug 2015 14:52:18 +0000 (16:52 +0200)
committerJán Tomko <jtomko@redhat.com>
Thu, 21 Jul 2016 06:30:26 +0000 (08:30 +0200)
Automatically assign addresses to USB devices.

Just like reserving, this is only done for newly defined domains.

https://bugzilla.redhat.com/show_bug.cgi?id=1215968

31 files changed:
src/conf/domain_addr.c
src/conf/domain_addr.h
src/libvirt_private.syms
src/qemu/qemu_domain_address.c
tests/qemuxml2argvdata/qemuxml2argv-bios-nvram.args
tests/qemuxml2argvdata/qemuxml2argv-bios.args
tests/qemuxml2argvdata/qemuxml2argv-controller-order.args
tests/qemuxml2argvdata/qemuxml2argv-disk-usb-device-removable.args
tests/qemuxml2argvdata/qemuxml2argv-disk-usb-device.args
tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.args
tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.args
tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address-device-boot.args
tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address-device.args
tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.args
tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.args
tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.args
tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.args
tests/qemuxml2argvdata/qemuxml2argv-serial-spiceport.args
tests/qemuxml2argvdata/qemuxml2argv-smartcard-controller.args
tests/qemuxml2argvdata/qemuxml2argv-smartcard-host-certificates.args
tests/qemuxml2argvdata/qemuxml2argv-smartcard-host.args
tests/qemuxml2argvdata/qemuxml2argv-smartcard-passthrough-spicevmc.args
tests/qemuxml2argvdata/qemuxml2argv-smartcard-passthrough-tcp.args
tests/qemuxml2argvdata/qemuxml2argv-sound-device.args
tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-autoassign.args
tests/qemuxml2argvdata/qemuxml2argv-usb-port-autoassign.args
tests/qemuxml2argvdata/qemuxml2argv-usb-port-missing.args
tests/qemuxml2argvdata/qemuxml2argv-usb-redir-boot.args
tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args
tests/qemuxml2argvdata/qemuxml2argv-usb-xhci-autoassign.args

index bbac399de01de9e43439dcc9b842dbd8cc88db68..3b0c205958ac9f934a59a3ba72fdd42475c00a8e 100644 (file)
@@ -1489,7 +1489,7 @@ virDomainUSBAddressFindPort(virDomainUSBAddressSetPtr addrs,
 
 #define VIR_DOMAIN_USB_HUB_PORTS 8
 
-static int
+int
 virDomainUSBAddressSetAddHub(virDomainUSBAddressSetPtr addrs,
                              virDomainHubDefPtr hub)
 {
@@ -1564,6 +1564,119 @@ virDomainUSBAddressSetAddControllers(virDomainUSBAddressSetPtr addrs,
 }
 
 
+static int
+virDomainUSBAddressFindFreePort(virDomainUSBAddressHubPtr hub,
+                                unsigned int *portpath,
+                                unsigned int level)
+{
+    unsigned int port;
+    ssize_t portIdx;
+    size_t i;
+
+    /* Look for free ports on the current hub */
+    if ((portIdx = virBitmapNextClearBit(hub->portmap, -1)) >= 0) {
+        port = portIdx + 1;
+        VIR_DEBUG("Found a free port %u at level %u", port, level);
+        portpath[level] = port;
+        return 0;
+    }
+
+    VIR_DEBUG("No ports found on hub %p, trying the hubs on it", hub);
+
+    if (level >= VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH - 1)
+        return -1;
+
+    /* Recursively search through the ports that contain another hub */
+    for (i = 0; i < hub->nports; i++) {
+        if (!hub->ports[i])
+            continue;
+
+        port = i + 1;
+        VIR_DEBUG("Looking at USB hub at level: %u port: %u", level, port);
+        if (virDomainUSBAddressFindFreePort(hub->ports[i], portpath,
+                                            level + 1) < 0)
+            continue;
+
+        portpath[level] = port;
+        return 0;
+    }
+    return -1;
+}
+
+
+/* Try to find a free port on bus @bus.
+ *
+ * Returns  0 on success
+ *         -1 on fatal error (OOM)
+ *         -2 if there is no bus at @bus or no free port on this bus
+ */
+static int
+virDomainUSBAddressAssignFromBus(virDomainUSBAddressSetPtr addrs,
+                                 virDomainDeviceInfoPtr info,
+                                 size_t bus)
+{
+    unsigned int portpath[VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH] = { 0 };
+    virDomainUSBAddressHubPtr hub = addrs->buses[bus];
+    char *portStr = NULL;
+    int ret = -1;
+
+    if (!hub)
+        return -2;
+
+    if (virDomainUSBAddressFindFreePort(hub, portpath, 0) < 0)
+        return -2;
+
+    /* we found a free port */
+    if (!(portStr = virDomainUSBAddressPortFormat(portpath)))
+        goto cleanup;
+
+    info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB;
+    info->addr.usb.bus = bus;
+    memcpy(info->addr.usb.port, portpath, sizeof(portpath));
+    VIR_DEBUG("Assigning USB addr bus=%u port=%s",
+              info->addr.usb.bus, portStr);
+    if (virDomainUSBAddressReserve(info, addrs) < 0)
+        goto cleanup;
+
+    ret = 0;
+ cleanup:
+    VIR_FREE(portStr);
+    return ret;
+}
+
+
+int
+virDomainUSBAddressAssign(virDomainUSBAddressSetPtr addrs,
+                          virDomainDeviceInfoPtr info)
+{
+    size_t i;
+    int rc;
+
+    if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) {
+        VIR_DEBUG("A USB port on bus %u was requested", info->addr.usb.bus);
+        if (!addrs->buses[info->addr.usb.bus]) {
+            virReportError(VIR_ERR_XML_ERROR,
+                           _("USB bus %u requested but no controller "
+                             "with that index is present"), info->addr.usb.bus);
+            return -1;
+        }
+        rc = virDomainUSBAddressAssignFromBus(addrs, info, info->addr.usb.bus);
+        if (rc >= -1)
+            return rc;
+    } else {
+        VIR_DEBUG("Looking for a free USB port on all the buses");
+        for (i = 0; i < addrs->nbuses; i++) {
+            rc = virDomainUSBAddressAssignFromBus(addrs, info, i);
+            if (rc >= -1)
+                return rc;
+        }
+    }
+
+    virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("No free USB ports"));
+    return -1;
+}
+
+
 int
 virDomainUSBAddressReserve(virDomainDeviceInfoPtr info,
                            void *data)
@@ -1604,3 +1717,21 @@ virDomainUSBAddressReserve(virDomainDeviceInfoPtr info,
     VIR_FREE(portStr);
     return ret;
 }
+
+
+int
+virDomainUSBAddressEnsure(virDomainUSBAddressSetPtr addrs,
+                          virDomainDeviceInfoPtr info)
+{
+    if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
+        (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB &&
+         !virDomainUSBAddressPortIsValid(info->addr.usb.port))) {
+        if (virDomainUSBAddressAssign(addrs, info) < 0)
+            return -1;
+    } else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) {
+        if (virDomainUSBAddressReserve(info, addrs) < 0)
+            return -1;
+    }
+
+    return 0;
+}
index a24d2166ef863ad2620c0efcbad535e53ed701f7..633aa16c0f89998723865bb9103b99d4d9a13fba 100644 (file)
@@ -273,10 +273,24 @@ virDomainUSBAddressSetPtr virDomainUSBAddressSetCreate(void);
 int virDomainUSBAddressSetAddControllers(virDomainUSBAddressSetPtr addrs,
                                          virDomainDefPtr def)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+int
+virDomainUSBAddressSetAddHub(virDomainUSBAddressSetPtr addrs,
+                             virDomainHubDefPtr hub)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 void virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs);
 
 int
 virDomainUSBAddressReserve(virDomainDeviceInfoPtr info,
                            void *data)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+
+int
+virDomainUSBAddressAssign(virDomainUSBAddressSetPtr addrs,
+                          virDomainDeviceInfoPtr info)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+
+int
+virDomainUSBAddressEnsure(virDomainUSBAddressSetPtr addrs,
+                          virDomainDeviceInfoPtr info)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 #endif /* __DOMAIN_ADDR_H__ */
index d8744aab4047cff4fe2ba6e3ea8d110007b5cfb5..02428293116cedc622ee22010698d4bcec03d320 100644 (file)
@@ -107,11 +107,14 @@ virDomainPCIAddressSetGrow;
 virDomainPCIAddressSlotInUse;
 virDomainPCIAddressValidate;
 virDomainPCIControllerModelToConnectType;
+virDomainUSBAddressAssign;
+virDomainUSBAddressEnsure;
 virDomainUSBAddressPortFormat;
 virDomainUSBAddressPortFormatBuf;
 virDomainUSBAddressPortIsValid;
 virDomainUSBAddressReserve;
 virDomainUSBAddressSetAddControllers;
+virDomainUSBAddressSetAddHub;
 virDomainUSBAddressSetCreate;
 virDomainUSBAddressSetFree;
 virDomainVirtioSerialAddrAssign;
index f66b2f09da567628c759e62163c37c294b968e50..21c2ecf9376383a2e7d7207598df478ce590de62 100644 (file)
@@ -1622,6 +1622,63 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
 }
 
 
+struct qemuAssignUSBIteratorInfo {
+    virDomainUSBAddressSetPtr addrs;
+    size_t count;
+};
+
+
+static int
+qemuDomainAssignUSBPortsIterator(virDomainDeviceInfoPtr info,
+                                 void *opaque)
+{
+    struct qemuAssignUSBIteratorInfo *data = opaque;
+
+    if (info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
+        return 0;
+
+    return virDomainUSBAddressAssign(data->addrs, info);
+}
+
+
+static int
+qemuDomainAssignUSBHubs(virDomainUSBAddressSetPtr addrs,
+                        virDomainDefPtr def)
+{
+    size_t i;
+
+    for (i = 0; i < def->nhubs; i++) {
+        virDomainHubDefPtr hub = def->hubs[i];
+        if (hub->type != VIR_DOMAIN_HUB_TYPE_USB)
+            continue;
+
+        if (hub->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB &&
+            virDomainUSBAddressPortIsValid(hub->info.addr.usb.port))
+            continue;
+        if (virDomainUSBAddressAssign(addrs, &hub->info) < 0)
+            return -1;
+
+        if (virDomainUSBAddressSetAddHub(addrs, hub) < 0)
+            return -1;
+    }
+
+    return 0;
+}
+
+
+static int
+qemuDomainAssignUSBPorts(virDomainUSBAddressSetPtr addrs,
+                         virDomainDefPtr def)
+{
+    struct qemuAssignUSBIteratorInfo data = { .addrs = addrs };
+
+    return virDomainUSBDeviceDefForeach(def,
+                                        qemuDomainAssignUSBPortsIterator,
+                                        &data,
+                                        true);
+}
+
+
 static int
 qemuDomainAssignUSBAddresses(virDomainDefPtr def,
                              virDomainObjPtr obj)
@@ -1642,6 +1699,14 @@ qemuDomainAssignUSBAddresses(virDomainDefPtr def,
 
     VIR_DEBUG("Existing USB addresses have been reserved");
 
+    if (qemuDomainAssignUSBHubs(addrs, def) < 0)
+        goto cleanup;
+
+    if (qemuDomainAssignUSBPorts(addrs, def) < 0)
+        goto cleanup;
+
+    VIR_DEBUG("Finished assigning USB ports");
+
     if (obj && obj->privateData) {
         priv = obj->privateData;
         priv->usbaddrs = addrs;
index 6d76dc1fe061d3e79350ec05b690db0c133f8ca4..92e63625961cd044102f327afb4134a90b8cadc9 100644 (file)
@@ -22,5 +22,5 @@ readonly=on \
 -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
 -serial pty \
--device usb-tablet,id=input0 \
+-device usb-tablet,id=input0,bus=usb.0,port=1 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index 701eb5d3059eb164c9cc75890c920804e8cc3255..fdd9a4e1e138785ab6c763da04342ca253a0fc6d 100644 (file)
@@ -22,5 +22,5 @@ QEMU_AUDIO_DRV=none \
 -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
 -serial pty \
--device usb-tablet,id=input0 \
+-device usb-tablet,id=input0,bus=usb.0,port=1 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index 8415c88cda8d4e86c2466d7f470c86595267d4ea..3361383386cb2e3e4bcad2e0411b932a0b2eab1c 100644 (file)
@@ -19,8 +19,8 @@ nowait \
 -boot order=cna,menu=off \
 -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x7 \
--device usb-ccid,id=ccid0 \
--device usb-hub,id=hub0 \
+-device usb-ccid,id=ccid0,bus=usb.0,port=1.1 \
+-device usb-hub,id=hub0,bus=usb.0,port=1 \
 -drive file=/tmp/fdr.img,format=raw,if=none,id=drive-virtio-disk0,cache=none,\
 aio=native \
 -device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,\
@@ -37,10 +37,10 @@ media=cdrom,id=drive-ide0-1-0,readonly=on \
 -chardev spicevmc,id=charchannel0,name=vdagent \
 -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,\
 id=channel0,name=com.redhat.spice.0 \
--device usb-tablet,id=input0 \
+-device usb-tablet,id=input0,bus=usb.0,port=1.2 \
 -spice port=5901,tls-port=5902,addr=0.0.0.0,x509-dir=/etc/pki/libvirt-spice \
 -vga cirrus \
 -device intel-hda,id=sound0,bus=pci.0,addr=0x4 \
 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 \
--device usb-host,hostbus=14,hostaddr=6,id=hostdev0 \
+-device usb-host,hostbus=14,hostaddr=6,id=hostdev0,bus=usb.0,port=2 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6
index e2b7a7022795e2aa91c8338d69996457c6b6520f..d002f99aa975ab1a6734e1752f6dd7cc1e26ad03 100644 (file)
@@ -21,5 +21,6 @@ QEMU_AUDIO_DRV=none \
 -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
 -drive file=/tmp/usbdisk.img,format=raw,if=none,id=drive-usb-disk0 \
--device usb-storage,drive=drive-usb-disk0,id=usb-disk0,removable=on \
+-device usb-storage,bus=usb.0,port=1,drive=drive-usb-disk0,id=usb-disk0,\
+removable=on \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index 7e823d49f213a745eb3d0ef73fe66d80392bde54..4ac1a9c28b8a7abcfe9379cb78be30b2c2e66f97 100644 (file)
@@ -21,5 +21,5 @@ QEMU_AUDIO_DRV=none \
 -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
 -drive file=/tmp/usbdisk.img,format=raw,if=none,id=drive-usb-disk0 \
--device usb-storage,drive=drive-usb-disk0,id=usb-disk0 \
+-device usb-storage,bus=usb.0,port=1,drive=drive-usb-disk0,id=usb-disk0 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index 58a3766be9fd254208682d6c6e222ac11e3b1d75..bab81ffdb9c9238749f504c032e36031268feff1 100644 (file)
@@ -28,7 +28,7 @@ media=cdrom,id=drive-ide0-1-0,readonly=on \
 -device rtl8139,vlan=0,id=net0,mac=52:54:00:71:70:89,bus=pci.0,addr=0x7 \
 -net tap,fd=3,vlan=0,name=hostnet0 \
 -serial pty \
--device usb-tablet,id=input0 \
+-device usb-tablet,id=input0,bus=usb.0,port=1 \
 -spice port=5900,addr=127.0.0.1 \
 -vga std \
 -device AC97,id=sound0,bus=pci.0,addr=0x3 \
index a7ff9049bf92b585f586a1070907076c8af9ec1c..7d3146c6d0c65c5ea9107425c9b2cd1170fa7183 100644 (file)
@@ -30,7 +30,7 @@ zlib-glz-wan-compression=auto,playback-compression=on,streaming-video=filter,\
 disable-copy-paste \
 -vga cirrus \
 -chardev socket,id=charredir0,host=localhost,port=4000 \
--device usb-redir,chardev=charredir0,id=redir0 \
+-device usb-redir,chardev=charredir0,id=redir0,bus=usb.0,port=1 \
 -chardev spicevmc,id=charredir1,name=usbredir \
 -device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=4 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index bb7f1e1d311b1bd36ded6e5baa27b96fcf4b8d86..4d24cb40a0dce3ec8c8976e9c4c4af6712aad7ad 100644 (file)
@@ -19,5 +19,6 @@ QEMU_AUDIO_DRV=none \
 -usb \
 -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
--device usb-host,hostbus=14,hostaddr=6,id=hostdev0,bootindex=1 \
+-device usb-host,hostbus=14,hostaddr=6,id=hostdev0,bootindex=1,bus=usb.0,\
+port=1 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index d7f0c3935754cd857f1ca87f4d14c524c1500972..06187ec28bc166340f5edd426c25a71af9845589 100644 (file)
@@ -20,5 +20,5 @@ QEMU_AUDIO_DRV=none \
 -usb \
 -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
--device usb-host,hostbus=14,hostaddr=6,id=hostdev0 \
+-device usb-host,hostbus=14,hostaddr=6,id=hostdev0,bus=usb.0,port=1 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index 5de2a6b23839b303b95f51051fa894f5d4c6b402..da409f6692498f31f4f68a8f24c4ed9162206ffa 100644 (file)
@@ -19,4 +19,4 @@ QEMU_AUDIO_DRV=none \
 -usb \
 -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
--device usb-host,hostbus=14,hostaddr=6,id=hostdev0
+-device usb-host,hostbus=14,hostaddr=6,id=hostdev0,bus=usb.0,port=1
index 5be70e18ac715b891a4960e2e6af8a8ccd9723ca..2eb006e6431c71513728addb6d787ccad4ebca87 100644 (file)
@@ -46,7 +46,7 @@ id=channel0,name=org.qemu.guest_agent.0 \
 -chardev spicevmc,id=charchannel1,name=vdagent \
 -device virtserialport,bus=virtio-serial0.0,nr=2,chardev=charchannel1,\
 id=channel1,name=com.redhat.spice.0 \
--device usb-tablet,id=input0 \
+-device usb-tablet,id=input0,bus=usb.0,port=1 \
 -spice port=5901,tls-port=5902,addr=127.0.0.1,x509-dir=/etc/pki/libvirt-spice \
 -vga qxl \
 -global qxl-vga.ram_size=67108864 \
@@ -54,7 +54,7 @@ id=channel1,name=com.redhat.spice.0 \
 -device intel-hda,id=sound0,bus=pci.0,addr=0x4 \
 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 \
 -chardev spicevmc,id=charredir0,name=usbredir \
--device usb-redir,chardev=charredir0,id=redir0 \
+-device usb-redir,chardev=charredir0,id=redir0,bus=usb.0,port=2 \
 -chardev spicevmc,id=charredir1,name=usbredir \
--device usb-redir,chardev=charredir1,id=redir1 \
+-device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=3 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8
index e124ddbc92b6db5f304c45734f666ec90040a635..f8250549f8dfdd02cf62e4777cb9bb8399ef4da8 100644 (file)
@@ -19,4 +19,4 @@ QEMU_AUDIO_DRV=none \
 -usb \
 -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
--device usb-mouse,id=input0
+-device usb-mouse,id=input0,bus=usb.0,port=1
index bb677e545b6695022745381758d4e6ea89d81684..54f8d0cdf6b40c65431360718e6adf3cbbd1e9cc 100644 (file)
@@ -19,4 +19,4 @@ QEMU_AUDIO_DRV=none \
 -usb \
 -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
--device usb-tablet,id=input0
+-device usb-tablet,id=input0,bus=usb.0,port=1
index afc817d6ea50a3c58d214e43dc293470cadb8b11..845128344fb79f710c90488256207456b2df90d1 100644 (file)
@@ -22,4 +22,4 @@ server,nowait \
 -device pci-ohci,id=usb,bus=pci,addr=0x1 \
 -chardev pty,id=charserial0 \
 -device spapr-vty,chardev=charserial0,reg=0x30000000 \
--device usb-kbd,id=input0
+-device usb-kbd,id=input0,bus=usb.0,port=1
index 78aba7c364eb8be89ac7870372ccab89e44ac3c7..54293bb894eb6d3cf94f269416b3e170487b383c 100644 (file)
@@ -23,7 +23,7 @@ server,nowait \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
 -chardev spiceport,id=charserial0,name=org.qemu.console.serial.0 \
 -device isa-serial,chardev=charserial0,id=serial0 \
--device usb-tablet,id=input0 \
+-device usb-tablet,id=input0,bus=usb.0,port=1 \
 -spice port=5903,tls-port=5904,addr=127.0.0.1,x509-dir=/etc/pki/libvirt-spice \
 -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,bus=pci.0,\
 addr=0x2 \
index 34bbfed2bfe79d738b4abe6f77a99ab04ed2caf1..913a6b7fccddfffc58d824ff4159810ba5a621f4 100644 (file)
@@ -19,7 +19,7 @@ server,nowait \
 -mon chardev=charmonitor,id=monitor,mode=readline \
 -no-acpi \
 -boot c \
--device usb-ccid,id=ccid0 \
+-device usb-ccid,id=ccid0,bus=usb.0,port=1 \
 -usb \
 -device ccid-card-emulated,backend=nss-emulated,id=smartcard0,bus=ccid0.0 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index f57196ede29ebab0357f894636b57e7e1528c191..f6ee9ed75fa843794d2ed1e1d64654f0ec1ab2da 100644 (file)
@@ -19,7 +19,7 @@ server,nowait \
 -mon chardev=charmonitor,id=monitor,mode=readline \
 -no-acpi \
 -boot c \
--device usb-ccid,id=ccid0 \
+-device usb-ccid,id=ccid0,bus=usb.0,port=1 \
 -usb \
 -device ccid-card-emulated,backend=certificates,cert1=cert1,cert2=cert2,\
 cert3=cert3,db=/etc/pki/nssdb,id=smartcard0,bus=ccid0.0 \
index 34bbfed2bfe79d738b4abe6f77a99ab04ed2caf1..913a6b7fccddfffc58d824ff4159810ba5a621f4 100644 (file)
@@ -19,7 +19,7 @@ server,nowait \
 -mon chardev=charmonitor,id=monitor,mode=readline \
 -no-acpi \
 -boot c \
--device usb-ccid,id=ccid0 \
+-device usb-ccid,id=ccid0,bus=usb.0,port=1 \
 -usb \
 -device ccid-card-emulated,backend=nss-emulated,id=smartcard0,bus=ccid0.0 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index fbae835a8c96aa97be43ea13c31ef80bf2e3848d..d4ebe436ebc68ad87f18e1fde08f5e2920666ac2 100644 (file)
@@ -19,7 +19,7 @@ server,nowait \
 -mon chardev=charmonitor,id=monitor,mode=readline \
 -no-acpi \
 -boot c \
--device usb-ccid,id=ccid0 \
+-device usb-ccid,id=ccid0,bus=usb.0,port=1 \
 -usb \
 -chardev spicevmc,id=charsmartcard0,name=smartcard \
 -device ccid-card-passthru,chardev=charsmartcard0,id=smartcard0,bus=ccid0.0 \
index abf07ddfd7199bf70bb3ff2eb9c448fc7e2475b1..e6034bd1918463715c5a8572f4edd930de384e46 100644 (file)
@@ -19,7 +19,7 @@ server,nowait \
 -mon chardev=charmonitor,id=monitor,mode=readline \
 -no-acpi \
 -boot c \
--device usb-ccid,id=ccid0 \
+-device usb-ccid,id=ccid0,bus=usb.0,port=1 \
 -usb \
 -chardev socket,id=charsmartcard0,host=127.0.0.1,port=2001,server,nowait \
 -device ccid-card-passthru,chardev=charsmartcard0,id=smartcard0,bus=ccid0.0 \
index 13186627c0e0a66f4f16127f3bbfb418ed328609..6735182b4ca458b2c3a44a3d9afa6faf9cdf9cd9 100644 (file)
@@ -34,5 +34,5 @@ QEMU_AUDIO_DRV=none \
 -device ich9-intel-hda,id=sound7,bus=pci.0,addr=0x8 \
 -device hda-micro,id=sound7-codec0,bus=sound7.0,cad=0 \
 -device hda-duplex,id=sound7-codec1,bus=sound7.0,cad=1 \
--device usb-audio,id=sound8 \
+-device usb-audio,id=sound8,bus=usb.0,port=1 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x9
index 929fa1eb1fb60e2e6e00299d86ea38bfbdb7046f..1cda34229bdb35d3703eb8fbcc7b32adc93bf336 100644 (file)
@@ -24,9 +24,9 @@ server,nowait \
 addr=0x4 \
 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
--device usb-hub,id=hub0 \
--device usb-hub,id=hub1 \
--device usb-mouse,id=input0 \
--device usb-mouse,id=input1 \
--device usb-mouse,id=input2 \
+-device usb-hub,id=hub0,bus=usb.0,port=1 \
+-device usb-hub,id=hub1,bus=usb.0,port=2 \
+-device usb-mouse,id=input0,bus=usb.0,port=3 \
+-device usb-mouse,id=input1,bus=usb.0,port=4 \
+-device usb-mouse,id=input2,bus=usb.0,port=5 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index 3515fad195f60d904bea27a5131b854d79beeb08..03803bd48b17c59dc44f37f9ca83d03567452ac5 100644 (file)
@@ -21,8 +21,8 @@ server,nowait \
 -boot c \
 -usb \
 -device usb-hub,id=hub0,bus=usb.0,port=1 \
--device usb-hub,id=hub1 \
--device usb-mouse,id=input0 \
--device usb-mouse,id=input1 \
--device usb-mouse,id=input2 \
+-device usb-hub,id=hub1,bus=usb.0,port=2 \
+-device usb-mouse,id=input0,bus=usb.0,port=1.1 \
+-device usb-mouse,id=input1,bus=usb.0,port=1.2 \
+-device usb-mouse,id=input2,bus=usb.0,port=1.3 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index 3b9d9dfcd128ea2c59c286337d6f2d5c11e2020f..ff743c89758f5ed206fc5d79b2ca56659ade55f3 100644 (file)
@@ -20,7 +20,7 @@ server,nowait \
 -no-acpi \
 -boot c \
 -usb \
--device usb-hub,id=hub0,bus=usb.0 \
--device usb-hub,id=hub1,bus=usb.0 \
+-device usb-hub,id=hub0,bus=usb.0,port=1 \
+-device usb-hub,id=hub1,bus=usb.0,port=2 \
 -device usb-mouse,id=input0,bus=usb.0 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index dc878957cffe8ee3a7027b9d056e6d0e6b032282..65c54172c4f5fa3e3f4e3197a646f85df1270d49 100644 (file)
@@ -24,7 +24,7 @@ addr=0x4 \
 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
 -chardev socket,id=charredir0,host=localhost,port=4000 \
--device usb-redir,chardev=charredir0,id=redir0,bootindex=1 \
+-device usb-redir,chardev=charredir0,id=redir0,bootindex=1,bus=usb.0,port=1 \
 -chardev spicevmc,id=charredir1,name=usbredir \
 -device usb-redir,chardev=charredir1,id=redir1,bootindex=2,bus=usb.0,port=4 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index 0bb0c5e8488b8798beac849e65216482252d9c1f..04a7a37f52dc48aec738c32bdaee189cdbcd904b 100644 (file)
@@ -25,7 +25,7 @@ addr=0x4 \
 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
 -chardev socket,id=charredir0,host=localhost,port=4000 \
--device usb-redir,chardev=charredir0,id=redir0 \
+-device usb-redir,chardev=charredir0,id=redir0,bus=usb.0,port=1 \
 -chardev spicevmc,id=charredir1,name=usbredir \
 -device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=4 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index 3034d2190dd4f5bfeae954295151a7e9dab39a0e..abcaeaee91321fba784bb9bf825e5ec22643655f 100644 (file)
@@ -20,8 +20,8 @@ server,nowait \
 -no-acpi \
 -boot c \
 -device nec-usb-xhci,p2=8,p3=8,id=usb,bus=pci.0,addr=0x3 \
--device usb-hub,id=hub0 \
--device usb-hub,id=hub1 \
--device usb-mouse,id=input0 \
--device usb-mouse,id=input1 \
--device usb-mouse,id=input2
+-device usb-hub,id=hub0,bus=usb.0,port=1 \
+-device usb-hub,id=hub1,bus=usb.0,port=2 \
+-device usb-mouse,id=input0,bus=usb.0,port=3 \
+-device usb-mouse,id=input1,bus=usb.0,port=4 \
+-device usb-mouse,id=input2,bus=usb.0,port=5