On Fri, Aug 26, 2011 at 01:44:27AM +0300, Marc-André Lureau wrote: > QEMU uses USB bus name "usb.0" when using the legacy -usb argument. > If we want to allow USB devices to specify their addresses with legacy > -usb, we should either in case of legacy bus name drop the 0 from the > address bus, or just drop the 0 from device id. This patch does the > later. > > Another solution would be to permit addressing on non-legacy USB > controllers only. > --- > src/qemu/qemu_command.c | 46 +++++++++++++++----- > .../qemuxml2argv-input-usbmouse-addr.args | 2 +- > .../qemuxml2argv-usb-ich9-companion.args | 8 ++-- > .../qemuxml2argv-usb-ich9-ehci-addr.args | 2 +- > .../qemuxml2argv-usb-piix3-controller.args | 2 +- > tests/qemuxml2argvtest.c | 2 +- > 6 files changed, 43 insertions(+), 19 deletions(-) > > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > index a9dc541..f50d927 100644 > --- a/src/qemu/qemu_command.c > +++ b/src/qemu/qemu_command.c > @@ -1106,7 +1106,7 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs) > if (qemuDomainPCIAddressReserveSlot(addrs, 0) < 0) > goto error; > > - /* Verify that first IDE controller (if any) is on the PIIX3, fn 1 */ > + /* Verify that first IDE and USB controllers (if any) is on the PIIX3, fn 1 */ > for (i = 0; i < def->ncontrollers ; i++) { > /* First IDE controller lives on the PIIX3 at slot=1, function=1 */ > if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE && > @@ -1132,11 +1132,24 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs) > } > } else if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB && > def->controllers[i]->idx == 0 && > - def->controllers[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && > - def->controllers[i]->info.addr.pci.domain == 0 && > - def->controllers[i]->info.addr.pci.bus == 0 && > - def->controllers[i]->info.addr.pci.slot == 1) { > - reservedUSB = true; > + def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI) { > + if (def->controllers[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { > + if (def->controllers[i]->info.addr.pci.domain != 0 || > + def->controllers[i]->info.addr.pci.bus != 0 || > + def->controllers[i]->info.addr.pci.slot != 1 || > + def->controllers[i]->info.addr.pci.function != 2) { > + qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("PIIX3 USB controller must have PCI address 0:0:1.2")); > + goto error; > + } > + reservedUSB = true; > + } else { > + def->controllers[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; > + def->controllers[i]->info.addr.pci.domain = 0; > + def->controllers[i]->info.addr.pci.bus = 0; > + def->controllers[i]->info.addr.pci.slot = 1; > + def->controllers[i]->info.addr.pci.function = 2; > + } > } > } > > @@ -1294,6 +1307,14 @@ error: > return -1; > } > > +static void > +qemuUsbId(virBufferPtr buf, int idx) > +{ > + if (idx == 0) > + virBufferAsprintf(buf, "usb"); > + else > + virBufferAsprintf(buf, "usb%d", idx); > +} > > static int > qemuBuildDeviceAddressStr(virBufferPtr buf, > @@ -1343,8 +1364,9 @@ qemuBuildDeviceAddressStr(virBufferPtr buf, > else > virBufferAsprintf(buf, ",addr=0x%x", info->addr.pci.slot); > } else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) { > - virBufferAsprintf(buf, ",bus=usb%d.0", info->addr.usb.bus); > - virBufferAsprintf(buf, ",port=%s", info->addr.usb.port); > + virBufferAsprintf(buf, ",bus="); > + qemuUsbId(buf, info->addr.usb.bus); > + virBufferAsprintf(buf, ".0,port=%s", info->addr.usb.port); > } > > return 0; > @@ -1776,10 +1798,12 @@ qemuBuildUSBControllerDevStr(virDomainControllerDefPtr def, > virBufferAsprintf(buf, "%s", smodel); > > if (def->info.mastertype == VIR_DOMAIN_CONTROLLER_MASTER_USB) { > - virBufferAsprintf(buf, ",masterbus=usb%d.0", def->idx); > - virBufferAsprintf(buf, ",firstport=%d", def->info.master.usb.startport); > + virBufferAsprintf(buf, ",masterbus="); > + qemuUsbId(buf, def->idx); > + virBufferAsprintf(buf, ".0,firstport=%d", def->info.master.usb.startport); > } else { > - virBufferAsprintf(buf, ",id=usb%d", def->idx); > + virBufferAsprintf(buf, ",id="); > + qemuUsbId(buf, def->idx); > } > > return 0; > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse-addr.args b/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse-addr.args > index d784960..b6dc0d3 100644 > --- a/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse-addr.args > +++ b/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse-addr.args > @@ -1 +1 @@ > -LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -usb -device usb-mouse,id=input0,bus=usb0.0,port=4 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 > +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -usb -device usb-mouse,id=input0,bus=usb.0,port=4 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args b/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args > index b37dbf6..1007544 100644 > --- a/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args > +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args > @@ -1,6 +1,6 @@ > LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \ > --device ich9-usb-ehci1,id=usb0,bus=pci.0,multifunction=on,addr=0x4.0x7 \ > --device ich9-usb-uhci1,masterbus=usb0.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4.0x0 \ > --device ich9-usb-uhci2,masterbus=usb0.0,firstport=2,bus=pci.0,multifunction=on,addr=0x4.0x1 \ > --device ich9-usb-uhci3,masterbus=usb0.0,firstport=4,bus=pci.0,multifunction=on,addr=0x4.0x2 \ > +-device ich9-usb-ehci1,id=usb,bus=pci.0,multifunction=on,addr=0x4.0x7 \ > +-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4.0x0 \ > +-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,multifunction=on,addr=0x4.0x1 \ > +-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,multifunction=on,addr=0x4.0x2 \ > -device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0 > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args b/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args > index 502244d..0059ab5 100644 > --- a/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args > +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args > @@ -1 +1 @@ > -LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device ich9-usb-ehci1,id=usb0,bus=pci.0,multifunction=on,addr=0x4.0x7 -device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0 > +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device ich9-usb-ehci1,id=usb,bus=pci.0,multifunction=on,addr=0x4.0x7 -device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0 > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-piix3-controller.args b/tests/qemuxml2argvdata/qemuxml2argv-usb-piix3-controller.args > index 799b75f..06863bb 100644 > --- a/tests/qemuxml2argvdata/qemuxml2argv-usb-piix3-controller.args > +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-piix3-controller.args > @@ -1 +1 @@ > -LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device piix3-usb-uhci,id=usb0,bus=pci.0,addr=0x3 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 > +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device piix3-usb-uhci,id=usb,bus=pci.0,multifunction=on,addr=0x1.0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0 > diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c > index 4c6c486..a8e7259 100644 > --- a/tests/qemuxml2argvtest.c > +++ b/tests/qemuxml2argvtest.c > @@ -489,7 +489,7 @@ mymain(void) > QEMU_CAPS_NODEFCONFIG); > DO_TEST("usb-piix3-controller", false, > QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_PIIX3_USB_UHCI, > - QEMU_CAPS_NODEFCONFIG); > + QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_NODEFCONFIG); > DO_TEST("usb-ich9-ehci-addr", false, > QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, > QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_ICH9_USB_EHCI1); > -- ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list