Changeset 86c71de in mainline for kernel/generic/src/mm/backend_elf.c


Ignore:
Timestamp:
2012-01-21T12:57:55Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
eaa0c3f
Parents:
47a89fe (diff), e86b8f0 (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 with mainline

File:
1 edited

Legend:

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

    r47a89fe r86c71de  
    4444#include <mm/page.h>
    4545#include <mm/reserve.h>
     46#include <mm/km.h>
    4647#include <genarch/mm/page_pt.h>
    4748#include <genarch/mm/page_ht.h>
     
    229230        elf_segment_header_t *entry = area->backend_data.segment;
    230231        btree_node_t *leaf;
    231         uintptr_t base, frame, page, start_anon;
     232        uintptr_t base;
     233        uintptr_t frame;
     234        uintptr_t kpage;
     235        uintptr_t upage;
     236        uintptr_t start_anon;
    232237        size_t i;
    233238        bool dirty = false;
     
    249254            (((void *) elf) + ALIGN_DOWN(entry->p_offset, PAGE_SIZE));
    250255
    251         /* Virtual address of faulting page*/
    252         page = ALIGN_DOWN(addr, PAGE_SIZE);
     256        /* Virtual address of faulting page */
     257        upage = ALIGN_DOWN(addr, PAGE_SIZE);
    253258
    254259        /* Virtual address of the end of initialized part of segment */
     
    264269                mutex_lock(&area->sh_info->lock);
    265270                frame = (uintptr_t) btree_search(&area->sh_info->pagemap,
    266                     page - area->base, &leaf);
     271                    upage - area->base, &leaf);
    267272                if (!frame) {
    268273                        unsigned int i;
     
    273278
    274279                        for (i = 0; i < leaf->keys; i++) {
    275                                 if (leaf->key[i] == page - area->base) {
     280                                if (leaf->key[i] == upage - area->base) {
    276281                                        found = true;
    277282                                        break;
     
    281286                if (frame || found) {
    282287                        frame_reference_add(ADDR2PFN(frame));
    283                         page_mapping_insert(AS, addr, frame,
     288                        page_mapping_insert(AS, upage, frame,
    284289                            as_area_get_flags(area));
    285                         if (!used_space_insert(area, page, 1))
     290                        if (!used_space_insert(area, upage, 1))
    286291                                panic("Cannot insert used space.");
    287292                        mutex_unlock(&area->sh_info->lock);
     
    294299         * mapping.
    295300         */
    296         if (page >= entry->p_vaddr && page + PAGE_SIZE <= start_anon) {
     301        if (upage >= entry->p_vaddr && upage + PAGE_SIZE <= start_anon) {
    297302                /*
    298303                 * Initialized portion of the segment. The memory is backed
     
    304309                 */
    305310                if (entry->p_flags & PF_W) {
    306                         frame = (uintptr_t)frame_alloc_noreserve(ONE_FRAME, 0);
    307                         memcpy((void *) PA2KA(frame),
    308                             (void *) (base + i * FRAME_SIZE), FRAME_SIZE);
     311                        kpage = km_temporary_page_get(&frame, FRAME_NO_RESERVE);
     312                        memcpy((void *) kpage, (void *) (base + i * PAGE_SIZE),
     313                            PAGE_SIZE);
    309314                        if (entry->p_flags & PF_X) {
    310                                 smc_coherence_block((void *) PA2KA(frame),
    311                                     FRAME_SIZE);
     315                                smc_coherence_block((void *) kpage, PAGE_SIZE);
    312316                        }
     317                        km_temporary_page_put(kpage);
    313318                        dirty = true;
    314319                } else {
    315320                        frame = KA2PA(base + i * FRAME_SIZE);
    316321                }       
    317         } else if (page >= start_anon) {
     322        } else if (upage >= start_anon) {
    318323                /*
    319324                 * This is the uninitialized portion of the segment.
     
    322327                 * and cleared.
    323328                 */
    324                 frame = (uintptr_t) frame_alloc_noreserve(ONE_FRAME, 0);
    325                 memsetb((void *) PA2KA(frame), FRAME_SIZE, 0);
     329                kpage = km_temporary_page_get(&frame, FRAME_NO_RESERVE);
     330                memsetb((void *) kpage, PAGE_SIZE, 0);
     331                km_temporary_page_put(kpage);
    326332                dirty = true;
    327333        } else {
     
    334340                 * (The segment can be and often is shorter than 1 page).
    335341                 */
    336                 if (page < entry->p_vaddr)
    337                         pad_lo = entry->p_vaddr - page;
     342                if (upage < entry->p_vaddr)
     343                        pad_lo = entry->p_vaddr - upage;
    338344                else
    339345                        pad_lo = 0;
    340346
    341                 if (start_anon < page + PAGE_SIZE)
    342                         pad_hi = page + PAGE_SIZE - start_anon;
     347                if (start_anon < upage + PAGE_SIZE)
     348                        pad_hi = upage + PAGE_SIZE - start_anon;
    343349                else
    344350                        pad_hi = 0;
    345351
    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);
     352                kpage = km_temporary_page_get(&frame, FRAME_NO_RESERVE);
     353                memcpy((void *) (kpage + pad_lo),
     354                    (void *) (base + i * PAGE_SIZE + pad_lo),
     355                    PAGE_SIZE - pad_lo - pad_hi);
    350356                if (entry->p_flags & PF_X) {
    351                         smc_coherence_block((void *) (PA2KA(frame) + pad_lo),
    352                             FRAME_SIZE - pad_lo - pad_hi);
     357                        smc_coherence_block((void *) (kpage + pad_lo),
     358                            PAGE_SIZE - pad_lo - pad_hi);
    353359                }
    354                 memsetb((void *) PA2KA(frame), pad_lo, 0);
    355                 memsetb((void *) (PA2KA(frame) + FRAME_SIZE - pad_hi), pad_hi,
    356                     0);
     360                memsetb((void *) kpage, pad_lo, 0);
     361                memsetb((void *) (kpage + PAGE_SIZE - pad_hi), pad_hi, 0);
     362                km_temporary_page_put(kpage);
    357363                dirty = true;
    358364        }
     
    360366        if (dirty && area->sh_info) {
    361367                frame_reference_add(ADDR2PFN(frame));
    362                 btree_insert(&area->sh_info->pagemap, page - area->base,
     368                btree_insert(&area->sh_info->pagemap, upage - area->base,
    363369                    (void *) frame, leaf);
    364370        }
     
    367373                mutex_unlock(&area->sh_info->lock);
    368374
    369         page_mapping_insert(AS, addr, frame, as_area_get_flags(area));
    370         if (!used_space_insert(area, page, 1))
     375        page_mapping_insert(AS, upage, frame, as_area_get_flags(area));
     376        if (!used_space_insert(area, upage, 1))
    371377                panic("Cannot insert used space.");
    372378
Note: See TracChangeset for help on using the changeset viewer.