summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/armv7-m
diff options
context:
space:
mode:
authorLorenz Meier <lm@inf.ethz.ch>2013-06-02 17:59:43 +0200
committerLorenz Meier <lm@inf.ethz.ch>2013-06-02 17:59:43 +0200
commitdbcaa670d97b6676e5f0f357ff2de76dd497420b (patch)
treee781e95d122cff8096f8b240f00d94c67b28aee0 /nuttx/arch/arm/src/armv7-m
parentae4a2c022ed4f01a14afa422f2cd62b7c5aef73f (diff)
parent80a7f76152acab6d864047925069516eebea6543 (diff)
downloadpx4-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/Kconfig6
-rw-r--r--nuttx/arch/arm/src/armv7-m/up_initialstate.c10
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;