This supports the -qxl argument in RHEL-5's fork of KVM which has SPICE support. QXL is a graphics card, but inexplicably doesn't use the standard -vga syntax for generic configuration. Also -qxl is rather useless unless you also supply -spice (coming in next patch) * src/qemu_conf.c: Probe for -qxl arg in QEMU help. Format a -qxl arg for launching VMs * src/qemu_conf.h: Add flag for -qxl arg availability * tests/qemuhelpdata/kvm-83-rhel, tests/qemuhelptest.c: test for -qxl arg help parsing * tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args, tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml: add tests for -qxl graphics XML to ARGV handling --- src/qemu/qemu_conf.c | 41 +++++- src/qemu/qemu_conf.h | 2 +- tests/qemuhelpdata/kvm-83-rhel | 151 ++++++++++++++++++++ tests/qemuhelptest.c | 16 ++ .../qemuxml2argv-graphics-spice.args | 1 + .../qemuxml2argv-graphics-spice.xml | 25 ++++ tests/qemuxml2argvtest.c | 3 + tests/qemuxml2xmltest.c | 1 + 8 files changed, 235 insertions(+), 5 deletions(-) create mode 100644 tests/qemuhelpdata/kvm-83-rhel create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index ae171bc..695ee7c 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -87,7 +87,7 @@ VIR_ENUM_IMPL(qemuVideo, VIR_DOMAIN_VIDEO_TYPE_LAST, "vmware", NULL, /* no arg needed for xen */ NULL, /* don't support vbox */ - NULL, /* Not implemented yet */); + NULL, /* qxl is a bizarre special case */); #define PROC_MOUNT_BUF_LEN 255 @@ -865,6 +865,8 @@ static unsigned int qemudComputeCmdFlags(const char *help, } if (strstr(help, "-vga") && !strstr(help, "-std-vga")) flags |= QEMUD_CMD_FLAG_VGA; + if (strstr(help, "-qxl")) + flags |= QEMUD_CMD_FLAG_QXL; if (strstr(help, "boot=on")) flags |= QEMUD_CMD_FLAG_DRIVE_BOOT; if (strstr(help, "serial=s")) @@ -2174,9 +2176,15 @@ int qemudBuildCommandLine(virConnectPtr conn, } if (qemuCmdFlags & QEMUD_CMD_FLAG_VGA) { - if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_XEN) { + switch (def->videos[0]->type) { + case VIR_DOMAIN_VIDEO_TYPE_XEN: /* nothing - vga has no effect on Xen pvfb */ - } else { + break; + case VIR_DOMAIN_VIDEO_TYPE_QXL: + /* handle later */ + break; + default: + { const char *vgastr = qemuVideoTypeToString(def->videos[0]->type); if (!vgastr) { qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, @@ -2187,9 +2195,10 @@ int qemudBuildCommandLine(virConnectPtr conn, ADD_ARG_LIT("-vga"); ADD_ARG_LIT(vgastr); + break; + } } } else { - switch (def->videos[0]->type) { case VIR_DOMAIN_VIDEO_TYPE_VGA: ADD_ARG_LIT("-std-vga"); @@ -2204,6 +2213,10 @@ int qemudBuildCommandLine(virConnectPtr conn, /* No special args - this is the default */ break; + case VIR_DOMAIN_VIDEO_TYPE_QXL: + /* handle later */ + break; + default: qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("video type %s is not supported with QEMU"), @@ -2211,6 +2224,26 @@ int qemudBuildCommandLine(virConnectPtr conn, goto error; } } + + if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_QXL) { + + if (qemuCmdFlags & QEMUD_CMD_FLAG_QXL) { + char *optstr; + + if (virAsprintf(&optstr, "%u,ram=%u", + def->videos[0]->heads, + (def->videos[0]->vram /1024)) < 0) + goto no_memory; + + ADD_ARG_LIT("-qxl"); + ADD_ARG(optstr); + } else { + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s", + _("qxl graphics are not supported with this QEMU")); + goto error; + } + } + } /* Add sound hardware */ diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 96b7c0c..c8e3276 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -60,7 +60,6 @@ enum qemud_cmd_flags { QEMUD_CMD_FLAG_KVM = (1 << 13), /* Whether KVM is compiled in */ QEMUD_CMD_FLAG_DRIVE_FORMAT = (1 << 14), /* Is -drive format= avail */ QEMUD_CMD_FLAG_VGA = (1 << 15), /* Is -vga avail */ - /* features added in qemu-0.10.0 */ QEMUD_CMD_FLAG_0_10 = (1 << 16), QEMUD_CMD_FLAG_NET_NAME = QEMUD_CMD_FLAG_0_10, /* -net ...,name=str */ @@ -70,6 +69,7 @@ enum qemud_cmd_flags { QEMUD_CMD_FLAG_MEM_PATH = (1 << 18), /* mmap'ped guest backing supported */ QEMUD_CMD_FLAG_DRIVE_SERIAL = (1 << 19), /* -driver serial= available */ QEMUD_CMD_FLAG_XEN_DOMID = (1 << 20), /* -xen-domid (new style xen integration) */ + QEMUD_CMD_FLAG_QXL = (1 << 21), /* Is -qxl avail (RHEL-5/6 custom) */ }; /* Main driver state */ diff --git a/tests/qemuhelpdata/kvm-83-rhel b/tests/qemuhelpdata/kvm-83-rhel new file mode 100644 index 0000000..aeae3a4 --- /dev/null +++ b/tests/qemuhelpdata/kvm-83-rhel @@ -0,0 +1,151 @@ +QEMU PC emulator version 0.9.1 (kvm-83-maint-snapshot-20090205), 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: +-M machine select emulated machine (-M ? for list) +-cpu cpu select CPU (-cpu ? for list) +-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] + [,boot=on|off] + use 'file' as a drive image +-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 [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n) +-snapshot write to temporary files instead of disk image files +-no-frame open SDL window without a frame and window decorations +-alt-grab use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt) +-no-quit disable SDL window close capability +-no-fd-bootchk disable boot signature checking for floppy disks +-m megs set virtual RAM size to megs MB [default=128] +-smp n set the number of CPUs to 'n' [default=1] +-nographic disable graphical output and redirect serial I/Os to console +-portrait rotate graphical output 90 deg left (only PXA LCD) +-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 +-vga [std|cirrus|vmware] + select video card type +-localtime set the real time clock to local time [default=utc] +-full-screen start in full screen +-win2k-hack use it when installing Windows 2000 to avoid a disk full bug +-rtc-td-hack use it to fix time drift in Windows ACPI HAL +-usb enable the USB driver (will be the default soon) +-usbdevice name add the host or guest USB device 'name' +-name string set the name of the guest +-uuid %08x-%04x-%04x-%04x-%012x specify machine UUID +-notify event enable async-notifications for event +-qxl <num>[,ram=megs] + use 'num' qxl display devices, each with RAM size of 'megs' MB + [default=64] +-spice <args> use spice +-spice-help show spice usage + +Network options: +-net nic[,vlan=n][,macaddr=addr][,model=type][,name=str] + create a new Network Interface Card and connect it to VLAN 'n' +-net user[,vlan=n][,name=str][,hostname=host] + connect the user mode network stack to VLAN 'n' and send + hostname 'host' to DHCP clients +-net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile] + 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 +-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 none use it alone to have zero network devices; if no -net option + is provided, the default is '-net nic -net user' + +-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' + +-tftp dir allow tftp access to files in dir [-net user] +-bootp file advertise file in BOOTP replies +-smb dir allow SMB access to files in 'dir' [-net user] +-redir [tcp|udp]:host-port:[guest-host]:guest-port + redirect TCP or UDP connections from host to guest [-net user] + +Linux 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: +-monitor dev redirect the monitor to char device 'dev' +-vmchannel di:DI,dev redirect the hypercall device with device id DI, to char device 'dev' +-balloon dev redirect the balloon hypercall device to char device 'dev' +-serial dev redirect the serial port to char device 'dev' +-parallel dev redirect the parallel port to char device 'dev' +-pidfile file Write PID to 'file' +-S freeze CPU at startup (use 'c' to start execution) +-s wait gdb connection to port +-p port set gdb connection port [default=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 +-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 +-enable-nesting enable support for running a VM inside the VM (AMD only) +-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. +-no-acpi disable ACPI +-no-hpet disable HPET +-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 +-no-reboot exit instead of rebooting +-no-shutdown stop before shutdown +-loadvm [tag|id] start right away with a saved state (loadvm in monitor) +-vnc display start a VNC server on display +-daemonize daemonize QEMU after initializing +-tdf inject timer interrupts that got lost +-kvm-shadow-memory megs set the amount of shadow pages to be allocated +-mem-path set the path to hugetlbfs/tmpfs mounted directory, also + enables allocation of guest memory with huge pages +-mem-prealloc toggles preallocation of -mem-path backed physical memory + at startup. Default is enabled. +-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 ? +-startdate select initial date of the clock +-icount [N|auto] + Enable virtual instruction counter with 2^N clock ticks per instruction + +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 428d9a3..7fd9e92 100644 --- a/tests/qemuhelptest.c +++ b/tests/qemuhelptest.c @@ -179,6 +179,22 @@ mymain(int argc, char **argv) QEMUD_CMD_FLAG_PCIDEVICE | QEMUD_CMD_FLAG_MEM_PATH, 10092, 1, 0); + DO_TEST("kvm-83-rhel", + 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_VGA | + QEMUD_CMD_FLAG_QXL, + 9001, 1, 0); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args new file mode 100644 index 0000000..d401b85 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.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 -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb -qxl 3,ram=64 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml new file mode 100644 index 0000000..17f4b20 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml @@ -0,0 +1,25 @@ +<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'/> + </disk> + <video> + <model type='qxl' vram='65536' heads='3'/> + </video> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 3255146..142ee76 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -244,6 +244,9 @@ mymain(int argc, char **argv) DO_TEST("graphics-sdl", 0); DO_TEST("graphics-sdl-fullscreen", 0); + + DO_TEST("graphics-spice", QEMUD_CMD_FLAG_QXL); + 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 2cba47b..defc35d 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -107,6 +107,7 @@ mymain(int argc, char **argv) DO_TEST("graphics-vnc-tls"); DO_TEST("graphics-sdl"); DO_TEST("graphics-sdl-fullscreen"); + DO_TEST("graphics-spice"); DO_TEST("input-usbmouse"); DO_TEST("input-usbtablet"); DO_TEST("input-xen"); -- 1.6.2.5 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list