> Caution: EXT Email
> 
> From: Peng Fan <[email protected]>
> 
> With Linux Kernel 5.15
> commit 6abbd6988971a ("irqchip/gic, gic-v3: Make SGIs use 
> handle_percpu_devid_irq()"), the on_each_cpu IPI_CALL_FUNC interrupt active 
> flag will not be cleared until interrupt handler finish.
> 
> Without Jailhouse hypervisor enabled, everything is ok, but when enabling 
> jailhouse, HCR_EL2.[FMO | IMO] is set, that means NS-EL1 is actually 
> accessing ICV_DIR_EL1 when eoi_irq after enter_hypervisor return. It not able 
> to deactive the interrupt that is actually a phyiscal irq which in active 
> state.
> 
> To ARM64, the IPI_CALL_FUNC is using SGI 1 which is same value as jailhouse 
> SGI_EVENT.
> 
> Then the following `jailhouse cell create` will hang the system, because the 
> previous 'SGI_EVENT' is in active state and not deactivated, so the current 
> SGI_EVENT issued not able to interrupt the target cpu core.
> 
> To resolve this issue, let's clear the active bit of SGI_EVENT and SGI_INJECT 
> before back to Linux.
> 
> Tested on NXP i.MX8MP-EVK
> 
> Signed-off-by: Peng Fan <[email protected]>
> ---
>  hypervisor/arch/arm-common/gic-v3.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/hypervisor/arch/arm-common/gic-v3.c 
> b/hypervisor/arch/arm-common/gic-v3.c
> index 03cface0..8327a95a 100644
> --- a/hypervisor/arch/arm-common/gic-v3.c
> +++ b/hypervisor/arch/arm-common/gic-v3.c
> @@ -200,7 +200,7 @@ static int gicv3_cpu_init(struct per_cpu *cpu_data)
>         unsigned long redist_addr = 
> system_config->platform_info.arm.gicr_base;
>         unsigned long redist_size = GIC_V3_REDIST_SIZE;
>         void *redist_base = gicr_base;
> -       unsigned long gicr_ispendr;
> +       unsigned long gicr_ispendr, gicr_isacter;
>         unsigned int n;
>         void *gicr;
>         u64 typer, mpidr;
> @@ -291,6 +291,10 @@ static int gicv3_cpu_init(struct per_cpu *cpu_data)
>         /* After this, the cells access the virtual interface of the GIC. */
>         arm_write_sysreg(ICH_HCR_EL2, ICH_HCR_EN);
> 
> +       /* Clear SGI active flag */
> +       gicr_isacter = mmio_read32(gicr + GICR_ISACTIVER);
> +       mmio_write32(gicr + GICR_ICACTIVER, gicr_isacter & 0xffff);
> +
>         /* Forward any pending physical SGIs to the virtual queue. */
>         gicr_ispendr = mmio_read32(gicr + GICR_ISPENDR);
>         for (n = 0; n < 16; n++) {
> --
> 2.25.1
> 

Hi,

I have encountered the issue on NXP LS1028ARDB as well, when testing with 
kernel 5.15. I have tested the fix and the issue is no longer reproducing.

Regards,
Anda

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/VI1PR04MB4719680FEAC9CAB7F5C5DCFFBAAB9%40VI1PR04MB4719.eurprd04.prod.outlook.com.

Reply via email to