Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset a820bf7 in mainline


Ignore:
Timestamp:
2010-05-31T19:02:12Z (11 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master
Children:
e3ce39b
Parents:
ada559c
Message:

The kernel address space must locked in find_mapping_and_check() too.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ppc32/src/mm/tlb.c

    rada559c ra820bf7  
    5151 *
    5252 * Try to find PTE for faulting address.
    53  * The as->lock must be held on entry to this function
    54  * if lock is true.
     53 * The as->lock must be held on entry to this function.
    5554 *
    5655 * @param as       Address space.
     
    6564 *
    6665 */
    67 static pte_t *find_mapping_and_check(as_t *as, bool lock, uintptr_t badvaddr,
    68     int access, istate_t *istate, int *pfrc)
     66static pte_t *find_mapping_and_check(as_t *as, uintptr_t badvaddr, int access,
     67    istate_t *istate, int *pfrc)
    6968{
    7069        /*
     
    8382                 * Resort to higher-level page fault handler.
    8483                 */
    85                 page_table_unlock(as, lock);
     84                page_table_unlock(as, true);
    8685               
    8786                int rc = as_page_fault(badvaddr, access, istate);
     
    9291                         * The mapping ought to be in place.
    9392                         */
    94                         page_table_lock(as, lock);
     93                        page_table_lock(as, true);
    9594                        pte = page_mapping_find(as, badvaddr);
    9695                        ASSERT((pte) && (pte->present));
     
    9897                        return pte;
    9998                case AS_PF_DEFER:
    100                         page_table_lock(as, lock);
     99                        page_table_lock(as, true);
    101100                        *pfrc = rc;
    102101                        return NULL;
    103102                case AS_PF_FAULT:
    104                         page_table_lock(as, lock);
     103                        page_table_lock(as, true);
    105104                        *pfrc = rc;
    106105                        return NULL;
     
    213212void pht_refill(int n, istate_t *istate)
    214213{
    215         as_t *as;
    216         bool lock;
    217        
    218         if (AS == NULL) {
    219                 as = AS_KERNEL;
    220                 lock = false;
    221         } else {
    222                 as = AS;
    223                 lock = true;
    224         }
    225        
     214        as_t *as = (AS == NULL) ? AS_KERNEL : AS;
    226215        uintptr_t badvaddr;
    227216       
     
    231220                badvaddr = istate->pc;
    232221       
    233         page_table_lock(as, lock);
     222        page_table_lock(as, true);
    234223       
    235224        int pfrc;
    236         pte_t *pte = find_mapping_and_check(as, lock, badvaddr,
     225        pte_t *pte = find_mapping_and_check(as, badvaddr,
    237226            PF_ACCESS_READ /* FIXME */, istate, &pfrc);
    238227       
     
    247236                         * or copy_to_uspace().
    248237                         */
    249                         page_table_unlock(as, lock);
     238                        page_table_unlock(as, true);
    250239                        return;
    251240                default:
     
    258247        pht_insert(badvaddr, pte);
    259248       
    260         page_table_unlock(as, lock);
     249        page_table_unlock(as, true);
    261250        return;
    262251       
    263252fail:
    264         page_table_unlock(as, lock);
     253        page_table_unlock(as, true);
    265254        pht_refill_fail(badvaddr, istate);
    266255}
Note: See TracChangeset for help on using the changeset viewer.