Changeset ccc362a1 in mainline for kernel/arch/riscv64/include/arch/mm/page.h
- Timestamp:
- 2017-08-21T18:46:34Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6c742f5e
- Parents:
- c16479e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/riscv64/include/arch/mm/page.h
rc16479e rccc362a1 50 50 51 51 /* 52 * Page table entry types.53 *54 * - PTE_TYPE_PTR: pointer to next level PTE55 * - PTE_TYPE_PTR_GLOBAL: pointer to next level PTE (global mapping)56 *57 * - PTE_TYPE_SRURX: kernel read, user read execute58 * - PTE_TYPE_SRWURWX: kernel read write, user read write execute59 * - PTE_TYPE_SRUR: kernel read, user read60 * - PTE_TYPE_SRWURW: kernel read write, user read write61 * - PTE_TYPE_SRXURX: kernel read execute, user read execute62 * - PTE_TYPE_SRWXURWX: kernel read write execute, user read write execute63 *64 * - PTE_TYPE_SR: kernel read65 * - PTE_TYPE_SRW: kernel read write66 * - PTE_TYPE_SRX: kernel read execute67 * - PTE_TYPE_SRWX: kernel read write execute68 *69 * - PTE_TYPE_SR_GLOBAL: kernel read (global mapping)70 * - PTE_TYPE_SRW_GLOBAL: kernel read write (global mapping)71 * - PTE_TYPE_SRX_GLOBAL: kernel read execute (global mapping)72 * - PTE_TYPE_SRWX_GLOBAL: kernel read write execute (global mapping)73 */74 75 #define PTE_TYPE_PTR 076 #define PTE_TYPE_PTR_GLOBAL 177 78 #define PTE_TYPE_SRURX 279 #define PTE_TYPE_SRWURWX 380 #define PTE_TYPE_SRUR 481 #define PTE_TYPE_SRWURW 582 #define PTE_TYPE_SRXURX 683 #define PTE_TYPE_SRWXURWX 784 85 #define PTE_TYPE_SR 886 #define PTE_TYPE_SRW 987 #define PTE_TYPE_SRX 1088 #define PTE_TYPE_SRWX 1189 90 #define PTE_TYPE_SR_GLOBAL 1291 #define PTE_TYPE_SRW_GLOBAL 1392 #define PTE_TYPE_SRX_GLOBAL 1493 #define PTE_TYPE_SRWX_GLOBAL 1594 95 /*96 52 * Implementation of 4-level page table interface. 97 53 * … … 125 81 #define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 12) & 0x1ff) 126 82 83 /* Flags mask for non-leaf page table entries */ 84 #define NON_LEAF_MASK (~(PAGE_READ | PAGE_WRITE | PAGE_EXEC)) 85 127 86 /* Get PTE address accessors for each level. */ 128 87 #define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ … … 139 98 140 99 /* Set PTE address accessors for each level. */ 141 #define SET_PTL0_ADDRESS_ARCH(ptl0) 100 #define SET_PTL0_ADDRESS_ARCH(ptl0) \ 101 (write_satp((uintptr_t) (ptl0))) 142 102 143 103 #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \ … … 167 127 168 128 /* Set PTE flags accessors for each level. */ 169 #define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \170 set_pt_flags((pte_t *) (ptl0), (size_t) (i), ( x))171 172 #define SET_PTL2_FLAGS_ARCH(ptl1, i, x) \173 set_pt_flags((pte_t *) (ptl1), (size_t) (i), ( x))174 175 #define SET_PTL3_FLAGS_ARCH(ptl2, i, x) \176 set_pt_flags((pte_t *) (ptl2), (size_t) (i), ( x))177 178 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \179 set_pt_flags((pte_t *) (ptl3), (size_t) (i), ( x))129 #define SET_PTL1_FLAGS_ARCH(ptl0, i, flags) \ 130 set_pt_flags((pte_t *) (ptl0), (size_t) (i), ((flags) & NON_LEAF_MASK)) 131 132 #define SET_PTL2_FLAGS_ARCH(ptl1, i, flags) \ 133 set_pt_flags((pte_t *) (ptl1), (size_t) (i), ((flags) & NON_LEAF_MASK)) 134 135 #define SET_PTL3_FLAGS_ARCH(ptl2, i, flags) \ 136 set_pt_flags((pte_t *) (ptl2), (size_t) (i), ((flags) & NON_LEAF_MASK)) 137 138 #define SET_FRAME_FLAGS_ARCH(ptl3, i, flags) \ 139 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (flags)) 180 140 181 141 /* Set PTE present accessors for each level. */ … … 196 156 #define PTE_PRESENT_ARCH(pte) ((pte)->valid != 0) 197 157 #define PTE_GET_FRAME_ARCH(pte) ((uintptr_t) (pte)->pfn << 12) 198 199 #define PTE_WRITABLE_ARCH(pte) \ 200 (((pte)->type == PTE_TYPE_SRWURWX) || \ 201 ((pte)->type == PTE_TYPE_SRWURW) || \ 202 ((pte)->type == PTE_TYPE_SRWXURWX)) 203 204 #define PTE_EXECUTABLE_ARCH(pte) \ 205 (((pte)->type == PTE_TYPE_SRURX) || \ 206 ((pte)->type == PTE_TYPE_SRWURWX) || \ 207 ((pte)->type == PTE_TYPE_SRXURX) || \ 208 ((pte)->type == PTE_TYPE_SRWXURWX)) 158 #define PTE_WRITABLE_ARCH(pte) ((pte)->writable != 0) 159 #define PTE_EXECUTABLE_ARCH(pte) ((pte)->executable != 0) 209 160 210 161 #ifndef __ASM__ … … 217 168 typedef struct { 218 169 unsigned long valid : 1; /**< Valid bit. */ 219 unsigned long type : 4; /**< Entry type. */ 220 unsigned long referenced : 1; /**< Refenced bit. */ 170 unsigned long readable : 1; /**< Readable bit. */ 171 unsigned long writable : 1; /**< Writable bit. */ 172 unsigned long executable : 1; /**< Executable bit. */ 173 unsigned long user : 1; /**< User mode accessible bit. */ 174 unsigned long global : 1; /**< Global mapping bit. */ 175 unsigned long accessed : 1; /**< Accessed bit. */ 221 176 unsigned long dirty : 1; /**< Dirty bit. */ 222 unsigned long reserved : 3; /**< Reserved bits. */177 unsigned long reserved : 2; /**< Reserved bits. */ 223 178 unsigned long pfn : 54; /**< Physical frame number. */ 224 179 } pte_t; … … 229 184 230 185 return (((!entry->valid) << PAGE_PRESENT_SHIFT) | 231 ( (entry->type < PTE_TYPE_SR)<< PAGE_USER_SHIFT) |232 PAGE_READ|233 ( PTE_WRITABLE_ARCH(entry)<< PAGE_WRITE_SHIFT) |234 ( PTE_EXECUTABLE_ARCH(entry)<< PAGE_EXEC_SHIFT) |235 ( (entry->type >= PTE_TYPE_SR_GLOBAL)<< PAGE_GLOBAL_SHIFT));186 (entry->user << PAGE_USER_SHIFT) | 187 (entry->readable << PAGE_READ_SHIFT) | 188 (entry->writable << PAGE_WRITE_SHIFT) | 189 (entry->executable << PAGE_EXEC_SHIFT) | 190 (entry->global << PAGE_GLOBAL_SHIFT)); 236 191 } 237 192 … … 241 196 242 197 entry->valid = !(flags & PAGE_NOT_PRESENT); 243 244 if ((flags & PAGE_WRITE) != 0) { 245 if ((flags & PAGE_EXEC) != 0) 246 entry->type = PTE_TYPE_SRWXURWX; 247 else 248 entry->type = PTE_TYPE_SRWURW; 249 } else { 250 if ((flags & PAGE_EXEC) != 0) 251 entry->type = PTE_TYPE_SRXURX; 252 else 253 entry->type = PTE_TYPE_SRUR; 254 } 198 entry->readable = (flags & PAGE_READ) != 0; 199 entry->writable = (flags & PAGE_WRITE) != 0; 200 entry->executable = (flags & PAGE_EXEC) != 0; 201 entry->user = (flags & PAGE_USER) != 0; 202 entry->global = (flags & PAGE_GLOBAL) != 0; 203 entry->accessed = 1; 204 entry->dirty = 1; 255 205 } 256 206 … … 264 214 extern void page_arch_init(void); 265 215 extern void page_fault(unsigned int, istate_t *); 216 extern void write_satp(uintptr_t); 266 217 267 218 #endif /* __ASM__ */
Note:
See TracChangeset
for help on using the changeset viewer.