Files
xen/tools/include/xen-tools/arm-arch-capabilities.h
T
Julian Vetter 93e976a1d1 tools/arm: choose GIC version explicitly instead of relying on GIC_NATIVE
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 the GIC version
   against those bits before the config is built. An unspecified version
   becomes v3 if available, else v2, else fails. An explicitly requested
   v2/v3 is validated against the same bits, so a version the host
   cannot provide is directly rejected in the toolstack.
 * 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.

LIBXL_GIC_VERSION_DEFAULT keeps its name and value: xl.cfg still accepts
"default" as the C<gic_version> keyword, and setdefault() resolves it to
a concrete v2/v3 before anything else can observe it.

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 <julian.vetter@vates.tech>
Acked-by: Michal Orzel <michal.orzel@amd.com>
Acked-by: Anthony PERARD <anthony.perard@vates.tech>
2026-10-14 16:32:32 +02:00

50 lines
1.1 KiB
C

/* SPDX-License-Identifier: LGPL-2.1-only */
/*
* Copyright (C) 2023 ARM Ltd.
*/
#ifndef ARM_ARCH_CAPABILITIES_H
#define ARM_ARCH_CAPABILITIES_H
#include <stdbool.h>
#include <stdint.h>
#include <xen/sysctl.h>
#include <xen-tools/common-macros.h>
static inline
unsigned int arch_capabilities_arm_sve(unsigned int arch_capabilities)
{
#if defined(__arm__) || defined(__aarch64__)
unsigned int sve_vl = MASK_EXTR(arch_capabilities,
XEN_SYSCTL_PHYSCAP_ARM_SVE_MASK);
/* Vector length is divided by 128 before storing it in arch_capabilities */
return sve_vl * 128U;
#else
return 0;
#endif
}
static inline
bool arch_capabilities_arm_gic_v2(unsigned int arch_capabilities)
{
#if defined(__arm__) || defined(__aarch64__)
return MASK_EXTR(arch_capabilities, XEN_SYSCTL_PHYSCAP_ARM_GIC_V2);
#else
return false;
#endif
}
static inline
bool arch_capabilities_arm_gic_v3(unsigned int arch_capabilities)
{
#if defined(__arm__) || defined(__aarch64__)
return MASK_EXTR(arch_capabilities, XEN_SYSCTL_PHYSCAP_ARM_GIC_V3);
#else
return false;
#endif
}
#endif /* ARM_ARCH_CAPABILITIES_H */