Index: generic/src/console/klog.c
===================================================================
--- generic/src/console/klog.c	(revision 0182a665b05ae2297ab7e8df8b00783a840b77e8)
+++ generic/src/console/klog.c	(revision 43752b6bac8514915a24becd36bda8a82f1d3549)
@@ -79,5 +79,5 @@
 			goto out;
 	}
-	ipc_irq_send_msg(IPC_IRQ_KLOG, klogpos, ret);
+	ipc_irq_send_msg(IPC_IRQ_KLOG, klogpos, ret, 0);
 	klogpos += ret;
 	if (klogpos >= klogsize)
Index: generic/src/ipc/irq.c
===================================================================
--- generic/src/ipc/irq.c	(revision 0182a665b05ae2297ab7e8df8b00783a840b77e8)
+++ generic/src/ipc/irq.c	(revision 43752b6bac8514915a24becd36bda8a82f1d3549)
@@ -35,8 +35,9 @@
  *
  * The structure of a notification message is as follows:
- * - METHOD: IPC_M_INTERRUPT
- * - ARG1: interrupt number
- * - ARG2: payload modified by a 'top-half' handler
- * - ARG3: interrupt counter (may be needed to assure correct order
+ * - METHOD: interrupt number
+ * - ARG1: payload modified by a 'top-half' handler
+ * - ARG2: payload
+ * - ARG3: payload
+ * - in_phone_hash: interrupt counter (may be needed to assure correct order
  *         in multithreaded drivers)
  */
@@ -67,4 +68,5 @@
 {
 	int i;
+	__native dstval = 0;
 	
 	if (!code)
@@ -74,14 +76,14 @@
 		switch (code->cmds[i].cmd) {
 		case CMD_MEM_READ_1:
-			IPC_SET_ARG2(call->data, *((__u8 *)code->cmds[i].addr));
+			dstval = *((__u8 *)code->cmds[i].addr);
 			break;
 		case CMD_MEM_READ_2:
-			IPC_SET_ARG2(call->data, *((__u16 *)code->cmds[i].addr));
+			dstval = *((__u16 *)code->cmds[i].addr);
 			break;
 		case CMD_MEM_READ_4:
-			IPC_SET_ARG2(call->data, *((__u32 *)code->cmds[i].addr));
+			dstval = *((__u32 *)code->cmds[i].addr);
 			break;
 		case CMD_MEM_READ_8:
-			IPC_SET_ARG2(call->data, *((__u64 *)code->cmds[i].addr));
+			dstval = *((__u64 *)code->cmds[i].addr);
 			break;
 		case CMD_MEM_WRITE_1:
@@ -99,5 +101,5 @@
 #if defined(ia32) || defined(amd64)
 		case CMD_PORT_READ_1:
-			IPC_SET_ARG2(call->data, inb((long)code->cmds[i].addr));
+			dstval = inb((long)code->cmds[i].addr);
 			break;
 		case CMD_PORT_WRITE_1:
@@ -107,14 +109,17 @@
 #if defined(ia64) 
 		case CMD_IA64_GETCHAR:
-			IPC_SET_ARG2(call->data, _getc(&ski_uconsole));
+			dstval = _getc(&ski_uconsole);
 			break;
 #endif
 #if defined(ppc32)
 		case CMD_PPC32_GETCHAR:
-			IPC_SET_ARG2(call->data, cuda_get_scancode());
+			dstval = cuda_get_scancode();
 			break;
 #endif
 		default:
 			break;
+		}
+		if (code->cmds[i].dstarg && code->cmds[i].dstarg < 4) {
+			call->data.args[code->cmds[i].dstarg] = dstval;
 		}
 	}
@@ -225,5 +230,5 @@
  *
  */
-void ipc_irq_send_msg(int irq, __native a2, __native a3)
+void ipc_irq_send_msg(int irq, __native a1, __native a2, __native a3)
 {
 	call_t *call;
@@ -239,8 +244,10 @@
 		}
 		call->flags |= IPC_CALL_NOTIF;
-		IPC_SET_METHOD(call->data, IPC_M_INTERRUPT);
-		IPC_SET_ARG1(call->data, irq);
+		IPC_SET_METHOD(call->data, irq);
+		IPC_SET_ARG1(call->data, a1);
 		IPC_SET_ARG2(call->data, a2);
 		IPC_SET_ARG3(call->data, a3);
+		/* Put a counter to the message */
+		call->private = atomic_preinc(&irq_conns[mq].counter);
 		
 		send_call(mq, call);
@@ -268,7 +275,8 @@
 		}
 		call->flags |= IPC_CALL_NOTIF;
-		IPC_SET_METHOD(call->data, IPC_M_INTERRUPT);
-		IPC_SET_ARG1(call->data, irq);
-		IPC_SET_ARG3(call->data, atomic_preinc(&irq_conns[mq].counter));
+		/* Put a counter to the message */
+		call->private = atomic_preinc(&irq_conns[mq].counter);
+		/* Set up args */
+		IPC_SET_METHOD(call->data, irq);
 
 		/* Execute code to handle irq */
Index: generic/src/ipc/sysipc.c
===================================================================
--- generic/src/ipc/sysipc.c	(revision 0182a665b05ae2297ab7e8df8b00783a840b77e8)
+++ generic/src/ipc/sysipc.c	(revision 43752b6bac8514915a24becd36bda8a82f1d3549)
@@ -519,5 +519,10 @@
 	if (call->flags & IPC_CALL_NOTIF) {
 		ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC));
-		STRUCT_TO_USPACE(&calldata->args, &call->data.args);
+
+		/* Set in_phone_hash to the interrupt counter */
+		call->data.phone = (void *)call->private;
+		
+		STRUCT_TO_USPACE(calldata, &call->data);
+
 		ipc_call_free(call);
 		
