mov     %g3, %o2                ! PTE
        mov     HV_MMU_IMMU, %o3        ! flags
        ta      HV_MMU_MAP_ADDR_TRAP
+       brnz,pn %o0, sun4v_itlb_error
+        mov    %g2, %o1                ! restore %o1
        mov     %g1, %o0                ! restore %o0
-       mov     %g2, %o1                ! restore %o1
        mov     %g5, %o2                ! restore %o2
        mov     %g7, %o3                ! restore %o3
 
        mov     %g3, %o2                ! PTE
        mov     HV_MMU_DMMU, %o3        ! flags
        ta      HV_MMU_MAP_ADDR_TRAP
+       brnz,pn %o0, sun4v_dtlb_error
+        mov    %g2, %o1                ! restore %o1
        mov     %g1, %o0                ! restore %o0
-       mov     %g2, %o1                ! restore %o1
        mov     %g5, %o2                ! restore %o2
        mov     %g7, %o3                ! restore %o3
 
        ldxa    [%g1] ASI_SCRATCHPAD, %g1
        brz,pn  %g5, kvmap_itlb_4v
         mov    FAULT_CODE_ITLB, %g3
+       ba,a,pt %xcc, sun4v_tsb_miss_common
 
        /* Called from trap table with TAG TARGET placed into
         * %g6 and SCRATCHPAD_UTSBREG1 contents in %g1.
        ba,pt   %xcc, tsb_miss_page_table_walk_sun4v_fastpath
         ldx    [%g2 + TRAP_PER_CPU_PGD_PADDR], %g7
 
+sun4v_itlb_error:
+       sethi   %hi(sun4v_err_itlb_vaddr), %g1
+       stx     %g4, [%g1 + %lo(sun4v_err_itlb_vaddr)]
+       sethi   %hi(sun4v_err_itlb_ctx), %g1
+       srlx    %g6, 48, %o1            ! ctx
+       stx     %o1, [%g1 + %lo(sun4v_err_itlb_ctx)]
+       sethi   %hi(sun4v_err_itlb_pte), %g1
+       stx     %g3, [%g1 + %lo(sun4v_err_itlb_pte)]
+       sethi   %hi(sun4v_err_itlb_error), %g1
+       stx     %o0, [%g1 + %lo(sun4v_err_itlb_error)]
+
+       rdpr    %tl, %g4
+       cmp     %g4, 1
+       ble,pt  %icc, 1f
+        sethi  %hi(2f), %g7
+       ba,pt   %xcc, etraptl1
+        or     %g7, %lo(2f), %g7
+
+1:     ba,pt   %xcc, etrap
+2:      or     %g7, %lo(2b), %g7
+       call    sun4v_itlb_error_report
+        add    %sp, PTREGS_OFF, %o0
+
+       /* NOTREACHED */
+
+sun4v_dtlb_error:
+       sethi   %hi(sun4v_err_dtlb_vaddr), %g1
+       stx     %g4, [%g1 + %lo(sun4v_err_dtlb_vaddr)]
+       sethi   %hi(sun4v_err_dtlb_ctx), %g1
+       srlx    %g6, 48, %o1            ! ctx
+       stx     %o1, [%g1 + %lo(sun4v_err_dtlb_ctx)]
+       sethi   %hi(sun4v_err_dtlb_pte), %g1
+       stx     %g3, [%g1 + %lo(sun4v_err_dtlb_pte)]
+       sethi   %hi(sun4v_err_dtlb_error), %g1
+       stx     %o0, [%g1 + %lo(sun4v_err_dtlb_error)]
+
+       rdpr    %tl, %g4
+       cmp     %g4, 1
+       ble,pt  %icc, 1f
+        sethi  %hi(2f), %g7
+       ba,pt   %xcc, etraptl1
+        or     %g7, %lo(2f), %g7
+
+1:     ba,pt   %xcc, etrap
+2:      or     %g7, %lo(2b), %g7
+       call    sun4v_dtlb_error_report
+        add    %sp, PTREGS_OFF, %o0
+
+       /* NOTREACHED */
+
        /* Instruction Access Exception, tl0. */
 sun4v_iacc:
        ldxa    [%g0] ASI_SCRATCHPAD, %g2
 
        atomic_inc(&sun4v_nonresum_oflow_cnt);
 }
 
+unsigned long sun4v_err_itlb_vaddr;
+unsigned long sun4v_err_itlb_ctx;
+unsigned long sun4v_err_itlb_pte;
+unsigned long sun4v_err_itlb_error;
+
+void sun4v_itlb_error_report(struct pt_regs *regs, int tl)
+{
+       if (tl > 1)
+               dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
+
+       printk("SUN4V-ITLB: Error at TPC[%lx], tl %d\n", regs->tpc, tl);
+       printk("SUN4V-ITLB: vaddr[%lx] ctx[%lx] pte[%lx] error[%lx]\n",
+              sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx,
+              sun4v_err_itlb_pte, sun4v_err_itlb_error);
+       prom_halt();
+}
+
+unsigned long sun4v_err_dtlb_vaddr;
+unsigned long sun4v_err_dtlb_ctx;
+unsigned long sun4v_err_dtlb_pte;
+unsigned long sun4v_err_dtlb_error;
+
+void sun4v_dtlb_error_report(struct pt_regs *regs, int tl)
+{
+       if (tl > 1)
+               dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
+
+       printk("SUN4V-DTLB: Error at TPC[%lx], tl %d\n", regs->tpc, tl);
+       printk("SUN4V-DTLB: vaddr[%lx] ctx[%lx] pte[%lx] error[%lx]\n",
+              sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx,
+              sun4v_err_dtlb_pte, sun4v_err_dtlb_error);
+       prom_halt();
+}
+
 void do_fpe_common(struct pt_regs *regs)
 {
        if (regs->tstate & TSTATE_PRIV) {