aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/libxl/libxl.c16
-rw-r--r--tools/libxl/libxl.idl8
-rw-r--r--tools/libxl/libxl_bootloader.c2
-rw-r--r--tools/libxl/libxl_create.c27
-rw-r--r--tools/libxl/libxl_dm.c3
-rw-r--r--tools/libxl/libxl_dom.c25
-rw-r--r--tools/libxl/xl_cmdimpl.c2
7 files changed, 61 insertions, 22 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 01020306fa..f7bd3b0293 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -2036,17 +2036,27 @@ int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
libxl_device_model_info *dm_info, uint32_t *need_memkb)
{
libxl__gc gc = LIBXL_INIT_GC(ctx);
+ int rc = ERROR_INVAL;
*need_memkb = b_info->target_memkb;
- if (b_info->hvm) {
+ switch (b_info->type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
*need_memkb += b_info->shadow_memkb + LIBXL_HVM_EXTRA_MEMORY;
if (dm_info->device_model_stubdomain)
*need_memkb += 32 * 1024;
- } else
+ break;
+ case LIBXL_DOMAIN_TYPE_PV:
*need_memkb += b_info->shadow_memkb + LIBXL_PV_EXTRA_MEMORY;
+ break;
+ default:
+ goto out;
+ }
if (*need_memkb % (2 * 1024))
*need_memkb += (2 * 1024) - (*need_memkb % (2 * 1024));
+ rc = 0;
+out:
libxl__free_all(&gc);
- return 0;
+ return rc;
+
}
int libxl_get_free_memory(libxl_ctx *ctx, uint32_t *memkb)
diff --git a/tools/libxl/libxl.idl b/tools/libxl/libxl.idl
index f0bc72393b..81f3e69fa6 100644
--- a/tools/libxl/libxl.idl
+++ b/tools/libxl/libxl.idl
@@ -158,9 +158,9 @@ libxl_domain_build_info = Struct("domain_build_info",[
("shadow_memkb", uint32),
("disable_migrate", bool),
("cpuid", libxl_cpuid_policy_list),
- ("hvm", bool),
- ("u", KeyedUnion(None, "hvm",
- [("hvm", "%s", Struct(None,
+ ("type", libxl_domain_type),
+ ("u", KeyedUnion(None, "type",
+ [("hvm", "%s == LIBXL_DOMAIN_TYPE_HVM", Struct(None,
[("firmware", string),
("pae", bool),
("apic", bool),
@@ -173,7 +173,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
("timer_mode", integer),
("nested_hvm", bool),
])),
- ("pv", "!%s", Struct(None,
+ ("pv", "%s == LIBXL_DOMAIN_TYPE_PV", Struct(None,
[("kernel", libxl_file_reference),
("slack_memkb", uint32),
("bootloader", string),
diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c
index 0d0b8d7652..111c22d48a 100644
--- a/tools/libxl/libxl_bootloader.c
+++ b/tools/libxl/libxl_bootloader.c
@@ -323,7 +323,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
struct stat st_buf;
- if (info->hvm || !info->u.pv.bootloader)
+ if (info->type != LIBXL_DOMAIN_TYPE_PV || !info->u.pv.bootloader)
goto out;
rc = ERROR_INVAL;
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index b74b66f6e2..69ffaa510c 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -84,7 +84,7 @@ void libxl_init_build_info(libxl_domain_build_info *b_info, libxl_domain_create_
b_info->shadow_memkb = 0;
if (c_info->hvm) {
b_info->video_memkb = 8 * 1024;
- b_info->hvm = 1;
+ 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;
@@ -96,6 +96,7 @@ void libxl_init_build_info(libxl_domain_build_info *b_info, libxl_domain_create_
b_info->u.hvm.timer_mode = 1;
b_info->u.hvm.nested_hvm = 0;
} else {
+ b_info->type = LIBXL_DOMAIN_TYPE_PV;
b_info->u.pv.slack_memkb = 8 * 1024;
}
}
@@ -160,7 +161,8 @@ int libxl__domain_build(libxl__gc *gc,
gettimeofday(&start_time, NULL);
- if (info->hvm) {
+ switch (info->type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
ret = libxl__build_hvm(gc, domid, info, dm_info, state);
if (ret)
goto out;
@@ -172,7 +174,8 @@ int libxl__domain_build(libxl__gc *gc,
vments[3] = "hvm";
vments[4] = "start_time";
vments[5] = libxl__sprintf(gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
- } else {
+ break;
+ case LIBXL_DOMAIN_TYPE_PV:
ret = libxl__build_pv(gc, domid, info, state);
if (ret)
goto out;
@@ -193,6 +196,10 @@ int libxl__domain_build(libxl__gc *gc,
vments[i++] = "image/cmdline";
vments[i++] = (char*) info->u.pv.cmdline;
}
+ break;
+ default:
+ ret = ERROR_INVAL;
+ goto out;
}
ret = libxl__build_post(gc, domid, info, state, vments, localents);
out:
@@ -219,7 +226,8 @@ static int domain_restore(libxl__gc *gc, libxl_domain_build_info *info,
gettimeofday(&start_time, NULL);
- if (info->hvm) {
+ switch (info->type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
vments = libxl__calloc(gc, 7, sizeof(char *));
vments[0] = "rtc/timeoffset";
vments[1] = (info->u.hvm.timeoffset) ? info->u.hvm.timeoffset : "";
@@ -227,7 +235,8 @@ static int domain_restore(libxl__gc *gc, libxl_domain_build_info *info,
vments[3] = "hvm";
vments[4] = "start_time";
vments[5] = libxl__sprintf(gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
- } else {
+ break;
+ case LIBXL_DOMAIN_TYPE_PV:
vments = libxl__calloc(gc, 11, sizeof(char *));
i = 0;
vments[i++] = "image/ostype";
@@ -244,20 +253,24 @@ static int domain_restore(libxl__gc *gc, libxl_domain_build_info *info,
vments[i++] = "image/cmdline";
vments[i++] = (char*) info->u.pv.cmdline;
}
+ break;
+ default:
+ ret = ERROR_INVAL;
+ goto out;
}
ret = libxl__build_post(gc, domid, info, state, vments, localents);
if (ret)
goto out;
dm_info->saved_state = NULL;
- if (info->hvm) {
+ if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
ret = asprintf(&dm_info->saved_state,
XC_DEVICE_MODEL_RESTORE_FILE".%d", domid);
ret = (ret < 0) ? ERROR_FAIL : 0;
}
out:
- if (!info->hvm) {
+ if (info->type == LIBXL_DOMAIN_TYPE_PV) {
libxl__file_reference_unmap(&info->u.pv.kernel);
libxl__file_reference_unmap(&info->u.pv.ramdisk);
}
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 2f2836871f..0b3ac9e1d3 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -638,12 +638,13 @@ static int libxl__create_stubdom(libxl__gc *gc,
b_info.max_vcpus = 1;
b_info.max_memkb = 32 * 1024;
b_info.target_memkb = b_info.max_memkb;
+
+ b_info.type = LIBXL_DOMAIN_TYPE_PV;
b_info.u.pv.kernel.path = libxl__abs_path(gc, "ioemu-stubdom.gz",
libxl_xenfirmwaredir_path());
b_info.u.pv.cmdline = libxl__sprintf(gc, " -d %d", info->domid);
b_info.u.pv.ramdisk.path = "";
b_info.u.pv.features = "";
- b_info.hvm = 0;
/* fixme: this function can leak the stubdom if it fails */
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index 7d4c729db6..3491736435 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -75,14 +75,14 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid,
libxl_ctx *ctx = libxl__gc_owner(gc);
xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus);
xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT);
- if (!info->hvm)
+ if (info->type == LIBXL_DOMAIN_TYPE_PV)
xc_domain_set_memmap_limit(ctx->xch, domid,
(info->max_memkb + info->u.pv.slack_memkb));
xc_domain_set_tsc_info(ctx->xch, domid, info->tsc_mode, 0, 0, 0);
if ( info->disable_migrate )
xc_domain_disable_migrate(ctx->xch, domid);
- if (info->hvm) {
+ if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
unsigned long shadow;
shadow = (info->shadow_memkb + 1023) / 1024;
xc_shadow_control(ctx->xch, domid, XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, NULL, 0, &shadow, 0, NULL);
@@ -340,10 +340,25 @@ int libxl__domain_restore_common(libxl__gc *gc, uint32_t domid,
libxl_ctx *ctx = libxl__gc_owner(gc);
/* read signature */
int rc;
+ int hvm, pae, superpages;
+ switch (info->type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
+ hvm = 1;
+ superpages = 1;
+ pae = info->u.hvm.pae;
+ break;
+ case LIBXL_DOMAIN_TYPE_PV:
+ hvm = 0;
+ superpages = 0;
+ pae = 1;
+ break;
+ default:
+ return ERROR_INVAL;
+ }
rc = xc_domain_restore(ctx->xch, fd, domid,
- state->store_port, &state->store_mfn,
- state->console_port, &state->console_mfn,
- info->hvm, info->u.hvm.pae, !!info->hvm);
+ state->store_port, &state->store_mfn,
+ state->console_port, &state->console_mfn,
+ hvm, pae, superpages);
if ( rc ) {
LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "restoring domain");
return ERROR_FAIL;
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index ecff457578..52c7f0ce27 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -381,7 +381,7 @@ static void printf_info(int domid,
printf("\t\t\t(spiceagent_mouse %d)\n", dm_info->spiceagent_mouse);
printf("\t\t)\n");
} else {
- printf("\t\t(linux %d)\n", b_info->hvm);
+ 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);