arch: arm: thread built-in stack guard implementation
This commit activates the built-in stack guard on the main_thread before jumping to it upon system initialization. Stack guard is activated if BUILTIN_STACK_GUARD is enabled by the user. The commit also activates built-in thread stack guards at every context switch, if BUILTIN_STACK_GUARD enabled by the user. Signed-off-by: Ioannis Glaropoulos <Ioannis.Glaropoulos@nordicsemi.no>
This commit is contained in:
parent
91dc3bd0f9
commit
8d1b013f3c
4 changed files with 44 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue