Index: kernel/arch/sparc64/include/mm/tlb.h
===================================================================
--- kernel/arch/sparc64/include/mm/tlb.h	(revision f04506589914be9a530406f36fe0fcc480b7e2e5)
+++ kernel/arch/sparc64/include/mm/tlb.h	(revision deb14fb3367eb949b89e653259a597e4debc46da)
@@ -430,4 +430,6 @@
 extern void dtlb_insert_mapping(uintptr_t page, uintptr_t frame, int pagesize, bool locked, bool cacheable);
 
+extern void dump_sfsr_and_sfar(void);
+
 #endif /* !def __ASM__ */
 
Index: kernel/arch/sparc64/src/drivers/fhc.c
===================================================================
--- kernel/arch/sparc64/src/drivers/fhc.c	(revision f04506589914be9a530406f36fe0fcc480b7e2e5)
+++ kernel/arch/sparc64/src/drivers/fhc.c	(revision deb14fb3367eb949b89e653259a597e4debc46da)
@@ -41,4 +41,5 @@
 
 #include <arch/drivers/fhc.h>
+#include <arch/trap/interrupt.h>
 #include <arch/mm/page.h>
 #include <mm/slab.h>
@@ -46,5 +47,4 @@
 #include <typedefs.h>
 #include <genarch/ofw/ofw_tree.h>
-#include <genarch/kbd/z8530.h>
 
 fhc_t *central_fhc = NULL;
@@ -95,6 +95,5 @@
 	switch (inr) {
 	case FHC_UART_INR:
-		fhc->uart_imap[FHC_UART_ICLR] = 0x0;
-		fhc->uart_imap[FHC_UART_IMAP] = 0x80000000;
+		fhc->uart_imap[FHC_UART_IMAP] |= IMAP_V_MASK;
 		break;
 	default:
Index: kernel/arch/sparc64/src/drivers/pci.c
===================================================================
--- kernel/arch/sparc64/src/drivers/pci.c	(revision f04506589914be9a530406f36fe0fcc480b7e2e5)
+++ kernel/arch/sparc64/src/drivers/pci.c	(revision deb14fb3367eb949b89e653259a597e4debc46da)
@@ -98,5 +98,4 @@
 void pci_sabre_enable_interrupt(pci_t *pci, int inr)
 {
-	pci->reg[PCI_SABRE_ICLR_BASE + (inr & INO_MASK)] = 0;
 	pci->reg[PCI_SABRE_IMAP_BASE + (inr & INO_MASK)] |= IMAP_V_MASK;
 }
Index: kernel/arch/sparc64/src/mm/tlb.c
===================================================================
--- kernel/arch/sparc64/src/mm/tlb.c	(revision f04506589914be9a530406f36fe0fcc480b7e2e5)
+++ kernel/arch/sparc64/src/mm/tlb.c	(revision deb14fb3367eb949b89e653259a597e4debc46da)
@@ -75,4 +75,10 @@
 	 */
 	tlb_invalidate_all();
+
+	/*
+	 * Clear both SFSRs.
+	 */
+	dtlb_sfsr_write(0);
+	itlb_sfsr_write(0);
 }
 
@@ -354,4 +360,19 @@
 }
 
+void dump_sfsr_and_sfar(void)
+{
+	tlb_sfsr_reg_t sfsr;
+	uintptr_t sfar;
+
+	sfsr.value = dtlb_sfsr_read();
+	sfar = dtlb_sfar_read();
+	
+	printf("DTLB SFSR: asi=%#x, ft=%#x, e=%d, ct=%d, pr=%d, w=%d, ow=%d, fv=%d\n",
+		sfsr.asi, sfsr.ft, sfsr.e, sfsr.ct, sfsr.pr, sfsr.w, sfsr.ow, sfsr.fv);
+	printf("DTLB SFAR: address=%p\n", sfar);
+	
+	dtlb_sfsr_write(0);
+}
+
 /** Invalidate all unlocked ITLB and DTLB entries. */
 void tlb_invalidate_all(void)
Index: kernel/arch/sparc64/src/trap/exception.c
===================================================================
--- kernel/arch/sparc64/src/trap/exception.c	(revision f04506589914be9a530406f36fe0fcc480b7e2e5)
+++ kernel/arch/sparc64/src/trap/exception.c	(revision deb14fb3367eb949b89e653259a597e4debc46da)
@@ -35,4 +35,5 @@
 
 #include <arch/trap/exception.h>
+#include <arch/mm/tlb.h>
 #include <arch/interrupt.h>
 #include <interrupt.h>
@@ -157,4 +158,5 @@
 	fault_if_from_uspace(istate, "%s\n", __FUNCTION__);
 	dump_istate(istate);
+	dump_sfsr_and_sfar();
 	panic("%s\n", __FUNCTION__);
 }
