Index: kernel/genarch/src/kbd/i8042.c
===================================================================
--- kernel/genarch/src/kbd/i8042.c	(revision 5cb223fc45a97511d5661289ec56529d021ec8f6)
+++ kernel/genarch/src/kbd/i8042.c	(revision 45448840d542ead240f5fefb8c8e9d8f889335c9)
@@ -51,6 +51,7 @@
 #include <ipc/irq.h>
 
-#define i8042_DATA	0x60
-#define i8042_STATUS	0x64
+i8042_instance_t lgcy_i8042_instance = {
+	.i8042 = (i8042_t *) 0x60,
+};
 
 /* Keyboard commands. */
@@ -128,27 +129,38 @@
 static irq_ownership_t i8042_claim(void *instance)
 {
-	return IRQ_ACCEPT;
+	i8042_instance_t *i8042_instance = instance;
+	i8042_t *dev = i8042_instance->i8042;
+	if (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
+		return IRQ_ACCEPT;
+	else
+		return IRQ_DECLINE;
 }
 
 static void i8042_irq_handler(irq_t *irq)
 {
-	if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
+	if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) {
+		/*
+		 * This will hopefully go to the IRQ dispatcher code soon.
+		 */ 
 		ipc_irq_send_notif(irq);
-	else {
-		uint8_t data;
-		uint8_t status;
+		return;
+	}
+
+	i8042_instance_t *instance = irq->instance;
+	i8042_t *dev = instance->i8042;
+
+	uint8_t data;
+	uint8_t status;
 		
-		while (((status = pio_read_8(i8042_STATUS)) &
-		    i8042_BUFFER_FULL_MASK)) {
-			data = pio_read_8(i8042_DATA);
+	if (((status = pio_read_8(&dev->status)) & i8042_BUFFER_FULL_MASK)) {
+		data = pio_read_8(&dev->data);
 			
-			if ((status & i8042_MOUSE_DATA))
-				continue;
-
-			if (data & KEY_RELEASE)
-				key_released(data ^ KEY_RELEASE);
-			else
-				key_pressed(data);
-		}
+		if ((status & i8042_MOUSE_DATA))
+			return;
+
+		if (data & KEY_RELEASE)
+			key_released(data ^ KEY_RELEASE);
+		else
+			key_pressed(data);
 	}
 }
@@ -159,4 +171,6 @@
     inr_t mouse_inr)
 {
+	i8042_t *dev = lgcy_i8042_instance.i8042;
+
 	chardev_initialize("i8042_kbd", &kbrd, &ops);
 	stdin = &kbrd;
@@ -167,4 +181,5 @@
 	i8042_kbd_irq.claim = i8042_claim;
 	i8042_kbd_irq.handler = i8042_irq_handler;
+	i8042_kbd_irq.instance = &lgcy_i8042_instance;
 	irq_register(&i8042_kbd_irq);
 	
@@ -174,4 +189,5 @@
 	i8042_mouse_irq.claim = i8042_claim;
 	i8042_mouse_irq.handler = i8042_irq_handler;
+	i8042_mouse_irq.instance = &lgcy_i8042_instance;
 	irq_register(&i8042_mouse_irq);
 	
@@ -184,7 +200,7 @@
 	 */
 	int i;
-	for (i = 0; (pio_read_8(i8042_STATUS) & i8042_BUFFER_FULL_MASK) &&
+	for (i = 0; (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK) &&
 	    i < 100; i++) {
-		(void) pio_read_8(i8042_DATA);
+		(void) pio_read_8(&dev->data);
 	}
 	
@@ -214,4 +230,5 @@
 char i8042_key_read(chardev_t *d)
 {
+	i8042_t *dev = lgcy_i8042_instance.i8042;
 	char ch;
 	
@@ -219,8 +236,8 @@
 		uint8_t x;
 		
-		while (!(pio_read_8(i8042_STATUS) & i8042_BUFFER_FULL_MASK))
+		while (!(pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK))
 			;
 		
-		x = pio_read_8(i8042_STATUS);
+		x = pio_read_8(&dev->data);
 		if (x & KEY_RELEASE)
 			key_released(x ^ KEY_RELEASE);
