From: Wei Liu <wei.liu2@citrix.com>
To: Xen-devel <xen-devel@lists.xenproject.org>
Cc: wei.liu2@citrix.com
Subject: [PATCH v2 59/62] libxl: pvshim: Provide first-class config settings to enable shim mode
Date: Fri, 12 Jan 2018 11:29:07 +0000 [thread overview]
Message-ID: <20180112112910.16762-60-wei.liu2@citrix.com> (raw)
In-Reply-To: <20180112112910.16762-1-wei.liu2@citrix.com>
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
This is API-compatible because old callers are supposed to call
libxl_*_init to initialise the struct; and the updated function clears
these members.
It is ABI-compatible because the new fields make this member of the
guest type union larger but only within the existing size of that
union.
Unfortunately it is not easy to backport because it depends on the PVH
domain type. Attempts to avoid use of the PVH domain type involved
working with two views of the configuration: the "underlying" domain
type and the "visible" type (and corresponding config info). Also
there are different sets of config settings for PV and PVH, which
callers would have to know to set.
And, unfortunately, it will not be possible, with this approach, to
enable the shim by default for all libxl callers. (Although it could
perhaps be done in xl.)
For now, our config defaults are:
* if enabled, path is "xen-shim" in the xen firmware directory
* if enabled, cmdline is the one we are currently debugging with
The debugging arguments will be rationalised in a moment.
Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Signed-off-by: George Dunlap <george.dunlap@citrix.com>
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
---
v2: pvshim, not pvhshim
works with type "pvh", not type "pv"
---
tools/libxl/libxl.h | 8 +++++++
tools/libxl/libxl_create.c | 19 +++++++++++----
tools/libxl/libxl_dom.c | 57 +++++++++++++++++++++++++++++++++++---------
tools/libxl/libxl_internal.h | 4 ++++
tools/libxl/libxl_types.idl | 5 +++-
5 files changed, 77 insertions(+), 16 deletions(-)
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 5e9aed739d..9632fd6d2f 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -1101,6 +1101,14 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, const libxl_mac *src);
*/
#define LIBXL_HAVE_SET_PARAMETERS 1
+/*
+ * LIBXL_HAVE_PV_SHIM
+ *
+ * If this is defined, libxl_domain_build_info's pvh type information
+ * contains members pvshim, pvshim_path, pvshim_cmdline.
+ */
+#define LIBXL_HAVE_PV_SHIM 1
+
typedef char **libxl_string_list;
void libxl_string_list_dispose(libxl_string_list *sl);
int libxl_string_list_length(const libxl_string_list *sl);
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index f15fb215c2..63cdc33991 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -389,6 +389,18 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
}
break;
case LIBXL_DOMAIN_TYPE_PVH:
+ libxl_defbool_setdefault(&b_info->u.pvh.pvshim, false);
+ if (libxl_defbool_val(b_info->u.pvh.pvshim)) {
+ if (!b_info->u.pvh.pvshim_path)
+ b_info->u.pvh.pvshim_path =
+ libxl__sprintf(NOGC, "%s/%s",
+ libxl__xenfirmwaredir_path(),
+ PVSHIM_BASENAME);
+ if (!b_info->u.pvh.pvshim_cmdline)
+ b_info->u.pvh.pvshim_cmdline =
+ libxl__strdup(NOGC, PVSHIM_CMDLINE);
+ }
+
break;
default:
LOG(ERROR, "invalid domain type %s in create info",
@@ -476,10 +488,6 @@ int libxl__domain_build(libxl__gc *gc,
break;
case LIBXL_DOMAIN_TYPE_PV:
- ret = libxl__build_pv(gc, domid, info, state);
- if (ret)
- goto out;
-
vments = libxl__calloc(gc, 11, sizeof(char *));
i = 0;
vments[i++] = "image/ostype";
@@ -499,6 +507,9 @@ int libxl__domain_build(libxl__gc *gc,
break;
case LIBXL_DOMAIN_TYPE_PVH:
+ state->shim_path = info->u.pvh.pvshim_path;
+ state->shim_cmdline = info->u.pvh.pvshim_cmdline;
+
ret = libxl__build_hvm(gc, domid, d_config, state);
if (ret)
goto out;
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index fbbdb9ec2f..b03386409f 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,14 @@ int libxl__build_hvm(libxl__gc *gc, uint32_t domid,
xc_dom_loginit(ctx->xch);
+ /*
+ * 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..2454efa621 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -118,6 +118,8 @@
#define TAP_DEVICE_SUFFIX "-emu"
#define DOMID_XS_PATH "domid"
#define INVALID_DOMID ~0
+#define PVSHIM_BASENAME "xen-shim"
+#define PVSHIM_CMDLINE "pv-shim console=xen,pv sched=null loglvl=all guest_loglvl=all apic_verbosity=debug e820-verbose"
/* Size macros. */
#define __AC(X,Y) (X##Y)
@@ -1136,6 +1138,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;
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index a239324341..6d060edc0d 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -592,7 +592,10 @@ libxl_domain_build_info = Struct("domain_build_info",[
# Use host's E820 for PCI passthrough.
("e820_host", libxl_defbool),
])),
- ("pvh", None),
+ ("pvh", Struct(None, [("pvshim", libxl_defbool),
+ ("pvshim_path", string),
+ ("pvshim_cmdline", string),
+ ])),
("invalid", None),
], keyvar_init_val = "LIBXL_DOMAIN_TYPE_INVALID")),
--
2.11.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-01-12 12:03 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-12 11:28 [PATCH v2 00/62] Comet: Run PV in PVH container Wei Liu
2018-01-12 11:28 ` [PATCH v2 01/62] x86/svm: Offer CPUID Faulting to AMD HVM guests as well Wei Liu
2018-01-12 11:28 ` [PATCH v2 02/62] xen/x86: report domain id on cpuid Wei Liu
2018-01-12 11:28 ` [PATCH v2 03/62] tools/libxc: remove extraneous newline in xc_dom_load_acpi Wei Liu
2018-01-12 11:28 ` [PATCH v2 04/62] tools/libelf: fix elf notes check for PVH guest Wei Liu
2018-01-12 11:28 ` [PATCH v2 05/62] tools/libxc: Multi modules support Wei Liu
2018-01-12 11:28 ` [PATCH v2 06/62] xen/common: Widen the guest logging buffer slightly Wei Liu
2018-01-12 11:28 ` [PATCH v2 07/62] x86/time: Print a more helpful error when a platform timer can't be found Wei Liu
2018-01-12 11:28 ` [PATCH v2 08/62] x86/link: Introduce and use SECTION_ALIGN Wei Liu
2018-01-12 11:28 ` [PATCH v2 09/62] ACPICA: Make ACPI Power Management Timer (PM Timer) optional Wei Liu
2018-01-12 11:28 ` [PATCH v2 10/62] xen/domctl: Return arch_config via getdomaininfo Wei Liu
2018-01-12 11:28 ` [PATCH v2 11/62] tools/ocaml: Expose arch_config in domaininfo Wei Liu
2018-01-12 11:28 ` [PATCH v2 12/62] tools/ocaml: Extend domain_create() to take arch_domainconfig Wei Liu
2018-01-12 11:28 ` [PATCH v2 13/62] x86/fixmap: Modify fix_to_virt() to return a void pointer Wei Liu
2018-01-12 11:28 ` [PATCH v2 14/62] x86: Common cpuid faulting support Wei Liu
2018-01-12 11:28 ` [PATCH v2 15/62] x86/Kconfig: Options for Xen and PVH support Wei Liu
2018-01-12 11:28 ` [PATCH v2 16/62] x86/link: Relocate program headers Wei Liu
2018-01-12 11:28 ` [PATCH v2 17/62] x86: introduce ELFNOTE macro Wei Liu
2018-01-12 11:28 ` [PATCH v2 18/62] x86: produce a binary that can be booted as PVH Wei Liu
2018-01-12 11:28 ` [PATCH v2 19/62] x86/entry: Early PVH boot code Wei Liu
2018-01-12 11:28 ` [PATCH v2 20/62] x86/boot: Map more than the first 16MB Wei Liu
2018-01-12 11:28 ` [PATCH v2 21/62] x86/entry: Probe for Xen early during boot Wei Liu
2018-01-12 11:28 ` [PATCH v2 22/62] x86/guest: Hypercall support Wei Liu
2018-01-12 11:28 ` [PATCH v2 23/62] x86/shutdown: Support for using SCHEDOP_{shutdown, reboot} Wei Liu
2018-01-12 11:28 ` [PATCH v2 24/62] x86/pvh: Retrieve memory map from Xen Wei Liu
2018-01-12 11:28 ` [PATCH v2 25/62] xen/console: Introduce console=xen Wei Liu
2018-01-12 11:28 ` [PATCH v2 26/62] xen: introduce rangeset_claim_range Wei Liu
2018-01-12 11:28 ` [PATCH v2 27/62] xen/pvshim: keep track of used PFN ranges Wei Liu
2018-01-12 11:28 ` [PATCH v2 28/62] x86/guest: map shared_info page Wei Liu
2018-01-12 11:28 ` [PATCH v2 29/62] xen/guest: fetch vCPU ID from Xen Wei Liu
2018-01-12 11:28 ` [PATCH v2 30/62] x86/guest: map per-cpu vcpu_info area Wei Liu
2018-01-12 11:28 ` [PATCH v2 31/62] x86: xen pv clock time source Wei Liu
2018-01-12 20:45 ` Joao Martins
2018-01-16 12:22 ` Wei Liu
2018-01-12 11:28 ` [PATCH v2 32/62] x86: APIC timer calibration when running as a guest Wei Liu
2018-01-12 11:28 ` [PATCH v2 33/62] x86: read wallclock from Xen when running in pvh mode Wei Liu
2018-01-12 11:28 ` [PATCH v2 34/62] x86: don't swallow the first command line item in guest mode Wei Liu
2018-01-12 11:28 ` [PATCH v2 35/62] x86/guest: setup event channel upcall vector Wei Liu
2018-01-12 11:28 ` [PATCH v2 36/62] x86/guest: add PV console code Wei Liu
2018-01-12 11:28 ` [PATCH v2 37/62] x86/guest: use PV console for Xen/Dom0 I/O Wei Liu
2018-01-12 11:28 ` [PATCH v2 38/62] x86/shim: Kconfig and command line options Wei Liu
2018-01-12 11:28 ` [PATCH v2 39/62] tools/firmware: Build and install xen-shim Wei Liu
2018-01-12 11:28 ` [PATCH v2 40/62] xen/x86: make VGA support selectable Wei Liu
2018-01-12 11:28 ` [PATCH v2 41/62] xen/pvh: do not mark the low 1MB as IO mem Wei Liu
2018-01-12 11:28 ` [PATCH v2 42/62] sched/null: skip vCPUs on the waitqueue that are blocked Wei Liu
2018-01-12 11:28 ` [PATCH v2 43/62] xen/pvshim: skip Dom0-only domain builder parts Wei Liu
2018-01-12 11:28 ` [PATCH v2 44/62] xen: mark xenstore/console pages as RAM Wei Liu
2018-01-12 11:28 ` [PATCH v2 45/62] xen/pvshim: modify Dom0 builder in order to build a DomU Wei Liu
2018-01-12 11:28 ` [PATCH v2 46/62] xen/pvshim: set correct domid value Wei Liu
2018-01-12 11:28 ` [PATCH v2 47/62] xen/pvshim: forward evtchn ops between L0 Xen and L2 DomU Wei Liu
2018-01-12 11:28 ` [PATCH v2 48/62] xen/pvshim: add grant table operations Wei Liu
2018-01-12 11:28 ` [PATCH v2 49/62] x86/pv-shim: shadow PV console's page for L2 DomU Wei Liu
2018-01-12 11:28 ` [PATCH v2 50/62] xen/pvshim: add migration support Wei Liu
2018-01-12 11:28 ` [PATCH v2 51/62] xen/pvshim: add shim_mem cmdline parameter Wei Liu
2018-01-12 11:29 ` [PATCH v2 52/62] xen/pvshim: set max_pages to the value of tot_pages Wei Liu
2018-01-12 11:29 ` [PATCH v2 53/62] xen/pvshim: support vCPU hotplug Wei Liu
2018-01-12 11:29 ` [PATCH v2 54/62] xen/pvshim: memory hotplug Wei Liu
2018-01-12 11:29 ` [PATCH v2 55/62] xen/shim: modify shim_mem parameter behaviour Wei Liu
2018-01-12 11:29 ` [PATCH v2 56/62] xen/pvshim: use default position for the m2p mappings Wei Liu
2018-01-12 11:29 ` [PATCH v2 57/62] xen/shim: crash instead of reboot in shim mode Wei Liu
2018-01-12 11:29 ` [PATCH v2 58/62] xen/shim: allow DomU to have as many vcpus as available Wei Liu
2018-01-12 11:29 ` Wei Liu [this message]
2018-01-12 14:45 ` [PATCH] fixup! libxl: pvshim: Provide first-class config settings to enable shim mode Ian Jackson
2018-01-12 11:29 ` [PATCH v2 60/62] libxl: pvshim: Introduce pvshim_extra Wei Liu
2018-01-12 11:29 ` [PATCH v2 61/62] xl: pvshim: Provide and document xl config Wei Liu
2018-01-12 11:29 ` [PATCH v2 62/62] xl: Default guest mode changed from PV to PVH with PV shim Wei Liu
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=20180112112910.16762-60-wei.liu2@citrix.com \
--to=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/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).