diff options
-rw-r--r-- | tools/libxl/libxl.c | 16 | ||||
-rw-r--r-- | tools/libxl/libxl.idl | 8 | ||||
-rw-r--r-- | tools/libxl/libxl_bootloader.c | 2 | ||||
-rw-r--r-- | tools/libxl/libxl_create.c | 27 | ||||
-rw-r--r-- | tools/libxl/libxl_dm.c | 3 | ||||
-rw-r--r-- | tools/libxl/libxl_dom.c | 25 | ||||
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 2 |
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); |