This patchset implements the v8M stack limit checking feature, which is the last missing piece of the v8M architectural support.
Note that the stack limit triggers when the SP value is changed to something below the limit, not when a load or store is performed below the limit. It's also done only for certain instructions that update SP, not for every possible way to change SP. For loads and stores which do writeback to SP there are also some rules about what parts of the load/store are permitted to happen if the check triggers -- we keep things simple by taking the approach of doing the check first so that no accesses are done. We take a straightforward approach to implementing the checks: generating a call to a helper function which does the comparison and might raise an exception. This obviously imposes some overhead for the common case where the limit isn't being breached, but generating code for a compare-and-conditionally-call seemed too tricky to insert into the existing code... thanks -- PMM Peter Maydell (13): target/arm: Define new TBFLAG for v8M stack checking target/arm: Define new EXCP type for v8M stack overflows target/arm: Move v7m_using_psp() to internals.h target/arm: Add v8M stack checks on ADD/SUB/MOV of SP target/arm: Add some comments in Thumb decode target/arm: Add v8M stack checks on exception entry target/arm: Add v8M stack limit checks on NS function calls target/arm: Add v8M stack checks for LDRD/STRD (imm) target/arm: Add v8M stack checks for Thumb2 LDM/STM target/arm: Add v8M stack checks for T32 load/store single target/arm: Add v8M stack checks for Thumb push/pop target/arm: Add v8M stack checks for VLDM/VSTM target/arm: Add v8M stack checks for MSR to SP_NS target/arm/cpu.h | 9 ++ target/arm/helper.h | 2 + target/arm/internals.h | 38 ++++++++ target/arm/translate.h | 1 + target/arm/helper.c | 99 ++++++++++++++++----- target/arm/op_helper.c | 23 ++++- target/arm/translate.c | 198 +++++++++++++++++++++++++++++++++++++---- 7 files changed, 330 insertions(+), 40 deletions(-) -- 2.19.0