Index: kernel/arch/sparc64/src/console.c
===================================================================
--- kernel/arch/sparc64/src/console.c	(revision 8b4be29e60da1d7e6355cb2b0bf8ae7e3c561965)
+++ kernel/arch/sparc64/src/console.c	(revision f9a56c06291b17dff86c61d294ec807828f33f96)
@@ -85,5 +85,5 @@
 	while (1) {
 #ifdef CONFIG_Z8530
-		z8530_poll();
+		return;
 #endif
 #ifdef CONFIG_NS16550
Index: kernel/arch/sparc64/src/drivers/fhc.c
===================================================================
--- kernel/arch/sparc64/src/drivers/fhc.c	(revision f9a56c06291b17dff86c61d294ec807828f33f96)
+++ kernel/arch/sparc64/src/drivers/fhc.c	(revision f9a56c06291b17dff86c61d294ec807828f33f96)
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2006 Jakub Jermar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup sparc64
+ * @{
+ */
+/**
+ * @file
+ * @brief	FireHose Controller (FHC) driver.
+ *
+ * Note that this driver is a result of reverse engineering
+ * rather than implementation of a specification. This
+ * is due to the fact that the FHC documentation is not
+ * publicly available.
+ */
+
+#include <arch/drivers/fhc.h>
+#include <arch/mm/page.h>
+#include <arch/types.h>
+#include <typedefs.h>
+
+#include <genarch/kbd/z8530.h>
+
+volatile uint32_t *fhc = NULL;
+
+#define FHC_UART_ADDR	0x1fff8808000ULL		/* hardcoded for Simics simulation */
+
+#define FHC_UART_IMAP	0x0
+#define FHC_UART_ICLR	0x4
+
+void fhc_init(void)
+{
+	fhc = (void *) hw_map(FHC_UART_ADDR, PAGE_SIZE);
+
+	(void) fhc[FHC_UART_ICLR];
+	fhc[FHC_UART_ICLR] = 0;
+	(void) fhc[FHC_UART_IMAP];
+	fhc[FHC_UART_IMAP] = Z8530_INTRCV_DATA0;	/* hardcoded for Simics simulation */
+	(void) fhc[FHC_UART_IMAP];
+	fhc[FHC_UART_IMAP] = 0x80000000;		/* hardcoded for Simics simulation */
+}
+
+void fhc_uart_reset(void)
+{
+	(void) fhc[FHC_UART_ICLR];
+	fhc[FHC_UART_ICLR] = 0;
+}
+
+/** @}
+ */
Index: kernel/arch/sparc64/src/drivers/kbd.c
===================================================================
--- kernel/arch/sparc64/src/drivers/kbd.c	(revision 8b4be29e60da1d7e6355cb2b0bf8ae7e3c561965)
+++ kernel/arch/sparc64/src/drivers/kbd.c	(revision f9a56c06291b17dff86c61d294ec807828f33f96)
@@ -61,5 +61,5 @@
 	 * However, the physical keyboard address can
 	 * be pretty much unaligned on some systems
-	 * (e.g. Ultra 5, Ultras 60).
+	 * (e.g. Ultra 5, Ultra 60).
 	 */
 	aligned_addr = ALIGN_DOWN(bootinfo.keyboard.addr, PAGE_SIZE);
Index: kernel/arch/sparc64/src/drivers/tick.c
===================================================================
--- kernel/arch/sparc64/src/drivers/tick.c	(revision 8b4be29e60da1d7e6355cb2b0bf8ae7e3c561965)
+++ kernel/arch/sparc64/src/drivers/tick.c	(revision f9a56c06291b17dff86c61d294ec807828f33f96)
@@ -27,5 +27,5 @@
  */
 
- /** @addtogroup sparc64	
+/** @addtogroup sparc64	
  * @{
  */
@@ -89,5 +89,4 @@
 }
 
- /** @}
+/** @}
  */
-
Index: kernel/arch/sparc64/src/trap/interrupt.c
===================================================================
--- kernel/arch/sparc64/src/trap/interrupt.c	(revision 8b4be29e60da1d7e6355cb2b0bf8ae7e3c561965)
+++ kernel/arch/sparc64/src/trap/interrupt.c	(revision f9a56c06291b17dff86c61d294ec807828f33f96)
@@ -34,8 +34,14 @@
 
 #include <arch/interrupt.h>
+#include <arch/trap/interrupt.h>
 #include <interrupt.h>
+#include <arch/drivers/fhc.h>
 #include <arch/types.h>
 #include <debug.h>
 #include <ipc/sysipc.h>
+#include <arch/asm.h>
+#include <arch/barrier.h>
+
+#include <genarch/kbd/z8530.h>
 
 /** Register Interrupt Level Handler.
@@ -59,5 +65,32 @@
 }
 
+void interrupt(void)
+{
+	uint64_t intrcv;
+	uint64_t data0;
+
+	intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0);
+	data0 = asi_u64_read(ASI_UDB_INTR_R, ASI_UDB_INTR_R_DATA_0);
+
+	switch (data0) {
+#ifdef CONFIG_Z8530
+	case Z8530_INTRCV_DATA0:
+		/*
+		 * So far, we know we got this interrupt through the FHC.
+		 * Since we don't have enough information about the FHC and
+		 * because the interrupt looks like level sensitive,
+		 * we cannot handle it by scheduling one of the level
+		 * interrupt traps. Call the interrupt handler directly.
+		 */
+		fhc_uart_reset();
+		z8530_interrupt();
+		break;
+#endif
+	}
+
+	membar();
+	asi_u64_write(ASI_INTR_RECEIVE, 0, 0);
+}
+
 /** @}
  */
-
