This patch extends the QEMU driver to support the <video> element for configuring the type of video adapter exposed to the guest. It implements the XML -> ARGV and ARGV -> XML conversions, so both import & export work. Some of the existing tests are updated to use the <video> element to get test coverage. The QEMU help parsing test is changed to use symbolic constants instead of black magic hex constants. This supports both old -std-vga and new -vga style QEMU args. Daniel From: Daniel P. Berrange <berrange@xxxxxxxxxx> Date: Mon, 6 Jul 2009 14:59:19 +0100 Subject: [PATCH 2/3] Support <video> element for QEMU guests * src/qemu_conf.c, src/qemu_conf.h: Use -vga or -std-vga when starting guests if video card is present * tests/qemuhelptest.c: Change to use constants instead of hardcoded hex numbers, and add VGA support * tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml, tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.args, tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml, tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.args, tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml, tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml, tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml, tests/qemuxml2argvdata/qemuxml2argv-input-xen.xml: Add <video> element for testing graphics adapter * tests/qemuxml2argvtest.c: Add QEMUD_CMD_FLAG_VGA flag * tests/qemuxml2xmltest.c: Add missing graphics-vnc-sasl/tls tests --- src/qemu_conf.c | 89 ++++++++++++++++++++ src/qemu_conf.h | 1 + tests/qemuhelptest.c | 66 +++++++++++++- .../qemuxml2argv-graphics-sdl-fullscreen.xml | 3 + .../qemuxml2argv-graphics-sdl.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml | 3 + .../qemuxml2argv-graphics-vnc-sasl.args | 2 +- .../qemuxml2argv-graphics-vnc-sasl.xml | 3 + .../qemuxml2argv-graphics-vnc-tls.xml | 3 + .../qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml | 3 + tests/qemuxml2argvdata/qemuxml2argv-input-xen.xml | 3 + tests/qemuxml2argvtest.c | 2 +- tests/qemuxml2xmltest.c | 2 + 13 files changed, 174 insertions(+), 8 deletions(-) diff --git a/src/qemu_conf.c b/src/qemu_conf.c index 9ca60b9..6337045 100644 --- a/src/qemu_conf.c +++ b/src/qemu_conf.c @@ -78,6 +78,15 @@ VIR_ENUM_IMPL(qemuDiskCacheV2, VIR_DOMAIN_DISK_CACHE_LAST, "writethrough", "writeback"); +VIR_ENUM_DECL(qemuVideo) + +VIR_ENUM_IMPL(qemuVideo, VIR_DOMAIN_VIDEO_TYPE_LAST, + "std", + "cirrus", + "vmware", + NULL, /* no arg needed for xen */ + NULL /* don't support vbox */); + int qemudLoadDriverConfig(struct qemud_driver *driver, const char *filename) { @@ -455,6 +464,8 @@ static unsigned int qemudComputeCmdFlags(const char *help, if (strstr(help, "format=")) flags |= QEMUD_CMD_FLAG_DRIVE_FORMAT; } + if (strstr(help, "-vga") && !strstr(help, "-std-vga")) + flags |= QEMUD_CMD_FLAG_VGA; if (strstr(help, "boot=on")) flags |= QEMUD_CMD_FLAG_DRIVE_BOOT; if (version >= 9000) @@ -1533,6 +1544,53 @@ int qemudBuildCommandLine(virConnectPtr conn, ADD_ARG_LIT("-full-screen"); } + if (def->nvideos) { + if (def->nvideos > 1) { + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, + "%s", _("only one video card is currentely supported")); + goto error; + } + + if (qemuCmdFlags & QEMUD_CMD_FLAG_VGA) { + if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_XEN) { + /* nothing - vga has no effect on Xen pvfb */ + } else { + const char *vgastr = qemuVideoTypeToString(def->videos[0]->type); + if (!vgastr) { + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("video type %s is not supported with QEMU"), + virDomainVideoTypeToString(def->videos[0]->type)); + goto error; + } + + ADD_ARG_LIT("-vga"); + ADD_ARG_LIT(vgastr); + } + } else { + + switch (def->videos[0]->type) { + case VIR_DOMAIN_VIDEO_TYPE_VGA: + ADD_ARG_LIT("-std-vga"); + break; + + case VIR_DOMAIN_VIDEO_TYPE_VMVGA: + ADD_ARG_LIT("-vmwarevga"); + break; + + case VIR_DOMAIN_VIDEO_TYPE_XEN: + case VIR_DOMAIN_VIDEO_TYPE_CIRRUS: + /* No special args - this is the default */ + break; + + default: + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("video type %s is not supported with QEMU"), + virDomainVideoTypeToString(def->videos[0]->type)); + goto error; + } + } + } + /* Add sound hardware */ if (def->nsounds) { int size = 100; @@ -2428,6 +2486,7 @@ virDomainDefPtr qemuParseCommandLine(virConnectPtr conn, char *path; int nnics = 0; const char **nics = NULL; + int video = VIR_DOMAIN_VIDEO_TYPE_CIRRUS; if (!progargv[0]) { qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, @@ -2805,6 +2864,18 @@ virDomainDefPtr qemuParseCommandLine(virConnectPtr conn, def->os.bootloader = strdup(val); if (!def->os.bootloader) goto no_memory; + } else if (STREQ(arg, "-vmwarevga")) { + video = VIR_DOMAIN_VIDEO_TYPE_VMVGA; + } else if (STREQ(arg, "-std-vga")) { + video = VIR_DOMAIN_VIDEO_TYPE_VGA; + } else if (STREQ(arg, "-vga")) { + WANT_VALUE(); + video = qemuVideoTypeFromString(val); + if (video < 0) { + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("unknown video adapter type '%s'"), val); + goto error; + } } else if (STREQ(arg, "-domid")) { WANT_VALUE(); /* ignore, generted on the fly */ @@ -2859,6 +2930,24 @@ virDomainDefPtr qemuParseCommandLine(virConnectPtr conn, def->graphics[def->ngraphics++] = sdl; } + if (def->ngraphics) { + virDomainVideoDefPtr vid; + if (VIR_ALLOC(vid) < 0) + goto no_memory; + if (def->virtType == VIR_DOMAIN_VIRT_XEN) + vid->type = VIR_DOMAIN_VIDEO_TYPE_XEN; + else + vid->type = video; + vid->vram = virDomainVideoDefaultRAM(def, vid->type); + vid->heads = 1; + + if (VIR_REALLOC_N(def->videos, def->nvideos+1) < 0) { + virDomainVideoDefFree(vid); + goto no_memory; + } + def->videos[def->nvideos++] = vid; + } + VIR_FREE(nics); if (!def->name) { diff --git a/src/qemu_conf.h b/src/qemu_conf.h index c0ed46d..9065821 100644 --- a/src/qemu_conf.h +++ b/src/qemu_conf.h @@ -57,6 +57,7 @@ enum qemud_cmd_flags { QEMUD_CMD_FLAG_DRIVE_CACHE_V2 = (1 << 12), /* Is the cache= flag wanting new v2 values */ 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 */ }; /* Main driver state */ diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c index bf8a293..73eae54 100644 --- a/tests/qemuhelptest.c +++ b/tests/qemuhelptest.c @@ -89,11 +89,67 @@ mymain(int argc, char **argv) ret = -1; \ } while (0) - DO_TEST("qemu-0.9.1", 0x002f, 9001, 0, 0); - DO_TEST("kvm-74", 0x633e, 9001, 1, 74); - DO_TEST("qemu-0.10.5", 0x5c6f, 10005, 0, 0); - DO_TEST("qemu-kvm-0.10.5", 0x7d7e, 10005, 1, 0); - DO_TEST("kvm-86", 0x7d7e, 10050, 1, 0); + DO_TEST("qemu-0.9.1", + QEMUD_CMD_FLAG_KQEMU | + QEMUD_CMD_FLAG_VNC_COLON | + QEMUD_CMD_FLAG_NO_REBOOT | + QEMUD_CMD_FLAG_DRIVE | + QEMUD_CMD_FLAG_NAME, + 9001, 0, 0); + DO_TEST("kvm-74", + 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_VNET_HDR | + QEMUD_CMD_FLAG_MIGRATE_KVM_STDIO | + QEMUD_CMD_FLAG_KVM | + QEMUD_CMD_FLAG_DRIVE_FORMAT, + 9001, 1, 74); + DO_TEST("qemu-0.10.5", + QEMUD_CMD_FLAG_KQEMU | + QEMUD_CMD_FLAG_VNC_COLON | + QEMUD_CMD_FLAG_NO_REBOOT | + QEMUD_CMD_FLAG_DRIVE | + QEMUD_CMD_FLAG_NAME | + QEMUD_CMD_FLAG_UUID | + QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP | + QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC | + QEMUD_CMD_FLAG_DRIVE_CACHE_V2 | + QEMUD_CMD_FLAG_DRIVE_FORMAT | + QEMUD_CMD_FLAG_VGA, + 10005, 0, 0); + DO_TEST("qemu-kvm-0.10.5", + 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, + 10005, 1, 0); + DO_TEST("kvm-86", + 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, + 10050, 1, 0); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml index fe1fe1a..f3fc588 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml @@ -20,5 +20,8 @@ </disk> <input type='mouse' bus='ps2'/> <graphics type='sdl' display=':0.1' xauth='/root/.Xauthority' fullscreen='yes'/> + <video> + <model type='cirrus' vram='9216' heads='1'/> + </video> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.args index 3b2b049..f908252 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.args @@ -1 +1 @@ -LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test XAUTHORITY=/root/.Xauthority DISPLAY=:0.1 /usr/bin/qemu -S -M pc -m 214 -smp 1 -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test XAUTHORITY=/root/.Xauthority DISPLAY=:0.1 /usr/bin/qemu -S -M pc -m 214 -smp 1 -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb -std-vga diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml index 1e04f12..431c3c9 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml @@ -20,5 +20,8 @@ </disk> <input type='mouse' bus='ps2'/> <graphics type='sdl' display=':0.1' xauth='/root/.Xauthority'/> + <video> + <model type='vga' vram='9216' heads='1'/> + </video> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.args index a41a57c..bd63540 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.args @@ -1 +1 @@ -LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test SASL_CONF_DIR=/root/.sasl2 /usr/bin/qemu -S -M pc -m 214 -smp 1 -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb -vnc 127.0.0.1:3,sasl +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test SASL_CONF_DIR=/root/.sasl2 /usr/bin/qemu -S -M pc -m 214 -smp 1 -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb -vnc 127.0.0.1:3,sasl -vga cirrus diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml index cbaa1da..b6f99d3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml @@ -20,5 +20,8 @@ </disk> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='5903' autoport='no' listen='127.0.0.1'/> + <video> + <model type='cirrus' vram='9216' heads='1'/> + </video> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml index cbaa1da..b6f99d3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml @@ -20,5 +20,8 @@ </disk> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='5903' autoport='no' listen='127.0.0.1'/> + <video> + <model type='cirrus' vram='9216' heads='1'/> + </video> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml index cbaa1da..b6f99d3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml @@ -20,5 +20,8 @@ </disk> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='5903' autoport='no' listen='127.0.0.1'/> + <video> + <model type='cirrus' vram='9216' heads='1'/> + </video> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-input-xen.xml b/tests/qemuxml2argvdata/qemuxml2argv-input-xen.xml index 1e80317..fea7f8e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-input-xen.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-input-xen.xml @@ -20,5 +20,8 @@ </disk> <input type='mouse' bus='xen'/> <graphics type='vnc' port='5903' autoport='no' listen='127.0.0.1'/> + <video> + <model type='xen' vram='4096' heads='1'/> + </video> </devices> </domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 28609eb..2a93018 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -216,7 +216,7 @@ mymain(int argc, char **argv) driver.vncSASL = 1; driver.vncSASLdir = strdup("/root/.sasl2"); - DO_TEST("graphics-vnc-sasl", 0); + DO_TEST("graphics-vnc-sasl", QEMUD_CMD_FLAG_VGA); driver.vncTLS = 1; driver.vncTLSx509verify = 1; driver.vncTLSx509certdir = strdup("/etc/pki/tls/qemu"); diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index ab9943d..7db7611 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -102,6 +102,8 @@ mymain(int argc, char **argv) DO_TEST("disk-drive-cache-v1-wb"); DO_TEST("disk-drive-cache-v1-none"); DO_TEST("graphics-vnc"); + DO_TEST("graphics-vnc-sasl"); + DO_TEST("graphics-vnc-tls"); DO_TEST("graphics-sdl"); DO_TEST("graphics-sdl-fullscreen"); DO_TEST("input-usbmouse"); -- 1.6.2.5 -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list