mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
target/arm: Add v8M stack checks on ADD/SUB/MOV of SP
Add code to insert calls to a helper function to do the stack limit checking when we handle these forms of instruction that write to SP: * ADD (SP plus immediate) * ADD (SP plus register) * SUB (SP minus immediate) * SUB (SP minus register) * MOV (register) Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20181002163556.10279-5-peter.maydell@linaro.org
This commit is contained in:
parent
5529bf188d
commit
5520318939
4 changed files with 106 additions and 9 deletions
|
@ -238,6 +238,25 @@ void arm_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
|
|||
|
||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||
|
||||
void HELPER(v8m_stackcheck)(CPUARMState *env, uint32_t newvalue)
|
||||
{
|
||||
/*
|
||||
* Perform the v8M stack limit check for SP updates from translated code,
|
||||
* raising an exception if the limit is breached.
|
||||
*/
|
||||
if (newvalue < v7m_sp_limit(env)) {
|
||||
CPUState *cs = CPU(arm_env_get_cpu(env));
|
||||
|
||||
/*
|
||||
* Stack limit exceptions are a rare case, so rather than syncing
|
||||
* PC/condbits before the call, we use cpu_restore_state() to
|
||||
* get them right before raising the exception.
|
||||
*/
|
||||
cpu_restore_state(cs, GETPC(), true);
|
||||
raise_exception(env, EXCP_STKOF, 0, 1);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t HELPER(add_setq)(CPUARMState *env, uint32_t a, uint32_t b)
|
||||
{
|
||||
uint32_t res = a + b;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue