arm/armv[7|8]-m: add syn barrier for MPU ops

Execute data and instruction sync barriers after writing MPU register,
to ensure MPU setting take effects that the new changes are seen.

testing in lm3s6965-ek:qemu-protected

Signed-off-by: fangxinyong <fangxinyong@xiaomi.com>
This commit is contained in:
fangxinyong 2024-01-23 17:36:06 +08:00 committed by Xiang Xiao
parent 1e29b8de1d
commit 13cb355a4e
2 changed files with 28 additions and 0 deletions

View File

@ -29,6 +29,7 @@
#include "mpu.h" #include "mpu.h"
#include "arm_internal.h" #include "arm_internal.h"
#include "barriers.h"
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions
@ -201,6 +202,9 @@ static void mpu_reset_internal()
} }
putreg32(0, MPU_CTRL); putreg32(0, MPU_CTRL);
ARM_DSB();
ARM_ISB();
} }
#endif #endif
@ -356,6 +360,11 @@ void mpu_control(bool enable, bool hfnmiena, bool privdefena)
} }
putreg32(regval, MPU_CTRL); putreg32(regval, MPU_CTRL);
/* Ensure MPU setting take effects */
ARM_DSB();
ARM_ISB();
} }
/**************************************************************************** /****************************************************************************
@ -413,6 +422,11 @@ void mpu_configure_region(uintptr_t base, size_t size,
((uint32_t)subregions << MPU_RASR_SRD_SHIFT) | /* Sub-regions */ ((uint32_t)subregions << MPU_RASR_SRD_SHIFT) | /* Sub-regions */
flags; flags;
putreg32(regval, MPU_RASR); putreg32(regval, MPU_RASR);
/* Ensure MPU setting take effects */
ARM_DSB();
ARM_ISB();
} }
/**************************************************************************** /****************************************************************************

View File

@ -29,6 +29,7 @@
#include "mpu.h" #include "mpu.h"
#include "arm_internal.h" #include "arm_internal.h"
#include "barriers.h"
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions
@ -95,6 +96,9 @@ static void mpu_reset_internal()
} }
putreg32(0, MPU_CTRL); putreg32(0, MPU_CTRL);
ARM_DSB();
ARM_ISB();
} }
#endif #endif
@ -139,6 +143,11 @@ void mpu_control(bool enable, bool hfnmiena, bool privdefena)
} }
putreg32(regval, MPU_CTRL); putreg32(regval, MPU_CTRL);
/* Ensure MPU setting take effects */
ARM_DSB();
ARM_ISB();
} }
/**************************************************************************** /****************************************************************************
@ -174,6 +183,11 @@ void mpu_configure_region(uintptr_t base, size_t size,
putreg32(base | flags1, MPU_RBAR); putreg32(base | flags1, MPU_RBAR);
putreg32(limit | flags2 | MPU_RLAR_ENABLE, MPU_RLAR); putreg32(limit | flags2 | MPU_RLAR_ENABLE, MPU_RLAR);
/* Ensure MPU setting take effects */
ARM_DSB();
ARM_ISB();
} }
/**************************************************************************** /****************************************************************************