diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index bf2c7e8..811678f 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -949,10 +949,10 @@ void dm_xenstore_record_pid(void *for_spawn, pid_t innerchild) xs_daemon_close(xsh); } -static int libxl_vfb_and_vkb_from_device_model_info(struct libxl_ctx *ctx, - libxl_device_model_info *info, - libxl_device_vfb *vfb, - libxl_device_vkb *vkb) +int libxl_vfb_and_vkb_from_device_model_info(struct libxl_ctx *ctx, + libxl_device_model_info *info, + libxl_device_vfb *vfb, + libxl_device_vkb *vkb) { memset(vfb, 0x00, sizeof(libxl_device_vfb)); memset(vkb, 0x00, sizeof(libxl_device_vkb)); @@ -1055,13 +1055,13 @@ int libxl_stubdom_make(struct libxl_ctx *ctx, libxl_stubdom_create_info *info, return 0; } -static int libxl_create_stubdom(struct libxl_ctx *ctx, - libxl_device_model_info *info, - libxl_device_disk *disks, int num_disks, - libxl_device_nic *vifs, int num_vifs, - libxl_device_vfb *vfb, - libxl_device_vkb *vkb, - libxl_device_model_starting **starting_r) +int libxl_stubdom_create(struct libxl_ctx *ctx, + libxl_device_model_info *info, + libxl_device_disk *disks, int num_disks, + libxl_device_nic *vifs, int num_vifs, + libxl_device_vfb *vfb, + libxl_device_vkb *vkb, + libxl_device_model_starting **starting_r) { int i, num_console = 1, ret; libxl_device_console *console; @@ -1178,14 +1178,6 @@ int libxl_create_device_model(struct libxl_ctx *ctx, char *vm_path; char **pass_stuff; - if (strstr(info->device_model, "stubdom-dm")) { - libxl_device_vfb vfb; - libxl_device_vkb vkb; - - libxl_vfb_and_vkb_from_device_model_info(ctx, info, &vfb, &vkb); - return libxl_create_stubdom(ctx, info, disks, num_disks, vifs, num_vifs, &vfb, &vkb, starting_r); - } - args = libxl_build_device_model_args(ctx, info, vifs, num_vifs); if (!args) return ERROR_FAIL; diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index a0a3a1a..76f9b5c 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -336,6 +336,7 @@ typedef struct { char *token; } libxl_waiter; +typedef struct libxl_device_model_starting libxl_device_model_starting; int libxl_get_wait_fd(struct libxl_ctx *ctx, int *fd); /* waiter is allocated by the caller */ @@ -374,7 +375,19 @@ 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_stubdom_create(struct libxl_ctx *ctx, + libxl_device_model_info *info, + libxl_device_disk *disks, int num_disks, + libxl_device_nic *vifs, int num_vifs, + libxl_device_vfb *vfb, + libxl_device_vkb *vkb, + libxl_device_model_starting **starting_r); + +int libxl_vfb_and_vkb_from_device_model_info(struct libxl_ctx *ctx, + libxl_device_model_info *info, + libxl_device_vfb *vfb, + libxl_device_vkb *vkb); + int libxl_create_device_model(struct libxl_ctx *ctx, libxl_device_model_info *info, libxl_device_disk *disk, int num_disks, diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 208ecd6..a20e77a 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1151,8 +1151,16 @@ start: } if (info1.hvm) { dm_info.domid = domid; - MUST( libxl_create_device_model(&ctx, &dm_info, disks, num_disks, - vifs, num_vifs, &dm_starting) ); + if (strstr(dm_info.device_model, "stubdom-dm")) { + libxl_device_vfb vfb; + libxl_device_vkb vkb; + + libxl_vfb_and_vkb_from_device_model_info(&ctx, &dm_info, &vfb, &vkb); + MUST( libxl_stubdom_create(&ctx, &dm_info, disks, num_disks, vifs, num_vifs, &vfb, &vkb, &dm_starting) ); + } else { + MUST( libxl_create_device_model(&ctx, &dm_info, disks, num_disks, + vifs, num_vifs, &dm_starting) ); + } } else { for (i = 0; i < num_vfbs; i++) { vfbs[i].domid = domid;