return virBufferContentAndReset(&opt);
}
-char *
-qemuBuildZPCIDevStr(virDomainDeviceInfo *dev)
-{
- g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
-
- virBufferAsprintf(&buf,
- "zpci,uid=%u,fid=%u,target=%s,id=zpci%u",
- dev->addr.pci.zpci.uid.value,
- dev->addr.pci.zpci.fid.value,
- dev->alias,
- dev->addr.pci.zpci.uid.value);
-
- return virBufferContentAndReset(&buf);
-}
-static int
-qemuCommandAddZPCIDevice(virCommand *cmd,
- virDomainDeviceInfo *dev)
+virJSONValue *
+qemuBuildZPCIDevProps(virDomainDeviceInfo *dev)
{
- g_autofree char *devstr = NULL;
+ virJSONValue *props = NULL;
+ g_autofree char *alias = g_strdup_printf("zpci%u", dev->addr.pci.zpci.uid.value);
- virCommandAddArg(cmd, "-device");
-
- if (!(devstr = qemuBuildZPCIDevStr(dev)))
- return -1;
-
- virCommandAddArg(cmd, devstr);
+ virJSONValueObjectCreate(&props,
+ "s:driver", "zpci",
+ "u:uid", dev->addr.pci.zpci.uid.value,
+ "u:fid", dev->addr.pci.zpci.fid.value,
+ "s:target", dev->alias,
+ "s:id", alias,
+ NULL);
- return 0;
+ return props;
}
+
static int
qemuCommandAddExtDevice(virCommand *cmd,
- virDomainDeviceInfo *dev)
+ virDomainDeviceInfo *dev,
+ virQEMUCaps *qemuCaps)
{
if (dev->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI ||
dev->addr.pci.extFlags == VIR_PCI_ADDRESS_EXTENSION_NONE) {
return 0;
}
- if (dev->addr.pci.extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI)
- return qemuCommandAddZPCIDevice(cmd, dev);
+ if (dev->addr.pci.extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) {
+ g_autoptr(virJSONValue) devprops = NULL;
+
+ if (!(devprops = qemuBuildZPCIDevProps(dev)))
+ return -1;
+
+ if (qemuBuildDeviceCommandlineFromJSON(cmd, devprops, qemuCaps) < 0)
+ return -1;
+ }
return 0;
}
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV))
return 0;
- if (qemuCommandAddExtDevice(cmd, &disk->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &disk->info, qemuCaps) < 0)
return -1;
virCommandAddArg(cmd, "-device");
virCommandAddArg(cmd, "-chardev");
virCommandAddArg(cmd, chrdevstr);
- if (qemuCommandAddExtDevice(cmd, &fs->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &fs->info, priv->qemuCaps) < 0)
return -1;
if (!(devstr = qemuBuildVHostUserFsDevStr(fs, def, chardev_alias, priv)))
return -1;
virCommandAddArg(cmd, fsdevstr);
- if (qemuCommandAddExtDevice(cmd, &fs->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &fs->info, qemuCaps) < 0)
return -1;
virCommandAddArg(cmd, "-device");
return -1;
if (devstr) {
- if (qemuCommandAddExtDevice(cmd, &cont->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &cont->info, qemuCaps) < 0)
return -1;
virCommandAddArg(cmd, "-device");
if (!def->watchdog)
return 0;
- if (qemuCommandAddExtDevice(cmd, &def->watchdog->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &def->watchdog->info, qemuCaps) < 0)
return -1;
if (!(props = qemuBuildWatchdogDevProps(def, watchdog)))
if (qemuBuildDeviceAddressProps(props, def, &def->memballoon->info) < 0)
return -1;
- if (qemuCommandAddExtDevice(cmd, &def->memballoon->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &def->memballoon->info, qemuCaps) < 0)
return -1;
if (qemuBuildDeviceCommandlineFromJSON(cmd, props, qemuCaps) < 0)
for (i = 0; i < def->ninputs; i++) {
virDomainInputDef *input = def->inputs[i];
- if (qemuCommandAddExtDevice(cmd, &input->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &input->info, qemuCaps) < 0)
return -1;
if (input->type == VIR_DOMAIN_INPUT_TYPE_EVDEV) {
if (sound->model == VIR_DOMAIN_SOUND_MODEL_PCSPK) {
virCommandAddArgList(cmd, "-soundhw", "pcspk", NULL);
} else {
- if (qemuCommandAddExtDevice(cmd, &sound->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &sound->info, qemuCaps) < 0)
return -1;
virCommandAddArg(cmd, "-device");
if (video->type == VIR_DOMAIN_VIDEO_TYPE_NONE)
continue;
- if (qemuCommandAddExtDevice(cmd, &def->videos[i]->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &def->videos[i]->info, qemuCaps) < 0)
return -1;
virCommandAddArg(cmd, "-device");
if (hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED)
continue;
- if (qemuCommandAddExtDevice(cmd, hostdev->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, hostdev->info, qemuCaps) < 0)
return -1;
virCommandAddArg(cmd, "-device");
return -1;
/* add the device */
- if (qemuCommandAddExtDevice(cmd, &rng->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &rng->info, qemuCaps) < 0)
return -1;
if (!(devprops = qemuBuildRNGDevProps(def, rng, qemuCaps)))
* New way: -netdev type=tap,id=netdev1 -device e1000,id=netdev1
*/
if (qemuDomainSupportsNicdev(def, net)) {
- if (qemuCommandAddExtDevice(cmd, &net->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &net->info, qemuCaps) < 0)
goto cleanup;
if (!(nic = qemuBuildNicDevStr(def, net, net->driver.virtio.queues, qemuCaps)))
goto cleanup;
virCommandAddArgList(cmd, "-device", nic, NULL);
} else if (!requireNicdev) {
- if (qemuCommandAddExtDevice(cmd, &net->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &net->info, qemuCaps) < 0)
goto cleanup;
if (!(nic = qemuBuildLegacyNicStr(net)))
if (!devProps)
return -1;
- if (qemuCommandAddExtDevice(cmd, &shmem->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &shmem->info, qemuCaps) < 0)
return -1;
if (qemuBuildDeviceCommandlineFromJSON(cmd, devProps, qemuCaps) < 0)
virCommandPassFD(cmd, priv->vhostfd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
priv->vhostfd = -1;
- if (qemuCommandAddExtDevice(cmd, &vsock->info) < 0)
+ if (qemuCommandAddExtDevice(cmd, &vsock->info, qemuCaps) < 0)
return -1;
virCommandAddArgList(cmd, "-device", devstr, NULL);