Ignore:
File:
1 edited

Legend:

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

    r1dbc43f r9d58539  
    5858static void dtlb_pte_copy(pte_t *, size_t, bool);
    5959static void itlb_pte_copy(pte_t *, size_t);
     60static void do_fast_instruction_access_mmu_miss_fault(istate_t *, uintptr_t,
     61    const char *);
     62static void do_fast_data_access_mmu_miss_fault(istate_t *, tlb_tag_access_reg_t,
     63    const char *);
     64static void do_fast_data_access_protection_fault(istate_t *,
     65    tlb_tag_access_reg_t, const char *);
    6066
    6167const char *context_encoding[] = {
     
    216222                 * handler.
    217223                 */
    218                 as_page_fault(page_16k, PF_ACCESS_EXEC, istate);
     224                if (as_page_fault(page_16k, PF_ACCESS_EXEC, istate) ==
     225                    AS_PF_FAULT) {
     226                        do_fast_instruction_access_mmu_miss_fault(istate,
     227                            istate->tpc, __func__);
     228                }
    219229        }
    220230}
     
    246256                if (!tag.vpn) {
    247257                        /* NULL access in kernel */
    248                         panic("NULL pointer dereference.");
     258                        do_fast_data_access_mmu_miss_fault(istate, tag,
     259                            "Dereferencing NULL pointer.");
    249260                } else if (page_8k >= end_of_identity) {
    250261                        /* Kernel non-identity. */
    251262                        as = AS_KERNEL;
    252263                } else {
    253                         panic("Unexpected kernel page fault.");
     264                        do_fast_data_access_mmu_miss_fault(istate, tag,
     265                    "Unexpected kernel page fault.");
    254266                }
    255267        }
     
    271283                 * handler.
    272284                 */
    273                 as_page_fault(page_16k, PF_ACCESS_READ, istate);
     285                if (as_page_fault(page_16k, PF_ACCESS_READ, istate) ==
     286                    AS_PF_FAULT) {
     287                        do_fast_data_access_mmu_miss_fault(istate, tag,
     288                            __func__);
     289                }
    274290        }
    275291}
     
    316332                 * handler.
    317333                 */             
    318                 as_page_fault(page_16k, PF_ACCESS_WRITE, istate);
     334                if (as_page_fault(page_16k, PF_ACCESS_WRITE, istate) ==
     335                    AS_PF_FAULT) {
     336                        do_fast_data_access_protection_fault(istate, tag,
     337                            __func__);
     338                }
    319339        }
    320340}
     
    408428
    409429#endif
     430
     431void do_fast_instruction_access_mmu_miss_fault(istate_t *istate,
     432    uintptr_t va, const char *str)
     433{
     434        fault_if_from_uspace(istate, "%s, address=%p.", str, (void *) va);
     435        panic_memtrap(istate, PF_ACCESS_EXEC, va, str);
     436}
     437
     438void do_fast_data_access_mmu_miss_fault(istate_t *istate,
     439    tlb_tag_access_reg_t tag, const char *str)
     440{
     441        uintptr_t va;
     442
     443        va = tag.vpn << MMU_PAGE_WIDTH;
     444        fault_if_from_uspace(istate, "%s, page=%p (asid=%u).", str,
     445            (void *) va, tag.context);
     446        panic_memtrap(istate, PF_ACCESS_UNKNOWN, va, str);
     447}
     448
     449void do_fast_data_access_protection_fault(istate_t *istate,
     450    tlb_tag_access_reg_t tag, const char *str)
     451{
     452        uintptr_t va;
     453
     454        va = tag.vpn << MMU_PAGE_WIDTH;
     455        fault_if_from_uspace(istate, "%s, page=%p (asid=%u).", str,
     456            (void *) va, tag.context);
     457        panic_memtrap(istate, PF_ACCESS_WRITE, va, str);
     458}
    410459
    411460void describe_dmmu_fault(void)
Note: See TracChangeset for help on using the changeset viewer.