Index: kernel/arch/amd64/Makefile.inc
===================================================================
--- kernel/arch/amd64/Makefile.inc	(revision d46c6ecd4bb1934b64d8c11726ffed69e5897343)
+++ kernel/arch/amd64/Makefile.inc	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -62,4 +62,5 @@
 
 CONFIG_I8042 = y
+DEFS += -DCONFIG_I8042
 
 ## Accepted configuration directives
Index: kernel/arch/ia32/Makefile.inc
===================================================================
--- kernel/arch/ia32/Makefile.inc	(revision d46c6ecd4bb1934b64d8c11726ffed69e5897343)
+++ kernel/arch/ia32/Makefile.inc	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -81,4 +81,5 @@
 
 CONFIG_I8042 = y
+DEFS += -DCONFIG_I8042
 
 ## Accepted configuration directives
Index: kernel/arch/sparc64/Makefile.inc
===================================================================
--- kernel/arch/sparc64/Makefile.inc	(revision d46c6ecd4bb1934b64d8c11726ffed69e5897343)
+++ kernel/arch/sparc64/Makefile.inc	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -61,9 +61,22 @@
 CONFIG_FB = y
 
-## Compile with support for z8530 controller.
-#
 
-CONFIG_Z8530 = y
-DEFS += -DCONFIG_Z8530
+ifeq ($(MACHINE),enterprise)
+	## Compile with support for z8530 controller.
+	#
+
+	CONFIG_Z8530 = y
+	DEFS += -DCONFIG_Z8530
+endif
+ifeq ($(MACHINE),ultra)
+	## Compile with support for ns16550 controller.
+	#
+	
+	CONFIG_NS16550 = y
+	DEFS += -DCONFIG_NS16550
+	
+	DEFS += -DKBD_ADDR_OVRD=0x1fff13083f8ULL
+endif
+
 
 ARCH_SOURCES = \
Index: kernel/arch/sparc64/include/drivers/ns16550.h
===================================================================
--- kernel/arch/sparc64/include/drivers/ns16550.h	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
+++ kernel/arch/sparc64/include/drivers/ns16550.h	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -0,0 +1,57 @@
+/*
+ * 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
+ */
+
+#ifndef KERN_sparc64_NS16550_H_
+#define KERN_sparc64_NS16550_H_
+
+#include <arch/types.h>
+#include <arch/drivers/kbd.h>
+
+#define RBR_REG		0	/** Receiver Buffer Register. */
+#define LSR_REG		5	/** Line Status Register. */
+
+static inline uint8_t ns16550_rbr_read(void)
+{
+	return kbd_virt_address[RBR_REG];
+}
+
+static inline uint8_t ns16550_lsr_read(void)
+{
+	return kbd_virt_address[LSR_REG];
+}
+
+#endif
+
+/** @}
+ */
Index: kernel/arch/sparc64/src/console.c
===================================================================
--- kernel/arch/sparc64/src/console.c	(revision d46c6ecd4bb1934b64d8c11726ffed69e5897343)
+++ kernel/arch/sparc64/src/console.c	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -43,6 +43,6 @@
 #include <genarch/kbd/z8530.h>
 #endif
-#ifdef CONFIG_16550A
-#include <genarch/kbd/16550a.h>
+#ifdef CONFIG_NS16550
+#include <genarch/kbd/ns16550.h>
 #endif
 
@@ -65,4 +65,9 @@
 		bootinfo.screen.bpp, bootinfo.screen.scanline, true);
 
+#ifdef KBD_ADDR_OVRD
+	if (!bootinfo.keyboard.addr)
+		bootinfo.keyboard.addr = KBD_ADDR_OVRD;
+#endif
+
 	if (bootinfo.keyboard.addr)
 		kbd_init();
@@ -82,6 +87,6 @@
 		z8530_poll();
 #endif
-#ifdef CONFIG_16550A
-		16550a_poll();
+#ifdef CONFIG_NS16550
+		ns16550_poll();
 #endif
 		thread_usleep(KEYBOARD_POLL_PAUSE);
Index: kernel/arch/sparc64/src/drivers/kbd.c
===================================================================
--- kernel/arch/sparc64/src/drivers/kbd.c	(revision d46c6ecd4bb1934b64d8c11726ffed69e5897343)
+++ kernel/arch/sparc64/src/drivers/kbd.c	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -37,6 +37,6 @@
 #include <genarch/kbd/z8530.h>
 #endif
-#ifdef CONFIG_16650A
-#include <genarch/kbd/16650a.h>
+#ifdef CONFIG_NS16550
+#include <genarch/kbd/ns16550.h>
 #endif
 
@@ -70,6 +70,6 @@
 	z8530_init();
 #endif
-#ifdef CONFIG_16650A
-	16650A_init();
+#ifdef CONFIG_NS16550
+	ns16550_init();
 #endif
 }
Index: kernel/genarch/Makefile.inc
===================================================================
--- kernel/genarch/Makefile.inc	(revision d46c6ecd4bb1934b64d8c11726ffed69e5897343)
+++ kernel/genarch/Makefile.inc	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -80,2 +80,10 @@
 		genarch/src/kbd/scanc_sun.c
 endif
+
+## ns16550 controller
+ifeq ($(CONFIG_NS16550),y)
+	GENARCH_SOURCES += \
+		genarch/src/kbd/ns16550.c \
+		genarch/src/kbd/key.c \
+		genarch/src/kbd/scanc_sun.c
+endif
Index: kernel/genarch/include/kbd/ns16550.h
===================================================================
--- kernel/genarch/include/kbd/ns16550.h	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
+++ kernel/genarch/include/kbd/ns16550.h	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2001-2004 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 genarch	
+ * @{
+ */
+/**
+ * @file
+ * @brief	Headers for NS 16550 serial port / keyboard driver.
+ */
+
+#ifndef KERN_NS16550_H_
+#define KERN_NS16550_H_
+
+extern void ns16550_init(void);
+extern void ns16550_poll(void);
+extern void ns16550_grab(void);
+extern void ns16550_release(void);
+
+#endif
+
+/** @}
+ */
Index: kernel/genarch/src/kbd/key.c
===================================================================
--- kernel/genarch/src/kbd/key.c	(revision d46c6ecd4bb1934b64d8c11726ffed69e5897343)
+++ kernel/genarch/src/kbd/key.c	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -37,5 +37,10 @@
 #include <genarch/kbd/key.h>
 #include <genarch/kbd/scanc.h>
+#ifdef CONFIG_I8042
 #include <genarch/kbd/scanc_pc.h>
+#endif
+#if (defined(CONFIG_Z8530) || defined(CONFIG_NS16550))
+#include <genarch/kbd/scanc_sun.h>
+#endif
 #include <synch/spinlock.h>
 #include <console/chardev.h>
Index: kernel/genarch/src/kbd/ns16550.c
===================================================================
--- kernel/genarch/src/kbd/ns16550.c	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
+++ kernel/genarch/src/kbd/ns16550.c	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2001-2004 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 genarch	
+ * @{
+ */
+/**
+ * @file
+ * @brief	NS 16550 serial port / keyboard driver.
+ */
+
+#include <genarch/kbd/ns16550.h>
+#include <genarch/kbd/key.h>
+#include <genarch/kbd/scanc.h>
+#include <genarch/kbd/scanc_sun.h>
+#include <arch/drivers/ns16550.h>
+#include <arch/interrupt.h>
+#include <cpu.h>
+#include <arch/asm.h>
+#include <arch.h>
+#include <typedefs.h>
+#include <console/chardev.h>
+#include <console/console.h>
+#include <interrupt.h>
+
+#define LSR_DATA_READY	0x01
+
+/*
+ * These codes read from ns16550 data register are silently ignored.
+ */
+#define IGNORE_CODE	0x7f		/* all keys up */
+
+static void ns16550_suspend(chardev_t *);
+static void ns16550_resume(chardev_t *);
+
+chardev_t kbrd;
+static chardev_operations_t ops = {
+	.suspend = ns16550_suspend,
+	.resume = ns16550_resume,
+	.read = key_read
+};
+
+void ns16550_interrupt(int n, istate_t *istate);
+void ns16550_wait(void);
+
+/** Initialize keyboard and service interrupts using kernel routine */
+void ns16550_grab(void)
+{
+	/* TODO */
+}
+
+/** Resume the former interrupt vector */
+void ns16550_release(void)
+{
+	/* TODO */
+}
+
+/** Initialize ns16550. */
+void ns16550_init(void)
+{
+	ns16550_grab();
+	chardev_initialize("ns16550_kbd", &kbrd, &ops);
+	stdin = &kbrd;
+}
+
+/** Process ns16550 interrupt.
+ *
+ * @param n Interrupt vector.
+ * @param istate Interrupted state.
+ */
+void ns16550_interrupt(int n, istate_t *istate)
+{
+	/* TODO */
+}
+
+/** Wait until the controller reads its data. */
+void ns16550_wait(void) {
+}
+
+/* Called from getc(). */
+void ns16550_resume(chardev_t *d)
+{
+}
+
+/* Called from getc(). */
+void ns16550_suspend(chardev_t *d)
+{
+}
+
+char key_read(chardev_t *d)
+{
+	char ch;	
+
+	while(!(ch = active_read_buff_read())) {
+		uint8_t x;
+		while (!(ns16550_lsr_read() & LSR_DATA_READY))
+			;
+		x = ns16550_rbr_read();
+		if (x != IGNORE_CODE) {
+			if (x & KEY_RELEASE)
+				key_released(x ^ KEY_RELEASE);
+			else
+				active_read_key_pressed(x);
+		}
+	}
+	return ch;
+}
+
+/** Poll for key press and release events.
+ *
+ * This function can be used to implement keyboard polling.
+ */
+void ns16550_poll(void)
+{
+	uint8_t x;
+
+	while (((x = ns16550_lsr_read() & LSR_DATA_READY))) {
+		x = ns16550_rbr_read();
+		if (x != IGNORE_CODE) {
+			if (x & KEY_RELEASE)
+				key_released(x ^ KEY_RELEASE);
+			else
+				key_pressed(x);
+		}
+	}
+}
+
+/** @}
+ */
Index: kernel/kernel.config
===================================================================
--- kernel/kernel.config	(revision d46c6ecd4bb1934b64d8c11726ffed69e5897343)
+++ kernel/kernel.config	(revision 5f24137d560f5f077807a0a6fd458ec00e5789db)
@@ -36,4 +36,9 @@
 @ "indy" SGI Indy
 ! [ARCH=mips32] MACHINE (choice)
+
+# Machine type
+@ "ultra" Sun Ultra 5
+@ "enterprise" Sun Enterprise E6500
+! [ARCH=sparc64] MACHINE (choice)
 
 # Framebuffer support
