arch: arm: utilize Kconfig option for min ARM MPU region size
The commit enforces the use of ARM_MPU_REGION_MIN_ALIGN_AND_SIZE in include/arch/arm/arch.h, instead of using 32 as a hard-coded value. The symbol is also used in arm/thread.c to truncate the thread stack size to satisfy MPU granularity. The commit does not introduce behavioral changes. Signed-off-by: Ioannis Glaropoulos <Ioannis.Glaropoulos@nordicsemi.no>
This commit is contained in:
parent
6bbb8273d2
commit
80d38788fc
2 changed files with 18 additions and 15 deletions
|
@ -122,11 +122,9 @@ FUNC_NORETURN void _arch_user_mode_enter(k_thread_entry_t user_entry,
|
||||||
_current->arch.priv_stack_size =
|
_current->arch.priv_stack_size =
|
||||||
(u32_t)CONFIG_PRIVILEGED_STACK_SIZE;
|
(u32_t)CONFIG_PRIVILEGED_STACK_SIZE;
|
||||||
|
|
||||||
/* FIXME: Need a general API for aligning stacks so that the initial
|
/* Truncate the stack size with the MPU region granularity. */
|
||||||
* user thread stack pointer doesn't overshoot the granularity of MPU
|
_current->stack_info.size &=
|
||||||
* regions, that works for ARM/NXP/QEMU.
|
~(CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE - 1);
|
||||||
*/
|
|
||||||
_current->stack_info.size &= ~0x1f;
|
|
||||||
|
|
||||||
_arm_userspace_enter(user_entry, p1, p2, p3,
|
_arm_userspace_enter(user_entry, p1, p2, p3,
|
||||||
(u32_t)_current->stack_info.start,
|
(u32_t)_current->stack_info.start,
|
||||||
|
|
|
@ -92,9 +92,9 @@ extern "C" {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_MPU_STACK_GUARD)
|
#if defined(CONFIG_MPU_STACK_GUARD)
|
||||||
#define MPU_GUARD_ALIGN_AND_SIZE 32
|
#define MPU_GUARD_ALIGN_AND_SIZE CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE
|
||||||
#else
|
#else
|
||||||
#define MPU_GUARD_ALIGN_AND_SIZE 0
|
#define MPU_GUARD_ALIGN_AND_SIZE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -107,7 +107,7 @@ extern "C" {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_USERSPACE)
|
#if defined(CONFIG_USERSPACE)
|
||||||
#define STACK_ALIGN 32
|
#define STACK_ALIGN CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE
|
||||||
#else
|
#else
|
||||||
#define STACK_ALIGN max(STACK_ALIGN_SIZE, MPU_GUARD_ALIGN_AND_SIZE)
|
#define STACK_ALIGN max(STACK_ALIGN_SIZE, MPU_GUARD_ALIGN_AND_SIZE)
|
||||||
#endif
|
#endif
|
||||||
|
@ -258,10 +258,11 @@ extern "C" {
|
||||||
#include <arch/arm/cortex_m/mpu/arm_mpu.h>
|
#include <arch/arm/cortex_m/mpu/arm_mpu.h>
|
||||||
#endif /* _ASMLANGUAGE */
|
#endif /* _ASMLANGUAGE */
|
||||||
#define _ARCH_MEM_PARTITION_ALIGN_CHECK(start, size) \
|
#define _ARCH_MEM_PARTITION_ALIGN_CHECK(start, size) \
|
||||||
BUILD_ASSERT_MSG(!(((size) & ((size) - 1))) && (size) >= 32 && \
|
BUILD_ASSERT_MSG(!(((size) & ((size) - 1))) && \
|
||||||
|
(size) >= CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE && \
|
||||||
!((u32_t)(start) & ((size) - 1)), \
|
!((u32_t)(start) & ((size) - 1)), \
|
||||||
"the size of the partition must be power of 2" \
|
"the size of the partition must be power of 2" \
|
||||||
" and greater than or equal to 32." \
|
" and greater than or equal to the minimum MPU region size." \
|
||||||
"start address of the partition must align with size.")
|
"start address of the partition must align with size.")
|
||||||
#endif /* CONFIG_CPU_HAS_ARM_MPU */
|
#endif /* CONFIG_CPU_HAS_ARM_MPU */
|
||||||
#ifdef CONFIG_CPU_HAS_NXP_MPU
|
#ifdef CONFIG_CPU_HAS_NXP_MPU
|
||||||
|
@ -313,11 +314,15 @@ extern "C" {
|
||||||
|
|
||||||
#endif /* _ASMLANGUAGE */
|
#endif /* _ASMLANGUAGE */
|
||||||
#define _ARCH_MEM_PARTITION_ALIGN_CHECK(start, size) \
|
#define _ARCH_MEM_PARTITION_ALIGN_CHECK(start, size) \
|
||||||
BUILD_ASSERT_MSG((size) % 32 == 0 && (size) >= 32 && \
|
BUILD_ASSERT_MSG((size) % \
|
||||||
(u32_t)(start) % 32 == 0, \
|
CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE == 0 && \
|
||||||
"the size of the partition must align with 32" \
|
(size) >= CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE && \
|
||||||
" and greater than or equal to 32." \
|
(u32_t)(start) % CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE == 0, \
|
||||||
"start address of the partition must align with 32.")
|
"the size of the partition must align with minimum MPU \
|
||||||
|
region size" \
|
||||||
|
" and greater than or equal to minimum MPU region size." \
|
||||||
|
"start address of the partition must align with minimum MPU \
|
||||||
|
region size.")
|
||||||
#endif /* CONFIG_CPU_HAS_ARM_MPU */
|
#endif /* CONFIG_CPU_HAS_ARM_MPU */
|
||||||
#endif /* CONFIG_USERSPACE */
|
#endif /* CONFIG_USERSPACE */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue