Changes in kernel/genarch/src/mm/page_pt.c [e943ecf:17af882] in mainline
- File:
-
- 1 edited
-
kernel/genarch/src/mm/page_pt.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/page_pt.c
re943ecf r17af882 82 82 83 83 if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) { 84 pte_t *newpt = (pte_t *) frame_alloc(PTL1_SIZE,85 FRAME_LOWMEM | FRAME_KA);86 memsetb(newpt, FRAME_SIZE <<PTL1_SIZE, 0);84 pte_t *newpt = (pte_t *) 85 PA2KA(frame_alloc(PTL1_FRAMES, FRAME_LOWMEM, PTL1_SIZE - 1)); 86 memsetb(newpt, PTL1_SIZE, 0); 87 87 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); 88 88 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), 89 89 PAGE_NOT_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 90 90 PAGE_WRITE); 91 /* 92 * Make sure that a concurrent hardware page table walk or 93 * pt_mapping_find() will see the new PTL1 only after it is 94 * fully initialized. 95 */ 91 96 write_barrier(); 92 97 SET_PTL1_PRESENT(ptl0, PTL0_INDEX(page)); … … 96 101 97 102 if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) { 98 pte_t *newpt = (pte_t *) frame_alloc(PTL2_SIZE,99 FRAME_LOWMEM | FRAME_KA);100 memsetb(newpt, FRAME_SIZE <<PTL2_SIZE, 0);103 pte_t *newpt = (pte_t *) 104 PA2KA(frame_alloc(PTL2_FRAMES, FRAME_LOWMEM, PTL2_SIZE - 1)); 105 memsetb(newpt, PTL2_SIZE, 0); 101 106 SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); 102 107 SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), 103 108 PAGE_NOT_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 104 109 PAGE_WRITE); 110 /* 111 * Make the new PTL2 visible only after it is fully initialized. 112 */ 105 113 write_barrier(); 106 SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page)); 114 SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page)); 107 115 } 108 116 … … 110 118 111 119 if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) { 112 pte_t *newpt = (pte_t *) frame_alloc(PTL3_SIZE,113 FRAME_LOWMEM | FRAME_KA);114 memsetb(newpt, FRAME_SIZE << PTL3_SIZE, 0);120 pte_t *newpt = (pte_t *) 121 PA2KA(frame_alloc(PTL3_FRAMES, FRAME_LOWMEM, PTL2_SIZE - 1)); 122 memsetb(newpt, PTL2_SIZE, 0); 115 123 SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); 116 124 SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), 117 125 PAGE_NOT_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 118 126 PAGE_WRITE); 127 /* 128 * Make the new PTL3 visible only after it is fully initialized. 129 */ 119 130 write_barrier(); 120 131 SET_PTL3_PRESENT(ptl2, PTL2_INDEX(page)); … … 125 136 SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame); 126 137 SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags | PAGE_NOT_PRESENT); 138 /* 139 * Make the new mapping visible only after it is fully initialized. 140 */ 127 141 write_barrier(); 128 142 SET_FRAME_PRESENT(ptl3, PTL3_INDEX(page)); … … 166 180 * Destroy the mapping. 167 181 * Setting to PAGE_NOT_PRESENT is not sufficient. 168 */ 182 * But we need SET_FRAME for possible PT coherence maintenance. 183 * At least on ARM. 184 */ 185 //TODO: Fix this inconsistency 186 SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), PAGE_NOT_PRESENT); 169 187 memsetb(&ptl3[PTL3_INDEX(page)], sizeof(pte_t), 0); 170 188 … … 201 219 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 202 220 #endif 203 frame_free(KA2PA((uintptr_t) ptl3) );221 frame_free(KA2PA((uintptr_t) ptl3), PTL3_FRAMES); 204 222 } else { 205 223 /* … … 235 253 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 236 254 #endif 237 frame_free(KA2PA((uintptr_t) ptl2) );255 frame_free(KA2PA((uintptr_t) ptl2), PTL2_FRAMES); 238 256 } else { 239 257 /* … … 266 284 267 285 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 268 frame_free(KA2PA((uintptr_t) ptl1) );286 frame_free(KA2PA((uintptr_t) ptl1), PTL1_FRAMES); 269 287 } 270 288 #endif /* PTL1_ENTRIES != 0 */ … … 296 314 297 315 #if (PTL1_ENTRIES != 0) 316 /* 317 * Always read ptl2 only after we are sure it is present. 318 */ 298 319 read_barrier(); 299 320 #endif … … 304 325 305 326 #if (PTL2_ENTRIES != 0) 327 /* 328 * Always read ptl3 only after we are sure it is present. 329 */ 306 330 read_barrier(); 307 331 #endif … … 339 363 * @param size Size in bytes defining the range of PTL0 entries that will be 340 364 * altered by this function. 365 * 341 366 */ 342 367 void pt_mapping_make_global(uintptr_t base, size_t size) 343 368 { 369 ASSERT(size > 0); 370 344 371 uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); 345 372 uintptr_t ptl0_step = ptl0_step_get(); 346 size_t order; 347 uintptr_t addr; 348 373 size_t frames; 374 349 375 #if (PTL1_ENTRIES != 0) 350 order = PTL1_SIZE;376 frames = PTL1_FRAMES; 351 377 #elif (PTL2_ENTRIES != 0) 352 order = PTL2_SIZE;378 frames = PTL2_FRAMES; 353 379 #else 354 order = PTL3_SIZE;380 frames = PTL3_FRAMES; 355 381 #endif 356 357 ASSERT(size > 0); 358 359 for (addr = ALIGN_DOWN(base, ptl0_step); addr - 1 < base + size - 1; 382 383 for (uintptr_t addr = ALIGN_DOWN(base, ptl0_step); 384 addr - 1 < base + size - 1; 360 385 addr += ptl0_step) { 361 uintptr_t l1; 362 363 l1 = (uintptr_t) frame_alloc(order, FRAME_KA | FRAME_LOWMEM); 364 memsetb((void *) l1, FRAME_SIZE << order, 0); 386 if (GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr))) { 387 ASSERT(overlaps(addr, ptl0_step, 388 config.identity_base, config.identity_size)); 389 390 /* 391 * This PTL0 entry also maps the kernel identity region, 392 * so it is already global and initialized. 393 */ 394 continue; 395 } 396 397 uintptr_t l1 = PA2KA(frame_alloc(frames, FRAME_LOWMEM, 0)); 398 memsetb((void *) l1, FRAMES2SIZE(frames), 0); 365 399 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1)); 366 400 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),
Note:
See TracChangeset
for help on using the changeset viewer.
