Ignore:
File:
1 edited

Legend:

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

    rf18d01b6 rde73242  
    8282       
    8383        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);
     84                pte_t *newpt = (pte_t *) frame_alloc(PTL1_SIZE,
     85                    FRAME_LOWMEM | FRAME_KA);
     86                memsetb(newpt, FRAME_SIZE << PTL1_SIZE, 0);
    8787                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt));
    8888                SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page),
     
    101101       
    102102        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);
     103                pte_t *newpt = (pte_t *) frame_alloc(PTL2_SIZE,
     104                    FRAME_LOWMEM | FRAME_KA);
     105                memsetb(newpt, FRAME_SIZE << PTL2_SIZE, 0);
    106106                SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt));
    107107                SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page),
     
    112112                 */
    113113                write_barrier();
    114                 SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page));
     114                SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page));       
    115115        }
    116116       
     
    118118       
    119119        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);
     120                pte_t *newpt = (pte_t *) frame_alloc(PTL3_SIZE,
     121                    FRAME_LOWMEM | FRAME_KA);
     122                memsetb(newpt, FRAME_SIZE << PTL3_SIZE, 0);
    123123                SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt));
    124124                SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page),
     
    180180         * Destroy the mapping.
    181181         * 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);
     182         */
    187183        memsetb(&ptl3[PTL3_INDEX(page)], sizeof(pte_t), 0);
    188184       
     
    219215                memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0);
    220216#endif
    221                 frame_free(KA2PA((uintptr_t) ptl3), PTL3_FRAMES);
     217                frame_free(KA2PA((uintptr_t) ptl3));
    222218        } else {
    223219                /*
     
    253249                memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0);
    254250#endif
    255                 frame_free(KA2PA((uintptr_t) ptl2), PTL2_FRAMES);
     251                frame_free(KA2PA((uintptr_t) ptl2));
    256252        } else {
    257253                /*
     
    284280
    285281                memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0);
    286                 frame_free(KA2PA((uintptr_t) ptl1), PTL1_FRAMES);
     282                frame_free(KA2PA((uintptr_t) ptl1));
    287283        }
    288284#endif /* PTL1_ENTRIES != 0 */
     
    363359 * @param size Size in bytes defining the range of PTL0 entries that will be
    364360 *             altered by this function.
    365  *
    366361 */
    367362void pt_mapping_make_global(uintptr_t base, size_t size)
    368363{
    369         ASSERT(size > 0);
    370        
    371364        uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table);
    372365        uintptr_t ptl0_step = ptl0_step_get();
    373         size_t frames;
    374        
     366        size_t order;
     367        uintptr_t addr;
     368
    375369#if (PTL1_ENTRIES != 0)
    376         frames = PTL1_FRAMES;
     370        order = PTL1_SIZE;
    377371#elif (PTL2_ENTRIES != 0)
    378         frames = PTL2_FRAMES;
     372        order = PTL2_SIZE;
    379373#else
    380         frames = PTL3_FRAMES;
    381 #endif
    382        
    383         for (uintptr_t addr = ALIGN_DOWN(base, ptl0_step);
    384             addr - 1 < base + size - 1;
     374        order = PTL3_SIZE;
     375#endif
     376
     377        ASSERT(size > 0);
     378
     379        for (addr = ALIGN_DOWN(base, ptl0_step); addr - 1 < base + size - 1;
    385380            addr += ptl0_step) {
    386                 uintptr_t l1 = PA2KA(frame_alloc(frames, FRAME_LOWMEM, 0));
    387                 memsetb((void *) l1, FRAMES2SIZE(frames), 0);
     381                uintptr_t l1;
     382
     383                l1 = (uintptr_t) frame_alloc(order, FRAME_KA | FRAME_LOWMEM);
     384                memsetb((void *) l1, FRAME_SIZE << order, 0);
    388385                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1));
    389386                SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),
Note: See TracChangeset for help on using the changeset viewer.