[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] hw/intc/armv7m_nvic: ICPRn must not unpend an IRQ that is be
From: |
Peter Maydell |
Subject: |
Re: [PATCH] hw/intc/armv7m_nvic: ICPRn must not unpend an IRQ that is being held high |
Date: |
Tue, 28 Jun 2022 16:52:10 +0100 |
On Tue, 28 Jun 2022 at 16:47, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> In the M-profile Arm ARM, rule R_CVJS defines when an interrupt should
> be set to the Pending state:
> A) when the input line is high and the interrupt is not Active
> B) when the input line transitions from low to high and the interrupt
> is Active
> (Note that the first of these is an ongoing condition, and the
> second is a point-in-time event.)
>
> This can be rephrased as:
> 1 when the line goes from low to high, set Pending
> 2 when Active goes from 1 to 0, if line is high then set Pending
> 3 ignore attempts to clear Pending when the line is high
> and Active is 0
>
> where 1 covers both B and one of the "transition into condition A"
> cases, 2 deals with the other "transition into condition A"
> possibility, and 3 is "don't drop Pending if we're already in
> condition A". Transitions out of condition A don't affect Pending
> state.
>
> We handle case 1 in set_irq_level(). For an interrupt (as opposed
> to other kinds of exception) the only place where we clear Active
> is in armv7m_nvic_complete_irq(), where we handle case 2 by
> checking for whether we need to re-pend the exception. For case 3,
> the only places where we clear Pending state on an interrupt are in
> armv7m_nvic_acknowledge_irq() (where we are setting Active so it
> doesn't count) and for writes to NVIC_CPSRn.
Should read "NVIC_ICPRn"...
> It is the "write to NVIC_ICPRn" case that we missed: we must ignore
> this if the input line is high and the interrupt is not Active.
> (This required behaviour is differently and perhaps more clearly
> stated in the v7M Arm ARM, which has pseudocode in section B3.4.1
> that implies it.)
-- PMM