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
|
config BUILTIN_STACK_GUARD
|
||||||
bool "Thread Stack Guards based on built-in ARM stack limit checking"
|
bool "Thread Stack Guards based on built-in ARM stack limit checking"
|
||||||
depends on CPU_CORTEX_M_HAS_SPLIM
|
depends on CPU_CORTEX_M_HAS_SPLIM
|
||||||
|
select THREAD_STACK_INFO
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
Enable Thread/Interrupt Stack Guards via built-in Stack Pointer
|
Enable Thread/Interrupt Stack Guards via built-in Stack Pointer
|
||||||
|
|
|
@ -175,6 +175,14 @@ _thread_irq_disabled:
|
||||||
pop {r2, lr}
|
pop {r2, lr}
|
||||||
#endif /* CONFIG_MPU_STACK_GUARD */
|
#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
|
#ifdef CONFIG_USERSPACE
|
||||||
/* restore mode */
|
/* restore mode */
|
||||||
ldr r0, [r2, #_thread_offset_to_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
|
#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 */
|
/* 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__(
|
__asm__ __volatile__(
|
||||||
|
|
||||||
/* move to main() thread stack */
|
/* move to main() thread stack */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue