Ignore:
File:
1 edited

Legend:

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

    r17af882 ref9a2a8  
    7777    unsigned int flags)
    7878{
     79        //printf("pt_mapping_insert: as=%p, page=0x%08x, frame=0x%08x\n", as, page, frame);
     80
    7981        pte_t *ptl0 = (pte_t *) PA2KA((uintptr_t) as->genarch.page_table);
    8082
     83        //printf("ptl0 = %p\n", ptl0);
     84
    8185        ASSERT(page_table_locked(as));
    82        
     86
    8387        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);
    8796                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt));
    8897                SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page),
     
    100109        pte_t *ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page)));
    101110       
     111//      printf("ptl1 = %p\n", ptl1);
     112
    102113        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);
    106122                SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt));
    107123                SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page),
     
    112128                 */
    113129                write_barrier();
    114                 SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page));
     130                SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page));       
    115131        }
    116132       
    117133        pte_t *ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page)));
    118134       
     135//      printf("ptl2 = %p\n", ptl2);
     136
    119137        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);
    123146                SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt));
    124147                SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page),
     
    134157        pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page)));
    135158       
     159//      printf("ptl3 = %p\n", ptl3);
     160
    136161        SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame);
    137162        SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags | PAGE_NOT_PRESENT);
     
    180205         * Destroy the mapping.
    181206         * 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         */
    187208        memsetb(&ptl3[PTL3_INDEX(page)], sizeof(pte_t), 0);
    188209       
     
    219240                memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0);
    220241#endif
    221                 frame_free(KA2PA((uintptr_t) ptl3), PTL3_FRAMES);
     242                frame_free(KA2PA((uintptr_t) ptl3));
    222243        } else {
    223244                /*
     
    253274                memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0);
    254275#endif
    255                 frame_free(KA2PA((uintptr_t) ptl2), PTL2_FRAMES);
     276                frame_free(KA2PA((uintptr_t) ptl2));
    256277        } else {
    257278                /*
     
    284305
    285306                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));
    287308        }
    288309#endif /* PTL1_ENTRIES != 0 */
     
    363384 * @param size Size in bytes defining the range of PTL0 entries that will be
    364385 *             altered by this function.
    365  *
    366386 */
    367387void pt_mapping_make_global(uintptr_t base, size_t size)
    368388{
    369         ASSERT(size > 0);
    370        
    371389        uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table);
    372390        uintptr_t ptl0_step = ptl0_step_get();
    373         size_t frames;
    374        
     391        size_t order;
     392        uintptr_t addr;
     393
    375394#if (PTL1_ENTRIES != 0)
    376         frames = PTL1_FRAMES;
     395        order = PTL1_SIZE;
    377396#elif (PTL2_ENTRIES != 0)
    378         frames = PTL2_FRAMES;
     397        order = PTL2_SIZE;
    379398#else
    380         frames = PTL3_FRAMES;
     399        order = PTL3_SIZE;
    381400#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;
    385405            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);
    399410                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1));
    400411                SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),
Note: See TracChangeset for help on using the changeset viewer.