Index: kernel/arch/sparc64/include/interrupt.h
===================================================================
--- kernel/arch/sparc64/include/interrupt.h	(revision 5b8016d235197748543b24787bd15cf1ba6864fb)
+++ kernel/arch/sparc64/include/interrupt.h	(revision 7008097ca6a0a187b98a9b23513d2488c87252d5)
@@ -76,4 +76,6 @@
 }
 
+extern void decode_istate(istate_t *);
+
 #endif
 
Index: kernel/arch/sparc64/src/mm/sun4u/tlb.c
===================================================================
--- kernel/arch/sparc64/src/mm/sun4u/tlb.c	(revision 5b8016d235197748543b24787bd15cf1ba6864fb)
+++ kernel/arch/sparc64/src/mm/sun4u/tlb.c	(revision 7008097ca6a0a187b98a9b23513d2488c87252d5)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup sparc64mm	
+/** @addtogroup sparc64mm
  * @{
  */
@@ -58,5 +58,6 @@
 static void dtlb_pte_copy(pte_t *, size_t, bool);
 static void itlb_pte_copy(pte_t *, size_t);
-static void do_fast_instruction_access_mmu_miss_fault(istate_t *, const char *);
+static void do_fast_instruction_access_mmu_miss_fault(istate_t *, uintptr_t,
+    const char *);
 static void do_fast_data_access_mmu_miss_fault(istate_t *, tlb_tag_access_reg_t,
     const char *);
@@ -222,10 +223,10 @@
 		 * Forward the page fault to the address space page fault
 		 * handler.
-		 */		
+		 */
 		page_table_unlock(AS, true);
 		if (as_page_fault(page_16k, PF_ACCESS_EXEC, istate) ==
 		    AS_PF_FAULT) {
 			do_fast_instruction_access_mmu_miss_fault(istate,
-			    __func__);
+			    istate->tpc, __func__);
 		}
 	}
@@ -258,5 +259,5 @@
 			/* NULL access in kernel */
 			do_fast_data_access_mmu_miss_fault(istate, tag,
-			    __func__);
+			    "Dereferencing NULL pointer");
 		} else if (page_8k >= end_of_identity) {
 			/*
@@ -438,9 +439,8 @@
 
 void do_fast_instruction_access_mmu_miss_fault(istate_t *istate,
-    const char *str)
-{
-	fault_if_from_uspace(istate, "%s.", str);
-	dump_istate(istate);
-	panic("%s.", str);
+    uintptr_t va, const char *str)
+{
+	fault_if_from_uspace(istate, "%s, Address=%p.", str, va);
+	panic_memtrap(istate, PF_ACCESS_EXEC, va, "%s.", str);
 }
 
@@ -451,11 +451,7 @@
 
 	va = tag.vpn << MMU_PAGE_WIDTH;
-	if (tag.context) {
-		fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str, va,
-		    tag.context);
-	}
-	dump_istate(istate);
-	printf("Faulting page: %p, ASID=%d.\n", va, tag.context);
-	panic("%s.", str);
+	fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str, va,
+	    tag.context);
+	panic_memtrap(istate, PF_ACCESS_READ, va, "%s.", str);
 }
 
@@ -466,12 +462,7 @@
 
 	va = tag.vpn << MMU_PAGE_WIDTH;
-
-	if (tag.context) {
-		fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str, va,
-		    tag.context);
-	}
-	printf("Faulting page: %p, ASID=%d\n", va, tag.context);
-	dump_istate(istate);
-	panic("%s.", str);
+	fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str, va,
+	    tag.context);
+	panic_memtrap(istate, PF_ACCESS_WRITE, va, "%s.", str);
 }
 
Index: kernel/arch/sparc64/src/mm/sun4v/tlb.c
===================================================================
--- kernel/arch/sparc64/src/mm/sun4v/tlb.c	(revision 5b8016d235197748543b24787bd15cf1ba6864fb)
+++ kernel/arch/sparc64/src/mm/sun4v/tlb.c	(revision 7008097ca6a0a187b98a9b23513d2488c87252d5)
@@ -28,5 +28,5 @@
  */
 
-/** @addtogroup sparc64mm	
+/** @addtogroup sparc64mm
  * @{
  */
@@ -62,5 +62,6 @@
 static void itlb_pte_copy(pte_t *);
 static void dtlb_pte_copy(pte_t *, bool);
-static void do_fast_instruction_access_mmu_miss_fault(istate_t *, const char *);
+static void do_fast_instruction_access_mmu_miss_fault(istate_t *, uintptr_t,
+    const char *);
 static void do_fast_data_access_mmu_miss_fault(istate_t *, uint64_t,
     const char *);
@@ -235,9 +236,9 @@
 		 * Forward the page fault to the address space page fault
 		 * handler.
-		 */		
+		 */
 		page_table_unlock(AS, true);
 		if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) {
 			do_fast_instruction_access_mmu_miss_fault(istate,
-			    __func__);
+			    istate->tpc, __func__);
 		}
 	}
