|
[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
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |