*flags |= QEMUD_CMD_FLAG_CCID_EMULATED;
if (strstr(str, "name \"ccid-card-passthru\""))
*flags |= QEMUD_CMD_FLAG_CCID_PASSTHRU;
+ /* Prefer -chardev spicevmc (detected earlier) over -device spicevmc */
+ if (!(*flags & QEMUD_CMD_FLAG_CHARDEV_SPICEVMC) &&
+ strstr(str, "name \"spicevmc\""))
+ *flags |= QEMUD_CMD_FLAG_DEVICE_SPICEVMC;
/* Features of given devices. */
if (strstr(str, "pci-assign.configfd"))
QEMUD_CMD_FLAG_PCI_BOOTINDEX = (1LL << 53), /* pci-assign.bootindex */
QEMUD_CMD_FLAG_CCID_EMULATED = (1LL << 54), /* -device ccid-card-emulated */
QEMUD_CMD_FLAG_CCID_PASSTHRU = (1LL << 55), /* -device ccid-card-passthru */
- QEMUD_CMD_FLAG_CHARDEV_SPICEVMC = (1LL << 56), /* -chardev spicevmc */
+ QEMUD_CMD_FLAG_CHARDEV_SPICEVMC = (1LL << 56), /* newer -chardev spicevmc */
+ QEMUD_CMD_FLAG_DEVICE_SPICEVMC = (1LL << 57), /* older -device spicevmc*/
};
virCapsPtr qemuCapsInit(virCapsPtr old_caps);
}
-char *
-qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev)
+static char *
+qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev,
+ unsigned long long qemuCmdFlags)
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE)
virBufferAddLit(&buf, "virtconsole");
+ else if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE_SPICEVMC) &&
+ dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC)
+ virBufferAddLit(&buf, "spicevmc");
else
virBufferAddLit(&buf, "virtserialport");
dev->info.addr.vioserial.port);
}
- virBufferVSprintf(&buf, ",chardev=char%s,id=%s",
- dev->info.alias, dev->info.alias);
if (dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC &&
dev->target.name &&
STRNEQ(dev->target.name, "com.redhat.spice.0")) {
dev->target.name);
goto error;
}
- if (dev->target.name) {
- virBufferVSprintf(&buf, ",name=%s", dev->target.name);
+ if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE_SPICEVMC) &&
+ dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) {
+ virBufferVSprintf(&buf, ",id=%s", dev->info.alias);
+ } else {
+ virBufferVSprintf(&buf, ",chardev=char%s,id=%s",
+ dev->info.alias, dev->info.alias);
+ if (dev->target.name) {
+ virBufferVSprintf(&buf, ",name=%s", dev->target.name);
+ }
}
if (virBufferError(&buf)) {
virReportOOMError();
goto error;
}
- virCommandAddArg(cmd, "-chardev");
- if (!(devstr = qemuBuildChrChardevStr(&channel->source,
- channel->info.alias,
- qemuCmdFlags)))
- goto error;
- virCommandAddArg(cmd, devstr);
- VIR_FREE(devstr);
+ if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE_SPICEVMC) &&
+ channel->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) {
+ /* spicevmc was originally introduced via a -device
+ * with a backend internal to qemu; although we prefer
+ * the newer -chardev interface. */
+ ;
+ } else {
+ virCommandAddArg(cmd, "-chardev");
+ if (!(devstr = qemuBuildChrChardevStr(&channel->source,
+ channel->info.alias,
+ qemuCmdFlags)))
+ goto error;
+ virCommandAddArg(cmd, devstr);
+ VIR_FREE(devstr);
+ }
virCommandAddArg(cmd, "-device");
- if (!(devstr = qemuBuildVirtioSerialPortDevStr(channel)))
+ if (!(devstr = qemuBuildVirtioSerialPortDevStr(channel,
+ qemuCmdFlags)))
goto error;
virCommandAddArg(cmd, devstr);
VIR_FREE(devstr);
VIR_FREE(devstr);
virCommandAddArg(cmd, "-device");
- if (!(devstr = qemuBuildVirtioSerialPortDevStr(console)))
+ if (!(devstr = qemuBuildVirtioSerialPortDevStr(console,
+ qemuCmdFlags)))
goto error;
virCommandAddArg(cmd, devstr);
VIR_FREE(devstr);
int qemuOpenPCIConfig(virDomainHostdevDefPtr dev);
-char * qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev);
-
/* Legacy, pre device support */
char * qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev);
/* Current, best practice */
QEMUD_CMD_FLAG_SPICE |
QEMUD_CMD_FLAG_VGA_NONE |
QEMUD_CMD_FLAG_MIGRATE_QEMU_FD |
- QEMUD_CMD_FLAG_DRIVE_AIO,
+ QEMUD_CMD_FLAG_DRIVE_AIO |
+ QEMUD_CMD_FLAG_DEVICE_SPICEVMC,
12001, 1, 0);
DO_TEST("qemu-kvm-0.12.3",
QEMUD_CMD_FLAG_VNC_COLON |
QEMUD_CMD_FLAG_SPICE |
QEMUD_CMD_FLAG_VGA_NONE |
QEMUD_CMD_FLAG_MIGRATE_QEMU_FD |
- QEMUD_CMD_FLAG_DRIVE_AIO,
+ QEMUD_CMD_FLAG_DRIVE_AIO |
+ QEMUD_CMD_FLAG_DEVICE_SPICEVMC,
13000, 1, 0);
DO_TEST("qemu-kvm-0.12.1.2-rhel61",
QEMUD_CMD_FLAG_VNC_COLON |
--- /dev/null
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=spice \
+/usr/bin/qemu -S -M pc -m 214 -smp 1 -nodefconfig -nodefaults \
+-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -device \
+virtio-serial-pci,id=virtio-serial1,bus=pci.0,addr=0xa -hda \
+/dev/HostVG/QEMUGuest1 -device spicevmc,bus=virtio-serial1.0,nr=3,id=channel0 \
+-usb -spice port=5903,tls-port=5904,addr=127.0.0.1,\
+x509-dir=/etc/pki/libvirt-spice,tls-channel=main -device \
+virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
--- /dev/null
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory>219136</memory>
+ <vcpu cpuset='1-4,8-20,525'>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/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' unit='0'/>
+ </disk>
+ <controller type='ide' index='0'/>
+ <controller type='virtio-serial' index='1'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
+ </controller>
+ <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'>
+ <channel name='main' mode='secure'/>
+ </graphics>
+ <channel type='spicevmc'>
+ <target type='virtio' name='com.redhat.spice.0'/>
+ <address type='virtio-serial' controller='1' bus='0' port='3'/>
+ </channel>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
DO_TEST("channel-spicevmc", QEMUD_CMD_FLAG_DEVICE |
QEMUD_CMD_FLAG_NODEFCONFIG | QEMUD_CMD_FLAG_SPICE |
QEMUD_CMD_FLAG_CHARDEV_SPICEVMC, false);
+ DO_TEST("channel-spicevmc-old", QEMUD_CMD_FLAG_DEVICE |
+ QEMUD_CMD_FLAG_NODEFCONFIG | QEMUD_CMD_FLAG_SPICE |
+ QEMUD_CMD_FLAG_DEVICE_SPICEVMC, false);
DO_TEST("smartcard-host",
QEMUD_CMD_FLAG_CHARDEV | QEMUD_CMD_FLAG_DEVICE |