Changeset 0c2d9bb in mainline for kernel/genarch/src/mm/page_pt.c
- Timestamp:
- 2013-12-25T22:54:29Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b51cf2c
- Parents:
- f7a33de (diff), ac36aed (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/page_pt.c
rf7a33de r0c2d9bb 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 81 79 pte_t *ptl0 = (pte_t *) PA2KA((uintptr_t) as->genarch.page_table); 82 80 83 //printf("ptl0 = %p\n", ptl0);84 85 81 ASSERT(page_table_locked(as)); 86 82 87 83 if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) { 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); 84 pte_t *newpt = (pte_t *) 85 PA2KA(frame_alloc(PTL1_FRAMES, FRAME_LOWMEM, PTL1_SIZE - 1)); 86 memsetb(newpt, PTL1_SIZE, 0); 96 87 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); 97 88 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), … … 109 100 pte_t *ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); 110 101 111 // printf("ptl1 = %p\n", ptl1);112 113 102 if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) { 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); 103 pte_t *newpt = (pte_t *) 104 PA2KA(frame_alloc(PTL2_FRAMES, FRAME_LOWMEM, PTL2_SIZE - 1)); 105 memsetb(newpt, PTL2_SIZE, 0); 122 106 SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); 123 107 SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), … … 133 117 pte_t *ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); 134 118 135 // printf("ptl2 = %p\n", ptl2);136 137 119 if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) { 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); 120 pte_t *newpt = (pte_t *) 121 PA2KA(frame_alloc(PTL3_FRAMES, FRAME_LOWMEM, PTL2_SIZE - 1)); 122 memsetb(newpt, PTL2_SIZE, 0); 146 123 SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); 147 124 SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), … … 157 134 pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); 158 135 159 // printf("ptl3 = %p\n", ptl3);160 161 136 SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame); 162 137 SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags | PAGE_NOT_PRESENT); … … 244 219 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 245 220 #endif 246 frame_free(KA2PA((uintptr_t) ptl3) );221 frame_free(KA2PA((uintptr_t) ptl3), PTL3_FRAMES); 247 222 } else { 248 223 /* … … 278 253 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 279 254 #endif 280 frame_free(KA2PA((uintptr_t) ptl2) );255 frame_free(KA2PA((uintptr_t) ptl2), PTL2_FRAMES); 281 256 } else { 282 257 /* … … 309 284 310 285 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 311 frame_free(KA2PA((uintptr_t) ptl1) );286 frame_free(KA2PA((uintptr_t) ptl1), PTL1_FRAMES); 312 287 } 313 288 #endif /* PTL1_ENTRIES != 0 */ … … 388 363 * @param size Size in bytes defining the range of PTL0 entries that will be 389 364 * altered by this function. 365 * 390 366 */ 391 367 void pt_mapping_make_global(uintptr_t base, size_t size) 392 368 { 369 ASSERT(size > 0); 370 393 371 uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); 394 372 uintptr_t ptl0_step = ptl0_step_get(); 395 size_t order; 396 uintptr_t addr; 397 373 size_t frames; 374 398 375 #if (PTL1_ENTRIES != 0) 399 order = PTL1_SIZE;376 frames = PTL1_FRAMES; 400 377 #elif (PTL2_ENTRIES != 0) 401 order = PTL2_SIZE;378 frames = PTL2_FRAMES; 402 379 #else 403 order = PTL3_SIZE; 404 #endif 405 406 ASSERT(size > 0); 407 408 for (addr = ALIGN_DOWN(base, ptl0_step); addr - 1 < base + size - 1; 380 frames = PTL3_FRAMES; 381 #endif 382 383 for (uintptr_t addr = ALIGN_DOWN(base, ptl0_step); 384 addr - 1 < base + size - 1; 409 385 addr += ptl0_step) { 410 uintptr_t l1; 411 412 l1 = (uintptr_t) frame_alloc(order, FRAME_KA | FRAME_LOWMEM); 413 memsetb((void *) l1, FRAME_SIZE << order, 0); 386 uintptr_t l1 = PA2KA(frame_alloc(frames, FRAME_LOWMEM, 0)); 387 memsetb((void *) l1, FRAMES2SIZE(frames), 0); 414 388 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1)); 415 389 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),
Note:
See TracChangeset
for help on using the changeset viewer.