/******************************************************************************\r
* @file mpu_armv8.h\r
- * @brief CMSIS MPU API for Armv8-M MPU\r
- * @version V5.0.4\r
- * @date 10. January 2018\r
+ * @brief CMSIS MPU API for Armv8-M and Armv8.1-M MPU\r
+ * @version V5.1.0\r
+ * @date 08. March 2019\r
******************************************************************************/\r
/*\r
- * Copyright (c) 2017-2018 Arm Limited. All rights reserved.\r
+ * Copyright (c) 2017-2019 Arm Limited. All rights reserved.\r
*\r
* SPDX-License-Identifier: Apache-2.0\r
*\r
* \oaram XN eXecute Never: Set to 1 for a non-executable memory region.\r
*/\r
#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \\r
- ((BASE & MPU_RBAR_BASE_Pos) | \\r
+ ((BASE & MPU_RBAR_BASE_Msk) | \\r
((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \\r
((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \\r
((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk))\r
((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \\r
(MPU_RLAR_EN_Msk))\r
\r
+#if defined(MPU_RLAR_PXN_Pos)\r
+ \r
+/** \brief Region Limit Address Register with PXN value\r
+* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.\r
+* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region.\r
+* \param IDX The attribute index to be associated with this memory region.\r
+*/\r
+#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \\r
+ ((LIMIT & MPU_RLAR_LIMIT_Msk) | \\r
+ ((PXN << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \\r
+ ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \\r
+ (MPU_RLAR_EN_Msk))\r
+ \r
+#endif\r
+\r
/**\r
* Struct for a single MPU Region\r
*/\r
*/\r
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control)\r
{\r
- __DSB();\r
- __ISB();\r
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;\r
#ifdef SCB_SHCSR_MEMFAULTENA_Msk\r
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;\r
#endif\r
+ __DSB();\r
+ __ISB();\r
}\r
\r
/** Disable the MPU.\r
*/\r
__STATIC_INLINE void ARM_MPU_Disable(void)\r
{\r
- __DSB();\r
- __ISB();\r
+ __DMB();\r
#ifdef SCB_SHCSR_MEMFAULTENA_Msk\r
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;\r
#endif\r
*/\r
__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control)\r
{\r
- __DSB();\r
- __ISB();\r
MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;\r
#ifdef SCB_SHCSR_MEMFAULTENA_Msk\r
SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;\r
#endif\r
+ __DSB();\r
+ __ISB();\r
}\r
\r
/** Disable the Non-secure MPU.\r
*/\r
__STATIC_INLINE void ARM_MPU_Disable_NS(void)\r
{\r
- __DSB();\r
- __ISB();\r
+ __DMB();\r
#ifdef SCB_SHCSR_MEMFAULTENA_Msk\r
SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;\r
#endif\r
* \param src Source data is copied from.\r
* \param len Amount of data words to be copied.\r
*/\r
-__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)\r
+__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)\r
{\r
uint32_t i;\r
for (i = 0U; i < len; ++i) \r
const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;\r
if (cnt == 1U) {\r
mpu->RNR = rnr;\r
- orderedCpy(&(mpu->RBAR), &(table->RBAR), rowWordSize);\r
+ ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize);\r
} else {\r
uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U);\r
uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES;\r
mpu->RNR = rnrBase;\r
while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) {\r
uint32_t c = MPU_TYPE_RALIASES - rnrOffset;\r
- orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize);\r
+ ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize);\r
table += c;\r
cnt -= c;\r
rnrOffset = 0U;\r
mpu->RNR = rnrBase;\r
}\r
\r
- orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize);\r
+ ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize);\r
}\r
}\r
\r