4cdbb395f2
grub2-x86_64-xen dependency not available xen.spec - More cleanup of README.SUSE - Update xen patch with upstream patch so that latest libvirt patch can work. (bnc#896044) + 53fcebab-xen-pass-kernel-initrd-to-qemu.patch - xen-pass-kernel-initrd-to-qemu.patch - bnc#895804 - VUL-0: CVE-2014-6268: xen: XSA-107: Mishandling of uninitialised FIFO-based event channel control blocks xsa107.patch - bnc#895802 - VUL-0: xen: XSA-106: Missing privilege level checks in x86 emulation of software interrupts xsa106.patch - bnc#895799 - VUL-0: xen: XSA-105: Missing privilege level checks in x86 HLT, LGDT, LIDT, and LMSW emulation xsa105.patch - bnc#895798 - VUL-0: xen: XSA-104: Race condition in HVMOP_track_dirty_vram xsa104.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=331
336 lines
12 KiB
Diff
336 lines
12 KiB
Diff
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.1-testing/docs/man/xl.cfg.pod.5
|
|
===================================================================
|
|
--- xen-4.4.1-testing.orig/docs/man/xl.cfg.pod.5
|
|
+++ xen-4.4.1-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
|
|
@@ -625,20 +656,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", ...]>
|
|
|
|
@@ -646,16 +669,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.1-testing/tools/libxl/libxl.h
|
|
===================================================================
|
|
--- xen-4.4.1-testing.orig/tools/libxl/libxl.h
|
|
+++ xen-4.4.1-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.1-testing/tools/libxl/libxl_bootloader.c
|
|
===================================================================
|
|
--- xen-4.4.1-testing.orig/tools/libxl/libxl_bootloader.c
|
|
+++ xen-4.4.1-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.1-testing/tools/libxl/libxl_create.c
|
|
===================================================================
|
|
--- xen-4.4.1-testing.orig/tools/libxl/libxl_create.c
|
|
+++ xen-4.4.1-testing/tools/libxl/libxl_create.c
|
|
@@ -337,6 +337,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.1-testing/tools/libxl/libxl_dm.c
|
|
===================================================================
|
|
--- xen-4.4.1-testing.orig/tools/libxl/libxl_dm.c
|
|
+++ xen-4.4.1-testing/tools/libxl/libxl_dm.c
|
|
@@ -196,6 +196,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);
|
|
}
|
|
@@ -481,6 +487,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.1-testing/tools/libxl/libxl_types.idl
|
|
===================================================================
|
|
--- xen-4.4.1-testing.orig/tools/libxl/libxl_types.idl
|
|
+++ xen-4.4.1-testing/tools/libxl/libxl_types.idl
|
|
@@ -333,6 +333,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.1-testing/tools/libxl/xl_cmdimpl.c
|
|
===================================================================
|
|
--- xen-4.4.1-testing.orig/tools/libxl/xl_cmdimpl.c
|
|
+++ xen-4.4.1-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:
|