[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v5 3/4] libxl: introduce a 'libxl_xen_abi_features' enumeration...
From: Paul Durrant <pdurrant@xxxxxxxxxx> ... and bitmaps to enable or disable fetaures. This patch adds a new 'libxl_xen_abi_features' enumeration into the IDL which specifies features of the Xen ABI which may be optionally enabled or disabled via new 'feature_enable' and 'feature_disable' bitaps added into 'libxl_domain_build_info'. The initially defined features are enabled by default (for relevant architectures) and so the corresponding flags in 'struct xen_domctl_createdomain' are set if they are missing from 'disable_features' rather than if they are present in 'enable_features'. Checks are, however, added to make sure that features are not specifically enabled in cases where they are not supported. NOTE: A subsequent patch will add an option into xl.cfg(5) to control whether Xen ABI features are enabled or disabled. Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx> --- Cc: Ian Jackson <iwj@xxxxxxxxxxxxxx> Cc: Wei Liu <wl@xxxxxxx> Cc: Anthony PERARD <anthony.perard@xxxxxxxxxx> v5: - New in v5 --- tools/include/libxl.h | 10 ++++++++++ tools/libs/light/libxl_arm.c | 22 +++++++++++++++------- tools/libs/light/libxl_create.c | 32 +++++++++++++++++++++++++++++++- tools/libs/light/libxl_types.idl | 7 +++++++ tools/libs/light/libxl_x86.c | 14 ++++++++++++-- 5 files changed, 75 insertions(+), 10 deletions(-) diff --git a/tools/include/libxl.h b/tools/include/libxl.h index eaffccb30f37..b328a5621e6f 100644 --- a/tools/include/libxl.h +++ b/tools/include/libxl.h @@ -451,6 +451,16 @@ */ #define LIBXL_HAVE_VIRIDIAN_EX_PROCESSOR_MASKS 1 +/* + * LIBXL_HAVE_BUILDINFO_XEN_ABI_FEATURE indicates that the + * libxl_xen_abi_feature enumeration is defined and that + * libxl_domain_build_info has feature_enable and _disable bitmaps + * of the specified width. These bitmaps are used to enable or disable + * features of the Xen ABI (enumerated by the new type) for a domain. + */ +#define LIBXL_HAVE_BUILDINFO_XEN_ABI_FEATURE 1 +#define LIBXL_BUILDINFO_FEATURE_ENABLE_DISABLE_WIDTH 64 + /* * libxl ABI compatibility * diff --git a/tools/libs/light/libxl_arm.c b/tools/libs/light/libxl_arm.c index 66e8a065fe67..69676340a661 100644 --- a/tools/libs/light/libxl_arm.c +++ b/tools/libs/light/libxl_arm.c @@ -28,19 +28,27 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, unsigned int i; uint32_t vuart_irq; bool vuart_enabled = false; + libxl_domain_build_info *b_info = &d_config->b_info; + libxl_xen_abi_feature f = LIBXL_XEN_ABI_FEATURE_EVTCHN_UPCALL; + + if (libxl_bitmap_test(&b_info->feature_enable, f)) { + LOG(ERROR, "unsupported Xen ABI feature '%s'", + libxl_xen_abi_feature_to_string(f)); + return ERROR_FAIL; + } /* * If pl011 vuart is enabled then increment the nr_spis to allow allocation * of SPI VIRQ for pl011. */ - if (d_config->b_info.arch_arm.vuart == LIBXL_VUART_TYPE_SBSA_UART) { + if (b_info->arch_arm.vuart == LIBXL_VUART_TYPE_SBSA_UART) { nr_spis += (GUEST_VPL011_SPI - 32) + 1; vuart_irq = GUEST_VPL011_SPI; vuart_enabled = true; } - for (i = 0; i < d_config->b_info.num_irqs; i++) { - uint32_t irq = d_config->b_info.irqs[i]; + for (i = 0; i < b_info->num_irqs; i++) { + uint32_t irq = b_info->irqs[i]; uint32_t spi; /* @@ -72,7 +80,7 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, config->arch.nr_spis = nr_spis; LOG(DEBUG, " - Allocate %u SPIs", nr_spis); - switch (d_config->b_info.arch_arm.gic_version) { + switch (b_info->arch_arm.gic_version) { case LIBXL_GIC_VERSION_DEFAULT: config->arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE; break; @@ -84,11 +92,11 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, break; default: LOG(ERROR, "Unknown GIC version %d", - d_config->b_info.arch_arm.gic_version); + b_info->arch_arm.gic_version); return ERROR_FAIL; } - switch (d_config->b_info.tee) { + switch (b_info->tee) { case LIBXL_TEE_TYPE_NONE: config->arch.tee_type = XEN_DOMCTL_CONFIG_TEE_NONE; break; @@ -97,7 +105,7 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, break; default: LOG(ERROR, "Unknown TEE type %d", - d_config->b_info.tee); + b_info->tee); return ERROR_FAIL; } diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c index 3ca9f00d6d83..8cf7fd5f6d1b 100644 --- a/tools/libs/light/libxl_create.c +++ b/tools/libs/light/libxl_create.c @@ -587,6 +587,7 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config, struct xs_permissions noperm[1]; xs_transaction_t t = 0; libxl_vminfo *vm_list; + libxl_xen_abi_feature f; /* convenience aliases */ libxl_domain_create_info *info = &d_config->c_info; @@ -607,9 +608,38 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config, .max_evtchn_port = b_info->event_channels, .max_grant_frames = b_info->max_grant_frames, .max_maptrack_frames = b_info->max_maptrack_frames, - .flags = XEN_DOMCTL_CDF_evtchn_fifo, }; + libxl_for_each_set_bit(f, b_info->feature_enable) { + if (!libxl_xen_abi_feature_to_string(f)) { /* check validity */ + LOGED(ERROR, *domid, "unknown Xen ABI feature enabled"); + rc = ERROR_FAIL; + goto out; + } + if (libxl_bitmap_test(&b_info->feature_disable, f)) { + LOGED(ERROR, *domid, "Xen ABI feature '%s' both enabled and disabled", + libxl_xen_abi_feature_to_string(f)); + rc = ERROR_FAIL; + goto out; + } + LOGD(DETAIL, *domid, "enable feature: '%s'", + libxl_xen_abi_feature_to_string(f)); + } + + libxl_for_each_set_bit(f, b_info->feature_disable) { + if (!libxl_xen_abi_feature_to_string(f)) { /* check validity */ + LOGED(ERROR, *domid, "unknown Xen ABI feature disabled"); + rc = ERROR_FAIL; + goto out; + } + LOGD(DETAIL, *domid, "disable feature: '%s'", + libxl_xen_abi_feature_to_string(f)); + } + + if (!libxl_bitmap_test(&b_info->feature_disable, + LIBXL_XEN_ABI_FEATURE_EVTCHN_FIFO)) + create.flags |= XEN_DOMCTL_CDF_evtchn_fifo; + if (info->type != LIBXL_DOMAIN_TYPE_PV) { create.flags |= XEN_DOMCTL_CDF_hvm; diff --git a/tools/libs/light/libxl_types.idl b/tools/libs/light/libxl_types.idl index 05324736b744..3c50724b64cd 100644 --- a/tools/libs/light/libxl_types.idl +++ b/tools/libs/light/libxl_types.idl @@ -477,6 +477,11 @@ libxl_tee_type = Enumeration("tee_type", [ (1, "optee") ], init_val = "LIBXL_TEE_TYPE_NONE") +libxl_xen_abi_feature = Enumeration("xen_abi_feature", [ + (0, "evtchn_fifo"), + (1, "evtchn_upcall") + ]) + libxl_rdm_reserve = Struct("rdm_reserve", [ ("strategy", libxl_rdm_reserve_strategy), ("policy", libxl_rdm_reserve_policy), @@ -559,6 +564,8 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("apic", libxl_defbool), ("dm_restrict", libxl_defbool), ("tee", libxl_tee_type), + ("feature_enable", libxl_bitmap), + ("feature_disable", libxl_bitmap), ("u", KeyedUnion(None, libxl_domain_type, "type", [("hvm", Struct(None, [("firmware", string), ("bios", libxl_bios_type), diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c index f7217b422404..39a9d3cbf9f8 100644 --- a/tools/libs/light/libxl_x86.c +++ b/tools/libs/light/libxl_x86.c @@ -6,9 +6,19 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, struct xen_domctl_createdomain *config) { libxl_domain_create_info *info = &d_config->c_info; + libxl_domain_build_info *b_info = &d_config->b_info; + libxl_xen_abi_feature f = LIBXL_XEN_ABI_FEATURE_EVTCHN_UPCALL; - if (info->type == LIBXL_DOMAIN_TYPE_HVM) - config->flags |= XEN_DOMCTL_CDF_evtchn_upcall; + if (info->type != LIBXL_DOMAIN_TYPE_HVM && + libxl_bitmap_test(&b_info->feature_enable, f)) { + LOG(ERROR, "unsupported Xen ABI feature '%s'", + libxl_xen_abi_feature_to_string(f)); + return ERROR_FAIL; + } + + if (info->type == LIBXL_DOMAIN_TYPE_HVM && + !libxl_bitmap_test(&b_info->feature_disable, f)) + config->flags |= XEN_DOMCTL_CDF_evtchn_upcall; switch(info->type) { case LIBXL_DOMAIN_TYPE_HVM: -- 2.20.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |