diff options
author | Lorenz Meier <lm@inf.ethz.ch> | 2013-06-02 17:59:43 +0200 |
---|---|---|
committer | Lorenz Meier <lm@inf.ethz.ch> | 2013-06-02 17:59:43 +0200 |
commit | dbcaa670d97b6676e5f0f357ff2de76dd497420b (patch) | |
tree | e781e95d122cff8096f8b240f00d94c67b28aee0 /nuttx/arch/arm/src/armv7-m | |
parent | ae4a2c022ed4f01a14afa422f2cd62b7c5aef73f (diff) | |
parent | 80a7f76152acab6d864047925069516eebea6543 (diff) | |
download | px4-nuttx-dbcaa670d97b6676e5f0f357ff2de76dd497420b.tar.gz px4-nuttx-dbcaa670d97b6676e5f0f357ff2de76dd497420b.tar.bz2 px4-nuttx-dbcaa670d97b6676e5f0f357ff2de76dd497420b.zip |
Merge branch 'stack_check' into integration
Diffstat (limited to 'nuttx/arch/arm/src/armv7-m')
-rw-r--r-- | nuttx/arch/arm/src/armv7-m/Kconfig | 6 | ||||
-rw-r--r-- | nuttx/arch/arm/src/armv7-m/up_initialstate.c | 10 |
2 files changed, 16 insertions, 0 deletions
diff --git a/nuttx/arch/arm/src/armv7-m/Kconfig b/nuttx/arch/arm/src/armv7-m/Kconfig index a154a4c5c..9c55068d5 100644 --- a/nuttx/arch/arm/src/armv7-m/Kconfig +++ b/nuttx/arch/arm/src/armv7-m/Kconfig @@ -57,3 +57,9 @@ config ARMV7M_OABI_TOOLCHAIN ---help--- Most of the older buildroot toolchains are OABI and are named arm-nuttx-elf- vs. arm-nuttx-eabi- +config ARMV7M_STACKCHECK + bool "Steck for stack overflow on function calls" + default n + ---help--- + This check uses R10 to check for a stack overflow within function calls. This has a performance impact, + but will be able to catch hard to find stack overflows. diff --git a/nuttx/arch/arm/src/armv7-m/up_initialstate.c b/nuttx/arch/arm/src/armv7-m/up_initialstate.c index c19d32f11..04089f8ac 100644 --- a/nuttx/arch/arm/src/armv7-m/up_initialstate.c +++ b/nuttx/arch/arm/src/armv7-m/up_initialstate.c @@ -93,6 +93,16 @@ void up_initial_state(struct tcb_s *tcb) xcp->regs[REG_SP] = (uint32_t)tcb->adj_stack_ptr; +#ifdef CONFIG_ARMV7M_STACKCHECK + /* Set the stack limit value */ + + xcp->regs[REG_R10] = (uint32_t)tcb->stack_alloc_ptr + 64; + + /* Fill the stack with a watermark value */ + + memset(tcb->stack_alloc_ptr, 0xff, tcb->adj_stack_size); +#endif + /* Save the task entry point (stripping off the thumb bit) */ xcp->regs[REG_PC] = (uint32_t)tcb->start & ~1; |