This supports the '-vga qxl' parameter in upstream QEMU/KVM
which has SPICE support added. This isn't particularly useful
until you get the next patch for -spice support. Also note that
while the libvirt XML supports multiple video devices, this
patch only supports a single one. A later patch can add support
for 2nd, 3rd, etc PCI devices for QXL
* src/qemu/qemu_conf.h: Flag for QXL support
* src/qemu/qemu_conf.c: Probe for '-vga qxl' support and implement it
* tests/qemuhelptest.c, tests/qemuhelpdata/qemu-kvm-0.12.1-rhel6: Test
case for '-vga qxl' probing. Currently broken.
* tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c,
tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-rhel6.args,
tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-rhel6.xml: Test
case for generating spice args with RHEL6 kvm
---
src/qemu/qemu_conf.c | 15 ++-
src/qemu/qemu_conf.h | 1 +
tests/qemuhelpdata/qemu-kvm-0.12.1-rhel6 | 212 ++++++++++++++++++++
tests/qemuhelptest.c | 28 +++
.../qemuxml2argv-graphics-spice-rhel6.args | 1 +
.../qemuxml2argv-graphics-spice-rhel6.xml | 27 +++
tests/qemuxml2argvtest.c | 10 +
tests/qemuxml2xmltest.c | 1 +
8 files changed, 293 insertions(+), 2 deletions(-)
create mode 100644 tests/qemuhelpdata/qemu-kvm-0.12.1-rhel6
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-rhel6.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-rhel6.xml
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index b922907..d59b0e9 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -93,7 +93,7 @@ VIR_ENUM_IMPL(qemuVideo, VIR_DOMAIN_VIDEO_TYPE_LAST,
"vmware",
"", /* no arg needed for xen */
"", /* don't support vbox */
- "", /* Not implemented QXL yet */);
+ "qxl");
int qemudLoadDriverConfig(struct qemud_driver *driver,
const char *filename) {
@@ -1143,8 +1143,12 @@ static unsigned long long qemudComputeCmdFlags(const char *help,
if (strstr(help, "format="))
flags |= QEMUD_CMD_FLAG_DRIVE_FORMAT;
}
- if (strstr(help, "-vga") && !strstr(help, "-std-vga"))
+ if (strstr(help, "-vga") && !strstr(help, "-std-vga")) {
flags |= QEMUD_CMD_FLAG_VGA;
+
+ if (strstr(help, "|qxl"))
+ flags |= QEMUD_CMD_FLAG_VGA_QXL;
+ }
if (strstr(help, "boot=on"))
flags |= QEMUD_CMD_FLAG_DRIVE_BOOT;
if (strstr(help, "serial=s"))
@@ -4421,6 +4425,13 @@ int qemudBuildCommandLine(virConnectPtr conn,
if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_XEN) {
/* nothing - vga has no effect on Xen pvfb */
} else {
+ if ((def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_QXL) &&
+ !(qemuCmdFlags & QEMUD_CMD_FLAG_VGA_QXL)) {
+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("This QEMU does not support QXL graphics
adapters"));
+ goto error;
+ }
+
const char *vgastr = qemuVideoTypeToString(def->videos[0]->type);
if (!vgastr || STREQ(vgastr, "")) {
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index e0666cb..5321955 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -88,6 +88,7 @@ enum qemud_cmd_flags {
QEMUD_CMD_FLAG_NO_HPET = (1LL << 33), /* -no-hpet flag is supported */
QEMUD_CMD_FLAG_NO_KVM_PIT = (1LL << 34), /* -no-kvm-pit-reinjection
supported */
QEMUD_CMD_FLAG_TDF = (1LL << 35), /* -tdf flag (user-mode pit
catchup) */
+ QEMUD_CMD_FLAG_VGA_QXL = (1LL << 36), /* The 'qxl' arg for
'-vga' */
};
/* Main driver state */
diff --git a/tests/qemuhelpdata/qemu-kvm-0.12.1-rhel6
b/tests/qemuhelpdata/qemu-kvm-0.12.1-rhel6
new file mode 100644
index 0000000..db54f6b
--- /dev/null
+++ b/tests/qemuhelpdata/qemu-kvm-0.12.1-rhel6
@@ -0,0 +1,212 @@
+QEMU PC emulator version 0.12.1 (qemu-kvm-0.12.1.2), Copyright (c) 2003-2008 Fabrice
Bellard
+usage: qemu [options] [disk_image]
+
+'disk_image' is a raw hard image image for IDE hard disk 0
+
+Standard options:
+-h or -help display this help and exit
+-version display version information and exit
+-M machine select emulated machine (-M ? for list)
+-cpu cpu select CPU (-cpu ? for list)
+-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]
+ set the number of CPUs to 'n' [default=1]
+ maxcpus= maximum number of total cpus, including
+ offline CPUs for hotplug etc.
+ cores= number of CPU cores on one socket
+ threads= number of threads on one CPU core
+ sockets= number of discrete sockets in the system
+-numa node[,mem=size][,cpus=cpu[-cpu]][,nodeid=node]
+-fda/-fdb file use 'file' as floppy disk 0/1 image
+-hda/-hdb file use 'file' as IDE hard disk 0/1 image
+-hdc/-hdd file use 'file' as IDE hard disk 2/3 image
+-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)
+-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]
+ [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]
+ [,cache=writethrough|writeback|none][,format=f][,serial=s]
+ [,addr=A][,id=name][,aio=threads|native]
+ [,boot=on|off]
+ use 'file' as a drive image
+-set group.id.arg=value
+ set <arg> parameter for item <id> of type <group>
+ i.e. -set drive.$id.file=/path/to/image
+-global driver.property=value
+ set a global default for a driver property
+-mtdblock file use 'file' as on-board Flash memory image
+-sd file use 'file' as SecureDigital card image
+-pflash file use 'file' as a parallel flash image
+-boot [order=drives][,once=drives][,menu=on|off]
+ 'drives': floppy (a), hard disk (c), CD-ROM (d), network (n)
+-snapshot write to temporary files instead of disk image files
+-m megs set virtual RAM size to megs MB [default=128]
+-k language use keyboard layout (for example 'fr' for French)
+-audio-help print list of audio drivers and their options
+-soundhw c1,... enable audio support
+ and only specified sound cards (comma separated list)
+ use -soundhw ? to get the list of supported cards
+ use -soundhw all to enable all of them
+-usb enable the USB driver (will be the default soon)
+-usbdevice name add the host or guest USB device 'name'
+-device driver[,options] add device
+-name string1[,process=string2] set the name of the guest
+ string1 sets the window title and string2 the process name (on Linux)
+-uuid %08x-%04x-%04x-%04x-%012x
+ specify machine UUID
+
+Display options:
+-nographic disable graphical output and redirect serial I/Os to console
+-spice <args> use spice
+-portrait rotate graphical output 90 deg left (only PXA LCD)
+-vga [std|cirrus|vmware|xenfb|qxl|none]
+ select video card type
+-full-screen start in full screen
+-vnc display start a VNC server on display
+
+i386 target only:
+-win2k-hack use it when installing Windows 2000 to avoid a disk full bug
+-no-fd-bootchk disable boot signature checking for floppy disks
+-no-acpi disable ACPI
+-no-hpet disable HPET
+-balloon none disable balloon device
+-balloon virtio[,addr=str]
+ enable virtio balloon device (default)
+-acpitable
[sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n][,asl_compiler_id=str][,asl_compiler_rev=n][,data=file1[:file2]...]
+ ACPI table description
+-smbios file=binary
+ Load SMBIOS entry from binary file
+-smbios type=0[,vendor=str][,version=str][,date=str][,release=%d.%d]
+ Specify SMBIOS type 0 fields
+-smbios type=1[,manufacturer=str][,product=str][,version=str][,serial=str]
+ [,uuid=uuid][,sku=str][,family=str]
+ Specify SMBIOS type 1 fields
+
+Network options:
+-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
+ create a new Network Interface Card and connect it to VLAN 'n'
+-net user[,vlan=n][,name=str][,net=addr[/mask]][,host=addr][,restrict=y|n]
+ [,hostname=host][,dhcpstart=addr][,dns=addr][,tftp=dir][,bootfile=f]
+ [,hostfwd=rule][,guestfwd=rule][,smb=dir[,smbserver=addr]]
+ connect the user mode network stack to VLAN 'n', configure its
+ DHCP server and enabled optional services
+-net
tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile][,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off][,vhostfd=h]
+ connect the host TAP network interface to VLAN 'n' and use the
+ network scripts 'file' (default=/etc/qemu-ifup)
+ and 'dfile' (default=/etc/qemu-ifdown);
+ use '[down]script=no' to disable script execution;
+ use 'fd=h' to connect to an already opened TAP interface
+ use 'sndbuf=nbytes' to limit the size of the send buffer; the
+ default of 'sndbuf=1048576' can be disabled using
'sndbuf=0'
+ use vnet_hdr=off to avoid enabling the IFF_VNET_HDR tap flag; use
+ vnet_hdr=on to make the lack of IFF_VNET_HDR support an error condition
+ use vhost=on to enable experimental in kernel accelerator
+ use 'vhostfd=h' to connect to an already opened vhost net device
+-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]
+ connect the vlan 'n' to another VLAN using a socket connection
+-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port]
+ connect the vlan 'n' to multicast maddr and port
+-net dump[,vlan=n][,file=f][,len=n]
+ dump traffic on vlan 'n' to file 'f' (max n bytes per
packet)
+-net none use it alone to have zero network devices; if no -net option
+ is provided, the default is '-net nic -net user'
+-netdev [user|tap|socket],id=str[,option][,option][,...]
+
+Character device options:
+-chardev null,id=id
+-chardev socket,id=id[,host=host],port=host[,to=to][,ipv4][,ipv6][,nodelay]
+ [,server][,nowait][,telnet] (tcp)
+-chardev socket,id=id,path=path[,server][,nowait][,telnet] (unix)
+-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]
+ [,localport=localport][,ipv4][,ipv6]
+-chardev msmouse,id=id
+-chardev vc,id=id[[,width=width][,height=height]][[,cols=cols][,rows=rows]]
+-chardev file,id=id,path=path
+-chardev pipe,id=id,path=path
+-chardev pty,id=id
+-chardev stdio,id=id
+-chardev tty,id=id,path=path
+-chardev parport,id=id,path=path
+
+Bluetooth(R) options:
+-bt hci,null dumb bluetooth HCI - doesn't respond to commands
+-bt hci,host[:id]
+ use host's HCI with the given name
+-bt hci[,vlan=n]
+ emulate a standard HCI in virtual scatternet 'n'
+-bt vhci[,vlan=n]
+ add host computer to virtual scatternet 'n' using VHCI
+-bt device:dev[,vlan=n]
+ emulate a bluetooth device 'dev' in scatternet 'n'
+
+Linux/Multiboot boot specific:
+-kernel bzImage use 'bzImage' as kernel image
+-append cmdline use 'cmdline' as kernel command line
+-initrd file use 'file' as initial ram disk
+
+Debug/Expert options:
+-serial dev redirect the serial port to char device 'dev'
+-parallel dev redirect the parallel port to char device 'dev'
+-monitor dev redirect the monitor to char device 'dev'
+-qmp dev like -monitor but opens in 'control' mode.
+-mon chardev=[name][,mode=readline|control][,default]
+-pidfile file write PID to 'file'
+-singlestep always run in singlestep mode
+-S freeze CPU at startup (use 'c' to start execution)
+-gdb dev wait for gdb connection on 'dev'
+-s shorthand for -gdb tcp::1234
+-d item1,... output log to /tmp/qemu.log (use -d ? for a list of log items)
+-hdachs c,h,s[,t]
+ force hard disk 0 physical geometry and the optional BIOS
+ translation (t=none or lba) (usually qemu can guess them)
+-L path set the directory for the BIOS, VGA BIOS and keymaps
+-bios file set the filename for the BIOS
+-enable-kvm enable KVM full virtualization support
+-no-reboot exit instead of rebooting
+-no-shutdown stop before shutdown
+-loadvm [tag|id]
+ start right away with a saved state (loadvm in monitor)
+-daemonize daemonize QEMU after initializing
+-option-rom rom load a file, rom, into the option ROM space
+-clock force the use of the given methods for timer alarm.
+ To see what timers are available use -clock ?
+-rtc [base=utc|localtime|date][,clock=host|vm][,driftfix=none|slew]
+ set the RTC base and clock, enable drift fix for clock ticks
+-icount [N|auto]
+ enable virtual instruction counter with 2^N clock ticks per
+ instruction
+-watchdog i6300esb|ib700
+ enable virtual hardware watchdog [default=none]
+-watchdog-action reset|shutdown|poweroff|pause|debug|none
+ action when watchdog fires [default=reset]
+-echr chr set terminal escape character instead of ctrl-a
+-virtioconsole c
+ set virtio console
+-show-cursor show cursor
+-tb-size n set TB size
+-incoming p prepare for incoming migration, listen on port p
+-nodefaults don't create default devices.
+-chroot dir Chroot to dir just before starting the VM.
+-runas user Change to user id user just before starting the VM.
+-readconfig <file>
+-writeconfig <file>
+ read/write config file
+-no-kvm disable KVM hardware virtualization
+-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC
+-no-kvm-pit disable KVM kernel mode PIT
+-no-kvm-pit-reinjection disable KVM kernel mode PIT interrupt reinjection
+-pcidevice host=bus:dev.func[,dma=none][,name=string]
+ expose a PCI device to the guest OS.
+ dma=none: don't perform any dma translations (default is to use an
iommu)
+ 'string' is used in log output.
+-enable-nesting enable support for running a VM inside the VM (AMD only)
+-nvram FILE provide ia64 nvram contents
+-tdf enable guest time drift compensation
+-kvm-shadow-memory MEGABYTES
+ allocate MEGABYTES for kvm mmu shadowing
+-mem-path FILE provide backing storage for guest RAM
+-mem-prealloc preallocate guest memory (use with -mempath)
+
+During emulation, the following keys are useful:
+ctrl-alt-f toggle full screen
+ctrl-alt-n switch to virtual console 'n'
+ctrl-alt toggle mouse and keyboard grab
+
+When using -nographic, press 'ctrl-a h' to get some help.
diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c
index b8c4b91..8dc49f0 100644
--- a/tests/qemuhelptest.c
+++ b/tests/qemuhelptest.c
@@ -245,6 +245,34 @@ mymain(int argc, char **argv)
QEMUD_CMD_FLAG_RTC |
QEMUD_CMD_FLAG_NO_HPET,
12001, 0, 0);
+ DO_TEST("qemu-kvm-0.12.1-rhel6",
+ QEMUD_CMD_FLAG_VNC_COLON |
+ QEMUD_CMD_FLAG_NO_REBOOT |
+ QEMUD_CMD_FLAG_DRIVE |
+ QEMUD_CMD_FLAG_DRIVE_BOOT |
+ QEMUD_CMD_FLAG_NAME |
+ QEMUD_CMD_FLAG_UUID |
+ QEMUD_CMD_FLAG_VNET_HDR |
+ QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP |
+ QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC |
+ QEMUD_CMD_FLAG_DRIVE_CACHE_V2 |
+ QEMUD_CMD_FLAG_KVM |
+ QEMUD_CMD_FLAG_DRIVE_FORMAT |
+ QEMUD_CMD_FLAG_DRIVE_SERIAL |
+ QEMUD_CMD_FLAG_VGA |
+ QEMUD_CMD_FLAG_0_10 |
+ QEMUD_CMD_FLAG_PCIDEVICE |
+ QEMUD_CMD_FLAG_MEM_PATH |
+ QEMUD_CMD_FLAG_ENABLE_KVM |
+ QEMUD_CMD_FLAG_MIGRATE_QEMU_UNIX |
+ QEMUD_CMD_FLAG_CHARDEV |
+ QEMUD_CMD_FLAG_BALLOON |
+ QEMUD_CMD_FLAG_DEVICE |
+ QEMUD_CMD_FLAG_SMP_TOPOLOGY |
+ QEMUD_CMD_FLAG_RTC |
+ QEMUD_CMD_FLAG_VNET_HOST |
+ QEMUD_CMD_FLAG_VGA_QXL,
+ 12001, 1, 0);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-rhel6.args
b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-rhel6.args
new file mode 100644
index 0000000..94cd90e
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-rhel6.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/QEMUGuest1 -usb -vga qxl -device
virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-rhel6.xml
b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-rhel6.xml
new file mode 100644
index 0000000..031a622
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-rhel6.xml
@@ -0,0 +1,27 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-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/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0'
unit='0'/>
+ </disk>
+ <controller type='ide' index='0'/>
+ <video>
+ <model type='qxl' vram='65536' heads='1'/>
+ </video>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 9e4d5bf..2e960d1 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -14,6 +14,7 @@
# include "testutils.h"
# include "qemu/qemu_conf.h"
# include "datatypes.h"
+# include "virterror_internal.h"
# include "testutilsqemu.h"
@@ -39,6 +40,8 @@ static int testCompareXMLToArgvFiles(const char *xml,
virDomainChrDef monitor_chr;
virConnectPtr conn;
+ virResetLastError();
+
if (!(conn = virGetConnect()))
goto fail;
@@ -125,6 +128,9 @@ static int testCompareXMLToArgvFiles(const char *xml,
ret = 0;
fail:
+ if (ret != 0 && virGetLastError())
+ virDispatchError(conn);
+
free(actualargv);
if (argv) {
tmp = argv;
@@ -289,6 +295,10 @@ mymain(int argc, char **argv)
DO_TEST("graphics-sdl", 0);
DO_TEST("graphics-sdl-fullscreen", 0);
DO_TEST("nographics-vga", QEMUD_CMD_FLAG_VGA);
+ DO_TEST("graphics-spice-rhel6",
+ QEMUD_CMD_FLAG_VGA | QEMUD_CMD_FLAG_VGA_QXL |
+ QEMUD_CMD_FLAG_DEVICE);
+
DO_TEST("input-usbmouse", 0);
DO_TEST("input-usbtablet", 0);
DO_TEST("input-xen", QEMUD_CMD_FLAG_DOMID);
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 1ac6edc..60f60c7 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -110,6 +110,7 @@ mymain(int argc, char **argv)
DO_TEST("graphics-vnc-tls");
DO_TEST("graphics-sdl");
DO_TEST("graphics-sdl-fullscreen");
+ DO_TEST("graphics-spice-rhel6");
DO_TEST("input-usbmouse");
DO_TEST("input-usbtablet");
DO_TEST("input-xen");
--
1.6.6.1