Changes in kernel/genarch/src/mm/page_pt.c [17af882:ef9a2a8] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/page_pt.c
r17af882 ref9a2a8 77 77 unsigned int flags) 78 78 { 79 //printf("pt_mapping_insert: as=%p, page=0x%08x, frame=0x%08x\n", as, page, frame); 80 79 81 pte_t *ptl0 = (pte_t *) PA2KA((uintptr_t) as->genarch.page_table); 80 82 83 //printf("ptl0 = %p\n", ptl0); 84 81 85 ASSERT(page_table_locked(as)); 82 86 83 87 if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) { 84 pte_t *newpt = (pte_t *) 85 PA2KA(frame_alloc(PTL1_FRAMES, FRAME_LOWMEM, PTL1_SIZE - 1)); 86 memsetb(newpt, PTL1_SIZE, 0); 88 // printf("allocating ptl1\n"); 89 90 pte_t *newpt = (pte_t *) frame_alloc(PTL1_SIZE, 91 FRAME_LOWMEM | FRAME_KA); 92 93 // printf("newpt = %p, index = %d\n", newpt, PTL0_INDEX(page)); 94 95 memsetb(newpt, FRAME_SIZE << PTL1_SIZE, 0); 87 96 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); 88 97 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), … … 100 109 pte_t *ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); 101 110 111 // printf("ptl1 = %p\n", ptl1); 112 102 113 if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) { 103 pte_t *newpt = (pte_t *) 104 PA2KA(frame_alloc(PTL2_FRAMES, FRAME_LOWMEM, PTL2_SIZE - 1)); 105 memsetb(newpt, PTL2_SIZE, 0); 114 // printf("allocating ptl2\n"); 115 116 pte_t *newpt = (pte_t *) frame_alloc(PTL2_SIZE, 117 FRAME_LOWMEM | FRAME_KA); 118 119 // printf("newpt = %p, index = %d\n", newpt, PTL1_INDEX(page)); 120 121 memsetb(newpt, FRAME_SIZE << PTL2_SIZE, 0); 106 122 SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); 107 123 SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), … … 112 128 */ 113 129 write_barrier(); 114 SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page)); 130 SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page)); 115 131 } 116 132 117 133 pte_t *ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); 118 134 135 // printf("ptl2 = %p\n", ptl2); 136 119 137 if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) { 120 pte_t *newpt = (pte_t *) 121 PA2KA(frame_alloc(PTL3_FRAMES, FRAME_LOWMEM, PTL2_SIZE - 1)); 122 memsetb(newpt, PTL2_SIZE, 0); 138 // printf("allocating ptl3\n"); 139 140 pte_t *newpt = (pte_t *) frame_alloc(PTL3_SIZE, 141 FRAME_LOWMEM | FRAME_KA); 142 143 // printf("newpt = %p, index = %d\n", newpt, PTL2_INDEX(page)); 144 145 memsetb(newpt, FRAME_SIZE << PTL3_SIZE, 0); 123 146 SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); 124 147 SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), … … 134 157 pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); 135 158 159 // printf("ptl3 = %p\n", ptl3); 160 136 161 SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame); 137 162 SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags | PAGE_NOT_PRESENT); … … 180 205 * Destroy the mapping. 181 206 * Setting to PAGE_NOT_PRESENT is not sufficient. 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); 207 */ 187 208 memsetb(&ptl3[PTL3_INDEX(page)], sizeof(pte_t), 0); 188 209 … … 219 240 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 220 241 #endif 221 frame_free(KA2PA((uintptr_t) ptl3) , PTL3_FRAMES);242 frame_free(KA2PA((uintptr_t) ptl3)); 222 243 } else { 223 244 /* … … 253 274 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 254 275 #endif 255 frame_free(KA2PA((uintptr_t) ptl2) , PTL2_FRAMES);276 frame_free(KA2PA((uintptr_t) ptl2)); 256 277 } else { 257 278 /* … … 284 305 285 306 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 286 frame_free(KA2PA((uintptr_t) ptl1) , PTL1_FRAMES);307 frame_free(KA2PA((uintptr_t) ptl1)); 287 308 } 288 309 #endif /* PTL1_ENTRIES != 0 */ … … 363 384 * @param size Size in bytes defining the range of PTL0 entries that will be 364 385 * altered by this function. 365 *366 386 */ 367 387 void pt_mapping_make_global(uintptr_t base, size_t size) 368 388 { 369 ASSERT(size > 0);370 371 389 uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); 372 390 uintptr_t ptl0_step = ptl0_step_get(); 373 size_t frames; 374 391 size_t order; 392 uintptr_t addr; 393 375 394 #if (PTL1_ENTRIES != 0) 376 frames = PTL1_FRAMES;395 order = PTL1_SIZE; 377 396 #elif (PTL2_ENTRIES != 0) 378 frames = PTL2_FRAMES;397 order = PTL2_SIZE; 379 398 #else 380 frames = PTL3_FRAMES;399 order = PTL3_SIZE; 381 400 #endif 382 383 for (uintptr_t addr = ALIGN_DOWN(base, ptl0_step); 384 addr - 1 < base + size - 1; 401 402 ASSERT(size > 0); 403 404 for (addr = ALIGN_DOWN(base, ptl0_step); addr - 1 < base + size - 1; 385 405 addr += ptl0_step) { 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); 406 uintptr_t l1; 407 408 l1 = (uintptr_t) frame_alloc(order, FRAME_KA | FRAME_LOWMEM); 409 memsetb((void *) l1, FRAME_SIZE << order, 0); 399 410 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1)); 400 411 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),
Note:
See TracChangeset
for help on using the changeset viewer.