target/arm: Split "get pending exception info" from "acknowledge it"
commit6c9485188170e11ad31ce477c8ce200b8e8ce59d
authorPeter Maydell <peter.maydell@linaro.org>
Fri, 9 Feb 2018 10:40:27 +0000 (9 10:40 +0000)
committerPeter Maydell <peter.maydell@linaro.org>
Fri, 9 Feb 2018 10:40:27 +0000 (9 10:40 +0000)
tree754d796a30a1467838d5766a9ad562c7d3b5ba14
parent5ede82b8ccb652382c106d53f656ed67997d76e8
target/arm: Split "get pending exception info" from "acknowledge it"

Currently armv7m_nvic_acknowledge_irq() does three things:
 * make the current highest priority pending interrupt active
 * return a bool indicating whether that interrupt is targeting
   Secure or NonSecure state
 * implicitly tell the caller which is the highest priority
   pending interrupt by setting env->v7m.exception

We need to split these jobs, because v7m_exception_taken()
needs to know whether the pending interrupt targets Secure so
it can choose to stack callee-saves registers or not, but it
must not make the interrupt active until after it has done
that stacking, in case the stacking causes a derived exception.
Similarly, it needs to know the number of the pending interrupt
so it can read the correct vector table entry before the
interrupt is made active, because vector table reads might
also cause a derived exception.

Create a new armv7m_nvic_get_pending_irq_info() function which simply
returns information about the highest priority pending interrupt, and
use it to rearrange the v7m_exception_taken() code so we don't
acknowledge the exception until we've done all the things which could
possibly cause a derived exception.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-id: 1517324542-6607-3-git-send-email-peter.maydell@linaro.org
hw/intc/armv7m_nvic.c
hw/intc/trace-events
target/arm/cpu.h
target/arm/helper.c