Ignore:
File:
1 edited

Legend:

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

    ref9a2a8 r17af882  
    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),
     
    128112                 */
    129113                write_barrier();
    130                 SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page));       
     114                SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page));
    131115        }
    132116       
    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);
     
    205180         * Destroy the mapping.
    206181         * Setting to PAGE_NOT_PRESENT is not sufficient.
    207          */
     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);
    208187        memsetb(&ptl3[PTL3_INDEX(page)], sizeof(pte_t), 0);
    209188       
     
    240219                memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0);
    241220#endif
    242                 frame_free(KA2PA((uintptr_t) ptl3));
     221                frame_free(KA2PA((uintptr_t) ptl3), PTL3_FRAMES);
    243222        } else {
    244223                /*
     
    274253                memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0);
    275254#endif
    276                 frame_free(KA2PA((uintptr_t) ptl2));
     255                frame_free(KA2PA((uintptr_t) ptl2), PTL2_FRAMES);
    277256        } else {
    278257                /*
     
    305284
    306285                memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0);
    307                 frame_free(KA2PA((uintptr_t) ptl1));
     286                frame_free(KA2PA((uintptr_t) ptl1), PTL1_FRAMES);
    308287        }
    309288#endif /* PTL1_ENTRIES != 0 */
     
    384363 * @param size Size in bytes defining the range of PTL0 entries that will be
    385364 *             altered by this function.
     365 *
    386366 */
    387367void pt_mapping_make_global(uintptr_t base, size_t size)
    388368{
     369        ASSERT(size > 0);
     370       
    389371        uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table);
    390372        uintptr_t ptl0_step = ptl0_step_get();
    391         size_t order;
    392         uintptr_t addr;
    393 
     373        size_t frames;
     374       
    394375#if (PTL1_ENTRIES != 0)
    395         order = PTL1_SIZE;
     376        frames = PTL1_FRAMES;
    396377#elif (PTL2_ENTRIES != 0)
    397         order = PTL2_SIZE;
     378        frames = PTL2_FRAMES;
    398379#else
    399         order = PTL3_SIZE;
     380        frames = PTL3_FRAMES;
    400381#endif
    401 
    402         ASSERT(size > 0);
    403 
    404         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;
    405385            addr += ptl0_step) {
    406                 uintptr_t l1;
    407 
    408                 l1 = (uintptr_t) frame_alloc(order, FRAME_KA | FRAME_LOWMEM);
    409                 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);
    410399                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1));
    411400                SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),
Note: See TracChangeset for help on using the changeset viewer.