Index: init/init.c
===================================================================
--- init/init.c	(revision b419162567eebf03db8ff08a2d21f6d3003f1577)
+++ init/init.c	(revision 7fc78dadfd309258412525b48cca055b6d9de6f4)
@@ -32,8 +32,10 @@
 int main(int argc, char *argv[])
 {
+	ipc_data_t ipcdata;
+
 	version_print();
 
-	ipc_call_sync(0, 1, 2);
-
+	ipc_call_sync(0, 1, 2, &ipcdata);
+	
 	return 0;
 }
Index: libc/arch/ia32/src/syscall.c
===================================================================
--- libc/arch/ia32/src/syscall.c	(revision b419162567eebf03db8ff08a2d21f6d3003f1577)
+++ libc/arch/ia32/src/syscall.c	(revision 7fc78dadfd309258412525b48cca055b6d9de6f4)
@@ -29,5 +29,6 @@
 #include <libc.h>
 
-sysarg_t __syscall(const syscall_t id, const sysarg_t p1, const sysarg_t p2, const sysarg_t p3)
+sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3, 
+		   const sysarg_t p4, const syscall_t id)
 {
 	sysarg_t ret;
@@ -36,8 +37,9 @@
 		"int $0x30\n"
 		: "=a" (ret)
-		: "a" (id),
-		  "b" (p1),
-		  "c" (p2),
-		  "d" (p3)
+		: "a" (p1),
+		  "b" (p2),
+		  "c" (p3),
+		  "d" (p4),
+		  "S" (id)
 	);
 	
Index: libc/arch/mips32/src/syscall.c
===================================================================
--- libc/arch/mips32/src/syscall.c	(revision b419162567eebf03db8ff08a2d21f6d3003f1577)
+++ libc/arch/mips32/src/syscall.c	(revision 7fc78dadfd309258412525b48cca055b6d9de6f4)
@@ -30,10 +30,12 @@
 
 sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, 
-		   const sysarg_t p3, const syscall_t id)
+		   const sysarg_t p3, const sysarg_t p4,
+		   const syscall_t id)
 {
 	register sysarg_t __mips_reg_a0 asm("$4") = p1;
 	register sysarg_t __mips_reg_a1 asm("$5") = p2;
 	register sysarg_t __mips_reg_a2 asm("$6") = p3;
-	register sysarg_t __mips_reg_a3 asm("$7") = id;
+	register sysarg_t __mips_reg_a3 asm("$7") = p4;
+	register sysarg_t __mips_reg_t0 asm("$8") = id;
 	register sysarg_t __mips_reg_v0 asm("$2");
 	
@@ -44,5 +46,6 @@
 		  "r" (__mips_reg_a1),
 		  "r" (__mips_reg_a2),
-		  "r" (__mips_reg_a3)
+		  "r" (__mips_reg_a3),
+		  "r" (__mips_reg_t0)
 	);
 	
Index: libc/include/libc.h
===================================================================
--- libc/include/libc.h	(revision b419162567eebf03db8ff08a2d21f6d3003f1577)
+++ libc/include/libc.h	(revision 7fc78dadfd309258412525b48cca055b6d9de6f4)
@@ -34,13 +34,15 @@
 #include <kernel/syscall/syscall.h>
 
-#define __SYSCALL0(id) __syscall(0, 0, 0, id)
-#define __SYSCALL1(id, p1) __syscall(p1, 0, 0, id)
-#define __SYSCALL2(id, p1, p2) __syscall(p1, p2, 0, id)
-#define __SYSCALL3(id, p1, p2, p3) __syscall(p1,p2,p3,id)
+#define __SYSCALL0(id) __syscall(0, 0, 0, 0, id)
+#define __SYSCALL1(id, p1) __syscall(p1, 0, 0, 0, id)
+#define __SYSCALL2(id, p1, p2) __syscall(p1, p2, 0, 0, id)
+#define __SYSCALL3(id, p1, p2, p3) __syscall(p1,p2,p3, 0, id)
+#define __SYSCALL4(id, p1, p2, p3, p4) __syscall(p1,p2,p3,p4,id)
 
 extern void __main(void);
 extern void __exit(void);
 extern sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, 
-			  const sysarg_t p3, const syscall_t id);
+			  const sysarg_t p3, const sysarg_t p4,
+			  const syscall_t id);
 
 
Index: libipc/generic/ipc.c
===================================================================
--- libipc/generic/ipc.c	(revision b419162567eebf03db8ff08a2d21f6d3003f1577)
+++ libipc/generic/ipc.c	(revision 7fc78dadfd309258412525b48cca055b6d9de6f4)
@@ -30,15 +30,8 @@
 #include <libc.h>
 
-static inline ipc_callid_t _ipc_call(int phoneid, int arg1, int arg2)
+int ipc_call_sync(int phoneid, int arg1, int arg2, ipc_data_t *resdata)
 {
-	__SYSCALL3(SYS_IPC_CALL, phoneid, arg1, arg2);
-}
-
-int ipc_call_sync(int phoneid, int arg1, int arg2)
-{
-	ipc_data_t resdata;
-
-	_ipc_call(phoneid, arg1, arg2);
-	ipc_wait_for_call(&resdata,0);
+	return __SYSCALL4(SYS_IPC_CALL_SYNC, phoneid, arg1, arg2, 
+			  (sysarg_t)resdata);
 }
 
Index: libipc/include/ipc.h
===================================================================
--- libipc/include/ipc.h	(revision b419162567eebf03db8ff08a2d21f6d3003f1577)
+++ libipc/include/ipc.h	(revision 7fc78dadfd309258412525b48cca055b6d9de6f4)
@@ -37,5 +37,5 @@
 
 
-extern int ipc_call_sync(int phoneid, int arg1, int arg2);
+extern int ipc_call_sync(int phoneid, int arg1, int arg2, ipc_data_t *resdata);
 extern int ipc_wait_for_call(ipc_data_t *data, int flags);
 
