Index: HelenOS.config
===================================================================
--- HelenOS.config	(revision 7ee8c5b6e104e12c5c46f3b995225fc3b3d0c636)
+++ HelenOS.config	(revision c640876a2871d801c859155f90c27f4d2ff40c11)
@@ -334,10 +334,20 @@
 @ "generic" Keyboard or serial line
 @ "none" No input device
-! [PLATFORM=ia32|PLATFORM=amd64|PLATFORM=mips32] CONFIG_HID_IN (choice)
+! [PLATFORM=ia32|PLATFORM=amd64|(PLATFORM=mips32&MACHINE!=msim)] CONFIG_HID_IN (choice)
+
+% Input device class
+@ "serial" Serial line
+@ "none" No input device
+! [MACHINE=ski|MACHINE=serengeti|MACHINE=msim] CONFIG_HID_IN (choice)
+
+% Output device class
+@ "serial" Serial line
+@ "none" No output device
+! [MACHINE=ski|MACHINE=serengeti|MACHINE=msim] CONFIG_HID_OUT (choice)
 
 % Output device class
 @ "generic" Monitor or serial line
 @ "none" No output device
-! [PLATFORM=ia32|PLATFORM=amd64|(PLATFORM=mips32&MACHINE=msim)] CONFIG_HID_OUT (choice)
+! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_HID_OUT (choice)
 
 % Output device class
Index: kernel/arch/ia64/include/ski/ski.h
===================================================================
--- kernel/arch/ia64/include/ski/ski.h	(revision 7ee8c5b6e104e12c5c46f3b995225fc3b3d0c636)
+++ kernel/arch/ia64/include/ski/ski.h	(revision c640876a2871d801c859155f90c27f4d2ff40c11)
@@ -36,5 +36,4 @@
 #define KERN_ia64_SKI_H_
 
-#include <arch/types.h>
 #include <console/chardev.h>
 
@@ -43,5 +42,6 @@
 #define SKI_PUTCHAR		31
 
-extern void ski_console_init(chardev_t *);
+extern indev_t *skiin_init(void);
+extern void skiout_init(void);
 extern void ski_kbd_grab(void);
 extern void ski_kbd_release(void);
Index: kernel/arch/ia64/src/asm.S
===================================================================
--- kernel/arch/ia64/src/asm.S	(revision 7ee8c5b6e104e12c5c46f3b995225fc3b3d0c636)
+++ kernel/arch/ia64/src/asm.S	(revision c640876a2871d801c859155f90c27f4d2ff40c11)
@@ -52,5 +52,5 @@
 	adds r14 = 7, in1
 	mov r2 = ar.lc
-	mov r8 = in0
+	mov r8 = in0 ;;
 	and r14 = -8, r14 ;;
 	cmp.ne p6, p7 = r14, in1
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision 7ee8c5b6e104e12c5c46f3b995225fc3b3d0c636)
+++ kernel/arch/ia64/src/ia64.c	(revision c640876a2871d801c859155f90c27f4d2ff40c11)
@@ -151,6 +151,9 @@
 {
 #ifdef SKI
-	srln_init(stdin);
-	ski_console_init(&srlnin);
+	indev_t *in;
+	in = skiin_init();
+	if (in)
+		srln_init(in);
+	skiout_init();
 #endif
 	
@@ -166,5 +169,5 @@
 	inr = NS16550_IRQ;
 	
-	indev_t *kbrdin = ns16550_init(ns16550_t *) NS16550_BASE, devno, inr, NULL, NULL);
+	indev_t *kbrdin = ns16550_init((ns16550_t *) NS16550_BASE, devno, inr, NULL, NULL);
 	if (kbrdin)
 		srln_init(kbrdin);
Index: kernel/arch/ia64/src/ski/ski.c
===================================================================
--- kernel/arch/ia64/src/ski/ski.c	(revision 7ee8c5b6e104e12c5c46f3b995225fc3b3d0c636)
+++ kernel/arch/ia64/src/ski/ski.c	(revision c640876a2871d801c859155f90c27f4d2ff40c11)
@@ -44,7 +44,6 @@
 #include <arch.h>
 
-static chardev_t *skiout;
-
-static chardev_t ski_stdout;
+static indev_t skiin;		/**< Ski input device. */
+static outdev_t skiout;		/**< Ski output device. */
 
 static bool kbd_disabled;
@@ -58,5 +57,5 @@
  * @param ch Character to be printed.
  */
-static void ski_putchar(chardev_t *d, const char ch, bool silent)
+static void ski_putchar(outdev_t *d, const char ch, bool silent)
 {
 	if (!silent) {
@@ -75,5 +74,9 @@
 }
 
-static chardev_operations_t ski_ops = {
+static indev_operations_t skiin_ops = {
+	.poll = NULL
+};
+
+static outdev_operations_t skiout_ops = {
 	.write = ski_putchar
 };
@@ -109,23 +112,14 @@
 {
 	char ch;
-	ipl_t ipl;
-	
-	ipl = interrupts_disable();
-	
-	if (kbd_disabled) {
-		interrupts_restore(ipl);
+	
+	if (kbd_disabled)
 		return;
-	}
-	
 	ch = ski_getchar();
 	if(ch == '\r')
 		ch = '\n'; 
-	if (ch && skiout) {
-		chardev_push_character(skiout, ch);
-		interrupts_restore(ipl);
+	if (ch) {
+		indev_push_character(&skiin, ch);
 		return;
 	}
-
-	interrupts_restore(ipl);
 }
 
@@ -148,6 +142,11 @@
  * to open debug console.
  */
-void ski_console_init(chardev_t *devout)
-{
+static void ski_init(void)
+{
+	static bool initialized;
+
+	if (initialized)
+		return;
+	
 	asm volatile (
 		"mov r15 = %0\n"
@@ -157,17 +156,33 @@
 		: "r15", "r8"
 	);
-
-	skiout = devout;
-	chardev_initialize("ski_stdout", &ski_stdout, &ski_ops);
-	stdout = &ski_stdout;
-
+	
+	initialized = true;
+}
+
+indev_t *skiin_init(void)
+{
+	ski_init();
+
+	indev_initialize("skiin", &skiin, &skiin_ops);
 	thread_t *t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll", true);
-	if (!t)
-		panic("Cannot create kkbdpoll.");
-	thread_ready(t);
+	if (t)
+		thread_ready(t);
+	else
+		return NULL;
 
 	sysinfo_set_item_val("kbd", NULL, true);
 	sysinfo_set_item_val("kbd.type", NULL, KBD_SKI);
 
+	return &skiin;
+}
+
+
+void skiout_init(void)
+{
+	ski_init();
+
+	outdev_initialize("skiout", &skiout, &skiout_ops);
+	stdout = &skiout;
+
 	sysinfo_set_item_val("fb", NULL, false);
 }
Index: kernel/genarch/include/drivers/ns16550/ns16550.h
===================================================================
--- kernel/genarch/include/drivers/ns16550/ns16550.h	(revision 7ee8c5b6e104e12c5c46f3b995225fc3b3d0c636)
+++ kernel/genarch/include/drivers/ns16550/ns16550.h	(revision c640876a2871d801c859155f90c27f4d2ff40c11)
@@ -69,5 +69,5 @@
 } ns16550_instance_t;
 
-extern indev_t *ns16550_init(ns16550_t *, devno_t, inr_t, cir_t, void *)
+extern indev_t *ns16550_init(ns16550_t *, devno_t, inr_t, cir_t, void *);
 
 #endif
