diff --git a/arch/arm/core/Kconfig b/arch/arm/core/Kconfig index a2f6831c2ab..1e74d052823 100644 --- a/arch/arm/core/Kconfig +++ b/arch/arm/core/Kconfig @@ -37,6 +37,7 @@ config CPU_HAS_SYSTICK config BUILTIN_STACK_GUARD bool "Thread Stack Guards based on built-in ARM stack limit checking" depends on CPU_CORTEX_M_HAS_SPLIM + select THREAD_STACK_INFO default n help Enable Thread/Interrupt Stack Guards via built-in Stack Pointer diff --git a/arch/arm/core/swap_helper.S b/arch/arm/core/swap_helper.S index 164393978bf..d4e95abc41b 100644 --- a/arch/arm/core/swap_helper.S +++ b/arch/arm/core/swap_helper.S @@ -175,6 +175,14 @@ _thread_irq_disabled: pop {r2, lr} #endif /* CONFIG_MPU_STACK_GUARD */ +#ifdef CONFIG_BUILTIN_STACK_GUARD + /* r2 contains k_thread */ + add r0, r2, #0 + push {r2, lr} + blx configure_builtin_stack_guard + pop {r2, lr} +#endif /* CONFIG_BUILTIN_STACK_GUARD */ + #ifdef CONFIG_USERSPACE /* restore mode */ ldr r0, [r2, #_thread_offset_to_mode] diff --git a/arch/arm/core/thread.c b/arch/arm/core/thread.c index 81211d0a510..50969fcfe0a 100644 --- a/arch/arm/core/thread.c +++ b/arch/arm/core/thread.c @@ -141,3 +141,29 @@ FUNC_NORETURN void _arch_user_mode_enter(k_thread_entry_t user_entry, } #endif + +#if defined(CONFIG_BUILTIN_STACK_GUARD) +/* + * @brief Configure ARM built-in stack guard + * + * This function configures per thread stack guards by reprogramming + * the built-in Process Stack Pointer Limit Register (PSPLIM). + * + * @param thread thread info data structure. + */ +void configure_builtin_stack_guard(struct k_thread *thread) +{ +#if defined(CONFIG_USERSPACE) + u32_t guard_start = thread->arch.priv_stack_start ? + (u32_t)thread->arch.priv_stack_start : + (u32_t)thread->stack_obj; +#else + u32_t guard_start = thread->stack_info.start; +#endif +#if defined(CONFIG_CPU_CORTEX_M_HAS_SPLIM) + __set_PSPLIM(guard_start); +#else +#error "Built-in PSP limit checks not supported by HW" +#endif +} +#endif /* CONFIG_BUIILTIN_STACK_GUARD */ diff --git a/arch/arm/include/kernel_arch_func.h b/arch/arm/include/kernel_arch_func.h index 773d8fc5261..6934727fffd 100644 --- a/arch/arm/include/kernel_arch_func.h +++ b/arch/arm/include/kernel_arch_func.h @@ -59,6 +59,15 @@ _arch_switch_to_main_thread(struct k_thread *main_thread, /* the ready queue cache already contains the main thread */ +#if defined(CONFIG_BUILTIN_STACK_GUARD) + /* Set PSPLIM register for built-in stack guarding of main thread. */ +#if defined(CONFIG_CPU_CORTEX_M_HAS_SPLIM) + __set_PSPLIM((u32_t)main_stack); +#else +#error "Built-in PSP limit checks not supported by HW" +#endif +#endif /* CONFIG_BUILTIN_STACK_GUARD */ + __asm__ __volatile__( /* move to main() thread stack */