[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v5 2/4] domctl: introduce a new domain create flag, XEN_DOMCTL_CDF_evtchn_upcall, ...
From: Paul Durrant <pdurrant@xxxxxxxxxx> ...to control the visibility of the per-vCPU upcall feature for HVM guests. Commit 04447f4453c0 ("x86/hvm: add per-vcpu evtchn upcalls") added a mechanism by which x86 HVM guests can register a vector for each vCPU which will be used by Xen to signal event channels on that vCPU. This facility (an HVMOP hypercall) appeared in a uncontrolled fashion which has implications for the behaviour of OS when moving from an older Xen to a newer Xen. For instance, the OS may be aware of the per-vCPU upcall feature but support for it is buggy. In this case the OS will function perfectly well on the older Xen, but fail (in a potentially non-obvious way) on the newer Xen. To maintain compatibility it is necessary to make Xen behave as it did before the new hypercall was added and hence the code in this patch ensures that, if XEN_DOMCTL_CDF_evtchn_upcall is not set, the hypercall will again result in -ENOSYS being returned to the guest. NOTE: To maintain current behavior, until a tool-stack option is added to control the flag, it is unconditionally set for x86 HVM domains. A subsequent patch will introduce such tool-stack control. Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx> --- Cc: Ian Jackson <iwj@xxxxxxxxxxxxxx> Cc: Wei Liu <wl@xxxxxxx> Cc: Anthony PERARD <anthony.perard@xxxxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: George Dunlap <george.dunlap@xxxxxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Julien Grall <julien@xxxxxxx> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: Christian Lindig <christian.lindig@xxxxxxxxxx> Cc: David Scott <dave@xxxxxxxxxx> Cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx> v5: - New in v5 --- tools/libs/light/libxl_x86.c | 7 ++++++- tools/ocaml/libs/xc/xenctrl.ml | 1 + tools/ocaml/libs/xc/xenctrl.mli | 1 + xen/arch/x86/domain.c | 8 ++++++++ xen/arch/x86/hvm/hvm.c | 3 +++ xen/arch/x86/setup.c | 1 + xen/common/domain.c | 3 ++- xen/include/public/domctl.h | 4 +++- 8 files changed, 25 insertions(+), 3 deletions(-) diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c index 86d272999d67..f7217b422404 100644 --- a/tools/libs/light/libxl_x86.c +++ b/tools/libs/light/libxl_x86.c @@ -5,7 +5,12 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, libxl_domain_config *d_config, struct xen_domctl_createdomain *config) { - switch(d_config->c_info.type) { + libxl_domain_create_info *info = &d_config->c_info; + + if (info->type == LIBXL_DOMAIN_TYPE_HVM) + config->flags |= XEN_DOMCTL_CDF_evtchn_upcall; + + switch(info->type) { case LIBXL_DOMAIN_TYPE_HVM: config->arch.emulation_flags = (XEN_X86_EMU_ALL & ~XEN_X86_EMU_VPCI); break; diff --git a/tools/ocaml/libs/xc/xenctrl.ml b/tools/ocaml/libs/xc/xenctrl.ml index fa5c7b7eb0a2..04284c364108 100644 --- a/tools/ocaml/libs/xc/xenctrl.ml +++ b/tools/ocaml/libs/xc/xenctrl.ml @@ -66,6 +66,7 @@ type domain_create_flag = | CDF_IOMMU | CDF_NESTED_VIRT | CDF_EVTCHN_FIFO + | CDF_EVTCHN_UPCALL type domain_create_iommu_opts = | IOMMU_NO_SHAREPT diff --git a/tools/ocaml/libs/xc/xenctrl.mli b/tools/ocaml/libs/xc/xenctrl.mli index a872002d90cc..e40759464ae5 100644 --- a/tools/ocaml/libs/xc/xenctrl.mli +++ b/tools/ocaml/libs/xc/xenctrl.mli @@ -59,6 +59,7 @@ type domain_create_flag = | CDF_IOMMU | CDF_NESTED_VIRT | CDF_EVTCHN_FIFO + | CDF_EVTCHN_UPCALL type domain_create_iommu_opts = | IOMMU_NO_SHAREPT diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 1b894d0124d7..e7f83880219d 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -662,11 +662,19 @@ int arch_sanitise_domain_config(struct xen_domctl_createdomain *config) } if ( !hvm ) + { + if ( config->flags & XEN_DOMCTL_CDF_evtchn_upcall ) + { + dprintk(XENLOG_INFO, "Per-vCPU event channel vector only supported for HVM guests\n"); + return -EINVAL; + } + /* * It is only meaningful for XEN_DOMCTL_CDF_oos_off to be clear * for HVM guests. */ config->flags |= XEN_DOMCTL_CDF_oos_off; + } if ( nested_virt && !hap ) { diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 54e32e4fe85c..7ffc42a7282e 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -4037,6 +4037,9 @@ static int hvmop_set_evtchn_upcall_vector( struct domain *d = current->domain; struct vcpu *v; + if ( !(d->options & XEN_DOMCTL_CDF_evtchn_upcall) ) + return -ENOSYS; + if ( !is_hvm_domain(d) ) return -EINVAL; diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index e558241c73da..3ff9a25eede6 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -751,6 +751,7 @@ static struct domain *__init create_dom0(const module_t *image, if ( opt_dom0_pvh ) { dom0_cfg.flags |= (XEN_DOMCTL_CDF_hvm | + XEN_DOMCTL_CDF_evtchn_upcall | ((hvm_hap_supported() && !opt_dom0_shadow) ? XEN_DOMCTL_CDF_hap : 0)); diff --git a/xen/common/domain.c b/xen/common/domain.c index 28592c7c8486..1ff2603425a3 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -307,7 +307,8 @@ static int sanitise_domain_config(struct xen_domctl_createdomain *config) ~(XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap | XEN_DOMCTL_CDF_s3_integrity | XEN_DOMCTL_CDF_oos_off | XEN_DOMCTL_CDF_xs_domain | XEN_DOMCTL_CDF_iommu | - XEN_DOMCTL_CDF_nested_virt | XEN_DOMCTL_CDF_evtchn_fifo) ) + XEN_DOMCTL_CDF_nested_virt | XEN_DOMCTL_CDF_evtchn_fifo | + XEN_DOMCTL_CDF_evtchn_upcall ) ) { dprintk(XENLOG_INFO, "Unknown CDF flags %#x\n", config->flags); return -EINVAL; diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index f7149c81a7c2..f5fe43a55662 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -72,9 +72,11 @@ struct xen_domctl_createdomain { #define XEN_DOMCTL_CDF_nested_virt (1U << _XEN_DOMCTL_CDF_nested_virt) #define _XEN_DOMCTL_CDF_evtchn_fifo 7 #define XEN_DOMCTL_CDF_evtchn_fifo (1U << _XEN_DOMCTL_CDF_evtchn_fifo) +#define _XEN_DOMCTL_CDF_evtchn_upcall 8 +#define XEN_DOMCTL_CDF_evtchn_upcall (1U << _XEN_DOMCTL_CDF_evtchn_upcall) /* Max XEN_DOMCTL_CDF_* constant. Used for ABI checking. */ -#define XEN_DOMCTL_CDF_MAX XEN_DOMCTL_CDF_evtchn_fifo +#define XEN_DOMCTL_CDF_MAX XEN_DOMCTL_CDF_evtchn_upcall uint32_t flags; -- 2.20.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |