Index: kernel/arch/mips32/src/mach/msim/msim.c
===================================================================
--- kernel/arch/mips32/src/mach/msim/msim.c	(revision e7a8bd2c02aaf8786a884fd8c8988f624acadc29)
+++ kernel/arch/mips32/src/mach/msim/msim.c	(revision 7de5f12d2f46bdbb9e958b00882b5e2217c3cac0)
@@ -105,13 +105,4 @@
 		}
 	}
-	
-	/*
-	 * 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.inr", NULL, MSIM_KBD_IRQ);
-	sysinfo_set_item_val("kbd.address.physical", NULL,
-	    PA2KA(MSIM_KBD_ADDRESS));
 #endif
 }
Index: uspace/drv/char/msim-con/main.c
===================================================================
--- uspace/drv/char/msim-con/main.c	(revision e7a8bd2c02aaf8786a884fd8c8988f624acadc29)
+++ uspace/drv/char/msim-con/main.c	(revision 7de5f12d2f46bdbb9e958b00882b5e2217c3cac0)
@@ -35,4 +35,5 @@
 #include <ddf/driver.h>
 #include <ddf/log.h>
+#include <device/hw_res_parsed.h>
 #include <errno.h>
 #include <stdio.h>
@@ -61,9 +62,47 @@
 };
 
+static int msim_con_get_res(ddf_dev_t *dev, msim_con_res_t *res)
+{
+	async_sess_t *parent_sess;
+	hw_res_list_parsed_t hw_res;
+	int rc;
+
+	parent_sess = ddf_dev_parent_sess_get(dev);
+	if (parent_sess == NULL)
+		return ENOMEM;
+
+	hw_res_list_parsed_init(&hw_res);
+	rc = hw_res_get_list_parsed(parent_sess, &hw_res, 0);
+	if (rc != EOK)
+		return rc;
+
+	if (hw_res.mem_ranges.count != 1) {
+		rc = EINVAL;
+		goto error;
+	}
+
+	res->base = RNGABS(hw_res.mem_ranges.ranges[0]);
+
+	if (hw_res.irqs.count != 1) {
+		rc = EINVAL;
+		goto error;
+	}
+
+	res->irq = hw_res.irqs.irqs[0];
+
+	return EOK;
+error:
+	hw_res_list_parsed_clean(&hw_res);
+	return rc;
+}
+
 static int msim_con_dev_add(ddf_dev_t *dev)
 {
 	msim_con_t *msim_con;
+	msim_con_res_t res;
+	int rc;
 
         ddf_msg(LVL_DEBUG, "msim_con_dev_add(%p)", dev);
+
 	msim_con = ddf_dev_data_alloc(dev, sizeof(msim_con_t));
 	if (msim_con == NULL) {
@@ -74,5 +113,11 @@
 	msim_con->dev = dev;
 
-	return msim_con_add(msim_con);
+	rc = msim_con_get_res(dev, &res);
+	if (rc != EOK) {
+		ddf_msg(LVL_ERROR, "Failed getting hardware resource list.\n");
+		return EIO;
+	}
+
+	return msim_con_add(msim_con, &res);
 }
 
Index: uspace/drv/char/msim-con/msim-con.c
===================================================================
--- uspace/drv/char/msim-con/msim-con.c	(revision e7a8bd2c02aaf8786a884fd8c8988f624acadc29)
+++ uspace/drv/char/msim-con/msim-con.c	(revision 7de5f12d2f46bdbb9e958b00882b5e2217c3cac0)
@@ -38,5 +38,4 @@
 #include <errno.h>
 #include <ipc/char.h>
-#include <sysinfo.h>
 
 #include "msim-con.h"
@@ -84,9 +83,11 @@
 
 /** Add msim console device. */
-int msim_con_add(msim_con_t *con)
+int msim_con_add(msim_con_t *con, msim_con_res_t *res)
 {
 	ddf_fun_t *fun = NULL;
 	bool subscribed = false;
 	int rc;
+
+	con->res = *res;
 
 	fun = ddf_fun_create(con->dev, fun_exposed, "a");
@@ -99,19 +100,7 @@
 	ddf_fun_set_conn_handler(fun, msim_con_connection);
 
-	sysarg_t paddr;
-	if (sysinfo_get_value("kbd.address.physical", &paddr) != EOK) {
-		rc = ENOENT;
-		goto error;
-	}
-
-	sysarg_t inr;
-	if (sysinfo_get_value("kbd.inr", &inr) != EOK) {
-		rc = ENOENT;
-		goto error;
-	}
-
-	msim_ranges[0].base = paddr;
-	msim_cmds[0].addr = (void *) paddr;
-	async_irq_subscribe(inr, msim_irq_handler, con, &msim_kbd);
+	msim_ranges[0].base = res->base;
+	msim_cmds[0].addr = (void *) res->base;
+	async_irq_subscribe(res->irq, msim_irq_handler, con, &msim_kbd);
 	subscribed = true;
 
@@ -125,5 +114,5 @@
 error:
 	if (subscribed)
-		async_irq_unsubscribe(inr);
+		async_irq_unsubscribe(res->irq);
 	if (fun != NULL)
 		ddf_fun_destroy(fun);
Index: uspace/drv/char/msim-con/msim-con.h
===================================================================
--- uspace/drv/char/msim-con/msim-con.h	(revision e7a8bd2c02aaf8786a884fd8c8988f624acadc29)
+++ uspace/drv/char/msim-con/msim-con.h	(revision 7de5f12d2f46bdbb9e958b00882b5e2217c3cac0)
@@ -41,11 +41,18 @@
 #include <stdint.h>
 
+/** MSIM console resources */
+typedef struct {
+	uintptr_t base;
+	int irq;
+} msim_con_res_t;
+
 /** MSIM console */
 typedef struct {
 	async_sess_t *client_sess;
 	ddf_dev_t *dev;
+	msim_con_res_t res;
 } msim_con_t;
 
-extern int msim_con_add(msim_con_t *);
+extern int msim_con_add(msim_con_t *, msim_con_res_t *);
 extern int msim_con_remove(msim_con_t *);
 extern int msim_con_gone(msim_con_t *);
Index: uspace/drv/platform/msim/msim.c
===================================================================
--- uspace/drv/platform/msim/msim.c	(revision e7a8bd2c02aaf8786a884fd8c8988f624acadc29)
+++ uspace/drv/platform/msim/msim.c	(revision 7de5f12d2f46bdbb9e958b00882b5e2217c3cac0)
@@ -38,22 +38,22 @@
 
 #include <assert.h>
-#include <stdio.h>
-#include <errno.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <macros.h>
-
-#include <ddi.h>
 #include <ddf/driver.h>
 #include <ddf/log.h>
+#include <errno.h>
 #include <ipc/dev_iface.h>
 #include <ops/hw_res.h>
 #include <ops/pio_window.h>
+#include <stdbool.h>
+#include <stdio.h>
 
 #define NAME "msim"
 
-#define MSIM_DISK_BASE	UINT32_C(0x10000200)
-#define MSIM_DISK_SIZE	UINT32_C(0x00000010)
+#define MSIM_DDISK_BASE	UINT32_C(0x10000200)
+#define MSIM_DDISK_SIZE	UINT32_C(0x00000010)
+#define MSIM_DDISK_IRQ 6
+
+#define MSIM_KBD_ADDRESS UINT32_C(0x10000000)
+#define MSIM_KBD_SIZE 1
+#define MSIM_KBD_IRQ 2
 
 typedef struct msim_fun {
@@ -89,5 +89,5 @@
 		.type = INTERRUPT,
 		.res.interrupt = {
-			.irq = 6
+			.irq = MSIM_DDISK_IRQ
 		}
 	}
@@ -101,6 +101,37 @@
 	.pio_window = {
 		.mem = {
-			.base = MSIM_DISK_BASE,
-			.size = MSIM_DISK_SIZE
+			.base = MSIM_DDISK_BASE,
+			.size = MSIM_DDISK_SIZE
+		}
+	}
+};
+
+static hw_resource_t console_regs[] = {
+	{
+		.type = MEM_RANGE,
+		.res.mem_range = {
+			.address = 0,
+			.size = 1,
+			.relative = true,
+			.endianness = LITTLE_ENDIAN
+		}
+	},
+	{
+		.type = INTERRUPT,
+		.res.interrupt = {
+			.irq = MSIM_KBD_IRQ
+		}
+	}
+};
+
+static msim_fun_t console_data = {
+	.hw_resources = {
+		sizeof(console_regs) / sizeof(console_regs[0]),
+		console_regs
+	},
+	.pio_window = {
+		.mem = {
+			.base = MSIM_KBD_ADDRESS,
+			.size = MSIM_KBD_SIZE
 		}
 	}
@@ -194,5 +225,5 @@
 	if (!msim_add_fun(dev, "disk0", "msim/ddisk", &disk_data))
 		return false;
-	if (!msim_add_fun(dev, "console", "msim/console", &disk_data))
+	if (!msim_add_fun(dev, "console", "msim/console", &console_data))
 		return false;
 	return true;
