diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 293aaa7..bf2c7e8 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -80,7 +80,7 @@ int libxl_ctx_free(struct libxl_ctx *ctx) /******************************************************************************/ int libxl_domain_make(struct libxl_ctx *ctx, libxl_domain_create_info *info, - uint32_t *domid) + uint32_t *domid) { int flags, ret, i, rc; char *uuid_string; @@ -1020,6 +1020,41 @@ retry_transaction: return 0; } +int libxl_stubdom_make(struct libxl_ctx *ctx, libxl_stubdom_create_info *info, + libxl_domain_build_state *state, uint32_t *domid) +{ + int ret, i; + libxl_domain_create_info c_info; + libxl_domain_build_info b_info; + + memset(&c_info, 0x00, sizeof(libxl_domain_create_info)); + c_info.hvm = 0; + c_info.name = libxl_sprintf(ctx, "%s-dm", libxl_domid_to_name(ctx, info->target_domid)); + for (i = 0; i < 16; i++) + c_info.uuid[i] = info->uuid[i]; + + memset(&b_info, 0x00, sizeof(libxl_domain_build_info)); + b_info.max_vcpus = 1; + b_info.max_memkb = info->max_memkb; + b_info.target_memkb = b_info.max_memkb; + b_info.kernel = libxl_abs_path(ctx, "ioemu-stubdom.gz", libxl_xenfirmwaredir_path()); + b_info.u.pv.cmdline = libxl_sprintf(ctx, " -d %d", info->target_domid); + b_info.u.pv.ramdisk = ""; + b_info.u.pv.features = ""; + b_info.hvm = 0; + + ret = libxl_domain_make(ctx, &c_info, domid); + if (ret) + return ret; + ret = libxl_domain_build(ctx, &b_info, *domid, state); + if (ret) + return ret; + + xc_domain_set_target(ctx->xch, *domid, info->target_domid); + xs_set_target(ctx->xsh, *domid, info->target_domid); + return 0; +} + static int libxl_create_stubdom(struct libxl_ctx *ctx, libxl_device_model_info *info, libxl_device_disk *disks, int num_disks, @@ -1030,40 +1065,27 @@ static int libxl_create_stubdom(struct libxl_ctx *ctx, { int i, num_console = 1, ret; libxl_device_console *console; - libxl_domain_create_info c_info; - libxl_domain_build_info b_info; libxl_domain_build_state state; uint32_t domid; char **args; struct xs_permissions perm[2]; xs_transaction_t t; libxl_device_model_starting *dm_starting = 0; + libxl_stubdom_create_info stubinfo; + + /* initialize stubinfo create structure */ + stubinfo.target_domid = info->domid; + stubinfo.max_memkb = 32 * 1024; + for (i = 0; i < 16; i++) + stubinfo.uuid[i] = info->uuid[i]; + ret = libxl_stubdom_make(ctx, &stubinfo, &state, &domid); + if (ret) + return ret; args = libxl_build_device_model_args(ctx, info, vifs, num_vifs); if (!args) return ERROR_FAIL; - memset(&c_info, 0x00, sizeof(libxl_domain_create_info)); - c_info.hvm = 0; - c_info.name = libxl_sprintf(ctx, "%s-dm", libxl_domid_to_name(ctx, info->domid)); - for (i = 0; i < 16; i++) - c_info.uuid[i] = info->uuid[i]; - - memset(&b_info, 0x00, sizeof(libxl_domain_build_info)); - b_info.max_vcpus = 1; - b_info.max_memkb = 32 * 1024; - b_info.target_memkb = b_info.max_memkb; - b_info.kernel = libxl_abs_path(ctx, "ioemu-stubdom.gz", libxl_xenfirmwaredir_path()); - b_info.u.pv.cmdline = libxl_sprintf(ctx, " -d %d", info->domid); - b_info.u.pv.ramdisk = ""; - b_info.u.pv.features = ""; - b_info.hvm = 0; - - ret = libxl_domain_make(ctx, &c_info, &domid); - if (ret) return ret; - ret = libxl_domain_build(ctx, &b_info, domid, &state); - if (ret) return ret; - libxl_write_dmargs(ctx, domid, info->domid, args); libxl_xs_write(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/image/device-model-domid", libxl_xs_get_dompath(ctx, info->domid)), @@ -1071,8 +1093,6 @@ static int libxl_create_stubdom(struct libxl_ctx *ctx, libxl_xs_write(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/target", libxl_xs_get_dompath(ctx, domid)), "%d", info->domid); - xc_domain_set_target(ctx->xch, domid, info->domid); - xs_set_target(ctx->xsh, domid, info->domid); perm[0].id = domid; perm[0].perms = XS_PERM_NONE; diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 85f8196..a0a3a1a 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -121,6 +121,13 @@ typedef struct { } libxl_domain_build_info; typedef struct { + uint8_t uuid[16]; + char *name; + uint32_t max_memkb; + uint32_t target_domid; +} libxl_stubdom_create_info; + +typedef struct { uint32_t store_port; unsigned long store_mfn; uint32_t console_port; @@ -364,6 +371,9 @@ struct libxl_dominfo * libxl_list_domain(struct libxl_ctx*, int *nb_domain); struct libxl_poolinfo * libxl_list_pool(struct libxl_ctx*, int *nb_pool); struct libxl_vminfo * libxl_list_vm(struct libxl_ctx *ctx, int *nb_vm); +int libxl_stubdom_make(struct libxl_ctx *ctx, libxl_stubdom_create_info *info, + libxl_domain_build_state *state, uint32_t *domid); + typedef struct libxl_device_model_starting libxl_device_model_starting; int libxl_create_device_model(struct libxl_ctx *ctx, libxl_device_model_info *info,