Changes in kernel/arch/arm32/include/mm/page.h [7a0359b:98000fb] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/include/mm/page.h
r7a0359b r98000fb 27 27 */ 28 28 29 /** @addtogroup arm32mm 29 /** @addtogroup arm32mm 30 30 * @{ 31 31 */ … … 40 40 #include <mm/mm.h> 41 41 #include <arch/exception.h> 42 #include <trace.h>43 42 44 43 #define PAGE_WIDTH FRAME_WIDTH … … 76 75 /* Get PTE address accessors for each level. */ 77 76 #define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ 78 ((pte_t *) ((((pte_ t *)(ptl0))[(i)].l0).coarse_table_addr << 10))77 ((pte_t *) ((((pte_level0_t *)(ptl0))[(i)]).coarse_table_addr << 10)) 79 78 #define GET_PTL2_ADDRESS_ARCH(ptl1, i) \ 80 79 (ptl1) … … 82 81 (ptl2) 83 82 #define GET_FRAME_ADDRESS_ARCH(ptl3, i) \ 84 ((uintptr_t) ((((pte_ t *)(ptl3))[(i)].l1).frame_base_addr << 12))83 ((uintptr_t) ((((pte_level1_t *)(ptl3))[(i)]).frame_base_addr << 12)) 85 84 86 85 /* Set PTE address accessors for each level. */ 87 86 #define SET_PTL0_ADDRESS_ARCH(ptl0) \ 88 (set_ptl0_addr((pte_ t *) (ptl0)))87 (set_ptl0_addr((pte_level0_t *) (ptl0))) 89 88 #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \ 90 (((pte_ t *) (ptl0))[(i)].l0.coarse_table_addr = (a) >> 10)89 (((pte_level0_t *) (ptl0))[(i)].coarse_table_addr = (a) >> 10) 91 90 #define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) 92 91 #define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) 93 92 #define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \ 94 (((pte_ t *) (ptl3))[(i)].l1.frame_base_addr = (a) >> 12)93 (((pte_level1_t *) (ptl3))[(i)].frame_base_addr = (a) >> 12) 95 94 96 95 /* Get PTE flags accessors for each level. */ 97 96 #define GET_PTL1_FLAGS_ARCH(ptl0, i) \ 98 get_pt_level0_flags((pte_ t *) (ptl0), (size_t) (i))97 get_pt_level0_flags((pte_level0_t *) (ptl0), (size_t) (i)) 99 98 #define GET_PTL2_FLAGS_ARCH(ptl1, i) \ 100 99 PAGE_PRESENT … … 102 101 PAGE_PRESENT 103 102 #define GET_FRAME_FLAGS_ARCH(ptl3, i) \ 104 get_pt_level1_flags((pte_ t *) (ptl3), (size_t) (i))103 get_pt_level1_flags((pte_level1_t *) (ptl3), (size_t) (i)) 105 104 106 105 /* Set PTE flags accessors for each level. */ 107 106 #define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \ 108 set_pt_level0_flags((pte_ t *) (ptl0), (size_t) (i), (x))107 set_pt_level0_flags((pte_level0_t *) (ptl0), (size_t) (i), (x)) 109 108 #define SET_PTL2_FLAGS_ARCH(ptl1, i, x) 110 109 #define SET_PTL3_FLAGS_ARCH(ptl2, i, x) 111 110 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ 112 set_pt_level1_flags((pte_ t *) (ptl3), (size_t) (i), (x))111 set_pt_level1_flags((pte_level1_t *) (ptl3), (size_t) (i), (x)) 113 112 114 113 /* Macros for querying the last-level PTE entries. */ … … 116 115 (*((uint32_t *) (pte)) != 0) 117 116 #define PTE_PRESENT_ARCH(pte) \ 118 (((pte_ t *) (pte))->l0.descriptor_type != 0)117 (((pte_level0_t *) (pte))->descriptor_type != 0) 119 118 #define PTE_GET_FRAME_ARCH(pte) \ 120 (((pte_ t *) (pte))->l1.frame_base_addr << FRAME_WIDTH)119 (((pte_level1_t *) (pte))->frame_base_addr << FRAME_WIDTH) 121 120 #define PTE_WRITABLE_ARCH(pte) \ 122 (((pte_t *) (pte))->l1.access_permission_0 == PTE_AP_USER_RW_KERNEL_RW) 121 (((pte_level1_t *) (pte))->access_permission_0 == \ 122 PTE_AP_USER_RW_KERNEL_RW) 123 123 #define PTE_EXECUTABLE_ARCH(pte) \ 124 124 1 … … 159 159 } ATTRIBUTE_PACKED pte_level1_t; 160 160 161 typedef union {162 pte_level0_t l0;163 pte_level1_t l1;164 } pte_t;165 161 166 162 /* Level 1 page tables access permissions */ … … 193 189 /** Sets the address of level 0 page table. 194 190 * 195 * @param pt Pointer to the page table to set. 196 * 197 */ 198 NO_TRACE static inline void set_ptl0_addr(pte_t *pt) 191 * @param pt Pointer to the page table to set. 192 */ 193 static inline void set_ptl0_addr(pte_level0_t *pt) 199 194 { 200 195 asm volatile ( … … 207 202 /** Returns level 0 page table entry flags. 208 203 * 209 * @param pt Level 0 page table. 210 * @param i Index of the entry to return. 211 * 212 */ 213 NO_TRACE static inline int get_pt_level0_flags(pte_t *pt, size_t i) 214 { 215 pte_level0_t *p = &pt[i].l0; 204 * @param pt Level 0 page table. 205 * @param i Index of the entry to return. 206 */ 207 static inline int get_pt_level0_flags(pte_level0_t *pt, size_t i) 208 { 209 pte_level0_t *p = &pt[i]; 216 210 int np = (p->descriptor_type == PTE_DESCRIPTOR_NOT_PRESENT); 217 211 218 212 return (np << PAGE_PRESENT_SHIFT) | (1 << PAGE_USER_SHIFT) | 219 213 (1 << PAGE_READ_SHIFT) | (1 << PAGE_WRITE_SHIFT) | … … 223 217 /** Returns level 1 page table entry flags. 224 218 * 225 * @param pt Level 1 page table. 226 * @param i Index of the entry to return. 227 * 228 */ 229 NO_TRACE static inline int get_pt_level1_flags(pte_t *pt, size_t i) 230 { 231 pte_level1_t *p = &pt[i].l1; 232 219 * @param pt Level 1 page table. 220 * @param i Index of the entry to return. 221 */ 222 static inline int get_pt_level1_flags(pte_level1_t *pt, size_t i) 223 { 224 pte_level1_t *p = &pt[i]; 225 233 226 int dt = p->descriptor_type; 234 227 int ap = p->access_permission_0; 235 228 236 229 return ((dt == PTE_DESCRIPTOR_NOT_PRESENT) << PAGE_PRESENT_SHIFT) | 237 230 ((ap == PTE_AP_USER_RO_KERNEL_RW) << PAGE_READ_SHIFT) | … … 245 238 } 246 239 240 247 241 /** Sets flags of level 0 page table entry. 248 242 * 249 * @param pt level 0 page table 250 * @param i index of the entry to be changed 251 * @param flags new flags 252 * 253 */ 254 NO_TRACE static inline void set_pt_level0_flags(pte_t *pt, size_t i, int flags) 255 { 256 pte_level0_t *p = &pt[i].l0; 257 243 * @param pt level 0 page table 244 * @param i index of the entry to be changed 245 * @param flags new flags 246 */ 247 static inline void set_pt_level0_flags(pte_level0_t *pt, size_t i, int flags) 248 { 249 pte_level0_t *p = &pt[i]; 250 258 251 if (flags & PAGE_NOT_PRESENT) { 259 252 p->descriptor_type = PTE_DESCRIPTOR_NOT_PRESENT; … … 266 259 p->descriptor_type = PTE_DESCRIPTOR_COARSE_TABLE; 267 260 p->should_be_zero = 0; 268 261 } 269 262 } 270 263 … … 272 265 /** Sets flags of level 1 page table entry. 273 266 * 274 * We use same access rights for the whole page. When page 275 * is not preset we store 1 in acess_rigts_3 so that at least 276 * one bit is 1 (to mark correct page entry, see #PAGE_VALID_ARCH). 277 * 278 * @param pt Level 1 page table. 279 * @param i Index of the entry to be changed. 280 * @param flags New flags. 281 * 282 */ 283 NO_TRACE static inline void set_pt_level1_flags(pte_t *pt, size_t i, int flags) 284 { 285 pte_level1_t *p = &pt[i].l1; 267 * We use same access rights for the whole page. When page is not preset we 268 * store 1 in acess_rigts_3 so that at least one bit is 1 (to mark correct 269 * page entry, see #PAGE_VALID_ARCH). 270 * 271 * @param pt Level 1 page table. 272 * @param i Index of the entry to be changed. 273 * @param flags New flags. 274 */ 275 static inline void set_pt_level1_flags(pte_level1_t *pt, size_t i, int flags) 276 { 277 pte_level1_t *p = &pt[i]; 286 278 287 279 if (flags & PAGE_NOT_PRESENT) { … … 292 284 p->access_permission_3 = p->access_permission_0; 293 285 } 294 286 295 287 p->cacheable = p->bufferable = (flags & PAGE_CACHEABLE) != 0; 296 288 297 289 /* default access permission */ 298 290 p->access_permission_0 = p->access_permission_1 = 299 291 p->access_permission_2 = p->access_permission_3 = 300 292 PTE_AP_USER_NO_KERNEL_RW; 301 293 302 294 if (flags & PAGE_USER) { 303 295 if (flags & PAGE_READ) {
Note:
See TracChangeset
for help on using the changeset viewer.