[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC v1 08/74] libxl: Introduce hack to allow PVH mode to add a shim
From: George Dunlap <george.dunlap@xxxxxxxxxx> libxl will look for LIBXL_PVSHIM_PATH and LIBXL_PVSHIM_CMDLINE environment variables. If the first is present, it will boot with the shim and the existing kernel / ramdisk. (That is, the shim as the "kernel" and the kernel and ramdisk both as extra modules.) If not, it will just boot the kernel / ramdisk directly (that is, with the kernel as "kernel" and the ramdisk as a module). Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxx> --- To be replaced with proper toolstack side patches --- tools/libxl/libxl_dom.c | 67 ++++++++++++++++++++++++++++++++++++-------- tools/libxl/libxl_internal.h | 2 ++ 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index fbbdb9ec2f..f04eec7c79 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -1025,22 +1025,51 @@ static int libxl__domain_firmware(libxl__gc *gc, if (state->pv_kernel.path != NULL && info->type == LIBXL_DOMAIN_TYPE_PVH) { - /* Try to load a kernel instead of the firmware. */ - if (state->pv_kernel.mapped) { - rc = xc_dom_kernel_mem(dom, state->pv_kernel.data, - state->pv_kernel.size); + + if (state->shim_path) { + rc = xc_dom_kernel_file(dom, state->shim_path); if (rc) { - LOGE(ERROR, "xc_dom_kernel_mem failed"); + LOGE(ERROR, "xc_dom_kernel_file failed"); goto out; } + + /* We've loaded the shim, so load the kernel as a secondary module */ + if (state->pv_kernel.mapped) { + LOG(WARN, "xc_dom_module_mem, cmdline %s", + state->pv_cmdline); + rc = xc_dom_module_mem(dom, state->pv_kernel.data, + state->pv_kernel.size, state->pv_cmdline); + if (rc) { + LOGE(ERROR, "xc_dom_kernel_mem failed"); + goto out; + } + } else { + LOG(WARN, "xc_dom_module_file, path %s cmdline %s", + state->pv_kernel.path, state->pv_cmdline); + rc = xc_dom_module_file(dom, state->pv_kernel.path, state->pv_cmdline); + if (rc) { + LOGE(ERROR, "xc_dom_kernel_file failed"); + goto out; + } + } } else { - rc = xc_dom_kernel_file(dom, state->pv_kernel.path); - if (rc) { - LOGE(ERROR, "xc_dom_kernel_file failed"); - goto out; + /* No shim, so load the kernel directly */ + if (state->pv_kernel.mapped) { + rc = xc_dom_kernel_mem(dom, state->pv_kernel.data, + state->pv_kernel.size); + if (rc) { + LOGE(ERROR, "xc_dom_kernel_mem failed"); + goto out; + } + } else { + rc = xc_dom_kernel_file(dom, state->pv_kernel.path); + if (rc) { + LOGE(ERROR, "xc_dom_kernel_file failed"); + goto out; + } } } - + if (state->pv_ramdisk.path && strlen(state->pv_ramdisk.path)) { if (state->pv_ramdisk.mapped) { rc = xc_dom_module_mem(dom, state->pv_ramdisk.data, @@ -1154,8 +1183,24 @@ int libxl__build_hvm(libxl__gc *gc, uint32_t domid, xc_dom_loginit(ctx->xch); + /* FIXME */ +#define LIBXL_PVSHIM_PATH "LIBXL_PVSHIM_PATH" +#define LIBXL_PVSHIM_CMDLINE "LIBXL_PVSHIM_CMDLINE" + state->shim_path = getenv(LIBXL_PVSHIM_PATH); + if (state->shim_path) { + state->shim_cmdline = getenv(LIBXL_PVSHIM_CMDLINE); + LOG(WARN, "LIBXL_PVSHIM_PATH detected, using pv shim %s cmd %s", + state->shim_path, state->shim_cmdline); + } + + /* + * If PVH and we have a shim override, use the shim cmdline. + * If PVH and no shim override, use the pv cmdline. + * If not PVH, use info->cmdline. + */ dom = xc_dom_allocate(ctx->xch, info->type == LIBXL_DOMAIN_TYPE_PVH ? - state->pv_cmdline : info->cmdline, NULL); + (state->shim_path ? state->shim_cmdline : state->pv_cmdline) : + info->cmdline, NULL); if (!dom) { LOGE(ERROR, "xc_dom_allocate failed"); rc = ERROR_NOMEM; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index bfa95d8619..ef1b2e2ca1 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1136,6 +1136,8 @@ typedef struct { libxl__file_reference pv_kernel; libxl__file_reference pv_ramdisk; + const char * shim_path; + const char * shim_cmdline; const char * pv_cmdline; xen_vmemrange_t *vmemranges; -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |