Signed-off-by: Fabio Fantoni <fabio.fantoni@xxxxxxx>
---
tools/libxl/libxl_create.c | 20 ++++++++++----------
tools/libxl/libxl_dm.c | 31 +++++++++++++++----------------
tools/libxl/xl_cmdimpl.c | 35 +++++++++++++++++++++--------------
3 files changed, 46 insertions(+), 40 deletions(-)
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 3376b5c..f1a1d73 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -215,6 +215,16 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
if (!b_info->event_channels)
b_info->event_channels = 1023;
+ libxl_defbool_setdefault(&b_info->u.hvm.spice.enable, false);
+ if (libxl_defbool_val(b_info->u.hvm.spice.enable)) {
+ libxl_defbool_setdefault(&b_info->u.hvm.spice.disable_ticketing,
+ false);
+ libxl_defbool_setdefault(&b_info->u.hvm.spice.agent_mouse, true);
+ libxl_defbool_setdefault(&b_info->u.hvm.spice.vdagent, false);
+ libxl_defbool_setdefault(&b_info->u.hvm.spice.clipboard_sharing,
+ false);
+ }
+
switch (b_info->type) {
case LIBXL_DOMAIN_TYPE_HVM:
if (b_info->shadow_memkb == LIBXL_MEMKB_DEFAULT)
@@ -337,16 +347,6 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
libxl_defbool_setdefault(&b_info->u.hvm.sdl.opengl, false);
}
- libxl_defbool_setdefault(&b_info->u.hvm.spice.enable, false);
- if (libxl_defbool_val(b_info->u.hvm.spice.enable)) {
- libxl_defbool_setdefault(&b_info->u.hvm.spice.disable_ticketing,
- false);
- libxl_defbool_setdefault(&b_info->u.hvm.spice.agent_mouse, true);
- libxl_defbool_setdefault(&b_info->u.hvm.spice.vdagent, false);
- libxl_defbool_setdefault(&b_info->u.hvm.spice.clipboard_sharing,
- false);
- }
-
libxl_defbool_setdefault(&b_info->u.hvm.nographic, false);
libxl_defbool_setdefault(&b_info->u.hvm.gfx_passthru, false);
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index e87f606..d5febc0 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -478,6 +478,21 @@ static char **
libxl__build_device_model_args_new(libxl__gc *gc,
flexarray_vappend(dm_args, "-k", keymap, NULL);
}
+ if (libxl_defbool_val(b_info->u.hvm.spice.enable)) {
+ const libxl_spice_info *spice = &b_info->u.hvm.spice;
+ char *spiceoptions = dm_spice_options(gc, spice);
+ if (!spiceoptions)
+ return NULL;
+
+ flexarray_append(dm_args, "-spice");
+ flexarray_append(dm_args, spiceoptions);
+ if (libxl_defbool_val(b_info->u.hvm.spice.vdagent)) {
+ flexarray_vappend(dm_args, "-device", "virtio-serial",
+ "-chardev", "spicevmc,id=vdagent,name=vdagent", "-device",
+ "virtserialport,chardev=vdagent,name=com.redhat.spice.0",
NULL);
+ }
+ }
+
if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) {
int ioemu_nics = 0;
@@ -489,22 +504,6 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc,
flexarray_append(dm_args, "-nographic");
}
- if (libxl_defbool_val(b_info->u.hvm.spice.enable)) {
- const libxl_spice_info *spice = &b_info->u.hvm.spice;
- char *spiceoptions = dm_spice_options(gc, spice);
- if (!spiceoptions)
- return NULL;
-
- flexarray_append(dm_args, "-spice");
- flexarray_append(dm_args, spiceoptions);
- if (libxl_defbool_val(b_info->u.hvm.spice.vdagent)) {
- flexarray_vappend(dm_args, "-device", "virtio-serial",
- "-chardev", "spicevmc,id=vdagent,name=vdagent", "-device",
- "virtserialport,chardev=vdagent,name=com.redhat.spice.0",
- NULL);
- }
- }
-
switch (b_info->u.hvm.vga.kind) {
case LIBXL_VGA_INTERFACE_TYPE_STD:
flexarray_append_pair(dm_args, "-device", "VGA");
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index e856e25..0c65beb 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -1647,6 +1647,8 @@ skip_vfb:
#undef parse_extra_args
+ xlu_cfg_get_defbool (config, "spice", &b_info->u.hvm.spice.enable, 0);
+
/* If we've already got vfb=[] for PV guest then ignore top level
* VNC config. */
if (c_info->type == LIBXL_DOMAIN_TYPE_PV && !d_config->num_vfbs) {
@@ -1655,7 +1657,7 @@ skip_vfb:
if (!xlu_cfg_get_long (config, "vnc", &l, 0))
vnc_enabled = l;
- if (vnc_enabled) {
+ if (vnc_enabled || libxl_defbool_val(b_info->u.hvm.spice.enable)) {
libxl_device_vfb *vfb;
libxl_device_vkb *vkb;
@@ -1665,15 +1667,30 @@ skip_vfb:
vkb = ARRAY_EXTEND_INIT(d_config->vkbs, d_config->num_vkbs,
libxl_device_vkb_init);
- parse_top_level_vnc_options(config, &vfb->vnc);
- parse_top_level_sdl_options(config, &vfb->sdl);
xlu_cfg_replace_string (config, "keymap", &vfb->keymap, 0);
+ if (vnc_enabled) {
+ parse_top_level_vnc_options(config, &vfb->vnc);
+ parse_top_level_sdl_options(config, &vfb->sdl);
+ }
}
} else {
parse_top_level_vnc_options(config, &b_info->u.hvm.vnc);
parse_top_level_sdl_options(config, &b_info->u.hvm.sdl);
}
+ if (!xlu_cfg_get_long (config, "spiceport", &l, 0))
+ b_info->u.hvm.spice.port = l;
+ if (!xlu_cfg_get_long (config, "spicetls_port", &l, 0))
+ b_info->u.hvm.spice.tls_port = l;
+ xlu_cfg_replace_string (config, "spicehost",
+ &b_info->u.hvm.spice.host, 0);
+ xlu_cfg_get_defbool(config, "spicedisable_ticketing",
+ &b_info->u.hvm.spice.disable_ticketing, 0);
+ xlu_cfg_replace_string (config, "spicepasswd",
+ &b_info->u.hvm.spice.passwd, 0);
+ /* Some spice features are missed because not supported by domU pv now */
+ b_info->u.hvm.spice.usbredirection = 0;
+
if (c_info->type == LIBXL_DOMAIN_TYPE_HVM) {
if (!xlu_cfg_get_string (config, "vga", &buf, 0)) {
if (!strcmp(buf, "stdvga")) {
@@ -1693,17 +1710,7 @@ skip_vfb:
LIBXL_VGA_INTERFACE_TYPE_CIRRUS;
xlu_cfg_replace_string (config, "keymap", &b_info->u.hvm.keymap, 0);
- xlu_cfg_get_defbool (config, "spice", &b_info->u.hvm.spice.enable, 0);
- if (!xlu_cfg_get_long (config, "spiceport", &l, 0))
- b_info->u.hvm.spice.port = l;
- if (!xlu_cfg_get_long (config, "spicetls_port", &l, 0))
- b_info->u.hvm.spice.tls_port = l;
- xlu_cfg_replace_string (config, "spicehost",
- &b_info->u.hvm.spice.host, 0);
- xlu_cfg_get_defbool(config, "spicedisable_ticketing",
- &b_info->u.hvm.spice.disable_ticketing, 0);
- xlu_cfg_replace_string (config, "spicepasswd",
- &b_info->u.hvm.spice.passwd, 0);
+
xlu_cfg_get_defbool(config, "spiceagent_mouse",
&b_info->u.hvm.spice.agent_mouse, 0);
xlu_cfg_get_defbool(config, "spicevdagent",