Index: uspace/Makefile
===================================================================
--- uspace/Makefile	(revision 0f74869b097948cf47305f47d532161682eac285)
+++ uspace/Makefile	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
@@ -63,4 +63,8 @@
 endif
 
+ifeq ($(UARCH),sparc64)
+	DIRS += srv/fhc
+endif
+
 BUILDS := $(addsuffix .build,$(DIRS))
 CLEANS := $(addsuffix .clean,$(DIRS))
Index: uspace/app/init/init.c
===================================================================
--- uspace/app/init/init.c	(revision 0f74869b097948cf47305f47d532161682eac285)
+++ uspace/app/init/init.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
@@ -109,4 +109,5 @@
 	spawn("/srv/kbd");
 	spawn("/srv/console");
+	spawn("/srv/fhc");
 	
 	console_wait();
Index: uspace/lib/libc/include/ipc/bus.h
===================================================================
--- uspace/lib/libc/include/ipc/bus.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ uspace/lib/libc/include/ipc/bus.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2009 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 libcipc
+ * @{
+ */
+/** @file
+ */ 
+
+#ifndef LIBC_BUS_H_
+#define LIBC_BUS_H_
+
+#include <ipc/ipc.h>
+
+typedef enum {
+	BUS_CLEAR_INTERRUPT = IPC_FIRST_USER_METHOD
+} bus_request_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/libc/include/ipc/services.h
===================================================================
--- uspace/lib/libc/include/ipc/services.h	(revision 0f74869b097948cf47305f47d532161682eac285)
+++ uspace/lib/libc/include/ipc/services.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
@@ -45,5 +45,6 @@
 	SERVICE_CONSOLE,
 	SERVICE_VFS,
-	SERVICE_DEVMAP
+	SERVICE_DEVMAP,
+	SERVICE_FHC
 } services_t;
 
