[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC PATCH] xen/arm: Introduce GICV3 Self Tests



On Fri, 12 Sep 2025, Ayan Kumar Halder wrote:
> Introduce CONFIG_GICV3_SELFTEST to enclose tests for GICv3 driver.
> Test that Xen is able to generate SGIs.
> 
> Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@xxxxxxx>
> ---
> One of the aim of functional safety is to test hw/sw interface. This means 
> that
> Xen is able to configure the hardware correctly for the desired 
> functionalities.
> 
> Normally this is tested from the VMs. For eg if a VM is able to receive irq, 
> this
> implies that Xen has configured the GICv3 interface 'correctly'. However this 
> is
> a high level (or integration) test which uses not only the GICv3 interface
> between Xen and VM, but the interrupt injection code for Xen to VMs.
> 
> We want to have some kind of unit tests to check that Xen is able to receive
> various interrupts, set priorities, etc. Here, we have written unit tests for
> software generated interrupts (SGIs) as example.
> 
> These tests are expected to be triggered as Xen boots (right after Xen has
> initialised the GICv3 interface ie gicv3_init(). The aim of this test is to
> check whether Xen can trigger SGIs after gicv3_init() is invoked. If so, we 
> can
> claim that gicv3_init() was done properly to be able to trigger SGIs. Likewise
> we will have tests to check for priorities, SPIs, etc.
> 
> A script will parse the logs and claim that Xen is able to trigger SGIs.

I like this approach and I think it is OK if Xen is not functional after
some of the SELFTESTS because it is not the goal to run those in a
working system.

My only suggestion is to separate the SELFTESTS in a separate __init
function, keeping them isolated from the rest of the code, for simplicy
and also ease of understanding.

See for example stub_selftest.


>  xen/arch/arm/Kconfig  |  8 ++++++++
>  xen/arch/arm/gic-v3.c |  7 +++++++
>  xen/arch/arm/gic.c    | 21 +++++++++++++++++++++
>  3 files changed, 36 insertions(+)
> 
> diff --git a/xen/arch/arm/Kconfig b/xen/arch/arm/Kconfig
> index 950e4452c1..739f99eaa9 100644
> --- a/xen/arch/arm/Kconfig
> +++ b/xen/arch/arm/Kconfig
> @@ -73,6 +73,14 @@ config GICV3
>         Driver for the ARM Generic Interrupt Controller v3.
>         If unsure, use the default setting.
>  
> +config GICV3_SELFTEST
> +    bool "GICv3 driver self test"
> +    default n
> +    depends on GICV3
> +    ---help---
> +
> +      Self tests to validate GICV3 driver.
> +
>  config HAS_ITS
>          bool "GICv3 ITS MSI controller support (UNSUPPORTED)" if UNSUPPORTED
>          depends on GICV3 && !NEW_VGIC && !ARM_32
> diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
> index 4e6c98bada..eb0c05231c 100644
> --- a/xen/arch/arm/gic-v3.c
> +++ b/xen/arch/arm/gic-v3.c
> @@ -1818,6 +1818,13 @@ static int __init gicv3_init(void)
>  
>      gicv3_hyp_init();
>  
> +#ifdef CONFIG_GICV3_SELFTEST
> +    send_SGI_self(GIC_SGI_EVENT_CHECK);
> +    send_SGI_self(GIC_SGI_DUMP_STATE);
> +    send_SGI_self(GIC_SGI_CALL_FUNCTION);
> +    send_SGI_self(GIC_SGI_MAX);
> +#endif
> +
>  out:
>      spin_unlock(&gicv3.lock);
>  
> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> index d922ea67aa..5cb58cdb92 100644
> --- a/xen/arch/arm/gic.c
> +++ b/xen/arch/arm/gic.c
> @@ -346,6 +346,26 @@ static void do_sgi(struct cpu_user_regs *regs, enum 
> gic_sgi sgi)
>       */
>      smp_rmb();
>  
> +#ifdef CONFIG_GICV3_SELFTEST
> +    switch (sgi)
> +    {
> +    case GIC_SGI_EVENT_CHECK:
> +        printk("GIC_SGI_EVENT_CHECK received\n");
> +        break;
> +    case GIC_SGI_DUMP_STATE:
> +        printk("GIC_SGI_DUMP_STATE received\n");
> +        break;
> +    case GIC_SGI_CALL_FUNCTION:
> +        printk("GIC_SGI_CALL_FUNCTION received\n");
> +        break;
> +    case GIC_SGI_MAX:
> +        printk("GIC_SGI_MAX received\n");
> +        break;
> +    default:
> +        panic("Unknown SGI triggered\n");
> +        break;
> +    }
> +#else
>      switch (sgi)
>      {
>      case GIC_SGI_EVENT_CHECK:
> @@ -361,6 +381,7 @@ static void do_sgi(struct cpu_user_regs *regs, enum 
> gic_sgi sgi)
>          panic("Unhandled SGI %d on CPU%d\n", sgi, smp_processor_id());
>          break;
>      }
> +#endif
>  
>      /* Deactivate */
>      gic_hw_ops->deactivate_irq(desc);
> -- 
> 2.25.1
> 



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.