Index: arch/mips32/src/drivers/msim.c
===================================================================
--- arch/mips32/src/drivers/msim.c	(revision af9a7c57cb5b1118b9fe7512bf136d64c3eee3b2)
+++ arch/mips32/src/drivers/msim.c	(revision ebbdb8fd8b3f471868d0d452f8ad473aa432226e)
@@ -38,9 +38,11 @@
 static void msim_enable(chardev_t *dev);
 static void msim_disable(chardev_t *dev);
+static char msim_do_read(chardev_t *dev);
 
 static chardev_operations_t msim_ops = {
 	.resume = msim_enable,
 	.suspend = msim_disable,
-	.write = msim_write
+	.write = msim_write,
+	.read = msim_do_read,
 };
 
@@ -64,8 +66,25 @@
 
 #include <print.h>
+/** Read character using polling, assume interrupts disabled */
+static char msim_do_read(chardev_t *dev)
+{
+	char ch;
+
+	while (1) {
+		ch = *((volatile char *) MSIM_KBD_ADDRESS);
+		if (ch) {
+			if (ch == '\r')
+				return '\n';
+			if (ch == 0x7f)
+				return '\b';
+			return ch;
+		}
+	}
+}
+
 /** Process keyboard interrupt. */
 static void msim_interrupt(int n, void *stack)
 {
-	char ch;
+	char ch = 0;
 
 	ch = *((char *) MSIM_KBD_ADDRESS);
Index: arch/mips32/src/drivers/serial.c
===================================================================
--- arch/mips32/src/drivers/serial.c	(revision af9a7c57cb5b1118b9fe7512bf136d64c3eee3b2)
+++ arch/mips32/src/drivers/serial.c	(revision ebbdb8fd8b3f471868d0d452f8ad473aa432226e)
@@ -72,9 +72,19 @@
 }
 
-static chardev_operations_t serial_ops = {
-	.resume = serial_enable,
-	.suspend = serial_disable,
-	.write = serial_write
-};
+/** Read character from serial port, wait until available */
+static char serial_do_read(chardev_t *dev)
+{
+	serial_t *sd = (serial_t *)dev->data;
+	char ch;
+
+	while (!(SERIAL_READ_LSR(sd->port) & 1))
+		;
+	ch = SERIAL_READ(sd->port);
+
+	if (ch =='\r')
+		ch = '\n';
+	return ch;
+}
+
 
 /** Process keyboard interrupt. Does not work in simics? */
@@ -93,4 +103,12 @@
 }
 
+
+
+static chardev_operations_t serial_ops = {
+	.resume = serial_enable,
+	.suspend = serial_disable,
+	.write = serial_write,
+	.read = serial_do_read
+};
 
 iroutine old_timer;
