Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
arm_mmu.h
Go to the documentation of this file.
1/*
2 * Copyright 2019 Broadcom
3 * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7#ifndef ZEPHYR_INCLUDE_ARCH_ARM64_ARM_MMU_H_
8#define ZEPHYR_INCLUDE_ARCH_ARM64_ARM_MMU_H_
9
10/* Following Memory types supported through MAIR encodings can be passed
11 * by user through "attrs"(attributes) field of specified memory region.
12 * As MAIR supports such 8 encodings, we will reserve attrs[2:0];
13 * so that we can provide encodings upto 7 if needed in future.
14 */
15#define MT_TYPE_MASK 0x7U
16#define MT_TYPE(attr) (attr & MT_TYPE_MASK)
17#define MT_DEVICE_nGnRnE 0U
18#define MT_DEVICE_nGnRE 1U
19#define MT_DEVICE_GRE 2U
20#define MT_NORMAL_NC 3U
21#define MT_NORMAL 4U
22#define MT_NORMAL_WT 5U
23
24#define MEMORY_ATTRIBUTES ((0x00 << (MT_DEVICE_nGnRnE * 8)) | \
25 (0x04 << (MT_DEVICE_nGnRE * 8)) | \
26 (0x0c << (MT_DEVICE_GRE * 8)) | \
27 (0x44 << (MT_NORMAL_NC * 8)) | \
28 (0xffUL << (MT_NORMAL * 8)) | \
29 (0xbbUL << (MT_NORMAL_WT * 8)))
30
31/* More flags from user's perpective are supported using remaining bits
32 * of "attrs" field, i.e. attrs[31:3], underlying code will take care
33 * of setting PTE fields correctly.
34 *
35 * current usage of attrs[31:3] is:
36 * attrs[3] : Access Permissions
37 * attrs[4] : Memory access from secure/ns state
38 * attrs[5] : Execute Permissions privileged mode (PXN)
39 * attrs[6] : Execute Permissions unprivileged mode (UXN)
40 * attrs[7] : Mirror RO/RW permissions to EL0
41 * attrs[8] : Overwrite existing mapping if any
42 *
43 */
44#define MT_PERM_SHIFT 3U
45#define MT_SEC_SHIFT 4U
46#define MT_P_EXECUTE_SHIFT 5U
47#define MT_U_EXECUTE_SHIFT 6U
48#define MT_RW_AP_SHIFT 7U
49#define MT_NO_OVERWRITE_SHIFT 8U
50
51#define MT_RO (0U << MT_PERM_SHIFT)
52#define MT_RW (1U << MT_PERM_SHIFT)
53
54#define MT_RW_AP_ELx (1U << MT_RW_AP_SHIFT)
55#define MT_RW_AP_EL_HIGHER (0U << MT_RW_AP_SHIFT)
56
57#define MT_SECURE (0U << MT_SEC_SHIFT)
58#define MT_NS (1U << MT_SEC_SHIFT)
59
60#define MT_P_EXECUTE (0U << MT_P_EXECUTE_SHIFT)
61#define MT_P_EXECUTE_NEVER (1U << MT_P_EXECUTE_SHIFT)
62
63#define MT_U_EXECUTE (0U << MT_U_EXECUTE_SHIFT)
64#define MT_U_EXECUTE_NEVER (1U << MT_U_EXECUTE_SHIFT)
65
66#define MT_NO_OVERWRITE (1U << MT_NO_OVERWRITE_SHIFT)
67
68#define MT_P_RW_U_RW (MT_RW | MT_RW_AP_ELx | MT_P_EXECUTE_NEVER | MT_U_EXECUTE_NEVER)
69#define MT_P_RW_U_NA (MT_RW | MT_RW_AP_EL_HIGHER | MT_P_EXECUTE_NEVER | MT_U_EXECUTE_NEVER)
70#define MT_P_RO_U_RO (MT_RO | MT_RW_AP_ELx | MT_P_EXECUTE_NEVER | MT_U_EXECUTE_NEVER)
71#define MT_P_RO_U_NA (MT_RO | MT_RW_AP_EL_HIGHER | MT_P_EXECUTE_NEVER | MT_U_EXECUTE_NEVER)
72#define MT_P_RO_U_RX (MT_RO | MT_RW_AP_ELx | MT_P_EXECUTE_NEVER | MT_U_EXECUTE)
73#define MT_P_RX_U_RX (MT_RO | MT_RW_AP_ELx | MT_P_EXECUTE | MT_U_EXECUTE)
74#define MT_P_RX_U_NA (MT_RO | MT_RW_AP_EL_HIGHER | MT_P_EXECUTE | MT_U_EXECUTE_NEVER)
75
76#ifdef CONFIG_ARMV8_A_NS
77#define MT_DEFAULT_SECURE_STATE MT_NS
78#else
79#define MT_DEFAULT_SECURE_STATE MT_SECURE
80#endif
81
82/*
83 * PTE descriptor can be Block descriptor or Table descriptor
84 * or Page descriptor.
85 */
86#define PTE_DESC_TYPE_MASK 3U
87#define PTE_BLOCK_DESC 1U
88#define PTE_TABLE_DESC 3U
89#define PTE_PAGE_DESC 3U
90#define PTE_INVALID_DESC 0U
91
92/*
93 * Block and Page descriptor attributes fields
94 */
95#define PTE_BLOCK_DESC_MEMTYPE(x) (x << 2)
96#define PTE_BLOCK_DESC_NS (1ULL << 5)
97#define PTE_BLOCK_DESC_AP_ELx (1ULL << 6)
98#define PTE_BLOCK_DESC_AP_EL_HIGHER (0ULL << 6)
99#define PTE_BLOCK_DESC_AP_RO (1ULL << 7)
100#define PTE_BLOCK_DESC_AP_RW (0ULL << 7)
101#define PTE_BLOCK_DESC_NON_SHARE (0ULL << 8)
102#define PTE_BLOCK_DESC_OUTER_SHARE (2ULL << 8)
103#define PTE_BLOCK_DESC_INNER_SHARE (3ULL << 8)
104#define PTE_BLOCK_DESC_AF (1ULL << 10)
105#define PTE_BLOCK_DESC_NG (1ULL << 11)
106#define PTE_BLOCK_DESC_PXN (1ULL << 53)
107#define PTE_BLOCK_DESC_UXN (1ULL << 54)
108
109/*
110 * TCR definitions.
111 */
112#define TCR_EL1_IPS_SHIFT 32U
113#define TCR_EL2_PS_SHIFT 16U
114#define TCR_EL3_PS_SHIFT 16U
115
116#define TCR_T0SZ_SHIFT 0U
117#define TCR_T0SZ(x) ((64 - (x)) << TCR_T0SZ_SHIFT)
118
119#define TCR_IRGN_NC (0ULL << 8)
120#define TCR_IRGN_WBWA (1ULL << 8)
121#define TCR_IRGN_WT (2ULL << 8)
122#define TCR_IRGN_WBNWA (3ULL << 8)
123#define TCR_IRGN_MASK (3ULL << 8)
124#define TCR_ORGN_NC (0ULL << 10)
125#define TCR_ORGN_WBWA (1ULL << 10)
126#define TCR_ORGN_WT (2ULL << 10)
127#define TCR_ORGN_WBNWA (3ULL << 10)
128#define TCR_ORGN_MASK (3ULL << 10)
129#define TCR_SHARED_NON (0ULL << 12)
130#define TCR_SHARED_OUTER (2ULL << 12)
131#define TCR_SHARED_INNER (3ULL << 12)
132#define TCR_TG0_4K (0ULL << 14)
133#define TCR_TG0_64K (1ULL << 14)
134#define TCR_TG0_16K (2ULL << 14)
135#define TCR_EPD1_DISABLE (1ULL << 23)
136
137#define TCR_PS_BITS_4GB 0x0ULL
138#define TCR_PS_BITS_64GB 0x1ULL
139#define TCR_PS_BITS_1TB 0x2ULL
140#define TCR_PS_BITS_4TB 0x3ULL
141#define TCR_PS_BITS_16TB 0x4ULL
142#define TCR_PS_BITS_256TB 0x5ULL
143
144#ifndef _ASMLANGUAGE
145
146/* Region definition data structure */
148 /* Region Base Physical Address */
150 /* Region Base Virtual Address */
152 /* Region size */
153 size_t size;
154 /* Region Name */
155 const char *name;
156 /* Region Attributes */
158};
159
160/* MMU configuration data structure */
162 /* Number of regions */
163 unsigned int num_regions;
164 /* Regions */
166};
167
170};
171
172/* Convenience macros to represent the ARMv8-A-specific
173 * configuration for memory access permission and
174 * cache-ability attribution.
175 */
176
177#define MMU_REGION_ENTRY(_name, _base_pa, _base_va, _size, _attrs) \
178 {\
179 .name = _name, \
180 .base_pa = _base_pa, \
181 .base_va = _base_va, \
182 .size = _size, \
183 .attrs = _attrs, \
184 }
185
186#define MMU_REGION_FLAT_ENTRY(name, adr, sz, attrs) \
187 MMU_REGION_ENTRY(name, adr, adr, sz, attrs)
188
189/* Reference to the MMU configuration.
190 *
191 * This struct is defined and populated for each SoC (in the SoC definition),
192 * and holds the build-time configuration information for the fixed MMU
193 * regions enabled during kernel initialization.
194 */
195extern const struct arm_mmu_config mmu_config;
196
197struct k_thread;
198void z_arm64_thread_pt_init(struct k_thread *thread);
199void z_arm64_swap_ptables(struct k_thread *thread);
200
201#endif /* _ASMLANGUAGE */
202
203#endif /* ZEPHYR_INCLUDE_ARCH_ARM64_ARM_MMU_H_ */
const struct arm_mmu_config mmu_config
static struct k_thread thread[2]
Definition: atomic.c:22
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
__UINT64_TYPE__ uint64_t
Definition: stdint.h:61
__UINTPTR_TYPE__ uintptr_t
Definition: stdint.h:75
Definition: arm_mmu.h:161
const struct arm_mmu_region * mmu_regions
Definition: arm_mmu.h:165
unsigned int num_regions
Definition: arm_mmu.h:163
Definition: arm_mmu.h:168
uint64_t * base_xlat_table
Definition: arm_mmu.h:169
Definition: arm_mmu.h:147
const char * name
Definition: arm_mmu.h:155
uintptr_t base_va
Definition: arm_mmu.h:151
size_t size
Definition: arm_mmu.h:153
uintptr_t base_pa
Definition: arm_mmu.h:149
uint32_t attrs
Definition: arm_mmu.h:157
Definition: thread.h:201