From: Chunyan Liu <cyliu@suse.com>
To: xen-devel@lists.xensource.com, qemu-devel@nongnu.org
Cc: Chunyan Liu <cyliu@suse.com>,
Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com,
stefano.stabellini@eu.citrix.com
Subject: [Qemu-devel] [RFC PATCH V3 1/2] xen: pass kernel initrd to qemu
Date: Fri, 20 Jun 2014 14:03:15 +0800 [thread overview]
Message-ID: <1403244196-19630-2-git-send-email-cyliu@suse.com> (raw)
In-Reply-To: <1403244196-19630-1-git-send-email-cyliu@suse.com>
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.
It's working with qemu-xen when using the default BIOS (seabios).
[config example]
kernel="/mnt/vmlinuz-3.0.13-0.27-default"
ramdisk="/mnt/initrd-3.0.13-0.27-default"
cmdline="/dev/hda2 console=tty0 console=ttyS0"
or:
kernel="/mnt/vmlinuz-3.0.13-0.27-default"
ramdisk="/mnt/initrd-3.0.13-0.27-default"
root="/dev/hda2"
extra="console=tty0 console=ttyS0"
Signed-off-by: Chunyan Liu <cyliu@suse.com>
---
docs/man/xl.cfg.pod.5 | 57 +++++++++++++++++++++++++--------------
tools/libxl/libxl.h | 13 +++++++++
tools/libxl/libxl_dm.c | 15 +++++++++++
tools/libxl/libxl_types.idl | 3 +++
tools/libxl/xl_cmdimpl.c | 66 ++++++++++++++++++++++++++++++---------------
5 files changed, 112 insertions(+), 42 deletions(-)
diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5
index a94d037..c460dd4 100644
--- a/docs/man/xl.cfg.pod.5
+++ b/docs/man/xl.cfg.pod.5
@@ -304,6 +304,41 @@ Action to take if the domain crashes. Default is C<destroy>.
=back
+=head3 Direct Kernel Boot
+
+Currently, direct kernel boot can be supported by PV guests, and HVM guests
+with limitations. For HVM guests, in case of stubdom-dm and old rombios,
+direct kernel boot is not supported.
+
+=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<cmdline="STRING">
+
+Append B<cmdline="STRING"> to the kernel command line. (Note: it is
+guest specific what meaning this has). It will replace
+B<root="STRING"> plus B<extra="STRING">. When B<cmdline="STRING"> is
+set, B<root="STRING"> and B<extra="STRING"> will be ignored.
+
+=item B<root="STRING">
+
+Append B<root="STRING"> to the kernel command line (Note: it is guest
+specific what meaning this has). It will be deprecated.
+
+=item B<extra="STRING">
+
+Append B<STRING> to the kernel command line. (Note: it is guest
+specific what meaning this has). It will be deprecated.
+
+=back
+
=head3 Other Options
=over 4
@@ -646,20 +681,12 @@ The following options apply only to Paravirtual guests.
=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", ...]>
@@ -667,16 +694,6 @@ Append B<ARG>s to the arguments to the B<bootloader>
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
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 80947c3..0ef393e 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -482,6 +482,19 @@
*/
#define LIBXL_HAVE_DEVICE_PCI_SEIZE 1
+/*
+ * LIBXL_HAVE_BUILDINFO_HVM_DIRECT_KERNEL_BOOT
+ *
+ * If this is defined, then the libxl_domain_build_info structure will
+ * contain hvm.kernel, hvm.cmdline and hvm.ramdisk. hvm.kernel is a string
+ * to indicate kernel image location, hvm.ramdisk is a string to indicate
+ * ramdisk location, hvm.cmdline is a string to indicate the paramters which
+ * would be appened to kernel image.
+ *
+ * If it is set, guest will be booted from the indicated kernel and ramdisk.
+ */
+#define LIBXL_HAVE_BUILDINFO_HVM_DIRECT_KERNEL_BOOT 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. */
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 51ab2bf..fe53441 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -196,6 +196,12 @@ static char ** libxl__build_device_model_args_old(libxl__gc *gc,
int nr_set_cpus = 0;
char *s;
+ if (b_info->u.hvm.kernel) {
+ LOG(ERROR, "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);
}
@@ -479,6 +485,15 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc,
if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) {
int ioemu_nics = 0;
+ if (b_info->u.hvm.kernel)
+ flexarray_vappend(dm_args, "-kernel", b_info->u.hvm.kernel, NULL);
+
+ if (b_info->u.hvm.ramdisk)
+ flexarray_vappend(dm_args, "-initrd", b_info->u.hvm.ramdisk, NULL);
+
+ if (b_info->u.hvm.cmdline)
+ flexarray_vappend(dm_args, "-append", b_info->u.hvm.cmdline, NULL);
+
if (b_info->u.hvm.serial) {
flexarray_vappend(dm_args, "-serial", b_info->u.hvm.serial, NULL);
}
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 52f1aa9..a96b228 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -336,6 +336,9 @@ libxl_domain_build_info = Struct("domain_build_info",[
("event_channels", uint32),
("u", KeyedUnion(None, libxl_domain_type, "type",
[("hvm", Struct(None, [("firmware", string),
+ ("kernel", string),
+ ("cmdline", string),
+ ("ramdisk", string),
("bios", libxl_bios_type),
("pae", libxl_defbool),
("apic", libxl_defbool),
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 5195914..a31e8c6 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -725,6 +725,37 @@ static void parse_top_level_sdl_options(XLU_Config *config,
xlu_cfg_replace_string (config, "xauthority", &sdl->xauthority, 0);
}
+static char *parse_cmdline(XLU_Config *config)
+{
+ char *cmdline = NULL;
+ const char *root = NULL, *extra = NULL, *buf = NULL;
+
+ xlu_cfg_get_string (config, "cmdline", &buf, 0);
+ xlu_cfg_get_string (config, "root", &root, 0);
+ xlu_cfg_get_string (config, "extra", &extra, 0);
+
+ if (buf) {
+ cmdline = strdup(buf);
+ if (root || extra)
+ fprintf(stderr, "Warning: ignoring deprecated root= and extra= "
+ "in favour of cmdline=\n");
+ } else {
+ if (root) {
+ if (asprintf(&cmdline, "root=%s %s", root, extra) == -1)
+ cmdline = NULL;
+ } else if (extra) {
+ cmdline = strdup(extra);
+ }
+ }
+
+ if ((buf || 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,
@@ -1007,9 +1038,18 @@ static void parse_config_data(const char *config_source,
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 (!xlu_cfg_get_string (config, "kernel", &buf, 0)) {
+ if (!strcmp(libxl_basename(buf), "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");
+ else
+ b_info->u.hvm.kernel = strdup(buf);
+ }
+
+ b_info->u.hvm.cmdline = parse_cmdline(config);
+ xlu_cfg_replace_string (config, "ramdisk", &b_info->u.hvm.ramdisk, 0);
xlu_cfg_replace_string (config, "firmware_override",
&b_info->u.hvm.firmware, 0);
@@ -1061,26 +1101,8 @@ static void parse_config_data(const char *config_source,
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))
@@ -1108,7 +1130,7 @@ static void parse_config_data(const char *config_source,
exit(1);
}
- b_info->u.pv.cmdline = cmdline;
+ b_info->u.pv.cmdline = parse_cmdline(config);
xlu_cfg_replace_string (config, "ramdisk", &b_info->u.pv.ramdisk, 0);
break;
}
--
1.8.4.5
next prev parent reply other threads:[~2014-06-20 6:04 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-01 7:05 [Qemu-devel] [RFC PATCH V4 0/2] Support xen HVM direct kernel boot Chunyan Liu
2014-07-01 7:06 ` [Qemu-devel] [RFC PATCH V4 1/2] xen: pass kernel initrd to qemu Chunyan Liu
2014-07-02 14:47 ` Ian Campbell
2014-06-20 6:03 ` [Qemu-devel] [RFC PATCH V3 0/2] support xen HVM direct kernel boot Chunyan Liu
2014-06-20 6:03 ` Chunyan Liu [this message]
2014-06-23 14:22 ` [Qemu-devel] [RFC PATCH V3 1/2] xen: pass kernel initrd to qemu Ian Jackson
2014-06-24 3:24 ` [Qemu-devel] [Xen-devel] " Chun Yan Liu
2014-07-02 14:40 ` [Qemu-devel] " Ian Campbell
2014-07-02 15:17 ` [Qemu-devel] [RFC PATCH V3 1/2] xen: pass kernel initrd to qemu [and 1 more messages] Ian Jackson
2014-07-03 5:56 ` [Qemu-devel] [Xen-devel] " Chun Yan Liu
2014-07-03 9:08 ` Ian Campbell
2014-06-20 6:03 ` [Qemu-devel] [RFC PATCH V3 2/2] qemu: support xen hvm direct kernel boot Chunyan Liu
2014-06-20 12:08 ` Stefano Stabellini
2014-06-23 3:36 ` [Qemu-devel] [Xen-devel] " Chun Yan Liu
2014-06-23 10:14 ` Stefano Stabellini
2014-06-24 2:27 ` Chun Yan Liu
2014-07-02 15:16 ` [Qemu-devel] [RFC PATCH V4 1/2] xen: pass kernel initrd to qemu Ian Campbell
2014-07-03 2:34 ` [Qemu-devel] [Xen-devel] " Chun Yan Liu
2014-07-03 8:57 ` Ian Campbell
2014-07-01 7:06 ` [Qemu-devel] [RFC PATCH V4 2/2] qemu: support xen hvm direct kernel boot Chunyan Liu
2014-07-02 14:18 ` Stefano Stabellini
2014-07-02 15:15 ` Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1403244196-19630-2-git-send-email-cyliu@suse.com \
--to=cyliu@suse.com \
--cc=Ian.Campbell@citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=qemu-devel@nongnu.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).