mirror of https://github.com/xemu-project/xemu.git
target/arm: Declare CPU <-> NVIC helpers in 'hw/intc/armv7m_nvic.h'
While dozens of files include "cpu.h", only 3 files require these NVIC helper declarations. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-id: 20230206223502.25122-12-philmd@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
8f4e07c9d1
commit
165876f22c
|
@ -83,4 +83,127 @@ struct NVICState {
|
||||||
qemu_irq sysresetreq;
|
qemu_irq sysresetreq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Interface between CPU and Interrupt controller. */
|
||||||
|
/**
|
||||||
|
* armv7m_nvic_set_pending: mark the specified exception as pending
|
||||||
|
* @s: the NVIC
|
||||||
|
* @irq: the exception number to mark pending
|
||||||
|
* @secure: false for non-banked exceptions or for the nonsecure
|
||||||
|
* version of a banked exception, true for the secure version of a banked
|
||||||
|
* exception.
|
||||||
|
*
|
||||||
|
* Marks the specified exception as pending. Note that we will assert()
|
||||||
|
* if @secure is true and @irq does not specify one of the fixed set
|
||||||
|
* of architecturally banked exceptions.
|
||||||
|
*/
|
||||||
|
void armv7m_nvic_set_pending(NVICState *s, int irq, bool secure);
|
||||||
|
/**
|
||||||
|
* armv7m_nvic_set_pending_derived: mark this derived exception as pending
|
||||||
|
* @s: the NVIC
|
||||||
|
* @irq: the exception number to mark pending
|
||||||
|
* @secure: false for non-banked exceptions or for the nonsecure
|
||||||
|
* version of a banked exception, true for the secure version of a banked
|
||||||
|
* exception.
|
||||||
|
*
|
||||||
|
* Similar to armv7m_nvic_set_pending(), but specifically for derived
|
||||||
|
* exceptions (exceptions generated in the course of trying to take
|
||||||
|
* a different exception).
|
||||||
|
*/
|
||||||
|
void armv7m_nvic_set_pending_derived(NVICState *s, int irq, bool secure);
|
||||||
|
/**
|
||||||
|
* armv7m_nvic_set_pending_lazyfp: mark this lazy FP exception as pending
|
||||||
|
* @s: the NVIC
|
||||||
|
* @irq: the exception number to mark pending
|
||||||
|
* @secure: false for non-banked exceptions or for the nonsecure
|
||||||
|
* version of a banked exception, true for the secure version of a banked
|
||||||
|
* exception.
|
||||||
|
*
|
||||||
|
* Similar to armv7m_nvic_set_pending(), but specifically for exceptions
|
||||||
|
* generated in the course of lazy stacking of FP registers.
|
||||||
|
*/
|
||||||
|
void armv7m_nvic_set_pending_lazyfp(NVICState *s, int irq, bool secure);
|
||||||
|
/**
|
||||||
|
* armv7m_nvic_get_pending_irq_info: return highest priority pending
|
||||||
|
* exception, and whether it targets Secure state
|
||||||
|
* @s: the NVIC
|
||||||
|
* @pirq: set to pending exception number
|
||||||
|
* @ptargets_secure: set to whether pending exception targets Secure
|
||||||
|
*
|
||||||
|
* This function writes the number of the highest priority pending
|
||||||
|
* exception (the one which would be made active by
|
||||||
|
* armv7m_nvic_acknowledge_irq()) to @pirq, and sets @ptargets_secure
|
||||||
|
* to true if the current highest priority pending exception should
|
||||||
|
* be taken to Secure state, false for NS.
|
||||||
|
*/
|
||||||
|
void armv7m_nvic_get_pending_irq_info(NVICState *s, int *pirq,
|
||||||
|
bool *ptargets_secure);
|
||||||
|
/**
|
||||||
|
* armv7m_nvic_acknowledge_irq: make highest priority pending exception active
|
||||||
|
* @s: the NVIC
|
||||||
|
*
|
||||||
|
* Move the current highest priority pending exception from the pending
|
||||||
|
* state to the active state, and update v7m.exception to indicate that
|
||||||
|
* it is the exception currently being handled.
|
||||||
|
*/
|
||||||
|
void armv7m_nvic_acknowledge_irq(NVICState *s);
|
||||||
|
/**
|
||||||
|
* armv7m_nvic_complete_irq: complete specified interrupt or exception
|
||||||
|
* @s: the NVIC
|
||||||
|
* @irq: the exception number to complete
|
||||||
|
* @secure: true if this exception was secure
|
||||||
|
*
|
||||||
|
* Returns: -1 if the irq was not active
|
||||||
|
* 1 if completing this irq brought us back to base (no active irqs)
|
||||||
|
* 0 if there is still an irq active after this one was completed
|
||||||
|
* (Ignoring -1, this is the same as the RETTOBASE value before completion.)
|
||||||
|
*/
|
||||||
|
int armv7m_nvic_complete_irq(NVICState *s, int irq, bool secure);
|
||||||
|
/**
|
||||||
|
* armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
|
||||||
|
* @s: the NVIC
|
||||||
|
* @irq: the exception number to mark pending
|
||||||
|
* @secure: false for non-banked exceptions or for the nonsecure
|
||||||
|
* version of a banked exception, true for the secure version of a banked
|
||||||
|
* exception.
|
||||||
|
*
|
||||||
|
* Return whether an exception is "ready", i.e. whether the exception is
|
||||||
|
* enabled and is configured at a priority which would allow it to
|
||||||
|
* interrupt the current execution priority. This controls whether the
|
||||||
|
* RDY bit for it in the FPCCR is set.
|
||||||
|
*/
|
||||||
|
bool armv7m_nvic_get_ready_status(NVICState *s, int irq, bool secure);
|
||||||
|
/**
|
||||||
|
* armv7m_nvic_raw_execution_priority: return the raw execution priority
|
||||||
|
* @s: the NVIC
|
||||||
|
*
|
||||||
|
* Returns: the raw execution priority as defined by the v8M architecture.
|
||||||
|
* This is the execution priority minus the effects of AIRCR.PRIS,
|
||||||
|
* and minus any PRIMASK/FAULTMASK/BASEPRI priority boosting.
|
||||||
|
* (v8M ARM ARM I_PKLD.)
|
||||||
|
*/
|
||||||
|
int armv7m_nvic_raw_execution_priority(NVICState *s);
|
||||||
|
/**
|
||||||
|
* armv7m_nvic_neg_prio_requested: return true if the requested execution
|
||||||
|
* priority is negative for the specified security state.
|
||||||
|
* @s: the NVIC
|
||||||
|
* @secure: the security state to test
|
||||||
|
* This corresponds to the pseudocode IsReqExecPriNeg().
|
||||||
|
*/
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure);
|
||||||
|
#else
|
||||||
|
static inline bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
bool armv7m_nvic_can_take_pending_exception(NVICState *s);
|
||||||
|
#else
|
||||||
|
static inline bool armv7m_nvic_can_take_pending_exception(NVICState *s)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -36,8 +36,10 @@
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
|
#ifdef CONFIG_TCG
|
||||||
#include "hw/intc/armv7m_nvic.h"
|
#include "hw/intc/armv7m_nvic.h"
|
||||||
#endif
|
#endif /* CONFIG_TCG */
|
||||||
|
#endif /* !CONFIG_USER_ONLY */
|
||||||
#include "sysemu/tcg.h"
|
#include "sysemu/tcg.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
#include "sysemu/hw_accel.h"
|
#include "sysemu/hw_accel.h"
|
||||||
|
|
123
target/arm/cpu.h
123
target/arm/cpu.h
|
@ -2559,129 +2559,6 @@ void arm_cpu_list(void);
|
||||||
uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
|
uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
|
||||||
uint32_t cur_el, bool secure);
|
uint32_t cur_el, bool secure);
|
||||||
|
|
||||||
/* Interface between CPU and Interrupt controller. */
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
|
||||||
bool armv7m_nvic_can_take_pending_exception(NVICState *s);
|
|
||||||
#else
|
|
||||||
static inline bool armv7m_nvic_can_take_pending_exception(NVICState *s)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* armv7m_nvic_set_pending: mark the specified exception as pending
|
|
||||||
* @s: the NVIC
|
|
||||||
* @irq: the exception number to mark pending
|
|
||||||
* @secure: false for non-banked exceptions or for the nonsecure
|
|
||||||
* version of a banked exception, true for the secure version of a banked
|
|
||||||
* exception.
|
|
||||||
*
|
|
||||||
* Marks the specified exception as pending. Note that we will assert()
|
|
||||||
* if @secure is true and @irq does not specify one of the fixed set
|
|
||||||
* of architecturally banked exceptions.
|
|
||||||
*/
|
|
||||||
void armv7m_nvic_set_pending(NVICState *s, int irq, bool secure);
|
|
||||||
/**
|
|
||||||
* armv7m_nvic_set_pending_derived: mark this derived exception as pending
|
|
||||||
* @s: the NVIC
|
|
||||||
* @irq: the exception number to mark pending
|
|
||||||
* @secure: false for non-banked exceptions or for the nonsecure
|
|
||||||
* version of a banked exception, true for the secure version of a banked
|
|
||||||
* exception.
|
|
||||||
*
|
|
||||||
* Similar to armv7m_nvic_set_pending(), but specifically for derived
|
|
||||||
* exceptions (exceptions generated in the course of trying to take
|
|
||||||
* a different exception).
|
|
||||||
*/
|
|
||||||
void armv7m_nvic_set_pending_derived(NVICState *s, int irq, bool secure);
|
|
||||||
/**
|
|
||||||
* armv7m_nvic_set_pending_lazyfp: mark this lazy FP exception as pending
|
|
||||||
* @s: the NVIC
|
|
||||||
* @irq: the exception number to mark pending
|
|
||||||
* @secure: false for non-banked exceptions or for the nonsecure
|
|
||||||
* version of a banked exception, true for the secure version of a banked
|
|
||||||
* exception.
|
|
||||||
*
|
|
||||||
* Similar to armv7m_nvic_set_pending(), but specifically for exceptions
|
|
||||||
* generated in the course of lazy stacking of FP registers.
|
|
||||||
*/
|
|
||||||
void armv7m_nvic_set_pending_lazyfp(NVICState *s, int irq, bool secure);
|
|
||||||
/**
|
|
||||||
* armv7m_nvic_get_pending_irq_info: return highest priority pending
|
|
||||||
* exception, and whether it targets Secure state
|
|
||||||
* @s: the NVIC
|
|
||||||
* @pirq: set to pending exception number
|
|
||||||
* @ptargets_secure: set to whether pending exception targets Secure
|
|
||||||
*
|
|
||||||
* This function writes the number of the highest priority pending
|
|
||||||
* exception (the one which would be made active by
|
|
||||||
* armv7m_nvic_acknowledge_irq()) to @pirq, and sets @ptargets_secure
|
|
||||||
* to true if the current highest priority pending exception should
|
|
||||||
* be taken to Secure state, false for NS.
|
|
||||||
*/
|
|
||||||
void armv7m_nvic_get_pending_irq_info(NVICState *s, int *pirq,
|
|
||||||
bool *ptargets_secure);
|
|
||||||
/**
|
|
||||||
* armv7m_nvic_acknowledge_irq: make highest priority pending exception active
|
|
||||||
* @s: the NVIC
|
|
||||||
*
|
|
||||||
* Move the current highest priority pending exception from the pending
|
|
||||||
* state to the active state, and update v7m.exception to indicate that
|
|
||||||
* it is the exception currently being handled.
|
|
||||||
*/
|
|
||||||
void armv7m_nvic_acknowledge_irq(NVICState *s);
|
|
||||||
/**
|
|
||||||
* armv7m_nvic_complete_irq: complete specified interrupt or exception
|
|
||||||
* @s: the NVIC
|
|
||||||
* @irq: the exception number to complete
|
|
||||||
* @secure: true if this exception was secure
|
|
||||||
*
|
|
||||||
* Returns: -1 if the irq was not active
|
|
||||||
* 1 if completing this irq brought us back to base (no active irqs)
|
|
||||||
* 0 if there is still an irq active after this one was completed
|
|
||||||
* (Ignoring -1, this is the same as the RETTOBASE value before completion.)
|
|
||||||
*/
|
|
||||||
int armv7m_nvic_complete_irq(NVICState *s, int irq, bool secure);
|
|
||||||
/**
|
|
||||||
* armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
|
|
||||||
* @s: the NVIC
|
|
||||||
* @irq: the exception number to mark pending
|
|
||||||
* @secure: false for non-banked exceptions or for the nonsecure
|
|
||||||
* version of a banked exception, true for the secure version of a banked
|
|
||||||
* exception.
|
|
||||||
*
|
|
||||||
* Return whether an exception is "ready", i.e. whether the exception is
|
|
||||||
* enabled and is configured at a priority which would allow it to
|
|
||||||
* interrupt the current execution priority. This controls whether the
|
|
||||||
* RDY bit for it in the FPCCR is set.
|
|
||||||
*/
|
|
||||||
bool armv7m_nvic_get_ready_status(NVICState *s, int irq, bool secure);
|
|
||||||
/**
|
|
||||||
* armv7m_nvic_raw_execution_priority: return the raw execution priority
|
|
||||||
* @s: the NVIC
|
|
||||||
*
|
|
||||||
* Returns: the raw execution priority as defined by the v8M architecture.
|
|
||||||
* This is the execution priority minus the effects of AIRCR.PRIS,
|
|
||||||
* and minus any PRIMASK/FAULTMASK/BASEPRI priority boosting.
|
|
||||||
* (v8M ARM ARM I_PKLD.)
|
|
||||||
*/
|
|
||||||
int armv7m_nvic_raw_execution_priority(NVICState *s);
|
|
||||||
/**
|
|
||||||
* armv7m_nvic_neg_prio_requested: return true if the requested execution
|
|
||||||
* priority is negative for the specified security state.
|
|
||||||
* @s: the NVIC
|
|
||||||
* @secure: the security state to test
|
|
||||||
* This corresponds to the pseudocode IsReqExecPriNeg().
|
|
||||||
*/
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
|
||||||
bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure);
|
|
||||||
#else
|
|
||||||
static inline bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Interface for defining coprocessor registers.
|
/* Interface for defining coprocessor registers.
|
||||||
* Registers are defined in tables of arm_cp_reginfo structs
|
* Registers are defined in tables of arm_cp_reginfo structs
|
||||||
* which are passed to define_arm_cp_regs().
|
* which are passed to define_arm_cp_regs().
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#endif
|
#endif
|
||||||
#include "cpregs.h"
|
#include "cpregs.h"
|
||||||
|
#if !defined(CONFIG_USER_ONLY) && defined(CONFIG_TCG)
|
||||||
|
#include "hw/intc/armv7m_nvic.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Share AArch32 -cpu max features with AArch64. */
|
/* Share AArch32 -cpu max features with AArch64. */
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
#include "exec/cpu_ldst.h"
|
#include "exec/cpu_ldst.h"
|
||||||
#include "semihosting/common-semi.h"
|
#include "semihosting/common-semi.h"
|
||||||
#endif
|
#endif
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
#include "hw/intc/armv7m_nvic.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
static void v7m_msr_xpsr(CPUARMState *env, uint32_t mask,
|
static void v7m_msr_xpsr(CPUARMState *env, uint32_t mask,
|
||||||
uint32_t reg, uint32_t val)
|
uint32_t reg, uint32_t val)
|
||||||
|
|
Loading…
Reference in New Issue