2002-10-07  Michal Ludvig  <mludvig@suse.cz>

        Merged s390x port by Heiko Carstens <Heiko.Carstens@de.ibm.com>
        and bugfixes to s390 by D.J. Barrow.
diff --git a/syscall.c b/syscall.c
index ff86032..5119668 100644
--- a/syscall.c
+++ b/syscall.c
@@ -506,7 +506,8 @@
 int nsubcalls;
 enum subcall_style style;
 {
-	int i, addr, mask, arg;
+	long addr, mask, arg;
+	int i;
 
 	switch (style) {
 	case shift_style:
@@ -679,7 +680,7 @@
 #elif defined(MIPS)
 	static long a3;
 	static long r2;
-#elif defined(S390)
+#elif defined(S390) || defined(S390X)
 	static long gpr2;
 	static long pc;
 #elif defined(HPPA)
@@ -705,10 +706,10 @@
 #endif /* !PROCFS */	
 
 #ifdef LINUX
-#if defined(S390)
-	if (upeek(tcp->pid,PT_PSWADDR,&pc) < 0)
+#if defined(S390) || defined(S390X)
+	if (upeek(pid,PT_PSWADDR,&pc) < 0)
 		return -1;
-	scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)(pc-4),0);
+	scno = ptrace(PTRACE_PEEKTEXT, pid, (char *)(pc-sizeof(long)),0);
 	if (errno)
 		return -1;
 	scno&=0xFF;
@@ -1098,7 +1099,7 @@
 			fprintf(stderr, "stray syscall exit: rax = %ld\n", rax);
 		return 0;
 	}
-#elif defined (S390)
+#elif defined (S390) || defined (S390X)
 	if (upeek(pid, PT_GPR2, &gpr2) < 0)
 		return -1;
 	if (gpr2 != -ENOSYS && !(tcp->flags & TCB_INSYSCALL)) {
@@ -1154,7 +1155,7 @@
 {
 	int u_error = 0;
 #ifdef LINUX
-#ifdef S390
+#if defined(S390) || defined(S390X)
 		if (gpr2 && (unsigned) -gpr2 < nerrnos) {
 			tcp->u_rval = -1;
 			u_error = -gpr2;
@@ -1163,7 +1164,7 @@
 			tcp->u_rval = gpr2;
 			u_error = 0;
 		}
-#else /* !S390 */
+#else /* !S390 && !S390X */
 #ifdef I386
 		if (eax < 0 && -eax < nerrnos) {
 			tcp->u_rval = -1;
@@ -1297,7 +1298,7 @@
 #endif /* IA64 */
 #endif /* X86_64 */
 #endif /* I386 */
-#endif /* S390 */
+#endif /* S390 || S390X */
 #endif /* LINUX */
 #ifdef SUNOS4
 		/* get error code from user struct */
@@ -1381,7 +1382,7 @@
 	int pid = tcp->pid;
 #endif /* !USE_PROCFS */	
 #ifdef LINUX
-#if defined(S390)
+#if defined(S390) || defined(S390X)
 	{
 		int i;
 		if (tcp->scno >= 0 && tcp->scno < nsyscalls && sysent[tcp->scno].nargs != -1)
@@ -1389,7 +1390,7 @@
 		else 
      	        	tcp->u_nargs = MAX_ARGS;
 		for (i = 0; i < tcp->u_nargs; i++) {
-			if (upeek(pid,i==0 ? PT_ORIGGPR2:PT_GPR2+(i<<2), &tcp->u_arg[i]) < 0)
+			if (upeek(pid,i==0 ? PT_ORIGGPR2:PT_GPR2+i*sizeof(long), &tcp->u_arg[i]) < 0)
 				return -1;
 		}
 	}