The old syntax is
-pcidevice host=BUS:SLOT:FUNCTION
The new syntax is
-device pci-assign,host=BUS:SLOT:FUNCTION,addr=<PCI SLOT>,id=host0
---
src/qemu/qemu_conf.c | 51 +++++++++++++++-----
.../qemuxml2argv-hostdev-pci-address-device.args | 1 +
.../qemuxml2argv-hostdev-pci-address-device.xml | 27 ++++++++++
tests/qemuxml2argvtest.c | 1 +
4 files changed, 68 insertions(+), 12 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.xml
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 3b39a91..a09fb62 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -2326,6 +2326,32 @@ error:
}
+static char *
+qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev)
+{
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+ virBufferAddLit(&buf, "pci-assign");
+ virBufferVSprintf(&buf, ",host=%.2x:%.2x.%.1x",
+ dev->source.subsys.u.pci.bus,
+ dev->source.subsys.u.pci.slot,
+ dev->source.subsys.u.pci.function);
+ virBufferVSprintf(&buf, ",id=%s", dev->info.alias);
+ if (qemuBuildDeviceAddressStr(&buf, &dev->info) < 0)
+ goto error;
+
+ if (virBufferError(&buf)) {
+ virReportOOMError(NULL);
+ goto error;
+ }
+
+ return virBufferContentAndReset(&buf);
+
+error:
+ virBufferFreeAndReset(&buf);
+ return NULL;
+}
+
/* This function outputs a -chardev command line option which describes only the
* host side of the character device */
static void qemudBuildCommandLineChrDevChardevStr(virDomainChrDefPtr dev,
@@ -3575,22 +3601,23 @@ int qemudBuildCommandLine(virConnectPtr conn,
/* PCI */
if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
- if (!(qemuCmdFlags & QEMUD_CMD_FLAG_PCIDEVICE)) {
+ if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
+ ADD_ARG_LIT("-device");
+ if (!(pcidev = qemuBuildPCIHostdevDevStr(hostdev)))
+ goto error;
+ } else if (qemuCmdFlags & QEMUD_CMD_FLAG_PCIDEVICE) {
+ ADD_ARG_LIT("-pcidevice");
+ if (virAsprintf(&pcidev, "host=%.2x:%.2x.%.1x",
+ hostdev->source.subsys.u.pci.bus,
+ hostdev->source.subsys.u.pci.slot,
+ hostdev->source.subsys.u.pci.function) < 0)
+ goto no_memory;
+ } else {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_SUPPORT, "%s",
_("PCI device assignment is not supported by this
version of qemu"));
goto error;
}
- ret = virAsprintf(&pcidev, "host=%.2x:%.2x.%.1x",
- hostdev->source.subsys.u.pci.bus,
- hostdev->source.subsys.u.pci.slot,
- hostdev->source.subsys.u.pci.function);
- if (ret < 0) {
- pcidev = NULL;
- goto no_memory;
- }
- ADD_ARG_LIT("-pcidevice");
- ADD_ARG_LIT(pcidev);
- VIR_FREE(pcidev);
+ ADD_ARG(pcidev);
}
}
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.args
b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.args
new file mode 100644
index 0000000..f1865ee
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.args
@@ -0,0 +1 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214
-smp 1 -nographic -nodefaults -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot
c -hda /dev/HostVG/QEMUGuest2 -usb -device pci-assign,host=06:12.5,id=hostpci0
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.xml
b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.xml
new file mode 100644
index 0000000..ac5ad47
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.xml
@@ -0,0 +1,27 @@
+<domain type='qemu'>
+ <name>QEMUGuest2</name>
+ <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
+ <memory>219200</memory>
+ <currentMemory>219200</currentMemory>
+ <vcpu>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <disk type='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest2'/>
+ <target dev='hda' bus='ide'/>
+ </disk>
+ <hostdev mode='subsystem' type='pci' managed='yes'>
+ <source>
+ <address domain='0x0000' bus='0x06' slot='0x12'
function='0x5'/>
+ </source>
+ </hostdev>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 2042e2a..2a2387e 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -301,6 +301,7 @@ mymain(int argc, char **argv)
DO_TEST("hostdev-usb-address", 0);
DO_TEST("hostdev-usb-address-device", QEMUD_CMD_FLAG_DEVICE);
DO_TEST("hostdev-pci-address", QEMUD_CMD_FLAG_PCIDEVICE);
+ DO_TEST("hostdev-pci-address-device",
QEMUD_CMD_FLAG_PCIDEVICE|QEMUD_CMD_FLAG_DEVICE);
DO_TEST_FULL("restore-v1", QEMUD_CMD_FLAG_MIGRATE_KVM_STDIO,
"stdio");
DO_TEST_FULL("restore-v2", QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC,
"stdio");
--
1.6.5.2