[RFC PATCH 15/19] arm: Add gicv4 to domain creation

Mykyta Poturai posted 19 patches 5 months, 1 week ago
[RFC PATCH 15/19] arm: Add gicv4 to domain creation
Posted by Mykyta Poturai 5 months, 1 week ago
Allow creating domains with GIC_V4 version.

Signed-off-by: Mykyta Poturai <mykyta_poturai@epam.com>
---
 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
Re: [RFC PATCH 15/19] arm: Add gicv4 to domain creation
Posted by Mykola Kvach 4 months, 3 weeks ago
On Mon, Feb 2, 2026 at 6:14 PM Mykyta Poturai <Mykyta_Poturai@epam.com> 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 <mykyta_poturai@epam.com>
> ---
>  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