[PATCH v4 3/6] tools/arm: choose GIC version explicitly instead of relying on GIC_NATIVE
Julian Vetter <[email protected]>
| Newsgroups | org.xenproject.lists.xen-devel |
|---|---|
| Message-ID | <1787229624.8631fc262581453bbf619ec5b2062170.1a01f2fd7e5000c4f3@vates.tech> |
XEN_DOMCTL_CONFIG_GIC_NATIVE lets the toolstack ask Xen to silently resolve the domain's GIC version to whatever the host hardware has. Xen then writes the resolved value back into the same in/out xen_arch_domainconfig the toolstack used as input, which is the kind of API abuse we're trying to get rid of. The struct passed to createdomain should only be an input parameter. Move the "pick the best available GIC version" decision to the toolstack, using the XEN_SYSCTL_PHYSCAP_ARM_GIC_V2/V3 capability bits already exposed via XEN_SYSCTL_physinfo: * libxl__arch_domain_build_info_setdefault() resolves LIBXL_GIC_VERSION_DEFAULT to v3 if available, else v2, else fails, before the config is built. * The Python xc.domain_create() binding does the same via a call to xc_physinfo(). * libxl__arch_domain_prepare_config() therefore only ever sees a concrete v2/v3 request and just validates it. The GIC_NATIVE case is dropped since setdefault() always resolves it first. This guarantees no toolstack path can still produce XEN_DOMCTL_CONFIG_GIC_NATIVE, in preparation for removing it from the Xen side and from the ABI entirely. Signed-off-by: Julian Vetter <[email protected]> --- Changes in v4: - Fix a missing closing bracket in arch_capabilities_arm_has() --- .../include/xen-tools/arm-arch-capabilities.h | 17 ++++++++++++++++ tools/libs/light/libxl_arm.c | 17 +++++++++++++--- tools/python/xen/lowlevel/xc/xc.c | 20 ++++++++++++++++++- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/tools/include/xen-tools/arm-arch-capabilities.h b/tools/include/xen-tools/arm-arch-capabilities.h index 4aa4c6c34a..ce1b3bdd71 100644 --- a/tools/include/xen-tools/arm-arch-capabilities.h +++ b/tools/include/xen-tools/arm-arch-capabilities.h @@ -6,6 +6,7 @@ #ifndef ARM_ARCH_CAPABILITIES_H #define ARM_ARCH_CAPABILITIES_H +#include <stdbool.h> #include <stdint.h> #include <xen/sysctl.h> @@ -25,4 +26,20 @@ unsigned int arch_capabilities_arm_sve(unsigned int arch_capabilities) #endif } +/* + * Generic test for any single-bit XEN_SYSCTL_PHYSCAP_ARM_* capability, e.g. + * arch_capabilities_arm_has(caps, XEN_SYSCTL_PHYSCAP_ARM_GIC_V2). Multi-bit + * fields (like the SVE vector length above) still need their own decoder. + */ +static inline +bool arch_capabilities_arm_has(unsigned int arch_capabilities, + unsigned int mask) +{ +#if defined(__arm__) || defined(__aarch64__) + return !!(arch_capabilities & mask); +#else + return false; +#endif +} + #endif /* ARM_ARCH_CAPABILITIES_H */ diff --git a/tools/libs/light/libxl_arm.c b/tools/libs/light/libxl_arm.c index 7e9f8a1bc3..926d651857 100644 --- a/tools/libs/light/libxl_arm.c +++ b/tools/libs/light/libxl_arm.c @@ -196,9 +196,6 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, LOG(DEBUG, " - Allocate %u SPIs", config->arch.nr_spis); switch (d_config->b_info.arch_arm.gic_version) { - case LIBXL_GIC_VERSION_DEFAULT: - config->arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE; - break; case LIBXL_GIC_VERSION_V2: config->arch.gic_version = XEN_DOMCTL_CONFIG_GIC_V2; break; @@ -1800,6 +1797,20 @@ int libxl__arch_domain_build_info_setdefault(libxl__gc *gc, /* Trapping of unmapped accesses enabled by default. */ libxl_defbool_setdefault(&b_info->trap_unmapped_accesses, true); + /* Pick the best GIC version available if none was requested. */ + if (b_info->arch_arm.gic_version == LIBXL_GIC_VERSION_DEFAULT) { + if (arch_capabilities_arm_has(physinfo->arch_capabilities, + XEN_SYSCTL_PHYSCAP_ARM_GIC_V3)) + b_info->arch_arm.gic_version = LIBXL_GIC_VERSION_V3; + else if (arch_capabilities_arm_has(physinfo->arch_capabilities, + XEN_SYSCTL_PHYSCAP_ARM_GIC_V2)) + b_info->arch_arm.gic_version = LIBXL_GIC_VERSION_V2; + else { + LOG(ERROR, "No supported GIC version found on this host"); + return ERROR_FAIL; + } + } + /* Sanitise SVE parameter */ if (b_info->arch_arm.sve_vl) { unsigned int max_sve_vl = diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index 7a4bf54597..e9e1d8572e 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -163,7 +163,25 @@ static PyObject *pyxc_domain_create(XcObject *self, ~(XEN_X86_EMU_VPCI | XEN_X86_EMU_USE_PIRQ); #elif defined (__arm__) || defined(__aarch64__) - config.arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE; + { + xc_physinfo_t pinfo; + + if ( xc_physinfo(self->xc_handle, &pinfo) != 0 ) + return pyxc_error_to_exception(self->xc_handle); + + if ( arch_capabilities_arm_has(pinfo.arch_capabilities, + XEN_SYSCTL_PHYSCAP_ARM_GIC_V3) ) + config.arch.gic_version = XEN_DOMCTL_CONFIG_GIC_V3; + else if ( arch_capabilities_arm_has(pinfo.arch_capabilities, + XEN_SYSCTL_PHYSCAP_ARM_GIC_V2) ) + config.arch.gic_version = XEN_DOMCTL_CONFIG_GIC_V2; + else + { + errno = EINVAL; + PyErr_SetFromErrno(xc_error_obj); + return NULL; + } + } #else #error Architecture not supported #endif -- 2.53.0 -- Julian Vetter | Vates Hypervisor & Kernel Developer XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech