On Mon, Feb 2, 2026 at 6:14 PM Mykyta Poturai <[email protected]> wrote: > > Allow creating domains with GIC_V4 version.
I am not convinced we should extend the public domctl ABI with XEN_DOMCTL_CONFIG_GIC_V4/V4_1. The GIC spec treats v4 as an extension of v3: Because GICv4 is an extension of GICv3, all references to GICv3 in this manual apply equally to GICv4, unless explicitly indicated otherwise. Any changes for GICv4.1 are indicated accordingly. >From a guest ABI perspective, a v4-capable system is still a GICv3 programmer's model, with additional optional features (e.g. vLPI/ vPE/ITS commands). Those features should be enabled/queried via the relevant capability bits, not by inventing new "GIC version" domctl values. So I'd prefer: * keep gic_hw_version accurate internally (v3/v4/v4.1 as needed), but * for domctl configuration, treat v4.x as XEN_DOMCTL_CONFIG_GIC_V3, and keep dom0less DT generation using the gicv3 node. This avoids growing the public ABI and toolstack churn for something that is effectively a v3 + extensions model. Best regards, Mykola > > Signed-off-by: Mykyta Poturai <[email protected]> > --- > xen/arch/arm/dom0less-build.c | 1 + > xen/arch/arm/domain.c | 16 ++++++++++++++++ > xen/arch/arm/vgic.c | 2 ++ > xen/include/public/arch-arm.h | 2 ++ > 4 files changed, 21 insertions(+) > > diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c > index 4181c10538..3c4b074b05 100644 > --- a/xen/arch/arm/dom0less-build.c > +++ b/xen/arch/arm/dom0less-build.c > @@ -157,6 +157,7 @@ int __init make_intc_domU_node(struct kernel_info *kinfo) > { > #ifdef CONFIG_GICV3 > case GIC_V3: > + case GIC_V4: > return make_gicv3_domU_node(kinfo); > #endif > #ifdef CONFIG_VGICV2 > diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c > index 507df807ed..864e5511c9 100644 > --- a/xen/arch/arm/domain.c > +++ b/xen/arch/arm/domain.c > @@ -604,6 +604,14 @@ int arch_sanitise_domain_config(struct > xen_domctl_createdomain *config) > config->arch.gic_version = XEN_DOMCTL_CONFIG_GIC_V3; > break; > > + case GIC_V4: > + config->arch.gic_version = XEN_DOMCTL_CONFIG_GIC_V4; > + break; > + > + case GIC_V4_1: > + config->arch.gic_version = XEN_DOMCTL_CONFIG_GIC_V4_1; > + break; > + > default: > ASSERT_UNREACHABLE(); > return -EINVAL; > @@ -679,6 +687,14 @@ int arch_domain_create(struct domain *d, > d->arch.vgic.version = GIC_V3; > break; > > + case XEN_DOMCTL_CONFIG_GIC_V4: > + d->arch.vgic.version = GIC_V4; > + break; > + > + case XEN_DOMCTL_CONFIG_GIC_V4_1: > + d->arch.vgic.version = GIC_V4_1; > + break; > + > default: > BUG(); > } > diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c > index 6baf870ad5..e5752faeb7 100644 > --- a/xen/arch/arm/vgic.c > +++ b/xen/arch/arm/vgic.c > @@ -153,6 +153,7 @@ int domain_vgic_register(struct domain *d, unsigned int > *mmio_count) > { > #ifdef CONFIG_GICV3 > case GIC_V3: > + case GIC_V4: > if ( vgic_v3_init(d, mmio_count) ) > return -ENODEV; > break; > @@ -929,6 +930,7 @@ unsigned int vgic_max_vcpus(unsigned int > domctl_vgic_version) > > #ifdef CONFIG_GICV3 > case XEN_DOMCTL_CONFIG_GIC_V3: > + case XEN_DOMCTL_CONFIG_GIC_V4: > return 4096; > #endif > > diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h > index 96365e5603..12690cf3ac 100644 > --- a/xen/include/public/arch-arm.h > +++ b/xen/include/public/arch-arm.h > @@ -322,6 +322,8 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t); > #define XEN_DOMCTL_CONFIG_GIC_NATIVE 0 > #define XEN_DOMCTL_CONFIG_GIC_V2 1 > #define XEN_DOMCTL_CONFIG_GIC_V3 2 > +#define XEN_DOMCTL_CONFIG_GIC_V4 3 > +#define XEN_DOMCTL_CONFIG_GIC_V4_1 4 > > #define XEN_DOMCTL_CONFIG_TEE_NONE 0 > #define XEN_DOMCTL_CONFIG_TEE_OPTEE 1 > -- > 2.51.2
