aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2011-07-18 14:52:30 +0100
committerIan Campbell <ian.campbell@citrix.com>2011-07-18 14:52:30 +0100
commitc9a87ccb1f1cdc39609e2a055a68a1f2cadc4ab5 (patch)
tree580da8a8c70120fd0de8267381fc5e43941a8f4e /tools
parentbd3454b6512fc337ed30a2213202affc3858874d (diff)
downloadxen-c9a87ccb1f1cdc39609e2a055a68a1f2cadc4ab5.tar.gz
xen-c9a87ccb1f1cdc39609e2a055a68a1f2cadc4ab5.tar.bz2
xen-c9a87ccb1f1cdc39609e2a055a68a1f2cadc4ab5.zip
libxl: specify HVM vs PV in create_info using libxl_domain_type enum
Since libxl_init_build_info now needs an error return and a ctx (to log to) switch all libxl_init_*_info to have an int return and a ctx. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Ian Jackson <ian.jackson.citrix.com> Committed-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/libxl/libxl.h11
-rw-r--r--tools/libxl/libxl.idl2
-rw-r--r--tools/libxl/libxl_create.c64
-rw-r--r--tools/libxl/libxl_dm.c2
-rw-r--r--tools/libxl/libxl_pci.c2
-rw-r--r--tools/libxl/xl_cmdimpl.c63
6 files changed, 99 insertions, 45 deletions
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 562937d0a2..bbd8ae935d 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -250,9 +250,14 @@ int libxl_ctx_free(libxl_ctx *ctx /* 0 is OK */);
int libxl_ctx_postfork(libxl_ctx *ctx);
/* domain related functions */
-void libxl_init_create_info(libxl_domain_create_info *c_info);
-void libxl_init_build_info(libxl_domain_build_info *b_info, libxl_domain_create_info *c_info);
-void libxl_init_dm_info(libxl_device_model_info *dm_info, libxl_domain_create_info *c_info, libxl_domain_build_info *b_info);
+int libxl_init_create_info(libxl_ctx *ctx, libxl_domain_create_info *c_info);
+int libxl_init_build_info(libxl_ctx *ctx,
+ libxl_domain_build_info *b_info,
+ libxl_domain_create_info *c_info);
+int libxl_init_dm_info(libxl_ctx *ctx,
+ libxl_device_model_info *dm_info,
+ libxl_domain_create_info *c_info,
+ libxl_domain_build_info *b_info);
typedef int (*libxl_console_ready)(libxl_ctx *ctx, uint32_t domid, void *priv);
int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config, libxl_console_ready cb, void *priv, uint32_t *domid);
int libxl_domain_create_restore(libxl_ctx *ctx, libxl_domain_config *d_config, libxl_console_ready cb, void *priv, uint32_t *domid, int restore_fd);
diff --git a/tools/libxl/libxl.idl b/tools/libxl/libxl.idl
index 81f3e69fa6..7f99f556f4 100644
--- a/tools/libxl/libxl.idl
+++ b/tools/libxl/libxl.idl
@@ -136,7 +136,7 @@ libxl_version_info = Struct("version_info", [
])
libxl_domain_create_info = Struct("domain_create_info",[
- ("hvm", bool),
+ ("type", libxl_domain_type),
("hap", bool),
("oos", bool),
("ssidref", uint32),
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 69ffaa510c..d8238766bc 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -60,19 +60,22 @@ void libxl_domain_config_destroy(libxl_domain_config *d_config)
libxl_device_model_info_destroy(&d_config->dm_info);
}
-void libxl_init_create_info(libxl_domain_create_info *c_info)
+int libxl_init_create_info(libxl_ctx *ctx, libxl_domain_create_info *c_info)
{
memset(c_info, '\0', sizeof(*c_info));
c_info->xsdata = NULL;
c_info->platformdata = NULL;
c_info->hap = 1;
- c_info->hvm = 1;
+ c_info->type = LIBXL_DOMAIN_TYPE_HVM;
c_info->oos = 1;
c_info->ssidref = 0;
c_info->poolid = 0;
+ return 0;
}
-void libxl_init_build_info(libxl_domain_build_info *b_info, libxl_domain_create_info *c_info)
+int libxl_init_build_info(libxl_ctx *ctx,
+ libxl_domain_build_info *b_info,
+ libxl_domain_create_info *c_info)
{
memset(b_info, '\0', sizeof(*b_info));
b_info->max_vcpus = 1;
@@ -82,9 +85,10 @@ void libxl_init_build_info(libxl_domain_build_info *b_info, libxl_domain_create_
b_info->disable_migrate = 0;
b_info->cpuid = NULL;
b_info->shadow_memkb = 0;
- if (c_info->hvm) {
+ b_info->type = c_info->type;
+ switch (b_info->type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
b_info->video_memkb = 8 * 1024;
- b_info->type = LIBXL_DOMAIN_TYPE_HVM;
b_info->u.hvm.firmware = NULL;
b_info->u.hvm.pae = 1;
b_info->u.hvm.apic = 1;
@@ -95,14 +99,23 @@ void libxl_init_build_info(libxl_domain_build_info *b_info, libxl_domain_create_
b_info->u.hvm.vpt_align = 1;
b_info->u.hvm.timer_mode = 1;
b_info->u.hvm.nested_hvm = 0;
- } else {
- b_info->type = LIBXL_DOMAIN_TYPE_PV;
+ break;
+ case LIBXL_DOMAIN_TYPE_PV:
b_info->u.pv.slack_memkb = 8 * 1024;
+ break;
+ default:
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+ "invalid domain type %s in create info",
+ libxl_domain_type_to_string(b_info->type));
+ return ERROR_INVAL;
}
+ return 0;
}
-void libxl_init_dm_info(libxl_device_model_info *dm_info,
- libxl_domain_create_info *c_info, libxl_domain_build_info *b_info)
+int libxl_init_dm_info(libxl_ctx *ctx,
+ libxl_device_model_info *dm_info,
+ libxl_domain_create_info *c_info,
+ libxl_domain_build_info *b_info)
{
memset(dm_info, '\0', sizeof(*dm_info));
@@ -132,6 +145,7 @@ void libxl_init_dm_info(libxl_device_model_info *dm_info,
dm_info->usb = 0;
dm_info->usbdevice = NULL;
dm_info->xen_platform_pci = 1;
+ return 0;
}
static int init_console_info(libxl_device_console *console, int dev_num)
@@ -316,9 +330,12 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info,
goto out;
}
- flags = info->hvm ? XEN_DOMCTL_CDF_hvm_guest : 0;
- flags |= info->hap ? XEN_DOMCTL_CDF_hap : 0;
- flags |= info->oos ? 0 : XEN_DOMCTL_CDF_oos_off;
+ flags = 0;
+ if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
+ flags |= XEN_DOMCTL_CDF_hvm_guest;
+ flags |= info->hap ? XEN_DOMCTL_CDF_hap : 0;
+ flags |= info->oos ? 0 : XEN_DOMCTL_CDF_oos_off;
+ }
*domid = -1;
/* Ultimately, handle is an array of 16 uint8_t, same as uuid */
@@ -432,7 +449,7 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
goto error_out;
}
- if ( !d_config->c_info.hvm && cb ) {
+ if ( d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV && cb ) {
if ( (*cb)(ctx, domid, priv) )
goto error_out;
}
@@ -486,7 +503,9 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
goto error_out;
}
}
- if (d_config->c_info.hvm) {
+ switch (d_config->c_info.type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
+ {
libxl_device_console console;
ret = init_console_info(&console, 0);
@@ -505,7 +524,10 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
"failed to create device model: %d", ret);
goto error_out;
}
- } else {
+ break;
+ }
+ case LIBXL_DOMAIN_TYPE_PV:
+ {
int need_qemu = 0;
libxl_device_console console;
@@ -530,6 +552,11 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
if (need_qemu)
libxl__create_xenpv_qemu(gc, domid, d_config->vfbs, &dm_starting);
+ break;
+ }
+ default:
+ ret = ERROR_INVAL;
+ goto error_out;
}
if (dm_starting) {
@@ -552,7 +579,8 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
goto error_out;
}
- if (!d_config->c_info.hvm && d_config->b_info.u.pv.e820_host) {
+ if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV &&
+ d_config->b_info.u.pv.e820_host) {
int rc;
rc = libxl__e820_alloc(ctx, domid, d_config);
if (rc)
@@ -560,7 +588,9 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
"Failed while collecting E820 with: %d (errno:%d)\n",
rc, errno);
}
- if ( cb && (d_config->c_info.hvm || d_config->b_info.u.pv.bootloader )) {
+ if ( cb && (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM ||
+ (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV &&
+ d_config->b_info.u.pv.bootloader ))) {
if ( (*cb)(ctx, domid, priv) )
goto error_out;
}
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 0b3ac9e1d3..94b4533639 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -629,7 +629,7 @@ static int libxl__create_stubdom(libxl__gc *gc,
}
memset(&c_info, 0x00, sizeof(libxl_domain_create_info));
- c_info.hvm = 0;
+ c_info.type = LIBXL_DOMAIN_TYPE_PV;
c_info.name = libxl__sprintf(gc, "%s-dm", libxl__domid_to_name(gc, info->domid));
libxl_uuid_copy(&c_info.uuid, &info->uuid);
diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 85ed79d719..7cd5850a31 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -1275,7 +1275,7 @@ int libxl__e820_alloc(libxl_ctx *ctx, uint32_t domid, libxl_domain_config *d_con
struct e820entry map[E820MAX];
libxl_domain_build_info *b_info;
- if (d_config == NULL || d_config->c_info.hvm)
+ if (d_config == NULL || d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM)
return ERROR_INVAL;
b_info = &d_config->b_info;
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 52c7f0ce27..c26bdfebeb 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -300,7 +300,7 @@ static void printf_info(int domid,
printf("(domain\n\t(domid %d)\n", domid);
printf("\t(create_info)\n");
- printf("\t(hvm %d)\n", c_info->hvm);
+ printf("\t(hvm %d)\n", c_info->type == LIBXL_DOMAIN_TYPE_HVM);
printf("\t(hap %d)\n", c_info->hap);
printf("\t(oos %d)\n", c_info->oos);
printf("\t(ssidref %d)\n", c_info->ssidref);
@@ -333,14 +333,15 @@ static void printf_info(int domid,
printf("\t(target_memkb %d)\n", b_info->target_memkb);
printf("\t(nomigrate %d)\n", b_info->disable_migrate);
- if (!c_info->hvm && b_info->u.pv.bootloader) {
+ if (c_info->type == LIBXL_DOMAIN_TYPE_PV && b_info->u.pv.bootloader) {
printf("\t(bootloader %s)\n", b_info->u.pv.bootloader);
if (b_info->u.pv.bootloader_args)
printf("\t(bootloader_args %s)\n", b_info->u.pv.bootloader_args);
}
printf("\t(image\n");
- if (c_info->hvm) {
+ switch (c_info->type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
printf("\t\t(hvm\n");
printf("\t\t\t(firmware %s)\n", b_info->u.hvm.firmware);
printf("\t\t\t(video_memkb %d)\n", b_info->video_memkb);
@@ -380,13 +381,18 @@ static void printf_info(int domid,
dm_info->spicedisable_ticketing);
printf("\t\t\t(spiceagent_mouse %d)\n", dm_info->spiceagent_mouse);
printf("\t\t)\n");
- } else {
+ break;
+ case LIBXL_DOMAIN_TYPE_PV:
printf("\t\t(linux %d)\n", 0);
printf("\t\t\t(kernel %s)\n", b_info->u.pv.kernel.path);
printf("\t\t\t(cmdline %s)\n", b_info->u.pv.cmdline);
printf("\t\t\t(ramdisk %s)\n", b_info->u.pv.ramdisk.path);
printf("\t\t\t(e820_host %d)\n", b_info->u.pv.e820_host);
printf("\t\t)\n");
+ break;
+ default:
+ fprintf(stderr, "Unknown domain type %d\n", c_info->type);
+ exit(1);
}
printf("\t)\n");
@@ -453,7 +459,7 @@ static void printf_info(int domid,
printf("\t\t)\n");
printf("\t)\n");
}
- printf(")\n");
+ printf(")\n");
}
static int parse_action_on_shutdown(const char *buf, libxl_action_on_shutdown *a)
@@ -538,7 +544,8 @@ static void parse_config_data(const char *configfile_filename_report,
exit(1);
}
- libxl_init_create_info(c_info);
+ if (libxl_init_create_info(ctx, c_info))
+ exit(1);
if (!xlu_cfg_get_string (config, "seclabel", &buf)) {
e = libxl_flask_context_to_sid(ctx, (char *)buf, strlen(buf),
@@ -553,10 +560,10 @@ static void parse_config_data(const char *configfile_filename_report,
}
}
- c_info->hvm = 0;
+ c_info->type = LIBXL_DOMAIN_TYPE_PV;
if (!xlu_cfg_get_string (config, "builder", &buf) &&
!strncmp(buf, "hvm", strlen(buf)))
- c_info->hvm = 1;
+ c_info->type = LIBXL_DOMAIN_TYPE_HVM;
if (!xlu_cfg_get_long (config, "hap", &l))
c_info->hap = l;
@@ -586,7 +593,8 @@ static void parse_config_data(const char *configfile_filename_report,
exit(1);
}
- libxl_init_build_info(b_info, c_info);
+ if (libxl_init_build_info(ctx, b_info, c_info))
+ exit(1);
/* the following is the actual config parsing with overriding values in the structures */
if (!xlu_cfg_get_long (config, "vcpus", &l)) {
@@ -654,7 +662,8 @@ static void parse_config_data(const char *configfile_filename_report,
if (!xlu_cfg_get_long (config, "gfx_passthru", &l))
dm_info->gfx_passthru = l;
- if (c_info->hvm == 1) {
+ switch(c_info->type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
if (!xlu_cfg_get_string (config, "kernel", &buf))
fprintf(stderr, "WARNING: ignoring \"kernel\" directive for HVM guest. "
"Use \"firmware_override\" instead if you really want a non-default firmware\n");
@@ -679,7 +688,9 @@ static void parse_config_data(const char *configfile_filename_report,
b_info->u.hvm.timer_mode = l;
if (!xlu_cfg_get_long (config, "nestedhvm", &l))
b_info->u.hvm.nested_hvm = l;
- } else {
+ break;
+ case LIBXL_DOMAIN_TYPE_PV:
+ {
char *cmdline = NULL;
const char *root = NULL, *extra = "";
@@ -712,6 +723,10 @@ static void parse_config_data(const char *configfile_filename_report,
b_info->u.pv.cmdline = cmdline;
xlu_cfg_replace_string (config, "ramdisk", &b_info->u.pv.ramdisk.path);
+ break;
+ }
+ default:
+ abort();
}
if (!xlu_cfg_get_list (config, "disk", &vbds, 0, 0)) {
@@ -888,11 +903,16 @@ skip_vfb:
/* To be reworked (automatically enabled) once the auto ballooning
* after guest starts is done (with PCI devices passed in). */
if (!xlu_cfg_get_long (config, "e820_host", &l)) {
- if (c_info->hvm)
- fprintf(stderr, "Can't do e820_host in HVM mode!");
- else {
- if (l)
- b_info->u.pv.e820_host = true;
+ switch (c_info->type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
+ fprintf(stderr, "Can't do e820_host in HVM mode!");
+ break;
+ case LIBXL_DOMAIN_TYPE_PV:
+ if (l)
+ b_info->u.pv.e820_host = true;
+ break;
+ default:
+ abort();
}
}
if (!xlu_cfg_get_list (config, "pci", &pcis, 0, 0)) {
@@ -911,7 +931,7 @@ skip_vfb:
if (!libxl_device_pci_parse_bdf(ctx, pcidev, buf))
d_config->num_pcidevs++;
}
- if (d_config->num_pcidevs && !c_info->hvm)
+ if (d_config->num_pcidevs && c_info->type == LIBXL_DOMAIN_TYPE_PV)
b_info->u.pv.e820_host = true;
}
@@ -994,12 +1014,13 @@ skip_vfb:
break;
}
- if (c_info->hvm == 1) {
+ if (c_info->type == LIBXL_DOMAIN_TYPE_HVM) {
XLU_ConfigList *dmargs;
int nr_dmargs = 0;
/* init dm from c and b */
- libxl_init_dm_info(dm_info, c_info, b_info);
+ if (libxl_init_dm_info(ctx, dm_info, c_info, b_info))
+ exit(1);
/* then process config related to dm */
if (!xlu_cfg_get_string (config, "device_model", &buf)) {
@@ -1082,9 +1103,7 @@ skip_vfb:
}
}
- dm_info->type = c_info->hvm ?
- LIBXL_DOMAIN_TYPE_HVM :
- LIBXL_DOMAIN_TYPE_PV;
+ dm_info->type = c_info->type;
xlu_cfg_destroy(config);
}