[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v1 1/1] intc/ibex_plic: Clear interrupts that occur during cl
From: |
Jackie Ke |
Subject: |
Re: [PATCH v1 1/1] intc/ibex_plic: Clear interrupts that occur during claim process |
Date: |
Sat, 5 Dec 2020 08:09:11 +0000 |
Tested-by: Jackie Ke <jackieke724@hotmail.com>
Best Regards,
Jackie Ke
> On Dec 5, 2020, at 12:47 AM, Alistair Francis <alistair.francis@wdc.com>
> wrote:
>
> Previously if an interrupt occured during the claim process (after the
> interrupt is claimed but before it's completed) it would never be
> cleared.
> This patch ensures that we also clear the hidden_pending bits as well.
>
> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
> ---
> hw/intc/ibex_plic.c | 13 ++++++++++---
> 1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/hw/intc/ibex_plic.c b/hw/intc/ibex_plic.c
> index 341c9db405..c1b72fcab0 100644
> --- a/hw/intc/ibex_plic.c
> +++ b/hw/intc/ibex_plic.c
> @@ -43,16 +43,23 @@ static void ibex_plic_irqs_set_pending(IbexPlicState *s,
> int irq, bool level)
> {
> int pending_num = irq / 32;
>
> + if (!level) {
> + /*
> + * If the level is low make sure we clear the hidden_pending.
> + */
> + s->hidden_pending[pending_num] &= ~(1 << (irq % 32));
> + }
> +
> if (s->claimed[pending_num] & 1 << (irq % 32)) {
> /*
> * The interrupt has been claimed, but not completed.
> * The pending bit can't be set.
> + * Save the pending level for after the interrupt is completed.
> */
> s->hidden_pending[pending_num] |= level << (irq % 32);
> - return;
> + } else {
> + s->pending[pending_num] |= level << (irq % 32);
> }
> -
> - s->pending[pending_num] |= level << (irq % 32);
> }
>
> static bool ibex_plic_irqs_pending(IbexPlicState *s, uint32_t context)
> --
> 2.29.2
>