Changeset 0c2d9bb in mainline for kernel/genarch/src/mm/page_pt.c


Ignore:
Timestamp:
2013-12-25T22:54:29Z (10 years ago)
Author:
Martin Decky <martin@…>
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.
Message:

merge mainline changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/mm/page_pt.c

    rf7a33de r0c2d9bb  
    7777    unsigned int flags)
    7878{
    79         //printf("pt_mapping_insert: as=%p, page=0x%08x, frame=0x%08x\n", as, page, frame);
    80 
    8179        pte_t *ptl0 = (pte_t *) PA2KA((uintptr_t) as->genarch.page_table);
    8280
    83         //printf("ptl0 = %p\n", ptl0);
    84 
    8581        ASSERT(page_table_locked(as));
    86 
     82       
    8783        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);
    9687                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt));
    9788                SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page),
     
    109100        pte_t *ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page)));
    110101       
    111 //      printf("ptl1 = %p\n", ptl1);
    112 
    113102        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);
    122106                SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt));
    123107                SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page),
     
    133117        pte_t *ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page)));
    134118       
    135 //      printf("ptl2 = %p\n", ptl2);
    136 
    137119        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);
    146123                SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt));
    147124                SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page),
     
    157134        pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page)));
    158135       
    159 //      printf("ptl3 = %p\n", ptl3);
    160 
    161136        SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame);
    162137        SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags | PAGE_NOT_PRESENT);
     
    244219                memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0);
    245220#endif
    246                 frame_free(KA2PA((uintptr_t) ptl3));
     221                frame_free(KA2PA((uintptr_t) ptl3), PTL3_FRAMES);
    247222        } else {
    248223                /*
     
    278253                memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0);
    279254#endif
    280                 frame_free(KA2PA((uintptr_t) ptl2));
     255                frame_free(KA2PA((uintptr_t) ptl2), PTL2_FRAMES);
    281256        } else {
    282257                /*
     
    309284
    310285                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);
    312287        }
    313288#endif /* PTL1_ENTRIES != 0 */
     
    388363 * @param size Size in bytes defining the range of PTL0 entries that will be
    389364 *             altered by this function.
     365 *
    390366 */
    391367void pt_mapping_make_global(uintptr_t base, size_t size)
    392368{
     369        ASSERT(size > 0);
     370       
    393371        uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table);
    394372        uintptr_t ptl0_step = ptl0_step_get();
    395         size_t order;
    396         uintptr_t addr;
    397 
     373        size_t frames;
     374       
    398375#if (PTL1_ENTRIES != 0)
    399         order = PTL1_SIZE;
     376        frames = PTL1_FRAMES;
    400377#elif (PTL2_ENTRIES != 0)
    401         order = PTL2_SIZE;
     378        frames = PTL2_FRAMES;
    402379#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;
    409385            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);
    414388                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1));
    415389                SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),
Note: See TracChangeset for help on using the changeset viewer.