Index: kernel/arch/mips32/src/console.c
===================================================================
--- kernel/arch/mips32/src/console.c	(revision b76e51d243b458b2d5e31d922127b23015da05d0)
+++ kernel/arch/mips32/src/console.c	(revision 648c9d96c0f1fac40bb51cbd1cc306101c6b6735)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup mips32	
+/** @addtogroup mips32
  * @{
  */
@@ -34,7 +34,4 @@
 
 #include <console/console.h>
-#include <arch/console.h>
-#include <arch/drivers/serial.h>
-#include <arch/drivers/msim.h>
 #include <genarch/fb/fb.h>
 
@@ -47,5 +44,4 @@
 	fb_redraw();
 #endif
-	msim_kbd_grab();
 }
 
@@ -55,5 +51,4 @@
 void arch_release_console(void)
 {
-	msim_kbd_release();
 }
 
Index: kernel/arch/mips32/src/mips32.c
===================================================================
--- kernel/arch/mips32/src/mips32.c	(revision b76e51d243b458b2d5e31d922127b23015da05d0)
+++ kernel/arch/mips32/src/mips32.c	(revision 648c9d96c0f1fac40bb51cbd1cc306101c6b6735)
@@ -53,4 +53,7 @@
 #include <genarch/fb/fb.h>
 #include <genarch/fb/visuals.h>
+#include <genarch/drivers/dsrln/dsrlnin.h>
+#include <genarch/drivers/dsrln/dsrlnout.h>
+#include <genarch/srln/srln.h>
 #include <macros.h>
 #include <ddi/device.h>
@@ -134,5 +137,5 @@
 {
 	interrupt_init();
-	msim_console(device_assign_devno());
+	
 #ifdef CONFIG_FB
 	/* GXemul framebuffer */
@@ -146,33 +149,43 @@
 	};
 	fb_init(&gxemul_prop);
+#else
+#ifdef CONFIG_MIPS_PRN
+	dsrlnout_init((ioport8_t *) MSIM_KBD_ADDRESS);
+#endif /* CONFIG_MIPS_PRN */
+#endif /* CONFIG_FB */
+}
+
+void arch_post_cpu_init(void)
+{
+}
+
+void arch_pre_smp_init(void)
+{
+}
+
+void arch_post_smp_init(void)
+{
+#ifdef CONFIG_MIPS_KBD
+	devno_t devno = device_assign_devno();
+	
+	/*
+	 * Initialize the msim/GXemul keyboard port. Then initialize the serial line
+	 * module and connect it to the msim/GXemul keyboard. Enable keyboard interrupts.
+	 */
+	indev_t *kbrdin = dsrlnin_init((dsrlnin_t *) MSIM_KBD_ADDRESS, devno, MSIM_KBD_IRQ);
+	if (kbrdin) {
+		srln_init(kbrdin);
+		cp0_unmask_int(MSIM_KBD_IRQ);
+	}
+	
+	/*
+	 * This is the necessary evil until the userspace driver is entirely
+	 * self-sufficient.
+	 */
+	sysinfo_set_item_val("kbd", NULL, true);
+	sysinfo_set_item_val("kbd.devno", NULL, devno);
+	sysinfo_set_item_val("kbd.inr", NULL, MSIM_KBD_IRQ);
+	sysinfo_set_item_val("kbd.address.virtual", NULL, MSIM_KBD_ADDRESS);
 #endif
-
-#ifdef MACHINE_msim
-	sysinfo_set_item_val("machine.msim", NULL, 1);
-#endif
-
-#ifdef MACHINE_simics
-	sysinfo_set_item_val("machine.simics", NULL, 1);
-#endif
-
-#ifdef MACHINE_bgxemul
-	sysinfo_set_item_val("machine.bgxemul", NULL, 1);
-#endif
-
-#ifdef MACHINE_lgxemul
-	sysinfo_set_item_val("machine.lgxemul", NULL, 1);
-#endif
-}
-
-void arch_post_cpu_init(void)
-{
-}
-
-void arch_pre_smp_init(void)
-{
-}
-
-void arch_post_smp_init(void)
-{
 }
 
@@ -223,5 +236,4 @@
 {
 	___halt();
-	
 	while (1);
 }
