Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12:Update
xen
53fcebab-xen-pass-kernel-initrd-to-qemu.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 53fcebab-xen-pass-kernel-initrd-to-qemu.patch of Package xen
Subject: xen: pass kernel initrd to qemu From: Chunyan Liu cyliu@suse.com Mon Jul 7 14:34:33 2014 +0800 Date: Tue Aug 26 21:18:51 2014 +0100: Git: 11dffa2359e8a2629490c14c029c7c7c777b3e47 xen side patch to support xen HVM direct kernel boot: support 'kernel', 'ramdisk', 'cmdline' (and 'root', 'extra' as well which would be deprecated later) in HVM config file, parse config file, pass -kernel, -initrd, -append parameters to qemu. Signed-off-by: Chunyan Liu <cyliu@suse.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Index: xen-4.4.4-testing/docs/man/xl.cfg.pod.5 =================================================================== --- xen-4.4.4-testing.orig/docs/man/xl.cfg.pod.5 +++ xen-4.4.4-testing/docs/man/xl.cfg.pod.5 @@ -296,6 +296,37 @@ Action to take if the domain crashes. D =back +=head3 Direct Kernel Boot + +Direct kernel boot allows booting directly from a kernel and initrd +stored in the host physical machine OS, allowing command line arguments +to be passed directly. PV guest direct kernel boot is supported. HVM +guest direct kernel boot is supported with limitation (it's supported +when using qemu-xen and default BIOS 'seabios'; not supported in case of +stubdom-dm and old rombios.) + +=over 4 + +=item B<kernel="PATHNAME"> + +Load the specified file as the kernel image. + +=item B<ramdisk="PATHNAME"> + +Load the specified file as the ramdisk. + +=item B<root="STRING"> + +Append B<root="STRING"> to the kernel command line (Note: it is guest +specific what meaning this has). + +=item B<extra="STRING"> + +Append B<STRING> to the kernel command line. (Note: it is guest +specific what meaning this has). + +=back + =head3 Other Options =over 4 @@ -627,20 +658,12 @@ The following options apply only to Para =over 4 -=item B<kernel="PATHNAME"> - -Load the specified file as the kernel image. Either B<kernel> or -B<bootloader> must be specified for PV guests. - -=item B<ramdisk="PATHNAME"> - -Load the specified file as the ramdisk. - =item B<bootloader="PROGRAM"> Run C<PROGRAM> to find the kernel image and ramdisk to use. Normally C<PROGRAM> would be C<pygrub>, which is an emulation of -grub/grub2/syslinux. +grub/grub2/syslinux. Either B<kernel> or B<bootloader> must be specified +for PV guests. =item B<bootloader_args=[ "ARG", "ARG", ...]> @@ -648,16 +671,6 @@ Append B<ARG>s to the arguments to the B program. Alternatively if the argument is a simple string then it will be split into words at whitespace (this second option is deprecated). -=item B<root="STRING"> - -Append B<root="STRING"> to the kernel command line (Note: it is guest -specific what meaning this has). - -=item B<extra="STRING"> - -Append B<STRING> to the kernel command line. Note: it is guest -specific what meaning this has). - =item B<e820_host=BOOLEAN> Selects whether to expose the host e820 (memory map) to the guest via Index: xen-4.4.4-testing/tools/libxl/libxl.h =================================================================== --- xen-4.4.4-testing.orig/tools/libxl/libxl.h +++ xen-4.4.4-testing/tools/libxl/libxl.h @@ -445,6 +445,21 @@ #define LIBXL_HAVE_NO_SUSPEND_RESUME 1 #endif +/* + * LIBXL_HAVE_BUILDINFO_KERNEL + * + * If this is defined, then the libxl_domain_build_info structure will + * contain 'kernel', 'ramdisk', 'cmdline' fields. 'kernel' is a string + * to indicate kernel image location, 'ramdisk' is a string to indicate + * ramdisk location, 'cmdline' is a string to indicate the paramters which + * would be appended to kernel image. + * + * Both PV guest and HVM guest can use these fields for direct kernel boot. + * But for compatibility reason, u.pv.kernel, u.pv.ramdisk and u.pv.cmdline + * still exist. + */ +#define LIBXL_HAVE_BUILDINFO_KERNEL 1 + /* Functions annotated with LIBXL_EXTERNAL_CALLERS_ONLY may not be * called from within libxl itself. Callers outside libxl, who * do not #include libxl_internal.h, are fine. */ Index: xen-4.4.4-testing/tools/libxl/libxl_bootloader.c =================================================================== --- xen-4.4.4-testing.orig/tools/libxl/libxl_bootloader.c +++ xen-4.4.4-testing/tools/libxl/libxl_bootloader.c @@ -56,12 +56,12 @@ static void make_bootloader_args(libxl__ ARG(bootloader_path); - if (info->u.pv.kernel) - ARG(libxl__sprintf(gc, "--kernel=%s", info->u.pv.kernel)); - if (info->u.pv.ramdisk) - ARG(libxl__sprintf(gc, "--ramdisk=%s", info->u.pv.ramdisk)); - if (info->u.pv.cmdline && *info->u.pv.cmdline != '\0') - ARG(libxl__sprintf(gc, "--args=%s", info->u.pv.cmdline)); + if (info->kernel) + ARG(libxl__sprintf(gc, "--kernel=%s", info->kernel)); + if (info->ramdisk) + ARG(libxl__sprintf(gc, "--ramdisk=%s", info->ramdisk)); + if (info->cmdline && *info->cmdline != '\0') + ARG(libxl__sprintf(gc, "--args=%s", info->cmdline)); ARG(libxl__sprintf(gc, "--output=%s", bl->outputpath)); ARG("--output-format=simple0"); @@ -325,9 +325,9 @@ void libxl__bootloader_run(libxl__egc *e if (!info->u.pv.bootloader) { LOG(DEBUG, "no bootloader configured, using user supplied kernel"); - bl->kernel->path = bl->info->u.pv.kernel; - bl->ramdisk->path = bl->info->u.pv.ramdisk; - bl->cmdline = bl->info->u.pv.cmdline; + bl->kernel->path = bl->info->kernel; + bl->ramdisk->path = bl->info->ramdisk; + bl->cmdline = bl->info->cmdline; rc = 0; goto out_ok; } Index: xen-4.4.4-testing/tools/libxl/libxl_create.c =================================================================== --- xen-4.4.4-testing.orig/tools/libxl/libxl_create.c +++ xen-4.4.4-testing/tools/libxl/libxl_create.c @@ -345,6 +345,25 @@ int libxl__domain_build_info_setdefault( b_info->shadow_memkb = 0; if (b_info->u.pv.slack_memkb == LIBXL_MEMKB_DEFAULT) b_info->u.pv.slack_memkb = 0; + + /* For compatibility, fill in b_info->kernel|ramdisk|cmdline + * with the value in u.pv, later processing will use + * b_info->kernel|ramdisk|cmdline only. + * User with old APIs that passes u.pv.kernel|ramdisk|cmdline + * is not affected. + */ + if (!b_info->kernel && b_info->u.pv.kernel) { + b_info->kernel = b_info->u.pv.kernel; + b_info->u.pv.kernel = NULL; + } + if (!b_info->ramdisk && b_info->u.pv.ramdisk) { + b_info->ramdisk = b_info->u.pv.ramdisk; + b_info->u.pv.ramdisk = NULL; + } + if (!b_info->cmdline && b_info->u.pv.cmdline) { + b_info->cmdline = b_info->u.pv.cmdline; + b_info->u.pv.cmdline = NULL; + } break; default: LIBXL__LOG(CTX, LIBXL__LOG_ERROR, Index: xen-4.4.4-testing/tools/libxl/libxl_dm.c =================================================================== --- xen-4.4.4-testing.orig/tools/libxl/libxl_dm.c +++ xen-4.4.4-testing/tools/libxl/libxl_dm.c @@ -205,6 +205,12 @@ static char ** libxl__build_device_model int nr_set_cpus = 0; char *s; + if (b_info->kernel) { + LOG(ERROR, "HVM direct kernel boot is not supported by " + "qemu-xen-traditional"); + return NULL; + } + if (b_info->u.hvm.serial) { flexarray_vappend(dm_args, "-serial", b_info->u.hvm.serial, NULL); } @@ -503,6 +509,15 @@ static char ** libxl__build_device_model if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) { int ioemu_nics = 0; + if (b_info->kernel) + flexarray_vappend(dm_args, "-kernel", b_info->kernel, NULL); + + if (b_info->ramdisk) + flexarray_vappend(dm_args, "-initrd", b_info->ramdisk, NULL); + + if (b_info->cmdline) + flexarray_vappend(dm_args, "-append", b_info->cmdline, NULL); + if (b_info->u.hvm.serial) { flexarray_vappend(dm_args, "-serial", b_info->u.hvm.serial, NULL); } Index: xen-4.4.4-testing/tools/libxl/libxl_types.idl =================================================================== --- xen-4.4.4-testing.orig/tools/libxl/libxl_types.idl +++ xen-4.4.4-testing/tools/libxl/libxl_types.idl @@ -334,6 +334,9 @@ libxl_domain_build_info = Struct("domain ("iomem", Array(libxl_iomem_range, "num_iomem")), ("claim_mode", libxl_defbool), ("event_channels", uint32), + ("kernel", string), + ("cmdline", string), + ("ramdisk", string), ("u", KeyedUnion(None, libxl_domain_type, "type", [("hvm", Struct(None, [("firmware", string), ("bios", libxl_bios_type), Index: xen-4.4.4-testing/tools/libxl/xl_cmdimpl.c =================================================================== --- xen-4.4.4-testing.orig/tools/libxl/xl_cmdimpl.c +++ xen-4.4.4-testing/tools/libxl/xl_cmdimpl.c @@ -721,6 +721,29 @@ static void parse_top_level_vnc_options( xlu_cfg_get_defbool(config, "vncunused", &vnc->findunused, 0); } +static char *parse_cmdline(XLU_Config *config) +{ + char *cmdline = NULL; + const char *root = NULL, *extra = ""; + + xlu_cfg_get_string (config, "root", &root, 0); + xlu_cfg_get_string (config, "extra", &extra, 0); + + if (root) { + if (asprintf(&cmdline, "root=%s %s", root, extra) == -1) + cmdline = NULL; + } else { + cmdline = strdup(extra); + } + + if ((root || extra) && !cmdline) { + fprintf(stderr, "Failed to allocate memory for cmdline\n"); + exit(1); + } + + return cmdline; +} + static void parse_config_data(const char *config_source, const char *config_data, int config_len, @@ -998,13 +1021,21 @@ static void parse_config_data(const char if (!xlu_cfg_get_long(config, "max_event_channels", &l, 0)) b_info->event_channels = l; + xlu_cfg_replace_string (config, "kernel", &b_info->kernel, 0); + xlu_cfg_replace_string (config, "ramdisk", &b_info->ramdisk, 0); + b_info->cmdline = parse_cmdline(config); + xlu_cfg_get_defbool(config, "driver_domain", &c_info->driver_domain, 0); switch(b_info->type) { case LIBXL_DOMAIN_TYPE_HVM: - if (!xlu_cfg_get_string (config, "kernel", &buf, 0)) - fprintf(stderr, "WARNING: ignoring \"kernel\" directive for HVM guest. " - "Use \"firmware_override\" instead if you really want a non-default firmware\n"); + if (!strcmp(libxl_basename(b_info->kernel), "hvmloader")) { + fprintf(stderr, "WARNING: you seem to be using \"kernel\" " + "directive to override HVM guest firmware. Ignore " + "that. Use \"firmware_override\" instead if you " + "really want a non-default firmware\n"); + b_info->kernel = NULL; + } xlu_cfg_replace_string (config, "firmware_override", &b_info->u.hvm.firmware, 0); @@ -1056,26 +1087,6 @@ static void parse_config_data(const char break; case LIBXL_DOMAIN_TYPE_PV: { - char *cmdline = NULL; - const char *root = NULL, *extra = ""; - - xlu_cfg_replace_string (config, "kernel", &b_info->u.pv.kernel, 0); - - xlu_cfg_get_string (config, "root", &root, 0); - xlu_cfg_get_string (config, "extra", &extra, 0); - - if (root) { - if (asprintf(&cmdline, "root=%s %s", root, extra) == -1) - cmdline = NULL; - } else { - cmdline = strdup(extra); - } - - if ((root || extra) && !cmdline) { - fprintf(stderr, "Failed to allocate memory for cmdline\n"); - exit(1); - } - xlu_cfg_replace_string (config, "bootloader", &b_info->u.pv.bootloader, 0); switch (xlu_cfg_get_list_as_string_list(config, "bootloader_args", &b_info->u.pv.bootloader_args, 1)) @@ -1098,13 +1109,11 @@ static void parse_config_data(const char exit(-ERROR_FAIL); } - if (!b_info->u.pv.bootloader && !b_info->u.pv.kernel) { + if (!b_info->u.pv.bootloader && !b_info->kernel) { fprintf(stderr, "Neither kernel nor bootloader specified\n"); exit(1); } - b_info->u.pv.cmdline = cmdline; - xlu_cfg_replace_string (config, "ramdisk", &b_info->u.pv.ramdisk, 0); break; } default:
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor