Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
arm_mmu.h File Reference

Go to the source code of this file.

Data Structures

struct  arm_mmu_region
struct  arm_mmu_config
struct  arm_mmu_ptables
struct  k_mem_partition_attr_t

Macros

#define MT_TYPE_MASK   0x7U
#define MT_TYPE(attr)
#define MT_DEVICE_nGnRnE   0U
#define MT_DEVICE_nGnRE   1U
#define MT_DEVICE_GRE   2U
#define MT_NORMAL_NC   3U
#define MT_NORMAL   4U
#define MT_NORMAL_WT   5U
#define MEMORY_ATTRIBUTES
#define MT_PERM_SHIFT   3U
#define MT_SEC_SHIFT   4U
#define MT_P_EXECUTE_SHIFT   5U
#define MT_U_EXECUTE_SHIFT   6U
#define MT_RW_AP_SHIFT   7U
#define MT_NO_OVERWRITE_SHIFT   8U
#define MT_NON_GLOBAL_SHIFT   9U
#define MT_PAGED_OUT_SHIFT   10U
#define MT_RO   (0U << MT_PERM_SHIFT)
#define MT_RW   (1U << MT_PERM_SHIFT)
#define MT_RW_AP_ELx   (1U << MT_RW_AP_SHIFT)
#define MT_RW_AP_EL_HIGHER   (0U << MT_RW_AP_SHIFT)
#define MT_SECURE   (0U << MT_SEC_SHIFT)
#define MT_NS   (1U << MT_SEC_SHIFT)
#define MT_P_EXECUTE   (0U << MT_P_EXECUTE_SHIFT)
#define MT_P_EXECUTE_NEVER   (1U << MT_P_EXECUTE_SHIFT)
#define MT_U_EXECUTE   (0U << MT_U_EXECUTE_SHIFT)
#define MT_U_EXECUTE_NEVER   (1U << MT_U_EXECUTE_SHIFT)
#define MT_NO_OVERWRITE   (1U << MT_NO_OVERWRITE_SHIFT)
#define MT_G   (0U << MT_NON_GLOBAL_SHIFT)
#define MT_NG   (1U << MT_NON_GLOBAL_SHIFT)
#define MT_PAGED_OUT   (1U << MT_PAGED_OUT_SHIFT)
#define MT_P_RW_U_RW   (MT_RW | MT_RW_AP_ELx | MT_P_EXECUTE_NEVER | MT_U_EXECUTE_NEVER)
#define MT_P_RW_U_NA   (MT_RW | MT_RW_AP_EL_HIGHER | MT_P_EXECUTE_NEVER | MT_U_EXECUTE_NEVER)
#define MT_P_RO_U_RO   (MT_RO | MT_RW_AP_ELx | MT_P_EXECUTE_NEVER | MT_U_EXECUTE_NEVER)
#define MT_P_RO_U_NA   (MT_RO | MT_RW_AP_EL_HIGHER | MT_P_EXECUTE_NEVER | MT_U_EXECUTE_NEVER)
#define MT_P_RO_U_RX   (MT_RO | MT_RW_AP_ELx | MT_P_EXECUTE_NEVER | MT_U_EXECUTE)
#define MT_P_RX_U_RX   (MT_RO | MT_RW_AP_ELx | MT_P_EXECUTE | MT_U_EXECUTE)
#define MT_P_RX_U_NA   (MT_RO | MT_RW_AP_EL_HIGHER | MT_P_EXECUTE | MT_U_EXECUTE_NEVER)
#define MT_DEFAULT_SECURE_STATE   MT_SECURE
#define ARCH_DATA_PAGE_LOADED   BIT(0)
#define ARCH_DATA_PAGE_ACCESSED   BIT(1)
#define ARCH_DATA_PAGE_DIRTY   BIT(2)
#define ARCH_DATA_PAGE_NOT_MAPPED   BIT(3)
#define ARCH_UNPAGED_ANON_ZERO   0x0000fffffffff000
#define ARCH_UNPAGED_ANON_UNINIT   0x0000ffffffffe000
#define MMU_REGION_ENTRY(_name, _base_pa, _base_va, _size, _attrs)
#define MMU_REGION_FLAT_ENTRY(name, adr, sz, attrs)
#define MMU_REGION_DT_FLAT_ENTRY(node_id, attrs)
#define MMU_REGION_DT_COMPAT_FOREACH_FLAT_ENTRY(compat, attr)
#define DT_MEM_ATTR_TO_MT(dt_attr)
 Convert a DT zephyr,memory-attr value to ARM64 MT_* flags.
#define MMU_REGION_DT_FLAT_ENTRY_FROM_DT(node_id)
 Auto-generate MMU region entry from a DT node's zephyr,memory-attr.
#define DT_MEM_ARM64_MMU_IS_VALID(dt_attr)
 Check whether a DT memory attribute value is valid for the ARM64 MMU.
#define ARM64_MMU_VALIDATE_DT_REGION(node_id)
 BUILD_ASSERT that a DT node's zephyr,memory-attr is valid for ARM64.
#define MMU_REGION_DT_COMPAT_FOREACH_FLAT_ENTRY_FROM_DT(compat)
 Auto-generate MMU region entries for all matching nodes.
#define K_MEM_PARTITION_P_RW_U_RW
#define K_MEM_PARTITION_P_RW_U_NA
#define K_MEM_PARTITION_P_RO_U_RO
#define K_MEM_PARTITION_P_RO_U_NA
#define K_MEM_PARTITION_P_RX_U_RX

Variables

const struct arm_mmu_config mmu_config

Macro Definition Documentation

◆ ARCH_DATA_PAGE_ACCESSED

#define ARCH_DATA_PAGE_ACCESSED   BIT(1)

◆ ARCH_DATA_PAGE_DIRTY

#define ARCH_DATA_PAGE_DIRTY   BIT(2)

◆ ARCH_DATA_PAGE_LOADED

#define ARCH_DATA_PAGE_LOADED   BIT(0)

◆ ARCH_DATA_PAGE_NOT_MAPPED

#define ARCH_DATA_PAGE_NOT_MAPPED   BIT(3)

◆ ARCH_UNPAGED_ANON_UNINIT

#define ARCH_UNPAGED_ANON_UNINIT   0x0000ffffffffe000

◆ ARCH_UNPAGED_ANON_ZERO

#define ARCH_UNPAGED_ANON_ZERO   0x0000fffffffff000

◆ ARM64_MMU_VALIDATE_DT_REGION

#define ARM64_MMU_VALIDATE_DT_REGION ( node_id)
Value:
IF_ENABLED(DT_NODE_HAS_PROP(node_id, zephyr_memory_attr), \
DT_PROP(node_id, zephyr_memory_attr)), \
"Unsupported zephyr,memory-attr for ARM64 MMU region " \
DT_NODE_FULL_NAME(node_id));))
#define DT_MEM_ARM64_MMU_IS_VALID(dt_attr)
Check whether a DT memory attribute value is valid for the ARM64 MMU.
Definition arm_mmu.h:258
#define DT_NODE_HAS_PROP(node_id, prop)
Does a devicetree node have a property?
Definition devicetree.h:3969
#define DT_NODE_FULL_NAME(node_id)
Get a devicetree node's name with unit-address as a string literal.
Definition devicetree.h:573
#define DT_PROP(node_id, prop)
Get a devicetree property value.
Definition devicetree.h:798
#define IF_ENABLED(_flag, _code)
Insert code if _flag is defined and equals 1.
Definition util_macro.h:278
#define BUILD_ASSERT(EXPR, MSG...)
Definition llvm.h:51

BUILD_ASSERT that a DT node's zephyr,memory-attr is valid for ARM64.

Nodes without the property are silently skipped.

Parameters
node_idDevicetree node identifier.

◆ DT_MEM_ARM64_MMU_IS_VALID

#define DT_MEM_ARM64_MMU_IS_VALID ( dt_attr)
Value:
(((dt_attr) & ~_DT_MEM_ARM64_SUPPORTED_MASK) == 0)

Check whether a DT memory attribute value is valid for the ARM64 MMU.

Parameters
dt_attrThe DT memory attribute value.
Returns
true if only supported bits are set.

◆ DT_MEM_ATTR_TO_MT

#define DT_MEM_ATTR_TO_MT ( dt_attr)
Value:
((_DT_MEM_ARM64_ARCH_BITS(dt_attr) & ATTR_ARM64_CACHE_WB) ? \
#define MT_NORMAL_NC
Definition arm_mmu.h:27
#define MT_P_RW_U_NA
Definition arm_mmu.h:85
#define MT_NORMAL_WT
Definition arm_mmu.h:29
#define MT_DEFAULT_SECURE_STATE
Definition arm_mmu.h:95
#define ATTR_ARM64_CACHE_WB
Write-Back cache policy (only meaningful with DT_MEM_CACHEABLE).
Definition memory-attr-arm64.h:42
#define DT_MEM_CACHEABLE
Definition memory-attr.h:20
#define DT_MEM_ATTR_GET(x)
Definition memory-attr.h:17
#define MT_NORMAL
Definition arm_mmu.h:33

Convert a DT zephyr,memory-attr value to ARM64 MT_* flags.

The generic DT_MEM_CACHEABLE bit selects cacheable vs non-cacheable. The arch-specific ATTR_ARM64_CACHE_WB bit selects write-back vs write-through when cacheable. Device memory must be mapped through the MMIO device API instead.

Parameters
dt_attrThe DT memory attribute value from zephyr,memory-attr.

◆ K_MEM_PARTITION_P_RO_U_NA

#define K_MEM_PARTITION_P_RO_U_NA
Value:
#define MT_P_RO_U_NA
Definition arm_mmu.h:87
Definition arm_mpu_v7m.h:145

◆ K_MEM_PARTITION_P_RO_U_RO

#define K_MEM_PARTITION_P_RO_U_RO
Value:
#define MT_P_RO_U_RO
Definition arm_mmu.h:86

◆ K_MEM_PARTITION_P_RW_U_NA

#define K_MEM_PARTITION_P_RW_U_NA

◆ K_MEM_PARTITION_P_RW_U_RW

#define K_MEM_PARTITION_P_RW_U_RW
Value:
#define MT_P_RW_U_RW
Definition arm_mmu.h:84

◆ K_MEM_PARTITION_P_RX_U_RX

#define K_MEM_PARTITION_P_RX_U_RX
Value:
#define MT_P_RX_U_RX
Definition arm_mmu.h:89

◆ MEMORY_ATTRIBUTES

#define MEMORY_ATTRIBUTES
Value:
((0x00 << (MT_DEVICE_nGnRnE * 8)) | \
(0x04 << (MT_DEVICE_nGnRE * 8)) | \
(0x0c << (MT_DEVICE_GRE * 8)) | \
(0x44 << (MT_NORMAL_NC * 8)) | \
(0xffUL << (MT_NORMAL * 8)) | \
(0xbbUL << (MT_NORMAL_WT * 8)))
#define MT_DEVICE_nGnRnE
Definition arm_mmu.h:24
#define MT_DEVICE_GRE
Definition arm_mmu.h:26
#define MT_DEVICE_nGnRE
Definition arm_mmu.h:25

◆ MMU_REGION_DT_COMPAT_FOREACH_FLAT_ENTRY

#define MMU_REGION_DT_COMPAT_FOREACH_FLAT_ENTRY ( compat,
attr )
Value:
#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn,...)
Invokes fn for each status okay node of a compatible with multiple arguments.
Definition devicetree.h:3700
#define MMU_REGION_DT_FLAT_ENTRY(node_id, attrs)
Definition arm_mmu.h:89

◆ MMU_REGION_DT_COMPAT_FOREACH_FLAT_ENTRY_FROM_DT

#define MMU_REGION_DT_COMPAT_FOREACH_FLAT_ENTRY_FROM_DT ( compat)
Value:
#define MMU_REGION_DT_FLAT_ENTRY_FROM_DT(node_id)
Auto-generate MMU region entry from a DT node's zephyr,memory-attr.
Definition arm_mmu.h:236
#define DT_FOREACH_STATUS_OKAY(compat, fn)
Invokes fn for each status okay node of a compatible.
Definition devicetree.h:3651

Auto-generate MMU region entries for all matching nodes.

Parameters
compatDevicetree compatible to iterate over.

Iterates over all status = "okay" nodes of compat and generates an MMU region entry for each node that has a zephyr,memory-attr property.

Note
This is a wrapper of MMU_REGION_DT_FLAT_ENTRY_FROM_DT.

◆ MMU_REGION_DT_FLAT_ENTRY

#define MMU_REGION_DT_FLAT_ENTRY ( node_id,
attrs )
Value:
DT_REG_ADDR(node_id), \
DT_REG_SIZE(node_id), \
attrs),
#define DT_REG_ADDR(node_id)
Get a node's (only) register block address.
Definition devicetree.h:2509
#define DT_REG_SIZE(node_id)
Get a node's (only) register block size.
Definition devicetree.h:2530
#define MMU_REGION_FLAT_ENTRY(name, adr, sz, attrs)
Definition arm_mmu.h:70

◆ MMU_REGION_DT_FLAT_ENTRY_FROM_DT

#define MMU_REGION_DT_FLAT_ENTRY_FROM_DT ( node_id)
Value:
IF_ENABLED(DT_NODE_HAS_PROP(node_id, zephyr_memory_attr), \
DT_REG_ADDR(node_id), \
DT_REG_SIZE(node_id), \
DT_PROP(node_id, zephyr_memory_attr))),))
#define DT_MEM_ATTR_TO_MT(dt_attr)
Convert a DT zephyr,memory-attr value to ARM64 MT_* flags.
Definition arm_mmu.h:214

Auto-generate MMU region entry from a DT node's zephyr,memory-attr.

Unlike MMU_REGION_DT_FLAT_ENTRY which takes attrs as a parameter, this macro reads the memory type from the node's zephyr,memory-attr property and converts it to ARM64 MT_* flags at compile time.

Nodes without zephyr,memory-attr are silently skipped.

Parameters
node_idDevicetree node identifier.
Note
This is a wrapper of MMU_REGION_FLAT_ENTRY and inherits its limitation: only the first reg bank is used. DT nodes with multiple reg entries are not fully covered.

◆ MMU_REGION_ENTRY

#define MMU_REGION_ENTRY ( _name,
_base_pa,
_base_va,
_size,
_attrs )
Value:
{\
.name = _name, \
.base_pa = _base_pa, \
.base_va = _base_va, \
.size = _size, \
.attrs = _attrs, \
}

◆ MMU_REGION_FLAT_ENTRY

#define MMU_REGION_FLAT_ENTRY ( name,
adr,
sz,
attrs )
Value:
MMU_REGION_ENTRY(name, adr, adr, sz, attrs)
#define MMU_REGION_ENTRY(_name, _base_pa, _base_va, _size, _attrs)
Definition arm_mmu.h:61

◆ MT_DEFAULT_SECURE_STATE

#define MT_DEFAULT_SECURE_STATE   MT_SECURE

◆ MT_DEVICE_GRE

#define MT_DEVICE_GRE   2U

◆ MT_DEVICE_nGnRE

#define MT_DEVICE_nGnRE   1U

◆ MT_DEVICE_nGnRnE

#define MT_DEVICE_nGnRnE   0U

◆ MT_G

#define MT_G   (0U << MT_NON_GLOBAL_SHIFT)

◆ MT_NG

#define MT_NG   (1U << MT_NON_GLOBAL_SHIFT)

◆ MT_NO_OVERWRITE

#define MT_NO_OVERWRITE   (1U << MT_NO_OVERWRITE_SHIFT)

◆ MT_NO_OVERWRITE_SHIFT

#define MT_NO_OVERWRITE_SHIFT   8U

◆ MT_NON_GLOBAL_SHIFT

#define MT_NON_GLOBAL_SHIFT   9U

◆ MT_NORMAL

#define MT_NORMAL   4U

◆ MT_NORMAL_NC

#define MT_NORMAL_NC   3U

◆ MT_NORMAL_WT

#define MT_NORMAL_WT   5U

◆ MT_NS

#define MT_NS   (1U << MT_SEC_SHIFT)

◆ MT_P_EXECUTE

#define MT_P_EXECUTE   (0U << MT_P_EXECUTE_SHIFT)

◆ MT_P_EXECUTE_NEVER

#define MT_P_EXECUTE_NEVER   (1U << MT_P_EXECUTE_SHIFT)

◆ MT_P_EXECUTE_SHIFT

#define MT_P_EXECUTE_SHIFT   5U

◆ MT_P_RO_U_NA

◆ MT_P_RO_U_RO

#define MT_P_RO_U_RO   (MT_RO | MT_RW_AP_ELx | MT_P_EXECUTE_NEVER | MT_U_EXECUTE_NEVER)

◆ MT_P_RO_U_RX

#define MT_P_RO_U_RX   (MT_RO | MT_RW_AP_ELx | MT_P_EXECUTE_NEVER | MT_U_EXECUTE)

◆ MT_P_RW_U_NA

◆ MT_P_RW_U_RW

#define MT_P_RW_U_RW   (MT_RW | MT_RW_AP_ELx | MT_P_EXECUTE_NEVER | MT_U_EXECUTE_NEVER)

◆ MT_P_RX_U_NA

#define MT_P_RX_U_NA   (MT_RO | MT_RW_AP_EL_HIGHER | MT_P_EXECUTE | MT_U_EXECUTE_NEVER)

◆ MT_P_RX_U_RX

#define MT_P_RX_U_RX   (MT_RO | MT_RW_AP_ELx | MT_P_EXECUTE | MT_U_EXECUTE)

◆ MT_PAGED_OUT

#define MT_PAGED_OUT   (1U << MT_PAGED_OUT_SHIFT)

◆ MT_PAGED_OUT_SHIFT

#define MT_PAGED_OUT_SHIFT   10U

◆ MT_PERM_SHIFT

#define MT_PERM_SHIFT   3U

◆ MT_RO

#define MT_RO   (0U << MT_PERM_SHIFT)

◆ MT_RW

#define MT_RW   (1U << MT_PERM_SHIFT)

◆ MT_RW_AP_EL_HIGHER

#define MT_RW_AP_EL_HIGHER   (0U << MT_RW_AP_SHIFT)

◆ MT_RW_AP_ELx

#define MT_RW_AP_ELx   (1U << MT_RW_AP_SHIFT)

◆ MT_RW_AP_SHIFT

#define MT_RW_AP_SHIFT   7U

◆ MT_SEC_SHIFT

#define MT_SEC_SHIFT   4U

◆ MT_SECURE

#define MT_SECURE   (0U << MT_SEC_SHIFT)

◆ MT_TYPE

#define MT_TYPE ( attr)
Value:
(attr & MT_TYPE_MASK)
#define MT_TYPE_MASK
Definition arm_mmu.h:22

◆ MT_TYPE_MASK

#define MT_TYPE_MASK   0x7U

◆ MT_U_EXECUTE

#define MT_U_EXECUTE   (0U << MT_U_EXECUTE_SHIFT)

◆ MT_U_EXECUTE_NEVER

#define MT_U_EXECUTE_NEVER   (1U << MT_U_EXECUTE_SHIFT)

◆ MT_U_EXECUTE_SHIFT

#define MT_U_EXECUTE_SHIFT   6U

Variable Documentation

◆ mmu_config

const struct arm_mmu_config mmu_config
extern