LCOV - code coverage report
Current view: top level - zephyr/arch/arm/mpu - arm_mpu_v7m.h Hit Total Coverage
Test: new.info Lines: 0 100 0.0 %
Date: 2024-12-21 18:13:37

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2018 Linaro Limited.
       3             :  * Copyright (c) 2018 Nordic Semiconductor ASA.
       4             :  *
       5             :  * SPDX-License-Identifier: Apache-2.0
       6             :  */
       7             : 
       8             : #ifndef _ASMLANGUAGE
       9             : 
      10             : #include <cmsis_core.h>
      11             : 
      12             : /* Convenience macros to represent the ARMv7-M-specific
      13             :  * configuration for memory access permission and
      14             :  * cache-ability attribution.
      15             :  */
      16             : 
      17             : /* Privileged No Access, Unprivileged No Access */
      18           0 : #define NO_ACCESS       0x0
      19           0 : #define NO_ACCESS_Msk   ((NO_ACCESS << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
      20             : /* Privileged No Access, Unprivileged No Access */
      21           0 : #define P_NA_U_NA       0x0
      22           0 : #define P_NA_U_NA_Msk   ((P_NA_U_NA << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
      23             : /* Privileged Read Write, Unprivileged No Access */
      24           0 : #define P_RW_U_NA       0x1
      25           0 : #define P_RW_U_NA_Msk   ((P_RW_U_NA << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
      26             : /* Privileged Read Write, Unprivileged Read Only */
      27           0 : #define P_RW_U_RO       0x2
      28           0 : #define P_RW_U_RO_Msk   ((P_RW_U_RO << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
      29             : /* Privileged Read Write, Unprivileged Read Write */
      30           0 : #define P_RW_U_RW       0x3U
      31           0 : #define P_RW_U_RW_Msk   ((P_RW_U_RW << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
      32             : /* Privileged Read Write, Unprivileged Read Write */
      33           0 : #define FULL_ACCESS     0x3
      34           0 : #define FULL_ACCESS_Msk ((FULL_ACCESS << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
      35             : /* Privileged Read Only, Unprivileged No Access */
      36           0 : #define P_RO_U_NA       0x5
      37           0 : #define P_RO_U_NA_Msk   ((P_RO_U_NA << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
      38             : /* Privileged Read Only, Unprivileged Read Only */
      39           0 : #define P_RO_U_RO       0x6
      40           0 : #define P_RO_U_RO_Msk   ((P_RO_U_RO << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
      41             : /* Privileged Read Only, Unprivileged Read Only */
      42           0 : #define RO              0x7
      43           0 : #define RO_Msk          ((RO << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
      44             : 
      45             : /* Attribute flag for not-allowing execution (eXecute Never) */
      46           0 : #define NOT_EXEC MPU_RASR_XN_Msk
      47             : 
      48             : /* The following definitions are for internal use in arm_mpu.h. */
      49           0 : #define STRONGLY_ORDERED_SHAREABLE      MPU_RASR_S_Msk
      50           0 : #define DEVICE_SHAREABLE                (MPU_RASR_B_Msk | MPU_RASR_S_Msk)
      51           0 : #define NORMAL_OUTER_INNER_WRITE_THROUGH_SHAREABLE \
      52             :                 (MPU_RASR_C_Msk | MPU_RASR_S_Msk)
      53           0 : #define NORMAL_OUTER_INNER_WRITE_THROUGH_NON_SHAREABLE  MPU_RASR_C_Msk
      54           0 : #define NORMAL_OUTER_INNER_WRITE_BACK_SHAREABLE \
      55             :                 (MPU_RASR_C_Msk | MPU_RASR_B_Msk | MPU_RASR_S_Msk)
      56           0 : #define NORMAL_OUTER_INNER_WRITE_BACK_NON_SHAREABLE \
      57             :                 (MPU_RASR_C_Msk | MPU_RASR_B_Msk)
      58           0 : #define NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE \
      59             :                 ((1 << MPU_RASR_TEX_Pos) | MPU_RASR_S_Msk)
      60           0 : #define NORMAL_OUTER_INNER_NON_CACHEABLE_NON_SHAREABLE \
      61             :                 (1 << MPU_RASR_TEX_Pos)
      62           0 : #define NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_SHAREABLE \
      63             :         ((1 << MPU_RASR_TEX_Pos) |\
      64             :          MPU_RASR_C_Msk | MPU_RASR_B_Msk | MPU_RASR_S_Msk)
      65           0 : #define NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE \
      66             :         ((1 << MPU_RASR_TEX_Pos) | MPU_RASR_C_Msk | MPU_RASR_B_Msk)
      67           0 : #define DEVICE_NON_SHAREABLE            (2 << MPU_RASR_TEX_Pos)
      68             : 
      69             : /* Bit-masks to disable sub-regions. */
      70           0 : #define SUB_REGION_0_DISABLED   ((0x01 << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk)
      71           0 : #define SUB_REGION_1_DISABLED   ((0x02 << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk)
      72           0 : #define SUB_REGION_2_DISABLED   ((0x04 << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk)
      73           0 : #define SUB_REGION_3_DISABLED   ((0x08 << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk)
      74           0 : #define SUB_REGION_4_DISABLED   ((0x10 << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk)
      75           0 : #define SUB_REGION_5_DISABLED   ((0x20 << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk)
      76           0 : #define SUB_REGION_6_DISABLED   ((0x40 << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk)
      77           0 : #define SUB_REGION_7_DISABLED   ((0x80 << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk)
      78             : 
      79             : 
      80           0 : #define REGION_SIZE(size) ((ARM_MPU_REGION_SIZE_ ## size \
      81             :         << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk)
      82             : 
      83           0 : #define REGION_32B      REGION_SIZE(32B)
      84           0 : #define REGION_64B      REGION_SIZE(64B)
      85           0 : #define REGION_128B     REGION_SIZE(128B)
      86           0 : #define REGION_256B     REGION_SIZE(256B)
      87           0 : #define REGION_512B     REGION_SIZE(512B)
      88           0 : #define REGION_1K       REGION_SIZE(1KB)
      89           0 : #define REGION_2K       REGION_SIZE(2KB)
      90           0 : #define REGION_4K       REGION_SIZE(4KB)
      91           0 : #define REGION_8K       REGION_SIZE(8KB)
      92           0 : #define REGION_16K      REGION_SIZE(16KB)
      93           0 : #define REGION_32K      REGION_SIZE(32KB)
      94           0 : #define REGION_64K      REGION_SIZE(64KB)
      95           0 : #define REGION_128K     REGION_SIZE(128KB)
      96           0 : #define REGION_256K     REGION_SIZE(256KB)
      97           0 : #define REGION_512K     REGION_SIZE(512KB)
      98           0 : #define REGION_1M       REGION_SIZE(1MB)
      99           0 : #define REGION_2M       REGION_SIZE(2MB)
     100           0 : #define REGION_4M       REGION_SIZE(4MB)
     101           0 : #define REGION_8M       REGION_SIZE(8MB)
     102           0 : #define REGION_16M      REGION_SIZE(16MB)
     103           0 : #define REGION_32M      REGION_SIZE(32MB)
     104           0 : #define REGION_64M      REGION_SIZE(64MB)
     105           0 : #define REGION_128M     REGION_SIZE(128MB)
     106           0 : #define REGION_256M     REGION_SIZE(256MB)
     107           0 : #define REGION_512M     REGION_SIZE(512MB)
     108           0 : #define REGION_1G       REGION_SIZE(1GB)
     109           0 : #define REGION_2G       REGION_SIZE(2GB)
     110           0 : #define REGION_4G       REGION_SIZE(4GB)
     111             : 
     112           0 : #define ARM_MPU_REGION_INIT(p_name, p_base, p_size, p_attr)     \
     113             :         { .name = p_name,                                       \
     114             :           .base = p_base,                                       \
     115             :           .attr = p_attr(size_to_mpu_rasr_size(p_size)),        \
     116             :         }
     117             : 
     118             : /* Some helper defines for common regions */
     119             : 
     120             : /* On Cortex-M, we can only set the XN bit when CONFIG_XIP=y. When
     121             :  * CONFIG_XIP=n, the entire image will be linked to SRAM, so we need to keep
     122             :  * the SRAM region XN bit clear or the application code will not be executable.
     123             :  */
     124           0 : #define REGION_RAM_ATTR(size) \
     125             : { \
     126             :         (NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE | \
     127             :          IF_ENABLED(CONFIG_XIP, (MPU_RASR_XN_Msk |)) size | P_RW_U_NA_Msk) \
     128             : }
     129           0 : #define REGION_RAM_NOCACHE_ATTR(size) \
     130             : { \
     131             :         (NORMAL_OUTER_INNER_NON_CACHEABLE_NON_SHAREABLE | \
     132             :          MPU_RASR_XN_Msk | size | P_RW_U_NA_Msk) \
     133             : }
     134             : #if defined(CONFIG_MPU_ALLOW_FLASH_WRITE)
     135             : #define REGION_FLASH_ATTR(size) \
     136             : { \
     137             :         (NORMAL_OUTER_INNER_WRITE_THROUGH_NON_SHAREABLE | size | \
     138             :                 P_RW_U_RO_Msk) \
     139             : }
     140             : #else
     141           0 : #define REGION_FLASH_ATTR(size) \
     142             : { \
     143             :         (NORMAL_OUTER_INNER_WRITE_THROUGH_NON_SHAREABLE | size | RO_Msk) \
     144             : }
     145             : #endif
     146           0 : #define REGION_PPB_ATTR(size) { (STRONGLY_ORDERED_SHAREABLE | size | \
     147             :                 P_RW_U_NA_Msk) }
     148           0 : #define REGION_IO_ATTR(size) { (DEVICE_NON_SHAREABLE | size | P_RW_U_NA_Msk) }
     149           0 : #define REGION_EXTMEM_ATTR(size) { (STRONGLY_ORDERED_SHAREABLE | size | \
     150             :                 NO_ACCESS_Msk) }
     151             : 
     152           0 : struct arm_mpu_region_attr {
     153             :         /* Attributes belonging to RASR (including the encoded region size) */
     154           0 :         uint32_t rasr;
     155             : };
     156             : 
     157           0 : typedef struct arm_mpu_region_attr arm_mpu_region_attr_t;
     158             : 
     159             : /* Typedef for the k_mem_partition attribute */
     160           0 : typedef struct {
     161           0 :         uint32_t rasr_attr;
     162             : } k_mem_partition_attr_t;
     163             : 
     164             : /* Read-Write access permission attributes */
     165             : #define _K_MEM_PARTITION_P_NA_U_NA      (NO_ACCESS_Msk | NOT_EXEC)
     166             : #define _K_MEM_PARTITION_P_RW_U_RW      (P_RW_U_RW_Msk | NOT_EXEC)
     167             : #define _K_MEM_PARTITION_P_RW_U_RO      (P_RW_U_RO_Msk | NOT_EXEC)
     168             : #define _K_MEM_PARTITION_P_RW_U_NA      (P_RW_U_NA_Msk | NOT_EXEC)
     169             : #define _K_MEM_PARTITION_P_RO_U_RO      (P_RO_U_RO_Msk | NOT_EXEC)
     170             : #define _K_MEM_PARTITION_P_RO_U_NA      (P_RO_U_NA_Msk | NOT_EXEC)
     171             : 
     172             : /* Execution-allowed attributes */
     173             : #define _K_MEM_PARTITION_P_RWX_U_RWX (P_RW_U_RW_Msk)
     174             : #define _K_MEM_PARTITION_P_RWX_U_RX  (P_RW_U_RO_Msk)
     175             : #define _K_MEM_PARTITION_P_RX_U_RX   (P_RO_U_RO_Msk)
     176             : 
     177             : /* Kernel macros for memory attribution
     178             :  * (access permissions and cache-ability).
     179             :  *
     180             :  * The macros are to be stored in k_mem_partition_attr_t
     181             :  * objects. The format of k_mem_partition_attr_t is an
     182             :  * "1-1" mapping of the ARMv7-M MPU RASR attribute register
     183             :  * fields (excluding the <size> and <enable> bit-fields).
     184             :  */
     185             : 
     186             : /* Read-Write access permission attributes (default cache-ability) */
     187           0 : #define K_MEM_PARTITION_P_NA_U_NA       ((k_mem_partition_attr_t) \
     188             :         { _K_MEM_PARTITION_P_NA_U_NA | \
     189             :           NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE})
     190           0 : #define K_MEM_PARTITION_P_RW_U_RW       ((k_mem_partition_attr_t) \
     191             :         { _K_MEM_PARTITION_P_RW_U_RW | \
     192             :           NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE})
     193           0 : #define K_MEM_PARTITION_P_RW_U_RO       ((k_mem_partition_attr_t) \
     194             :         { _K_MEM_PARTITION_P_RW_U_RO | \
     195             :           NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE})
     196           0 : #define K_MEM_PARTITION_P_RW_U_NA       ((k_mem_partition_attr_t) \
     197             :         { _K_MEM_PARTITION_P_RW_U_NA | \
     198             :           NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE})
     199           0 : #define K_MEM_PARTITION_P_RO_U_RO       ((k_mem_partition_attr_t) \
     200             :         { _K_MEM_PARTITION_P_RO_U_RO | \
     201             :           NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE})
     202           0 : #define K_MEM_PARTITION_P_RO_U_NA       ((k_mem_partition_attr_t) \
     203             :         { _K_MEM_PARTITION_P_RO_U_NA | \
     204             :           NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE})
     205             : 
     206             : /* Execution-allowed attributes (default-cacheability) */
     207           0 : #define K_MEM_PARTITION_P_RWX_U_RWX     ((k_mem_partition_attr_t) \
     208             :         { _K_MEM_PARTITION_P_RWX_U_RWX | \
     209             :           NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE})
     210           0 : #define K_MEM_PARTITION_P_RWX_U_RX      ((k_mem_partition_attr_t) \
     211             :         { _K_MEM_PARTITION_P_RWX_U_RX | \
     212             :           NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE})
     213           0 : #define K_MEM_PARTITION_P_RX_U_RX       ((k_mem_partition_attr_t) \
     214             :         { _K_MEM_PARTITION_P_RX_U_RX | \
     215             :           NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE})
     216             : 
     217             : /*
     218             :  * @brief Evaluate Write-ability
     219             :  *
     220             :  * Evaluate whether the access permissions include write-ability.
     221             :  *
     222             :  * @param attr The k_mem_partition_attr_t object holding the
     223             :  *             MPU attributes to be checked against write-ability.
     224             :  */
     225           0 : #define K_MEM_PARTITION_IS_WRITABLE(attr) \
     226             :         ({ \
     227             :                 int __is_writable__; \
     228             :                 switch (attr.rasr_attr & MPU_RASR_AP_Msk) { \
     229             :                 case P_RW_U_RW_Msk: \
     230             :                 case P_RW_U_RO_Msk: \
     231             :                 case P_RW_U_NA_Msk: \
     232             :                         __is_writable__ = 1; \
     233             :                         break; \
     234             :                 default: \
     235             :                         __is_writable__ = 0; \
     236             :                 } \
     237             :                 __is_writable__; \
     238             :         })
     239             : 
     240             : /*
     241             :  * @brief Evaluate Execution allowance
     242             :  *
     243             :  * Evaluate whether the access permissions include execution.
     244             :  *
     245             :  * @param attr The k_mem_partition_attr_t object holding the
     246             :  *             MPU attributes to be checked against execution
     247             :  *             allowance.
     248             :  */
     249           0 : #define K_MEM_PARTITION_IS_EXECUTABLE(attr) \
     250             :         (!((attr.rasr_attr) & (NOT_EXEC)))
     251             : 
     252             : /* Attributes for no-cache enabling (share-ability is selected by default) */
     253             : 
     254           0 : #define K_MEM_PARTITION_P_NA_U_NA_NOCACHE ((k_mem_partition_attr_t) \
     255             :         {(_K_MEM_PARTITION_P_NA_U_NA \
     256             :         | NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE)})
     257           0 : #define K_MEM_PARTITION_P_RW_U_RW_NOCACHE ((k_mem_partition_attr_t) \
     258             :         {(_K_MEM_PARTITION_P_RW_U_RW \
     259             :         | NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE)})
     260           0 : #define K_MEM_PARTITION_P_RW_U_RO_NOCACHE ((k_mem_partition_attr_t) \
     261             :         {(_K_MEM_PARTITION_P_RW_U_RO \
     262             :         | NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE)})
     263           0 : #define K_MEM_PARTITION_P_RW_U_NA_NOCACHE ((k_mem_partition_attr_t) \
     264             :         {(_K_MEM_PARTITION_P_RW_U_NA \
     265             :         | NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE)})
     266           0 : #define K_MEM_PARTITION_P_RO_U_RO_NOCACHE ((k_mem_partition_attr_t) \
     267             :         {(_K_MEM_PARTITION_P_RO_U_RO \
     268             :         | NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE)})
     269           0 : #define K_MEM_PARTITION_P_RO_U_NA_NOCACHE ((k_mem_partition_attr_t) \
     270             :         {(_K_MEM_PARTITION_P_RO_U_NA \
     271             :         | NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE)})
     272             : 
     273           0 : #define K_MEM_PARTITION_P_RWX_U_RWX_NOCACHE ((k_mem_partition_attr_t) \
     274             :         {(_K_MEM_PARTITION_P_RWX_U_RWX \
     275             :         | NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE)})
     276           0 : #define K_MEM_PARTITION_P_RWX_U_RX_NOCACHE  ((k_mem_partition_attr_t) \
     277             :         {(_K_MEM_PARTITION_P_RWX_U_RX  \
     278             :         | NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE)})
     279           0 : #define K_MEM_PARTITION_P_RX_U_RX_NOCACHE   ((k_mem_partition_attr_t) \
     280             :         {(_K_MEM_PARTITION_P_RX_U_RX   \
     281             :         | NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE)})
     282             : 
     283             : #endif /* _ASMLANGUAGE */
     284             : 
     285             : #define _ARCH_MEM_PARTITION_ALIGN_CHECK(start, size) \
     286             :         BUILD_ASSERT(!(((size) & ((size) - 1))) && \
     287             :                 (size) >= CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE && \
     288             :                 !((uint32_t)(start) & ((size) - 1)), \
     289             :                 "the size of the partition must be power of 2" \
     290             :                 " and greater than or equal to the minimum MPU region size." \
     291             :                 "start address of the partition must align with size.")

Generated by: LCOV version 1.14