arm: core: mpu: Prevent updating unexpected region
The REGION bits (bit[3:0]) of MPU_RBAR register can specify the number
of the region to update if the VALID bit (bit[4]) is also set.
If the bit[3:0] of "region_addr" are not zero, might cause to update
unexpected region. This could happen since we might not declare stack
memory with specific alignment.
This patch will mask the bit[4:0] of "region_addr" to prevent updating
unexpected region.
Signed-off-by: Chunlin Han <chunlin.han@linaro.org>
diff --git a/arch/arm/core/cortex_m/mpu/arm_mpu.c b/arch/arm/core/cortex_m/mpu/arm_mpu.c
index 8a0f00e..1568fcc 100644
--- a/arch/arm/core/cortex_m/mpu/arm_mpu.c
+++ b/arch/arm/core/cortex_m/mpu/arm_mpu.c
@@ -64,7 +64,8 @@
/* Select the region you want to access */
ARM_MPU_DEV->rnr = index;
/* Configure the region */
- ARM_MPU_DEV->rbar = region_addr | REGION_VALID | index;
+ ARM_MPU_DEV->rbar = (region_addr & REGION_BASE_ADDR_MASK)
+ | REGION_VALID | index;
ARM_MPU_DEV->rasr = region_attr | REGION_ENABLE;
}
diff --git a/include/arch/arm/cortex_m/mpu/arm_mpu.h b/include/arch/arm/cortex_m/mpu/arm_mpu.h
index 5a8399e..86145e0 100644
--- a/include/arch/arm/cortex_m/mpu/arm_mpu.h
+++ b/include/arch/arm/cortex_m/mpu/arm_mpu.h
@@ -44,6 +44,9 @@
#define ARM_MPU_PRIVDEFENA (1 << 2)
#define REGION_VALID (1 << 4)
+/* ARM MPU RBAR Register */
+/* Region base address mask */
+#define REGION_BASE_ADDR_MASK 0xFFFFFFE0
/* eXecute Never */
#define NOT_EXEC (0x1 << 28)