Index: arch/ia64/include/interrupt.h
===================================================================
--- arch/ia64/include/interrupt.h	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
+++ arch/ia64/include/interrupt.h	(revision 5c089c3a1844b12110b689bce338fdd5d4d26e7a)
@@ -71,4 +71,5 @@
 	__u64 in2;
 	__u64 in3;
+	__u64 in4;
 } __attribute__ ((packed));
 
Index: arch/ia64/src/ia64.c
===================================================================
--- arch/ia64/src/ia64.c	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
+++ arch/ia64/src/ia64.c	(revision 5c089c3a1844b12110b689bce338fdd5d4d26e7a)
@@ -36,4 +36,5 @@
 #include <arch/types.h>
 #include <arch/context.h>
+#include <arch/stack.h>
 #include <arch/mm/page.h>
 #include <mm/as.h>
@@ -84,5 +85,5 @@
 	rsc.mode = 3;				/* eager mode */
 
-	switch_to_userspace(entry, USTACK_ADDRESS+PAGE_SIZE-1, USTACK_ADDRESS, psr.value, rsc.value);
+	switch_to_userspace(entry, USTACK_ADDRESS+PAGE_SIZE-ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT), USTACK_ADDRESS, psr.value, rsc.value);
 
 	while (1) {
Index: arch/ia64/src/interrupt.c
===================================================================
--- arch/ia64/src/interrupt.c	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
+++ arch/ia64/src/interrupt.c	(revision 5c089c3a1844b12110b689bce338fdd5d4d26e7a)
@@ -187,8 +187,8 @@
 	}
 
-	if (istate->in3 < SYSCALL_END)
-		return syscall_table[istate->in3](istate->in0, istate->in1, istate->in2);
+	if (istate->in4 < SYSCALL_END)
+		return syscall_table[istate->in4](istate->in0, istate->in1, istate->in2, istate->in3);
 	else
-		panic("Undefined syscall %d", istate->in3);
+		panic("Undefined syscall %d", istate->in4);
 		
 	return -1;
Index: arch/ia64/src/ivt.S
===================================================================
--- arch/ia64/src/ivt.S	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
+++ arch/ia64/src/ivt.S	(revision 5c089c3a1844b12110b689bce338fdd5d4d26e7a)
@@ -33,5 +33,5 @@
 #include <align.h>
 
-#define STACK_ITEMS		18
+#define STACK_ITEMS		19
 #define STACK_FRAME_SIZE	ALIGN_UP((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT)
 
@@ -131,10 +131,11 @@
 	 * Note that p5 is a preserved predicate register and we make use of it.
 	 */
-	
+
+(p6)	st8 [r31] = r36, -8 ;;		/* save in4 */	
 (p6)	st8 [r31] = r35, -8 ;;		/* save in3 */
 (p6) 	st8 [r31] = r34, -8 ;;		/* save in2 */
 (p6)	st8 [r31] = r33, -8 ;;		/* save in1 */
 (p6)	st8 [r31] = r32, -8 ;;		/* save in0 */
-(p5)	add r31 = -32, r31 ;;
+(p5)	add r31 = -40, r31 ;;
     
 	st8 [r31] = r30, -8 ;;		/* save old stack pointer */ 
