Ignore:
File:
1 edited

Legend:

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

    r0e78394 r0ff03f3  
    206206        pte_t *t;
    207207
     208        page_table_lock(AS, true);
    208209        t = page_mapping_find(AS, page_16k, true);
    209210        if (t && PTE_EXECUTABLE(t)) {
     
    217218                itsb_pte_copy(t, index);
    218219#endif
     220                page_table_unlock(AS, true);
    219221        } else {
    220222                /*
     
    222224                 * handler.
    223225                 */
     226                page_table_unlock(AS, true);
    224227                if (as_page_fault(page_16k, PF_ACCESS_EXEC, istate) ==
    225228                    AS_PF_FAULT) {
     
    247250        size_t index;
    248251        pte_t *t;
    249         as_t *as = AS;
    250252
    251253        page_8k = (uint64_t) tag.vpn << MMU_PAGE_WIDTH;
     
    259261                            "Dereferencing NULL pointer.");
    260262                } else if (page_8k >= end_of_identity) {
    261                         /* Kernel non-identity. */
    262                         as = AS_KERNEL;
    263                 } else {
    264                         do_fast_data_access_mmu_miss_fault(istate, tag,
    265                     "Unexpected kernel page fault.");
     263                        /*
     264                         * The kernel is accessing the I/O space.
     265                         * We still do identity mapping for I/O,
     266                         * but without caching.
     267                         */
     268                        dtlb_insert_mapping(page_8k, KA2PA(page_8k),
     269                            PAGESIZE_8K, false, false);
     270                        return;
    266271                }
    267         }
    268 
    269         t = page_mapping_find(as, page_16k, true);
     272                do_fast_data_access_mmu_miss_fault(istate, tag, "Unexpected "
     273                    "kernel page fault.");
     274        }
     275
     276        page_table_lock(AS, true);
     277        t = page_mapping_find(AS, page_16k, true);
    270278        if (t) {
    271279                /*
     
    278286                dtsb_pte_copy(t, index, true);
    279287#endif
     288                page_table_unlock(AS, true);
    280289        } else {
    281290                /*
    282291                 * Forward the page fault to the address space page fault
    283292                 * handler.
    284                  */
     293                 */             
     294                page_table_unlock(AS, true);
    285295                if (as_page_fault(page_16k, PF_ACCESS_READ, istate) ==
    286296                    AS_PF_FAULT) {
     
    304314        size_t index;
    305315        pte_t *t;
    306         as_t *as = AS;
    307316
    308317        page_16k = ALIGN_DOWN((uint64_t) tag.vpn << MMU_PAGE_WIDTH, PAGE_SIZE);
    309318        index = tag.vpn % MMU_PAGES_PER_PAGE;   /* 16K-page emulation */
    310319
    311         if (tag.context == ASID_KERNEL)
    312                 as = AS_KERNEL;
    313 
    314         t = page_mapping_find(as, page_16k, true);
     320        page_table_lock(AS, true);
     321        t = page_mapping_find(AS, page_16k, true);
    315322        if (t && PTE_WRITABLE(t)) {
    316323                /*
     
    327334                dtsb_pte_copy(t, index, false);
    328335#endif
     336                page_table_unlock(AS, true);
    329337        } else {
    330338                /*
     
    332340                 * handler.
    333341                 */             
     342                page_table_unlock(AS, true);
    334343                if (as_page_fault(page_16k, PF_ACCESS_WRITE, istate) ==
    335344                    AS_PF_FAULT) {
Note: See TracChangeset for help on using the changeset viewer.