From 80a7f76152acab6d864047925069516eebea6543 Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Sun, 2 Jun 2013 17:52:52 +0200 Subject: Added stack checking for ARMv7M using R10, R10 NOT reserved yet --- nuttx/arch/arm/src/armv7-m/Kconfig | 6 ++++++ nuttx/arch/arm/src/armv7-m/up_initialstate.c | 10 ++++++++++ 2 files changed, 16 insertions(+) (limited to 'nuttx/arch/arm/src/armv7-m') 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; -- cgit v1.2.3