Changeset 20d50a1 in mainline for arch/mips32/src/mm/tlb.c


Ignore:
Timestamp:
2006-01-13T13:02:45Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f9425006
Parents:
0369911
Message:

Memory management work.

  • vm.* → as.* (as like address space is, imho, more fitting)
  • Don't do TLB shootdown on vm_install(). Some architectures only need to call tlb_invalidate_asid().
  • Don't allocate all frames for as_area in as_area_create(), but let them be allocated on-demand by as_page_fault().
  • Add high-level page fault handler as_page_fault().
  • Add as_area_load_mapping().
File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/mips32/src/mm/tlb.c

    r0369911 r20d50a1  
    3131#include <mm/tlb.h>
    3232#include <mm/page.h>
    33 #include <mm/vm.h>
     33#include <mm/as.h>
    3434#include <arch/cp0.h>
    3535#include <panic.h>
     
    9393        badvaddr = cp0_badvaddr_read();
    9494
    95         spinlock_lock(&VM->lock);               
     95        spinlock_lock(&AS->lock);               
    9696
    9797        pte = find_mapping_and_check(badvaddr);
     
    104104        pte->a = 1;
    105105
    106         prepare_entry_hi(&hi, VM->asid, badvaddr);
     106        prepare_entry_hi(&hi, AS->asid, badvaddr);
    107107        prepare_entry_lo(&lo, pte->lo.g, pte->lo.v, pte->lo.d, pte->lo.c, pte->lo.pfn);
    108108
     
    122122        tlbwr();
    123123
    124         spinlock_unlock(&VM->lock);
     124        spinlock_unlock(&AS->lock);
    125125        return;
    126126       
    127127fail:
    128         spinlock_unlock(&VM->lock);
     128        spinlock_unlock(&AS->lock);
    129129        tlb_refill_fail(pstate);
    130130}
     
    155155        index.value = cp0_index_read();
    156156       
    157         spinlock_lock(&VM->lock);       
     157        spinlock_lock(&AS->lock);       
    158158       
    159159        /*
     
    191191        tlbwi();
    192192
    193         spinlock_unlock(&VM->lock);     
     193        spinlock_unlock(&AS->lock);     
    194194        return;
    195195       
    196196fail:
    197         spinlock_unlock(&VM->lock);
     197        spinlock_unlock(&AS->lock);
    198198        tlb_invalid_fail(pstate);
    199199}
     
    224224        index.value = cp0_index_read();
    225225       
    226         spinlock_lock(&VM->lock);       
     226        spinlock_lock(&AS->lock);       
    227227       
    228228        /*
     
    267267        tlbwi();
    268268
    269         spinlock_unlock(&VM->lock);     
     269        spinlock_unlock(&AS->lock);     
    270270        return;
    271271       
    272272fail:
    273         spinlock_unlock(&VM->lock);
     273        spinlock_unlock(&AS->lock);
    274274        tlb_modified_fail(pstate);
    275275}
     
    313313 *
    314314 * Try to find PTE for faulting address.
    315  * The VM->lock must be held on entry to this function.
     315 * The AS->lock must be held on entry to this function.
    316316 *
    317317 * @param badvaddr Faulting virtual address.
     
    329329         * Handler cannot succeed if the ASIDs don't match.
    330330         */
    331         if (hi.asid != VM->asid) {
    332                 printf("EntryHi.asid=%d, VM->asid=%d\n", hi.asid, VM->asid);
     331        if (hi.asid != AS->asid) {
     332                printf("EntryHi.asid=%d, AS->asid=%d\n", hi.asid, AS->asid);
    333333                return NULL;
    334334        }
    335        
     335
     336        /*
     337         * Check if the mapping exists in page tables.
     338         */     
     339        pte = page_mapping_find(badvaddr, AS->asid, 0);
     340        if (pte && pte->lo.v) {
     341                /*
     342                 * Mapping found in page tables.
     343                 * Immediately succeed.
     344                 */
     345                return pte;
     346        } else {
     347                /*
     348                 * Mapping not found in page tables.
     349                 * Resort to higher-level page fault handler.
     350                 */
     351                if (as_page_fault(badvaddr)) {
     352                        /*
     353                         * The higher-level page fault handler succeeded,
     354                         * The mapping ought to be in place.
     355                         */
     356                        pte = page_mapping_find(badvaddr, AS->asid, 0);
     357                        ASSERT(pte && pte->lo.v);
     358                        return pte;
     359                }
     360        }
     361
    336362        /*
    337363         * Handler cannot succeed if badvaddr has no mapping.
    338364         */
    339         pte = page_mapping_find(badvaddr, VM->asid, 0);
    340365        if (!pte) {
    341366                printf("No such mapping.\n");
Note: See TracChangeset for help on using the changeset viewer.