Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/backend_elf.c

    r32817cc r55b77d9  
    4444#include <mm/page.h>
    4545#include <mm/reserve.h>
    46 #include <mm/km.h>
    4746#include <genarch/mm/page_pt.h>
    4847#include <genarch/mm/page_ht.h>
     
    230229        elf_segment_header_t *entry = area->backend_data.segment;
    231230        btree_node_t *leaf;
    232         uintptr_t base;
    233         uintptr_t frame;
    234         uintptr_t kpage;
    235         uintptr_t upage;
    236         uintptr_t start_anon;
     231        uintptr_t base, frame, page, start_anon;
    237232        size_t i;
    238233        bool dirty = false;
     
    254249            (((void *) elf) + ALIGN_DOWN(entry->p_offset, PAGE_SIZE));
    255250
    256         /* Virtual address of faulting page */
    257         upage = ALIGN_DOWN(addr, PAGE_SIZE);
     251        /* Virtual address of faulting page*/
     252        page = ALIGN_DOWN(addr, PAGE_SIZE);
    258253
    259254        /* Virtual address of the end of initialized part of segment */
     
    269264                mutex_lock(&area->sh_info->lock);
    270265                frame = (uintptr_t) btree_search(&area->sh_info->pagemap,
    271                     upage - area->base, &leaf);
     266                    page - area->base, &leaf);
    272267                if (!frame) {
    273268                        unsigned int i;
     
    278273
    279274                        for (i = 0; i < leaf->keys; i++) {
    280                                 if (leaf->key[i] == upage - area->base) {
     275                                if (leaf->key[i] == page - area->base) {
    281276                                        found = true;
    282277                                        break;
     
    286281                if (frame || found) {
    287282                        frame_reference_add(ADDR2PFN(frame));
    288                         page_mapping_insert(AS, upage, frame,
     283                        page_mapping_insert(AS, addr, frame,
    289284                            as_area_get_flags(area));
    290                         if (!used_space_insert(area, upage, 1))
     285                        if (!used_space_insert(area, page, 1))
    291286                                panic("Cannot insert used space.");
    292287                        mutex_unlock(&area->sh_info->lock);
     
    299294         * mapping.
    300295         */
    301         if (upage >= entry->p_vaddr && upage + PAGE_SIZE <= start_anon) {
     296        if (page >= entry->p_vaddr && page + PAGE_SIZE <= start_anon) {
    302297                /*
    303298                 * Initialized portion of the segment. The memory is backed
     
    309304                 */
    310305                if (entry->p_flags & PF_W) {
    311                         kpage = km_temporary_page_get(&frame, FRAME_NO_RESERVE);
    312                         memcpy((void *) kpage, (void *) (base + i * PAGE_SIZE),
    313                             PAGE_SIZE);
     306                        frame = (uintptr_t)frame_alloc_noreserve(ONE_FRAME, 0);
     307                        memcpy((void *) PA2KA(frame),
     308                            (void *) (base + i * FRAME_SIZE), FRAME_SIZE);
    314309                        if (entry->p_flags & PF_X) {
    315                                 smc_coherence_block((void *) kpage, PAGE_SIZE);
     310                                smc_coherence_block((void *) PA2KA(frame),
     311                                    FRAME_SIZE);
    316312                        }
    317                         km_temporary_page_put(kpage);
    318313                        dirty = true;
    319314                } else {
    320                         pte_t *pte = page_mapping_find(AS_KERNEL,
    321                             base + i * FRAME_SIZE, true);
    322 
    323                         ASSERT(pte);
    324                         ASSERT(PTE_PRESENT(pte));
    325 
    326                         frame = PTE_GET_FRAME(pte);
     315                        frame = KA2PA(base + i * FRAME_SIZE);
    327316                }       
    328         } else if (upage >= start_anon) {
     317        } else if (page >= start_anon) {
    329318                /*
    330319                 * This is the uninitialized portion of the segment.
     
    333322                 * and cleared.
    334323                 */
    335                 kpage = km_temporary_page_get(&frame, FRAME_NO_RESERVE);
    336                 memsetb((void *) kpage, PAGE_SIZE, 0);
    337                 km_temporary_page_put(kpage);
     324                frame = (uintptr_t) frame_alloc_noreserve(ONE_FRAME, 0);
     325                memsetb((void *) PA2KA(frame), FRAME_SIZE, 0);
    338326                dirty = true;
    339327        } else {
     
    346334                 * (The segment can be and often is shorter than 1 page).
    347335                 */
    348                 if (upage < entry->p_vaddr)
    349                         pad_lo = entry->p_vaddr - upage;
     336                if (page < entry->p_vaddr)
     337                        pad_lo = entry->p_vaddr - page;
    350338                else
    351339                        pad_lo = 0;
    352340
    353                 if (start_anon < upage + PAGE_SIZE)
    354                         pad_hi = upage + PAGE_SIZE - start_anon;
     341                if (start_anon < page + PAGE_SIZE)
     342                        pad_hi = page + PAGE_SIZE - start_anon;
    355343                else
    356344                        pad_hi = 0;
    357345
    358                 kpage = km_temporary_page_get(&frame, FRAME_NO_RESERVE);
    359                 memcpy((void *) (kpage + pad_lo),
    360                     (void *) (base + i * PAGE_SIZE + pad_lo),
    361                     PAGE_SIZE - pad_lo - pad_hi);
     346                frame = (uintptr_t) frame_alloc_noreserve(ONE_FRAME, 0);
     347                memcpy((void *) (PA2KA(frame) + pad_lo),
     348                    (void *) (base + i * FRAME_SIZE + pad_lo),
     349                    FRAME_SIZE - pad_lo - pad_hi);
    362350                if (entry->p_flags & PF_X) {
    363                         smc_coherence_block((void *) (kpage + pad_lo),
    364                             PAGE_SIZE - pad_lo - pad_hi);
     351                        smc_coherence_block((void *) (PA2KA(frame) + pad_lo),
     352                            FRAME_SIZE - pad_lo - pad_hi);
    365353                }
    366                 memsetb((void *) kpage, pad_lo, 0);
    367                 memsetb((void *) (kpage + PAGE_SIZE - pad_hi), pad_hi, 0);
    368                 km_temporary_page_put(kpage);
     354                memsetb((void *) PA2KA(frame), pad_lo, 0);
     355                memsetb((void *) (PA2KA(frame) + FRAME_SIZE - pad_hi), pad_hi,
     356                    0);
    369357                dirty = true;
    370358        }
     
    372360        if (dirty && area->sh_info) {
    373361                frame_reference_add(ADDR2PFN(frame));
    374                 btree_insert(&area->sh_info->pagemap, upage - area->base,
     362                btree_insert(&area->sh_info->pagemap, page - area->base,
    375363                    (void *) frame, leaf);
    376364        }
     
    379367                mutex_unlock(&area->sh_info->lock);
    380368
    381         page_mapping_insert(AS, upage, frame, as_area_get_flags(area));
    382         if (!used_space_insert(area, upage, 1))
     369        page_mapping_insert(AS, addr, frame, as_area_get_flags(area));
     370        if (!used_space_insert(area, page, 1))
    383371                panic("Cannot insert used space.");
    384372
Note: See TracChangeset for help on using the changeset viewer.