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


Ignore:
Timestamp:
2006-03-16T12:57:31Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e898a8d7
Parents:
b7dcabb
Message:

Page table locking.

File:
1 edited

Legend:

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

    rb7dcabb r2299914  
    8888{
    8989        entry_lo_t lo;
    90         entry_hi_t hi; 
     90        entry_hi_t hi;
     91        asid_t asid;
    9192        __address badvaddr;
    9293        pte_t *pte;
     
    9495        badvaddr = cp0_badvaddr_read();
    9596
    96         spinlock_lock(&AS->lock);               
     97        spinlock_lock(&AS->lock);
     98        asid = AS->asid;
     99        spinlock_unlock(&AS->lock);
     100
     101        page_table_lock(AS, true);
    97102
    98103        pte = find_mapping_and_check(badvaddr);
     
    105110        pte->a = 1;
    106111
    107         prepare_entry_hi(&hi, AS->asid, badvaddr);
     112        prepare_entry_hi(&hi, asid, badvaddr);
    108113        prepare_entry_lo(&lo, pte->g, pte->p, pte->d, pte->cacheable, pte->pfn);
    109114
     
    123128        tlbwr();
    124129
    125         spinlock_unlock(&AS->lock);
     130        page_table_unlock(AS, true);
    126131        return;
    127132       
    128133fail:
    129         spinlock_unlock(&AS->lock);
     134        page_table_unlock(AS, true);
    130135        tlb_refill_fail(istate);
    131136}
     
    155160        tlbp();
    156161        index.value = cp0_index_read();
    157        
    158         spinlock_lock(&AS->lock);       
     162
     163        page_table_lock(AS, true);     
    159164       
    160165        /*
     
    192197        tlbwi();
    193198
    194         spinlock_unlock(&AS->lock);     
     199        page_table_unlock(AS, true);
    195200        return;
    196201       
    197202fail:
    198         spinlock_unlock(&AS->lock);
     203        page_table_unlock(AS, true);
    199204        tlb_invalid_fail(istate);
    200205}
     
    224229        tlbp();
    225230        index.value = cp0_index_read();
    226        
    227         spinlock_lock(&AS->lock);       
     231
     232        page_table_lock(AS, true);     
    228233       
    229234        /*
     
    268273        tlbwi();
    269274
    270         spinlock_unlock(&AS->lock);     
     275        page_table_unlock(AS, true);
    271276        return;
    272277       
    273278fail:
    274         spinlock_unlock(&AS->lock);
     279        page_table_unlock(AS, true);
    275280        tlb_modified_fail(istate);
    276281}
     
    350355                 * Resort to higher-level page fault handler.
    351356                 */
     357                page_table_unlock(AS, true);
    352358                if (as_page_fault(badvaddr)) {
    353359                        /*
     
    355361                         * The mapping ought to be in place.
    356362                         */
     363                        page_table_lock(AS, true);
    357364                        pte = page_mapping_find(AS, badvaddr);
    358365                        ASSERT(pte && pte->p);
    359366                        return pte;
     367                } else {
     368                        page_table_lock(AS, true);
     369                        printf("Page fault.\n");
     370                        return NULL;
    360371                }
    361         }
    362 
    363         /*
    364          * Handler cannot succeed if badvaddr has no mapping.
    365          */
    366         if (!pte) {
    367                 printf("No such mapping.\n");
    368                 return NULL;
    369         }
    370 
    371         /*
    372          * Handler cannot succeed if the mapping is marked as invalid.
    373          */
    374         if (!pte->p) {
    375                 printf("Invalid mapping.\n");
    376                 return NULL;
    377         }
    378 
    379         return pte;
     372               
     373        }
    380374}
    381375
Note: See TracChangeset for help on using the changeset viewer.