@@ -354,10 +355,9 @@
 }
 
-void do_fast_instruction_access_mmu_miss_fault(istate_t *istate,
+void do_fast_instruction_access_mmu_miss_fault(istate_t *istate, uintptr_t va,
     const char *str)
 {
-	fault_if_from_uspace(istate, "%s.", str);
-	dump_istate(istate);
-	panic("%s.", str);
+	fault_if_from_uspace(istate, "%s, Address=%p.", str, va);
+	panic_memtrap(istate, PF_ACCESS_EXEC, va, "%s.", str);
 }
 
@@ -365,11 +365,8 @@
     uint64_t page_and_ctx, const char *str)
 {
-	if (DMISS_CONTEXT(page_and_ctx)) {
-		fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d)\n", str, DMISS_ADDRESS(page_and_ctx),
-		    DMISS_CONTEXT(page_and_ctx));
-	}
-	dump_istate(istate);
-	printf("Faulting page: %p, ASID=%d\n", DMISS_ADDRESS(page_and_ctx), DMISS_CONTEXT(page_and_ctx));
-	panic("%s\n", str);
+	fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str,
+	    DMISS_ADDRESS(page_and_ctx), DMISS_CONTEXT(page_and_ctx));
+	panic_memtrap(istate, PF_ACCESS_READ, DMISS_ADDRESS(page_and_ctx),
+	    "%s.");
 }
 
@@ -377,11 +374,8 @@
     uint64_t page_and_ctx, const char *str)
 {
-	if (DMISS_CONTEXT(page_and_ctx)) {
-		fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d)\n", str, DMISS_ADDRESS(page_and_ctx),
-		    DMISS_CONTEXT(page_and_ctx));
-	}
-	printf("Faulting page: %p, ASID=%d\n", DMISS_ADDRESS(page_and_ctx), DMISS_CONTEXT(page_and_ctx));
-	dump_istate(istate);
-	panic("%s\n", str);
+	fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str,
+	    DMISS_ADDRESS(page_and_ctx), DMISS_CONTEXT(page_and_ctx));
+	panic_memtrap(istate, PF_ACCESS_WRITE, DMISS_ADDRESS(page_and_ctx),
+	    "%s.");
 }
 
Index: kernel/arch/sparc64/src/trap/exception.c
===================================================================
--- kernel/arch/sparc64/src/trap/exception.c	(revision 5b8016d235197748543b24787bd15cf1ba6864fb)
+++ kernel/arch/sparc64/src/trap/exception.c	(revision 7008097ca6a0a187b98a9b23513d2488c87252d5)
@@ -44,5 +44,5 @@
 #include <symtab.h>
 
-void dump_istate(istate_t *istate)
+void decode_istate(istate_t *istate)
 {
 	const char *tpcs = symtab_fmt_name_lookup(istate->tpc);
@@ -58,6 +58,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -66,6 +65,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -74,6 +72,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -82,6 +79,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -90,6 +86,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -98,6 +93,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -118,6 +112,5 @@
 #else
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 #endif
 }
@@ -127,6 +120,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -135,6 +127,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -143,6 +134,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -151,6 +141,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -159,7 +148,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	describe_dmmu_fault();
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -168,6 +155,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -176,6 +162,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -184,6 +169,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -192,6 +176,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -200,6 +183,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -208,6 +190,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
@@ -216,6 +197,5 @@
 {
 	fault_if_from_uspace(istate, "%s.", __func__);
-	dump_istate(istate);
-	panic("%s.", __func__);
+	panic_badtrap(istate, n, "%s.", __func__);
 }
 
