aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2012-01-31 15:21:51 +0000
committerIan Campbell <ian.campbell@citrix.com>2012-01-31 15:21:51 +0000
commitd79f0a1bb6ceb345fc07ec5ee1351dee436e4aab (patch)
tree9e37b0d45390accc97075eddd940fc3de3066dfd /tools
parent7b3879d2361bee3b17c46d7b29bf32041ed1b8fc (diff)
downloadxen-d79f0a1bb6ceb345fc07ec5ee1351dee436e4aab.tar.gz
xen-d79f0a1bb6ceb345fc07ec5ee1351dee436e4aab.tar.bz2
xen-d79f0a1bb6ceb345fc07ec5ee1351dee436e4aab.zip
libxl: move HVM emulated GFX support into b_info->u.hvm
Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/libxl/libxl_create.c22
-rw-r--r--tools/libxl/libxl_dm.c165
-rw-r--r--tools/libxl/libxl_types.idl16
-rw-r--r--tools/libxl/xl_cmdimpl.c71
4 files changed, 157 insertions, 117 deletions
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index f287733fc7..621d73dd4e 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -96,6 +96,16 @@ int libxl_init_build_info(libxl_ctx *ctx,
b_info->u.hvm.timer_mode = 1;
b_info->u.hvm.nested_hvm = 0;
b_info->u.hvm.no_incr_generationid = 0;
+
+ b_info->u.hvm.stdvga = 0;
+ b_info->u.hvm.vnc.enable = 1;
+ b_info->u.hvm.vnc.listen = strdup("127.0.0.1");
+ b_info->u.hvm.vnc.display = 0;
+ b_info->u.hvm.vnc.findunused = 1;
+ b_info->u.hvm.keymap = NULL;
+ b_info->u.hvm.sdl.enable = 0;
+ b_info->u.hvm.sdl.opengl = 0;
+ b_info->u.hvm.nographic = 0;
break;
case LIBXL_DOMAIN_TYPE_PV:
b_info->u.pv.slack_memkb = 8 * 1024;
@@ -121,17 +131,7 @@ int libxl_init_dm_info(libxl_ctx *ctx,
dm_info->device_model_version = LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL;
dm_info->device_model_stubdomain = false;
dm_info->device_model = NULL;
- dm_info->videoram = libxl__sizekb_to_mb(b_info->video_memkb);
-
- dm_info->stdvga = 0;
- dm_info->vnc.enable = 1;
- dm_info->vnc.listen = strdup("127.0.0.1");
- dm_info->vnc.display = 0;
- dm_info->vnc.findunused = 1;
- dm_info->keymap = NULL;
- dm_info->sdl.enable = 0;
- dm_info->sdl.opengl = 0;
- dm_info->nographic = 0;
+
dm_info->serial = NULL;
dm_info->boot = strdup("cda");
dm_info->usb = 0;
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index bf19f217be..c01740ac65 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -78,7 +78,7 @@ static const libxl_vnc_info *dm_vnc(const libxl_domain_config *guest_config,
{
const libxl_vnc_info *vnc = NULL;
if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
- vnc = &info->vnc;
+ vnc = &guest_config->b_info.u.hvm.vnc;
} else if (guest_config->num_vfbs > 0) {
vnc = &guest_config->vfbs[0].vnc;
}
@@ -90,13 +90,24 @@ static const libxl_sdl_info *dm_sdl(const libxl_domain_config *guest_config,
{
const libxl_sdl_info *sdl = NULL;
if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
- sdl = &info->sdl;
+ sdl = &guest_config->b_info.u.hvm.sdl;
} else if (guest_config->num_vfbs > 0) {
sdl = &guest_config->vfbs[0].sdl;
}
return sdl && sdl->enable ? sdl : NULL;
}
+static const char *dm_keymap(const libxl_domain_config *guest_config,
+ const libxl_device_model_info *info)
+{
+ if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
+ return guest_config->b_info.u.hvm.keymap;
+ } else if (guest_config->num_vfbs > 0) {
+ return guest_config->vfbs[0].keymap;
+ } else
+ return NULL;
+}
+
static char ** libxl__build_device_model_args_old(libxl__gc *gc,
const char *dm,
const libxl_domain_config *guest_config,
@@ -108,6 +119,7 @@ static char ** libxl__build_device_model_args_old(libxl__gc *gc,
const libxl_vnc_info *vnc = dm_vnc(guest_config, info);
const libxl_sdl_info *sdl = dm_sdl(guest_config, info);
const int num_vifs = guest_config->num_vifs;
+ const char *keymap = dm_keymap(guest_config, info);
int i;
flexarray_t *dm_args;
dm_args = flexarray_make(16, 1);
@@ -156,11 +168,8 @@ static char ** libxl__build_device_model_args_old(libxl__gc *gc,
}
/* XXX sdl->{display,xauthority} into $DISPLAY/$XAUTHORITY */
}
- if (info->keymap) {
- flexarray_vappend(dm_args, "-k", info->keymap, NULL);
- }
- if (info->nographic && (!sdl && !vnc)) {
- flexarray_append(dm_args, "-nographic");
+ if (keymap) {
+ flexarray_vappend(dm_args, "-k", keymap, NULL);
}
if (info->serial) {
flexarray_vappend(dm_args, "-serial", info->serial, NULL);
@@ -168,10 +177,17 @@ static char ** libxl__build_device_model_args_old(libxl__gc *gc,
if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
int ioemu_vifs = 0;
- if (info->videoram) {
- flexarray_vappend(dm_args, "-videoram", libxl__sprintf(gc, "%d", info->videoram), NULL);
+ if (b_info->u.hvm.nographic && (!sdl && !vnc)) {
+ flexarray_append(dm_args, "-nographic");
}
- if (info->stdvga) {
+
+ if (b_info->video_memkb) {
+ flexarray_vappend(dm_args, "-videoram",
+ libxl__sprintf(gc, "%d",
+ libxl__sizekb_to_mb(b_info->video_memkb)),
+ NULL);
+ }
+ if (b_info->u.hvm.stdvga) {
flexarray_append(dm_args, "-std-vga");
}
@@ -225,7 +241,11 @@ static char ** libxl__build_device_model_args_old(libxl__gc *gc,
if (info->gfx_passthru) {
flexarray_append(dm_args, "-gfx_passthru");
}
+ } else {
+ if (!sdl && !vnc)
+ flexarray_append(dm_args, "-nographic");
}
+
if (info->saved_state) {
flexarray_vappend(dm_args, "-loadvm", info->saved_state, NULL);
}
@@ -260,6 +280,42 @@ static const char *qemu_disk_format_string(libxl_disk_format format)
}
}
+static char *dm_spice_options(libxl__gc *gc,
+ const libxl_spice_info *spice)
+{
+ char *opt;
+
+ if (!spice->port && !spice->tls_port) {
+ LIBXL__LOG(CTX, LIBXL__LOG_ERROR,
+ "at least one of the spiceport or tls_port must be provided");
+ return NULL;
+ }
+
+ if (!spice->disable_ticketing) {
+ if (!spice->passwd) {
+ LIBXL__LOG(CTX, LIBXL__LOG_ERROR,
+ "spice ticketing is enabled but missing password");
+ return NULL;
+ }
+ else if (!spice->passwd[0]) {
+ LIBXL__LOG(CTX, LIBXL__LOG_ERROR,
+ "spice password can't be empty");
+ return NULL;
+ }
+ }
+ opt = libxl__sprintf(gc, "port=%d,tls-port=%d",
+ spice->port, spice->tls_port);
+ if (spice->host)
+ opt = libxl__sprintf(gc, "%s,addr=%s", opt, spice->host);
+ if (spice->disable_ticketing)
+ opt = libxl__sprintf(gc, "%s,disable-ticketing", opt);
+ else
+ opt = libxl__sprintf(gc, "%s,password=%s", opt, spice->passwd);
+ opt = libxl__sprintf(gc, "%s,agent-mouse=%s", opt,
+ spice->agent_mouse ? "on" : "off");
+ return opt;
+}
+
static char ** libxl__build_device_model_args_new(libxl__gc *gc,
const char *dm,
const libxl_domain_config *guest_config,
@@ -274,6 +330,7 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc,
const int num_vifs = guest_config->num_vifs;
const libxl_vnc_info *vnc = dm_vnc(guest_config, info);
const libxl_sdl_info *sdl = dm_sdl(guest_config, info);
+ const char *keymap = dm_keymap(guest_config, info);
flexarray_t *dm_args;
int i;
@@ -332,61 +389,36 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc,
flexarray_append(dm_args, "-sdl");
/* XXX sdl->{display,xauthority} into $DISPLAY/$XAUTHORITY */
}
- if (info->spice.enable) {
- char *spiceoptions = NULL;
- if (!info->spice.port && !info->spice.tls_port) {
- LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
- "at least one of the spiceport or tls_port must be provided");
- return NULL;
- }
-
- if (!info->spice.disable_ticketing) {
- if (!info->spice.passwd) {
- LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
- "spice ticketing is enabled but missing password");
- return NULL;
- }
- else if (!info->spice.passwd[0]) {
- LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
- "spice password can't be empty");
- return NULL;
- }
- }
- spiceoptions = libxl__sprintf(gc, "port=%d,tls-port=%d",
- info->spice.port, info->spice.tls_port);
- if (info->spice.host)
- spiceoptions = libxl__sprintf(gc,
- "%s,addr=%s", spiceoptions, info->spice.host);
- if (info->spice.disable_ticketing)
- spiceoptions = libxl__sprintf(gc, "%s,disable-ticketing",
- spiceoptions);
- else
- spiceoptions = libxl__sprintf(gc,
- "%s,password=%s", spiceoptions, info->spice.passwd);
- spiceoptions = libxl__sprintf(gc, "%s,agent-mouse=%s", spiceoptions,
- info->spice.agent_mouse ? "on" : "off");
-
- flexarray_append(dm_args, "-spice");
- flexarray_append(dm_args, spiceoptions);
- }
- if (info->type == LIBXL_DOMAIN_TYPE_PV && !info->nographic) {
+ /*if (info->type == LIBXL_DOMAIN_TYPE_PV && !b_info->nographic) {
flexarray_vappend(dm_args, "-vga", "xenfb", NULL);
- }
+ } never was possible?*/
- if (info->keymap) {
- flexarray_vappend(dm_args, "-k", info->keymap, NULL);
- }
- if (info->nographic && (!sdl && !vnc)) {
- flexarray_append(dm_args, "-nographic");
+ if (keymap) {
+ flexarray_vappend(dm_args, "-k", keymap, NULL);
}
+
if (info->serial) {
flexarray_vappend(dm_args, "-serial", info->serial, NULL);
}
if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
int ioemu_vifs = 0;
- if (info->stdvga) {
+ if (b_info->u.hvm.nographic && (!sdl && !vnc)) {
+ flexarray_append(dm_args, "-nographic");
+ }
+
+ if (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 (b_info->u.hvm.stdvga) {
flexarray_vappend(dm_args, "-vga", "std", NULL);
}
@@ -446,7 +478,12 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc,
if (info->gfx_passthru) {
flexarray_append(dm_args, "-gfx_passthru");
}
+ } else {
+ if (!sdl && !vnc) {
+ flexarray_append(dm_args, "-nographic");
+ }
}
+
if (info->saved_state) {
/* This file descriptor is meant to be used by QEMU */
int migration_fd = open(info->saved_state, O_RDONLY);
@@ -555,19 +592,24 @@ static char ** libxl__build_device_model_args(libxl__gc *gc,
}
}
-static int libxl__vfb_and_vkb_from_device_model_info(libxl__gc *gc,
- const libxl_device_model_info *info,
+static int libxl__vfb_and_vkb_from_hvm_guest_config(libxl__gc *gc,
+ const libxl_domain_config *guest_config,
libxl_device_vfb *vfb,
libxl_device_vkb *vkb)
{
+ const libxl_domain_build_info *b_info = &guest_config->b_info;
+
+ if (b_info->type != LIBXL_DOMAIN_TYPE_HVM)
+ return ERROR_INVAL;
+
memset(vfb, 0x00, sizeof(libxl_device_vfb));
memset(vkb, 0x00, sizeof(libxl_device_vkb));
vfb->backend_domid = 0;
vfb->devid = 0;
- vfb->vnc = info->vnc;
- vfb->keymap = info->keymap;
- vfb->sdl = info->sdl;
+ vfb->vnc = b_info->u.hvm.vnc;
+ vfb->keymap = b_info->u.hvm.keymap;
+ vfb->sdl = b_info->u.hvm.sdl;
vkb->backend_domid = 0;
vkb->devid = 0;
@@ -670,8 +712,7 @@ static int libxl__create_stubdom(libxl__gc *gc,
dm_config.vifs = guest_config->vifs;
dm_config.num_vifs = guest_config->num_vifs;
- libxl__vfb_and_vkb_from_device_model_info(gc, info, &vfb, &vkb);
-
+ libxl__vfb_and_vkb_from_hvm_guest_config(gc, guest_config, &vfb, &vkb);
dm_config.vfbs = &vfb;
dm_config.num_vfbs = 1;
dm_config.vkbs = &vkb;
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index b579a14726..74edf9b5e0 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -215,6 +215,13 @@ libxl_domain_build_info = Struct("domain_build_info",[
("timer_mode", integer),
("nested_hvm", bool),
("no_incr_generationid", bool),
+ ("nographic", bool),
+ ("stdvga", bool),
+ ("vnc", libxl_vnc_info),
+ # keyboard layout, default is en-us keyboard
+ ("keymap", string),
+ ("sdl", libxl_sdl_info),
+ ("spice", libxl_spice_info),
])),
("pv", Struct(None, [("kernel", libxl_file_reference),
("slack_memkb", uint32),
@@ -243,15 +250,6 @@ libxl_device_model_info = Struct("device_model_info",[
("device_model", string),
("saved_state", string),
("type", libxl_domain_type),
- # size of the videoram in MB
- ("videoram", integer),
- ("stdvga", bool),
- ("vnc", libxl_vnc_info),
- # keyboard layout, default is en-us keyboard
- ("keymap", string),
- ("sdl", libxl_sdl_info),
- ("spice", libxl_spice_info),
- ("nographic", bool),
("gfx_passthru", bool),
("serial", string),
("boot", string),
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 9e125298e8..9bec8dc577 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -364,29 +364,29 @@ static void printf_info(int domid,
printf("\t\t\t(no_incr_generationid %d)\n",
b_info->u.hvm.no_incr_generationid);
+ printf("\t\t\t(stdvga %d)\n", b_info->u.hvm.stdvga);
+ printf("\t\t\t(vnc %d)\n", b_info->u.hvm.vnc.enable);
+ printf("\t\t\t(vnclisten %s)\n", b_info->u.hvm.vnc.listen);
+ printf("\t\t\t(vncdisplay %d)\n", b_info->u.hvm.vnc.display);
+ printf("\t\t\t(vncunused %d)\n", b_info->u.hvm.vnc.findunused);
+ printf("\t\t\t(keymap %s)\n", b_info->u.hvm.keymap);
+ printf("\t\t\t(sdl %d)\n", b_info->u.hvm.sdl.enable);
+ printf("\t\t\t(opengl %d)\n", b_info->u.hvm.sdl.opengl);
+ printf("\t\t\t(nographic %d)\n", b_info->u.hvm.nographic);
+ printf("\t\t\t(spice %d)\n", b_info->u.hvm.spice.enable);
+ printf("\t\t\t(spiceport %d)\n", b_info->u.hvm.spice.port);
+ printf("\t\t\t(spicetls_port %d)\n", b_info->u.hvm.spice.tls_port);
+ printf("\t\t\t(spicehost %s)\n", b_info->u.hvm.spice.host);
+ printf("\t\t\t(spicedisable_ticketing %d)\n",
+ b_info->u.hvm.spice.disable_ticketing);
+ printf("\t\t\t(spiceagent_mouse %d)\n", b_info->u.hvm.spice.agent_mouse);
+
printf("\t\t\t(device_model %s)\n", dm_info->device_model ? : "default");
- printf("\t\t\t(videoram %d)\n", dm_info->videoram);
- printf("\t\t\t(stdvga %d)\n", dm_info->stdvga);
- printf("\t\t\t(vnc %d)\n", dm_info->vnc.enable);
- printf("\t\t\t(vnclisten %s)\n", dm_info->vnc.listen);
- printf("\t\t\t(vncdisplay %d)\n", dm_info->vnc.display);
- printf("\t\t\t(vncunused %d)\n", dm_info->vnc.findunused);
- printf("\t\t\t(keymap %s)\n", dm_info->keymap);
- printf("\t\t\t(sdl %d)\n", dm_info->sdl.enable);
printf("\t\t\t(gfx_passthru %d)\n", dm_info->gfx_passthru);
- printf("\t\t\t(opengl %d)\n", dm_info->sdl.opengl);
- printf("\t\t\t(nographic %d)\n", dm_info->nographic);
printf("\t\t\t(serial %s)\n", dm_info->serial);
printf("\t\t\t(boot %s)\n", dm_info->boot);
printf("\t\t\t(usb %d)\n", dm_info->usb);
printf("\t\t\t(usbdevice %s)\n", dm_info->usbdevice);
- printf("\t\t\t(spice %d)\n", dm_info->spice.enable);
- printf("\t\t\t(spiceport %d)\n", dm_info->spice.port);
- printf("\t\t\t(spicetls_port %d)\n", dm_info->spice.tls_port);
- printf("\t\t\t(spicehost %s)\n", dm_info->spice.host);
- printf("\t\t\t(spicedisable_ticketing %d)\n",
- dm_info->spice.disable_ticketing);
- printf("\t\t\t(spiceagent_mouse %d)\n", dm_info->spice.agent_mouse);
printf("\t\t)\n");
break;
case LIBXL_DOMAIN_TYPE_PV:
@@ -1259,37 +1259,38 @@ skip_vfb:
if (c_info->type == LIBXL_DOMAIN_TYPE_HVM) {
if (!xlu_cfg_get_long (config, "stdvga", &l, 0))
- dm_info->stdvga = l;
+ b_info->u.hvm.stdvga = l;
if (!xlu_cfg_get_long (config, "vnc", &l, 0))
- dm_info->vnc.enable = l;
- xlu_cfg_replace_string (config, "vnclisten", &dm_info->vnc.listen, 0);
- xlu_cfg_replace_string (config, "vncpasswd", &dm_info->vnc.passwd, 0);
+ b_info->u.hvm.vnc.enable = l;
+ xlu_cfg_replace_string (config, "vnclisten", &b_info->u.hvm.vnc.listen, 0);
+ xlu_cfg_replace_string (config, "vncpasswd", &b_info->u.hvm.vnc.passwd, 0);
if (!xlu_cfg_get_long (config, "vncdisplay", &l, 0))
- dm_info->vnc.display = l;
+ b_info->u.hvm.vnc.display = l;
if (!xlu_cfg_get_long (config, "vncunused", &l, 0))
- dm_info->vnc.findunused = l;
- xlu_cfg_replace_string (config, "keymap", &dm_info->keymap, 0);
+ b_info->u.hvm.vnc.findunused = l;
+ xlu_cfg_replace_string (config, "keymap", &b_info->u.hvm.keymap, 0);
if (!xlu_cfg_get_long (config, "sdl", &l, 0))
- dm_info->sdl.enable = l;
+ b_info->u.hvm.sdl.enable = l;
if (!xlu_cfg_get_long (config, "opengl", &l, 0))
- dm_info->sdl.opengl = l;
+ b_info->u.hvm.sdl.opengl = l;
if (!xlu_cfg_get_long (config, "spice", &l, 0))
- dm_info->spice.enable = l;
+ b_info->u.hvm.spice.enable = l;
if (!xlu_cfg_get_long (config, "spiceport", &l, 0))
- dm_info->spice.port = l;
+ b_info->u.hvm.spice.port = l;
if (!xlu_cfg_get_long (config, "spicetls_port", &l, 0))
- dm_info->spice.tls_port = l;
- xlu_cfg_replace_string (config, "spicehost", &dm_info->spice.host, 0);
+ b_info->u.hvm.spice.tls_port = l;
+ xlu_cfg_replace_string (config, "spicehost",
+ &b_info->u.hvm.spice.host, 0);
if (!xlu_cfg_get_long (config, "spicedisable_ticketing", &l, 0))
- dm_info->spice.disable_ticketing = l;
+ b_info->u.hvm.spice.disable_ticketing = l;
xlu_cfg_replace_string (config, "spicepasswd",
- &dm_info->spice.passwd, 0);
+ &b_info->u.hvm.spice.passwd, 0);
if (!xlu_cfg_get_long (config, "spiceagent_mouse", &l, 0))
- dm_info->spice.agent_mouse = l;
+ b_info->u.hvm.spice.agent_mouse = l;
else
- dm_info->spice.agent_mouse = 1;
+ b_info->u.hvm.spice.agent_mouse = 1;
if (!xlu_cfg_get_long (config, "nographic", &l, 0))
- dm_info->nographic = l;
+ b_info->u.hvm.nographic = l;
if (!xlu_cfg_get_long (config, "gfx_passthru", &l, 0))
dm_info->gfx_passthru = l;
xlu_cfg_replace_string (config, "serial", &dm_info->serial, 0);