Index: uspace/srv/fhc/Makefile
===================================================================
--- uspace/srv/fhc/Makefile	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ uspace/srv/fhc/Makefile	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2006 Martin Decky
+# 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.
+#
+
+## Setup toolchain
+#
+
+
+LIBC_PREFIX = ../../lib/libc
+SOFTINT_PREFIX = ../../lib/softint
+
+include $(LIBC_PREFIX)/Makefile.toolchain
+
+LIBS = $(LIBC_PREFIX)/libc.a
+
+## Sources
+#
+
+OUTPUT = fhc
+SOURCES = \
+	fhc.c
+
+OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
+
+.PHONY: all clean depend disasm
+
+all: $(OUTPUT) $(OUTPUT).disasm
+
+-include Makefile.depend
+
+clean:
+	-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend $(OBJECTS)
+
+depend:
+	$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend
+
+$(OUTPUT): $(OBJECTS) $(LIBS)
+	$(LD) -T $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
+
+disasm: $(OUTPUT).disasm
+
+$(OUTPUT).disasm: $(OUTPUT)
+	$(OBJDUMP) -d $< >$@
+
+%.o: %.S
+	$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@
+
+%.o: %.s
+	$(AS) $(AFLAGS) $< -o $@
+
+%.o: %.c
+	$(CC) $(DEFS) $(CFLAGS) -c $< -o $@
Index: uspace/srv/fhc/fhc.c
===================================================================
--- uspace/srv/fhc/fhc.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ uspace/srv/fhc/fhc.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2009 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 fhc
+ * @{
+ */ 
+
+/**
+ * @file	fhc.c
+ * @brief	FHC bus driver.
+ */
+
+#include <ipc/ipc.h>
+#include <ipc/services.h>
+#include <ipc/bus.h>
+#include <ipc/ns.h>
+#include <sysinfo.h>
+#include <as.h>
+#include <ddi.h>
+#include <align.h>
+#include <bool.h>
+#include <errno.h>
+#include <async.h>
+#include <align.h>
+#include <async.h>
+#include <stdio.h>
+#include <ipc/devmap.h>
+
+#define NAME "fhc"
+
+#define FHC_UART_INR	0x39	
+
+#define FHC_UART_IMAP	0x0
+#define FHC_UART_ICLR	0x4
+
+static void *fhc_uart_phys;
+static volatile uint32_t *fhc_uart_virt;
+static size_t fhc_uart_size;
+
+/** Handle one connection to ramdisk.
+ *
+ * @param iid		Hash of the request that opened the connection.
+ * @param icall		Call data of the request that opened the connection.
+ */
+static void fhc_connection(ipc_callid_t iid, ipc_call_t *icall)
+{
+	ipc_callid_t callid;
+	ipc_call_t call;
+
+	/*
+	 * Answer the first IPC_M_CONNECT_ME_TO call.
+	 */
+	ipc_answer_0(iid, EOK);
+
+	while (1) {
+		int inr;
+	
+		callid = async_get_call(&call);
+		switch (IPC_GET_METHOD(call)) {
+		case BUS_CLEAR_INTERRUPT:
+			inr = IPC_GET_ARG1(call);
+			switch (inr) {
+			case FHC_UART_INR:
+				fhc_uart_virt[FHC_UART_ICLR] = 0;
+				ipc_answer_0(callid, EOK);
+				break;
+			default:
+				ipc_answer_0(callid, ENOTSUP);
+				break;
+			}
+			break;
+		default:
+			ipc_answer_0(callid, EINVAL);
+			break;
+		}
+	}
+}
+
+/** Initialize the FHC driver.
+ *
+ * So far, the driver heavily depends on information provided by the kernel via
+ * sysinfo. In the future, there should be a standalone FHC driver.
+ */
+static bool fhc_init(void)
+{
+	ipcarg_t phonead;
+
+	fhc_uart_size = sysinfo_value("fhc.uart.size");
+	fhc_uart_phys = (void *) sysinfo_value("fhc.uart.physical");
+	
+	if (!fhc_uart_size) {
+		printf(NAME ": no FHC UART registers found\n");
+		return false;
+	}
+
+	fhc_uart_virt = as_get_mappable_page(fhc_uart_size);
+	
+	int flags = AS_AREA_READ | AS_AREA_WRITE;
+	int retval = physmem_map(fhc_uart_phys, (void *) fhc_uart_virt,
+	    ALIGN_UP(fhc_uart_size, PAGE_SIZE) >> PAGE_WIDTH, flags);
+	
+	if (retval < 0) {
+		printf(NAME ": Error mapping FHC UART registers\n");
+		return false;
+	}
+	
+	printf(NAME ": FHC UART registers at %p, %d bytes\n", fhc_uart_phys,
+	    fhc_uart_size);
+
+	async_set_client_connection(fhc_connection);
+	ipc_connect_to_me(PHONE_NS, SERVICE_FHC, 0, 0, &phonead);
+	
+	return true;
+}
+
+int main(int argc, char **argv)
+{
+	printf(NAME ": HelenOS FHC bus driver\n");
+	
+	if (!fhc_init())
+		return -1;
+	
+	printf(NAME ": Accepting connections\n");
+	async_manager();
+
+	/* Never reached */
+	return 0;
+}
+
+/**
+ * @}
+ */ 
Index: uspace/srv/kbd/generic/kbd.c
===================================================================
--- uspace/srv/kbd/generic/kbd.c	(revision 0f74869b097948cf47305f47d532161682eac285)
+++ uspace/srv/kbd/generic/kbd.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
@@ -38,4 +38,5 @@
 #include <ipc/ipc.h>
 #include <ipc/services.h>
+#include <sysinfo.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -66,4 +67,7 @@
 /** Currently pressed lock keys. We track these to tackle autorepeat. */
 static unsigned lock_keys;
+
+int cir_service = 0;
+int cir_phone = -1;
 
 void kbd_push_scancode(int scancode)
@@ -173,4 +177,14 @@
 	ipcarg_t phonead;
 	
+	if (sysinfo_value("kbd.cir.fhc") == 1)
+		cir_service = SERVICE_FHC;
+	
+	if (cir_service) {
+		while (cir_phone < 0) {
+			cir_phone = ipc_connect_me_to(PHONE_NS, cir_service,
+			    0, 0);
+		}
+	}
+	
 	/* Initialize port driver. */
 	if (kbd_port_init())
Index: uspace/srv/kbd/include/kbd.h
===================================================================
--- uspace/srv/kbd/include/kbd.h	(revision 0f74869b097948cf47305f47d532161682eac285)
+++ uspace/srv/kbd/include/kbd.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
@@ -46,4 +46,7 @@
 #define KBD_MS_MOVE	1028
 
+extern int cir_service;
+extern int cir_phone;
+
 extern void kbd_push_scancode(int);
 extern void kbd_push_ev(int, unsigned int);
Index: uspace/srv/kbd/port/z8530.c
===================================================================
--- uspace/srv/kbd/port/z8530.c	(revision 0f74869b097948cf47305f47d532161682eac285)
+++ uspace/srv/kbd/port/z8530.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
@@ -36,4 +36,5 @@
 
 #include <ipc/ipc.h>
+#include <ipc/bus.h>
 #include <async.h>
 #include <sysinfo.h>
@@ -89,5 +90,5 @@
 	    CHAN_A_DATA;
 	ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"),
-	    0, &z8530_kbd);
+	    sysinfo_value("kbd.inr"), &z8530_kbd);
 	return 0;
 }
@@ -97,4 +98,8 @@
 	int scan_code = IPC_GET_ARG2(*call);
 	kbd_push_scancode(scan_code);
+	
+	if (cir_service)
+		async_msg_1(cir_phone, BUS_CLEAR_INTERRUPT,
+		    IPC_GET_METHOD(*call));
 }
 
