Index: kernel/genarch/src/kbd/key.c
===================================================================
--- kernel/genarch/src/kbd/key.c	(revision af863d0df32b98f1005d2470e2de1d3e71a445e6)
+++ kernel/genarch/src/kbd/key.c	(revision ff3b7da7acb81fa6d9a3a13f7c7f96b11b4cb59d)
@@ -40,7 +40,11 @@
 #include <genarch/kbd/scanc_pc.h>
 #endif
+
+#if (defined(sparc64))
 #if (defined(CONFIG_Z8530) || defined(CONFIG_NS16550))
 #include <genarch/kbd/scanc_sun.h>
 #endif
+#endif
+
 #include <synch/spinlock.h>
 #include <console/chardev.h>
Index: kernel/genarch/src/kbd/ns16550.c
===================================================================
--- kernel/genarch/src/kbd/ns16550.c	(revision af863d0df32b98f1005d2470e2de1d3e71a445e6)
+++ kernel/genarch/src/kbd/ns16550.c	(revision ff3b7da7acb81fa6d9a3a13f7c7f96b11b4cb59d)
@@ -39,6 +39,8 @@
 #include <genarch/kbd/scanc.h>
 #include <genarch/kbd/scanc_sun.h>
+#ifndef ia64
 #include <arch/drivers/kbd.h>
 #include <arch/drivers/ns16550.h>
+#endif
 #include <ddi/irq.h>
 #include <ipc/irq.h>
@@ -110,5 +112,5 @@
  * @param vaddr Virtual address of device's registers.
  */
-void ns16550_init(devno_t devno, inr_t inr, uintptr_t vaddr)
+void ns16550_init(devno_t devno, inr_t inr, ioport_t port)
 {
 	chardev_initialize("ns16550_kbd", &kbrd, &ops);
@@ -116,5 +118,5 @@
 	
 	ns16550.devno = devno;
-	ns16550.reg = (uint8_t *) vaddr;
+	ns16550.io_port = port;
 	
 	irq_initialize(&ns16550_irq);
@@ -126,8 +128,19 @@
 	
 	sysinfo_set_item_val("kbd", NULL, true);
+#ifndef ia64
 	sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550);
+#endif
 	sysinfo_set_item_val("kbd.devno", NULL, devno);
 	sysinfo_set_item_val("kbd.inr", NULL, inr);
-	sysinfo_set_item_val("kbd.address.virtual", NULL, vaddr);
+	sysinfo_set_item_val("kbd.address.virtual", NULL, port);
+
+#ifdef ia64
+    	uint8_t c;
+    	c=ns16550_lcr_read(&ns16550);
+    	ns16550_lcr_write(&ns16550,0x80|c);
+    	ns16550_rbr_write(&ns16550,0x0c);
+    	ns16550_ier_write(&ns16550,0x00);
+    	ns16550_lcr_write(&ns16550,c);
+#endif
 	
 	ns16550_grab();
@@ -152,4 +165,5 @@
 {
 }
+
 
 char ns16550_key_read(chardev_t *d)
@@ -162,4 +176,5 @@
 			;
 		x = ns16550_rbr_read(&ns16550);
+#ifndef ia64
 		if (x != IGNORE_CODE) {
 			if (x & KEY_RELEASE)
@@ -168,4 +183,13 @@
 				active_read_key_pressed(x);
 		}
+#else
+	extern chardev_t kbrd;
+	if(x!=0x0d)
+	{
+	    if(x==0x7f) x='\b';
+	    chardev_push_character(&kbrd,x);
+	}    
+#endif		
+
 	}
 	return ch;
@@ -202,4 +226,5 @@
 		
 		x = ns16550_rbr_read(&ns16550);
+#ifndef ia64
 		if (x != IGNORE_CODE) {
 			if (x & KEY_RELEASE)
@@ -208,4 +233,13 @@
 				key_pressed(x);
 		}
+#else
+	extern chardev_t kbrd;
+	if(x!=0x0d)
+	{
+	    if(x==0x7f) x='\b';
+	    chardev_push_character(&kbrd,x);
+	}    
+#endif		
+
 	}
 }
