Linux/S390 specific files.
authoraj <aj>
Wed, 2 Aug 2000 15:14:21 +0000 (15:14 +0000)
committeraj <aj>
Wed, 2 Aug 2000 15:14:21 +0000 (15:14 +0000)
38 files changed:
sysdeps/unix/sysv/linux/s390/Dist [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/Makefile [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/brk.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/clone.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/fchown.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/getegid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/geteuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/getgid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/getgroups.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/getmsg.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/getpmsg.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/getresgid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/getresuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/getuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/mmap.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/msgctl.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/profil-counter.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/putmsg.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/putpmsg.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/register-dump.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/semctl.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/setegid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/seteuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/setfsgid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/setfsuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/setgid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/setgroups.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/setregid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/setresgid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/setresuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/setreuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/setuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/shmctl.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/sigcontextinfo.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/socket.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/syscall.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/sysdep.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/sysdep.h [new file with mode: 0644]

diff --git a/sysdeps/unix/sysv/linux/s390/Dist b/sysdeps/unix/sysv/linux/s390/Dist
new file mode 100644 (file)
index 0000000..eaf8731
--- /dev/null
@@ -0,0 +1,9 @@
+clone.S
+setresuid.c
+setresgid.c
+setfsuid.c
+setfsgid.c
+sys/elf.h
+sys/perm.h
+sys/procfs.h
+sys/user.h
diff --git a/sysdeps/unix/sysv/linux/s390/Makefile b/sysdeps/unix/sysv/linux/s390/Makefile
new file mode 100644 (file)
index 0000000..7ca98f0
--- /dev/null
@@ -0,0 +1,4 @@
+ifeq ($(subdir),misc)
+sysdep_routines += setfsgid setfsuid setresgid setresuid
+sysdep_headers += sys/elf.h sys/reg.h
+endif
diff --git a/sysdeps/unix/sysv/linux/s390/brk.c b/sysdeps/unix/sysv/linux/s390/brk.c
new file mode 100644 (file)
index 0000000..fe22f38
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sysdep.h>
+
+void *__curbrk = 0;
+
+/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
+   to work around different old braindamage in the old Linux/x86 ELF
+   dynamic linker.  Sigh.  */
+weak_alias (__curbrk, ___brk_addr)
+
+int
+__brk (void *addr)
+{
+  void *newbrk;
+
+  {
+    register long r0 asm ("2");
+    register void *__addr asm("2") = addr;
+
+    asm ("svc  %b1\n\t"                /* call sys_brk */
+        : "=d" (r0)
+        : "I" (SYS_ify(brk)), "r" (__addr)
+        : _svc_clobber );
+    newbrk = (void *) r0;
+  }
+  __curbrk = newbrk;
+
+  if (newbrk < addr)
+    {
+      __set_errno (ENOMEM);
+      return -1;
+    }
+
+  return 0;
+}
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/s390/clone.S b/sysdeps/unix/sysv/linux/s390/clone.S
new file mode 100644 (file)
index 0000000..bde800d
--- /dev/null
@@ -0,0 +1,66 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* clone is even more special than fork as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sysdep.h>
+#define _ERRNO_H       1
+#include <bits/errno.h>
+
+/*int __clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg);*/
+/* sys_clone(void *child_stack, unsigned long flags) */
+
+       .text
+ENTRY(__clone)
+       /* Sanity check arguments & move registers */
+       ltr     %r1,%r2                 /* no NULL function pointers */
+       lhi     %r2,-EINVAL
+       jz      SYSCALL_ERROR_LABEL
+       ltr     %r3,%r3                 /* no NULL stack pointers */
+       jz      SYSCALL_ERROR_LABEL
+       /* move child_stack and flags, then call SVC */
+       lr      %r2,%r3
+       lr      %r3,%r4
+       svc     SYS_ify(clone)
+       ltr     %r2,%r2                 /* check return code */
+       jm      SYSCALL_ERROR_LABEL
+       jz      thread_start
+       br      %r14
+
+thread_start:
+       /* fn is in gpr 1, arg in gpr 5 */
+       lr      %r2,%r5         /* set first parameter to void *arg */
+       sr      %r11,%r11       /* terminate the stack frame */
+       ahi     %r15,-96        /* make room on the stack for the save area */
+       basr    %r14,%r1        /* jump to fn */
+#ifdef PIC
+       basr    %r12,0
+.L0:    lr      %r1,%r12
+       al      %r12,.L1-.L0(%r12)
+       al      %r1,.L2-.L0(%r1)
+       br      %r1             /* branch to _exit -> thread termination */
+.L1:   .long   _GLOBAL_OFFSET_TABLE_ - .L0
+.L2:   .long   _exit@PLT - .L0
+#else
+       basr    %r1,0
+.L0:   al      %r1,.L1-.L0(0,%r1)
+       br      %r1             /* branch to _exit -> thread termination */
+.L1:   .long   _exit - .L0
+#endif
+PSEUDO_END (__clone)
diff --git a/sysdeps/unix/sysv/linux/s390/fchown.c b/sysdeps/unix/sysv/linux/s390/fchown.c
new file mode 100644 (file)
index 0000000..3a69ecc
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fchown.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getegid.c b/sysdeps/unix/sysv/linux/s390/getegid.c
new file mode 100644 (file)
index 0000000..37b4b4a
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getegid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/geteuid.c b/sysdeps/unix/sysv/linux/s390/geteuid.c
new file mode 100644 (file)
index 0000000..ebcb555
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/geteuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getgid.c b/sysdeps/unix/sysv/linux/s390/getgid.c
new file mode 100644 (file)
index 0000000..0a4d606
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getgid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getgroups.c b/sysdeps/unix/sysv/linux/s390/getgroups.c
new file mode 100644 (file)
index 0000000..20a7166
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getgroups.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getmsg.c b/sysdeps/unix/sysv/linux/s390/getmsg.c
new file mode 100644 (file)
index 0000000..3a1fa08
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getmsg.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getpmsg.c b/sysdeps/unix/sysv/linux/s390/getpmsg.c
new file mode 100644 (file)
index 0000000..bb65f81
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getpmsg.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getresgid.c b/sysdeps/unix/sysv/linux/s390/getresgid.c
new file mode 100644 (file)
index 0000000..b703a41
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresgid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getresuid.c b/sysdeps/unix/sysv/linux/s390/getresuid.c
new file mode 100644 (file)
index 0000000..0b14cef
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getuid.c b/sysdeps/unix/sysv/linux/s390/getuid.c
new file mode 100644 (file)
index 0000000..d682c79
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/mmap.S b/sysdeps/unix/sysv/linux/s390/mmap.S
new file mode 100644 (file)
index 0000000..0ba58cc
--- /dev/null
@@ -0,0 +1,60 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+       .text
+
+ENTRY(__mmap)
+       /* Save registers and setup stack frame.  */
+       stm     %r6,%r15,24(%r15)
+       lr      %r1,%r15
+       l       %r0,4(0,%r15)           /* load eos */
+       ahi     %r15,-120               /* buy stack space */
+       st      %r1,0(0,%r15)           /* store back chain */
+       st      %r0,4(0,%r15)           /* store eos */
+
+       /* Store parameters on stack, because old_mmap
+        * takes only one parameter: a pointer to the parameter area
+        */
+       mvc     0x74(4,%r15),216(%r15)  /* move 'offset'  */
+       st      %r6,0x70(0,%r15)        /* store 'fd'     */
+       st      %r5,0x6C(0,%r15)        /* store 'flags'  */
+       st      %r4,0x68(0,%r15)        /* store 'prot'   */
+       st      %r3,0x64(0,%r15)        /* store 'length' */
+       st      %r2,0x60(0,%r15)        /* store 'start'  */
+
+       la      %r2,0x60(0,%r15)        /* load address of parameter list */
+       /* Do the system call trap.  */
+       svc     SYS_ify(mmap)
+
+       l       %r15,0(0,%r15)          /* load back chain */
+       lm      %r6,%r15,24(%r15)       /* load registers */
+
+       /* check gpr 2 for error */
+       lhi     %r0,-4096
+       clr     %r2,%r0
+       jnl     SYSCALL_ERROR_LABEL
+
+       /* Successful; return the syscall's value.  */
+       br      %r14
+
+PSEUDO_END (__mmap)
+
+weak_alias (__mmap, mmap)
diff --git a/sysdeps/unix/sysv/linux/s390/msgctl.c b/sysdeps/unix/sysv/linux/s390/msgctl.c
new file mode 100644 (file)
index 0000000..9f9b843
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/msgctl.c>
diff --git a/sysdeps/unix/sysv/linux/s390/profil-counter.h b/sysdeps/unix/sysv/linux/s390/profil-counter.h
new file mode 100644 (file)
index 0000000..33630b9
--- /dev/null
@@ -0,0 +1,27 @@
+/* Low-level statistical profiling support function.  Linux/s390 version.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <signal.h>
+#include <sigcontextinfo.h>
+
+static void
+profil_counter (int signo, SIGCONTEXT scp)
+{
+  profil_count ((void *) GET_PC (scp));
+}
diff --git a/sysdeps/unix/sysv/linux/s390/putmsg.c b/sysdeps/unix/sysv/linux/s390/putmsg.c
new file mode 100644 (file)
index 0000000..ebc1680
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/putmsg.c>
diff --git a/sysdeps/unix/sysv/linux/s390/putpmsg.c b/sysdeps/unix/sysv/linux/s390/putpmsg.c
new file mode 100644 (file)
index 0000000..fbfa598
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/putpmsg.c>
diff --git a/sysdeps/unix/sysv/linux/s390/register-dump.h b/sysdeps/unix/sysv/linux/s390/register-dump.h
new file mode 100644 (file)
index 0000000..3c859aa
--- /dev/null
@@ -0,0 +1,130 @@
+/* Dump registers.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sys/uio.h>
+#include <stdio-common/_itoa.h>
+
+/* We will print the register dump in this format:
+
+ GPR0: XXXXXXXX  GPR1: XXXXXXXX  GPR2: XXXXXXXX  GPR3: XXXXXXXX
+ GPR4: XXXXXXXX  GPR5: XXXXXXXX  GPR6: XXXXXXXX  GPR7: XXXXXXXX
+ GPR8: XXXXXXXX  GPR9: XXXXXXXX  GPRA: XXXXXXXX  GPRB: XXXXXXXX
+ GPRC: XXXXXXXX  GPRD: XXXXXXXX  GPRE: XXXXXXXX  GPRF: XXXXXXXX
+
+ PSW.MASK: XXXXXXXX   PSW.ADDR: XXXXXXXX
+
+ ST(0) XXXX XXXXXXXXXXXXXXXX   ST(1) XXXX XXXXXXXXXXXXXXXX
+ ST(2) XXXX XXXXXXXXXXXXXXXX   ST(3) XXXX XXXXXXXXXXXXXXXX
+ ST(4) XXXX XXXXXXXXXXXXXXXX   ST(5) XXXX XXXXXXXXXXXXXXXX
+ ST(6) XXXX XXXXXXXXXXXXXXXX   ST(7) XXXX XXXXXXXXXXXXXXXX
+
+ */
+
+static void
+hexvalue (unsigned long int value, char *buf, size_t len)
+{
+  char *cp = _itoa_word (value, buf + len, 16, 0);
+  while (cp > buf)
+    *--cp = '0';
+}
+
+static void
+register_dump (int fd, struct sigcontext *ctx)
+{
+  char regs[19][8];
+  struct iovec iov[40];
+  size_t nr = 0;
+
+#define ADD_STRING(str) \
+  iov[nr].iov_base = (char *) str;                                           \
+  iov[nr].iov_len = strlen (str);                                            \
+  ++nr
+#define ADD_MEM(str, len) \
+  iov[nr].iov_base = str;                                                    \
+  iov[nr].iov_len = len;                                                     \
+  ++nr
+
+  /* Generate strings of register contents.  */
+  hexvalue (ctx->sregs->regs.gprs[0], regs[0], 8);
+  hexvalue (ctx->sregs->regs.gprs[1], regs[1], 8);
+  hexvalue (ctx->sregs->regs.gprs[2], regs[2], 8);
+  hexvalue (ctx->sregs->regs.gprs[3], regs[3], 8);
+  hexvalue (ctx->sregs->regs.gprs[4], regs[4], 8);
+  hexvalue (ctx->sregs->regs.gprs[5], regs[5], 8);
+  hexvalue (ctx->sregs->regs.gprs[6], regs[6], 8);
+  hexvalue (ctx->sregs->regs.gprs[7], regs[7], 8);
+  hexvalue (ctx->sregs->regs.gprs[8], regs[8], 8);
+  hexvalue (ctx->sregs->regs.gprs[9], regs[9], 8);
+  hexvalue (ctx->sregs->regs.gprs[10], regs[10], 8);
+  hexvalue (ctx->sregs->regs.gprs[11], regs[11], 8);
+  hexvalue (ctx->sregs->regs.gprs[12], regs[12], 8);
+  hexvalue (ctx->sregs->regs.gprs[13], regs[13], 8);
+  hexvalue (ctx->sregs->regs.gprs[14], regs[14], 8);
+  hexvalue (ctx->sregs->regs.gprs[15], regs[15], 8);
+  hexvalue (ctx->sregs->regs.psw.mask, regs[16], 8);
+  hexvalue (ctx->sregs->regs.psw.addr, regs[17], 8);
+
+  /* Generate the output.  */
+  ADD_STRING ("Register dump:\n\n GPR0: ");
+  ADD_MEM (regs[0], 8);
+  ADD_STRING ("  GPR1: ");
+  ADD_MEM (regs[1], 8);
+  ADD_STRING ("  GPR2: ");
+  ADD_MEM (regs[2], 8);
+  ADD_STRING ("  GPR3: ");
+  ADD_MEM (regs[3], 8);
+  ADD_STRING ("\n GPR4: ");
+  ADD_MEM (regs[4], 8);
+  ADD_STRING ("  GPR5: ");
+  ADD_MEM (regs[5], 8);
+  ADD_STRING ("  GPR6: ");
+  ADD_MEM (regs[6], 8);
+  ADD_STRING ("  GPR7: ");
+  ADD_MEM (regs[7], 8);
+  ADD_STRING ("\n GPR8: ");
+  ADD_MEM (regs[8], 8);
+  ADD_STRING ("  GPR9: ");
+  ADD_MEM (regs[9], 8);
+  ADD_STRING ("  GPRA: ");
+  ADD_MEM (regs[10], 8);
+  ADD_STRING ("  GPRB: ");
+  ADD_MEM (regs[11], 8);
+  ADD_STRING ("\n GPRC: ");
+  ADD_MEM (regs[12], 8);
+  ADD_STRING ("  GPRD: ");
+  ADD_MEM (regs[13], 8);
+  ADD_STRING ("  GPRE: ");
+  ADD_MEM (regs[14], 8);
+  ADD_STRING ("  GPRF: ");
+  ADD_MEM (regs[15], 8);
+  ADD_STRING ("\n\n PSW.MASK: ");
+  ADD_MEM (regs[16], 8);
+  ADD_STRING ("  PSW.ADDR: ");
+  ADD_MEM (regs[17], 8);
+  ADD_STRING ("  TRAP: ");
+  ADD_MEM (regs[18], 4);
+  ADD_STRING ("\n");
+
+  /* Write the stuff out.  */
+  writev (fd, iov, nr);
+}
+
+
+#define REGISTER_DUMP register_dump (fd, &ctx)
diff --git a/sysdeps/unix/sysv/linux/s390/semctl.c b/sysdeps/unix/sysv/linux/s390/semctl.c
new file mode 100644 (file)
index 0000000..e9b1a48
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/semctl.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setegid.c b/sysdeps/unix/sysv/linux/s390/setegid.c
new file mode 100644 (file)
index 0000000..2e3a54c
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setegid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/seteuid.c b/sysdeps/unix/sysv/linux/s390/seteuid.c
new file mode 100644 (file)
index 0000000..18e41d0
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/seteuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setfsgid.c b/sysdeps/unix/sysv/linux/s390/setfsgid.c
new file mode 100644 (file)
index 0000000..0886712
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsgid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setfsuid.c b/sysdeps/unix/sysv/linux/s390/setfsuid.c
new file mode 100644 (file)
index 0000000..a9f22eb
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setgid.c b/sysdeps/unix/sysv/linux/s390/setgid.c
new file mode 100644 (file)
index 0000000..377021d
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setgid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setgroups.c b/sysdeps/unix/sysv/linux/s390/setgroups.c
new file mode 100644 (file)
index 0000000..0e70862
--- /dev/null
@@ -0,0 +1,2 @@
+/* We also have to rewrite the kernel gid_t to the user land type.  */
+#include <sysdeps/unix/sysv/linux/i386/setgroups.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setregid.c b/sysdeps/unix/sysv/linux/s390/setregid.c
new file mode 100644 (file)
index 0000000..99c57ad
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setregid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setresgid.c b/sysdeps/unix/sysv/linux/s390/setresgid.c
new file mode 100644 (file)
index 0000000..daca1a4
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresgid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setresuid.c b/sysdeps/unix/sysv/linux/s390/setresuid.c
new file mode 100644 (file)
index 0000000..3aeabe9
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setreuid.c b/sysdeps/unix/sysv/linux/s390/setreuid.c
new file mode 100644 (file)
index 0000000..8ad6122
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setreuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setuid.c b/sysdeps/unix/sysv/linux/s390/setuid.c
new file mode 100644 (file)
index 0000000..c8fa23e
--- /dev/null
@@ -0,0 +1,2 @@
+#include <sysdeps/unix/sysv/linux/i386/setuid.c>
+
diff --git a/sysdeps/unix/sysv/linux/s390/shmctl.c b/sysdeps/unix/sysv/linux/s390/shmctl.c
new file mode 100644 (file)
index 0000000..7eac638
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/shmctl.c>
diff --git a/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h b/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h
new file mode 100644 (file)
index 0000000..ccd5a41
--- /dev/null
@@ -0,0 +1,26 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <signal.h>
+
+#define SIGCONTEXT struct sigcontext *
+#define SIGCONTEXT_EXTRA_ARGS
+#define GET_PC(ctx)    ((void *)((ctx)->sregs->regs.psw.addr))
+#define GET_FRAME(ctx) (*(void **)((ctx)->sregs->regs.gprs[11]))
+#define GET_STACK(ctx) ((void *)((ctx)->sregs->regs.gprs[15]))
diff --git a/sysdeps/unix/sysv/linux/s390/socket.S b/sysdeps/unix/sysv/linux/s390/socket.S
new file mode 100644 (file)
index 0000000..562b98f
--- /dev/null
@@ -0,0 +1,98 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+#include <socketcall.h>
+
+/* &%/$&!! preprocessor */
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+       .text
+/* The socket-oriented system calls are handled unusally in Linux.
+   They are all gated through the single `socketcall' system call number.
+   `socketcall' takes two arguments: the first is the subcode, specifying
+   which socket function is being called; and the second is a pointer to
+   the arguments to the specific function.
+
+   The .S files for the other calls just #define socket and #include this.  */
+
+#ifndef __socket
+#ifndef NO_WEAK_ALIAS
+#define __socket P(__,socket)
+#else
+#define __socket socket
+#endif
+#endif
+
+#ifndef NARGS      /* the socket.o object is compiled directly ... */
+#define NARGS 3
+#endif
+
+.globl __socket
+ENTRY(__socket)
+
+       /* Save registers and setup stack.  */
+       stm     %r6,%r15,24(%r15)       /* save registers */
+       lr      %r1,%r15
+       l       %r0,4(0,%r15)           /* load eos */
+       ahi     %r15,-120               /* buy stack space */
+       st      %r1,0(0,%r15)           /* store back chain */
+       st      %r0,4(0,%r15)           /* store eos */
+
+       /* Reorder arguments */
+#if (NARGS >= 6)
+       mvc     0x74(4,%r15),216(%r15)  /* move between parameter lists */
+#endif
+#if (NARGS >= 5)
+       st      %r6,0x70(0,%r15)        /* store into parameter list */
+#endif
+#if (NARGS >= 4)
+       st      %r5,0x6C(0,%r15)        /* store into parameter list */
+#endif
+#if (NARGS >= 3)
+       st      %r4,0x68(0,%r15)        /* store into parameter list */
+#endif
+#if (NARGS >= 2)
+       st      %r3,0x64(0,%r15)        /* store into parameter list */
+       st      %r2,0x60(0,%r15)
+#endif
+       /* load subcode for socket syscall */
+       lhi     %r2,P(SOCKOP_,socket)
+       la      %r3,0x60(0,%r15)        /* load address of parameter list */
+
+       /* Do the system call trap.  */
+       svc     SYS_ify(socketcall)
+
+       l       %r15,0(0,%r15)          /* load back chain */
+       lm      %r6,15,24(%r15)         /* load registers */
+
+       /* gpr2 is < 0 if there was an error.  */
+       lhi     %r0,-125
+       clr     %r2,%r0
+       jnl     SYSCALL_ERROR_LABEL
+
+       /* Successful; return the syscall's value.  */
+       br      %r14
+
+PSEUDO_END (__socket)
+
+#ifndef NO_WEAK_ALIAS
+weak_alias (__socket, socket)
+#endif
diff --git a/sysdeps/unix/sysv/linux/s390/syscall.S b/sysdeps/unix/sysv/linux/s390/syscall.S
new file mode 100644 (file)
index 0000000..dbd8d68
--- /dev/null
@@ -0,0 +1,51 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+/* Please consult the file sysdeps/unix/sysv/linux/s390/sysdep.h for
+   more information about the value -4095 used below.*/
+
+ENTRY (syscall)
+       /* Save registers and setup stack.  */
+       stm     %r6,%r15,24(%r15)  /* save registers */
+       lr      %r1,%r15
+       l       %r0,4(0,%r15)      /* load eos */
+       ahi     %r15,-96           /* buy stack space */
+       st      %r1,0(0,%r15)      /* store back chain */
+       st      %r0,4(0,%r15)      /* store eos */
+
+       lr     %r1,%r2             /* move syscall number */
+       lr     %r2,%r3             /* first parameter  */
+       lr     %r3,%r4             /* second parameter */
+       lr     %r4,%r5             /* third parameter  */
+       lr     %r5,%r6             /* fourth parameter */
+       l      %r6,192(%r15)       /* fifth parameter  */
+       basr   %r7,0
+.L0:    ex     %r1,.L1-.L0(%r7)    /* lsb of R1 is subsituted as SVC number */
+
+       l       %r15,0(0,%r15)     /* load back chain */
+       lm      %r6,15,24(%r15)    /* load registers */
+
+       lhi    %r0,-4095
+       clr    %r2,%r0             /* check R2 for error */
+       jnl    SYSCALL_ERROR_LABEL
+       br     %r14                /* return to caller */
+.L1:    .word  0x0A00              /* opcode for SVC 0 */
+PSEUDO_END (syscall)
diff --git a/sysdeps/unix/sysv/linux/s390/sysdep.S b/sysdeps/unix/sysv/linux/s390/sysdep.S
new file mode 100644 (file)
index 0000000..5515c0f
--- /dev/null
@@ -0,0 +1,104 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+/* Because the Linux version is in fact m68k/ELF and the start.? file
+   for this system (sysdeps/m68k/elf/start.S) is also used by The Hurd
+   and therefore this files must not contain the definition of the
+   `errno' variable (I don't know why, ask Roland), we have to define
+   it somewhere else.
+
+    ...and this place is here.  */
+       .bss
+       .globl  errno
+       .type errno,@object
+       .size errno,4
+errno:
+       .space  4
+weak_alias (errno, _errno)
+
+/* The following code is only used in the shared library when we
+   compile the reentrant version.  Otherwise each system call defines
+   each own version.  */
+
+/* The syscall stubs jump here when they detect an error.  */
+
+#undef CALL_MCOUNT
+#define CALL_MCOUNT
+
+       .text
+ENTRY(__syscall_error)
+#ifndef PIC
+#ifndef _LIBC_REENTRANT
+       lcr     %r2,%r2
+       basr    %r1,0
+.L0:    l       %r1,.L1-.L0(%r1)
+       st      %r2,0(0,%r1)
+       lhi     %r2,-1
+       br      %r14
+.L1:    .long  errno
+#else
+       stm     %r11,%r15,44(%r15)
+       lr      %r0,%r15
+       ahi     %r15,-96
+       st      %r0,0(%r15)
+       lcr     %r11,%r2
+       basr    %r13,0
+.L0:   l       %r1,.L1-.L0(%r13)
+       basr    %r14,%r1
+       st      %r11,0(%r2)
+       lhi     %r2,-1
+       l       %r15,0(%r15)
+       lm      %r11,%r15,44(%r15)
+       br      %r14
+.L1:   .long  __errno_location
+#endif
+#else
+#ifndef _LIBC_REENTRANT
+       basr    %r1,0
+.L0:    al      %r1,.L1-.L0(%r1)
+       l       %r1,errno@GOT12(%r1)
+       lcr     %r2,%r2
+       st      %r2,0(0,%r1)
+       lhi     %r2,-1
+       br      %r14
+.L1:    .long   _GLOBAL_OFFSET_TABLE_-0b
+#else
+       stm     %r11,%r15,44(%r15)
+       lr      %r0,%r15
+       ahi     %r15,-96
+       st      %r0,0(%r15)
+       lcr     %r11,%r2
+       basr    %r13,0
+.L0:   l       %r12,.L1-.L0(%r13)
+       ar      %r12,%r13
+       l       %r14,.L2-.L0(%r13)
+       bas     %r14,0(%r14,%r13)
+       st      %r11,0(0,%r2)
+       lhi     %r2,-1
+       l       %r15,0(%r15)
+       lm      %r11,%r15,44(%r15)
+       br      %r14
+.L1:   .long _GLOBAL_OFFSET_TABLE_ - .L0
+.L2:    .long __errno_location@PLT - .L0
+#endif
+#endif
+
+END (__syscall_error)
diff --git a/sysdeps/unix/sysv/linux/s390/sysdep.h b/sysdeps/unix/sysv/linux/s390/sysdep.h
new file mode 100644 (file)
index 0000000..be58e7f
--- /dev/null
@@ -0,0 +1,212 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _LINUX_S390_SYSDEP_H
+#define _LINUX_S390_SYSEDP_H
+
+#include <sysdeps/s390/sysdep.h>
+#include <sysdeps/unix/sysdep.h>
+
+/* For Linux we can use the system call table in the header file
+       /usr/include/asm/unistd.h
+   of the kernel.  But these symbols do not follow the SYS_* syntax
+   so we have to redefine the `SYS_ify' macro here.  */
+/* in newer 2.1 kernels __NR_syscall is missing so we define it here */
+#define __NR_syscall 0
+
+#undef SYS_ify
+#define SYS_ify(syscall_name)  __NR_##syscall_name
+
+/* ELF-like local names start with `.L'.  */
+#undef L
+#define L(name)        .L##name
+
+#ifdef __ASSEMBLER__
+
+/* Linux uses a negative return value to indicate syscall errors, unlike
+   most Unices, which use the condition codes' carry flag.
+
+   Since version 2.1 the return value of a system call might be negative
+   even if the call succeeded.  E.g., the `lseek' system call might return
+   a large offset.  Therefore we must not anymore test for < 0, but test
+   for a real error by making sure the value in gpr2 is a real error
+   number.  Linus said he will make sure the no syscall returns a value
+   in -1 .. -4095 as a valid result so we can savely test with -4095.  */
+
+#define SYSCALL_ERROR_LABEL 0f
+
+#undef PSEUDO
+#define        PSEUDO(name, syscall_name, args)                                      \
+  .text;                                                                      \
+  ENTRY (name)                                                               \
+    DO_CALL (args, syscall_name);                                             \
+    lhi  %r4,-4095 ;                                                          \
+    clr  %r2,%r4 ;                                                           \
+    jnl  SYSCALL_ERROR_LABEL ;                                                \
+  L(pseudo_end):
+
+#undef PSEUDO_END
+#define PSEUDO_END(name)                                                     \
+  SYSCALL_ERROR_HANDLER;                                                     \
+  END (name)
+
+#ifndef _LIBC_REENTRANT
+#ifndef PIC
+#define SYSCALL_ERROR_HANDLER                                                 \
+0:  lcr     %r2,%r2 ;                                                         \
+    basr    %r1,0 ;                                                           \
+1:  l       %r1,2f-1b(%r1)                                                    \
+    st      %r2,0(%r1)                                                        \
+    lhi     %r2,-1                                                            \
+    br      %r14                                                              \
+2:  .long   errno
+#else
+#define SYSCALL_ERROR_HANDLER                                                \
+0:  basr    %r1,0 ;                                                           \
+1:  al      %r1,2f-1b(%r1) ;                                                  \
+    l       %r1,errno@GOT12(%r1) ;                                            \
+    lcr     %r2,%r2 ;                                                        \
+    st      %r2,0(%r1) ;                                                     \
+    lhi     %r2,-1 ;                                                          \
+    br      %r14 ;                                                            \
+2:  .long   _GLOBAL_OFFSET_TABLE_-1b
+#endif /* PIC */
+#else
+#define SYSCALL_ERROR_HANDLER                                                 \
+0:  basr    %r1,0 ;                                                           \
+1:  al      %r1,2f-1b(%r1) ;                                                  \
+    br      %r1 ;                                                             \
+2:  .long   __syscall_error@PLT-1b
+#endif /* _LIBC_REENTRANT */
+
+/* Linux takes system call arguments in registers:
+
+       syscall number  1            call-clobbered
+       arg 1           2            call-clobbered
+       arg 2           3            call-clobbered
+       arg 3           4            call-clobbered
+       arg 4           5            call-clobbered
+       arg 5           6            call-saved
+
+   (Of course a function with say 3 arguments does not have entries for
+   arguments 4 and 5.)
+   S390 does not need to do ANY stack operations to get its parameters
+   right.
+ */
+
+#define DO_CALL(args, syscall)                                               \
+    svc     SYS_ify (syscall)
+
+#define ret                                                                   \
+    br      14
+
+#endif /* __ASSEMBLER__ */
+
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...)                                     \
+  ({                                                                          \
+    DECLARGS_##nr(args)                                                       \
+    int err;                                                                  \
+    asm volatile (                                                            \
+    LOADARGS_##nr                                                             \
+    "svc    %b1\n\t"                                                          \
+    "lr     %0,%%r2\n\t"                                                      \
+    : "=d" (err)                                                              \
+    : "I" (__NR_##name) ASMFMT_##nr                                           \
+    : "memory", "cc", "2", "3", "4", "5", "6");                               \
+    if (err >= 0xfffff001)                                                    \
+     {                                                                        \
+       __set_errno(-err);                                                     \
+       err = 0xffffffff;                                                      \
+     }                                                                        \
+    (int) err; })
+
+#define DECLARGS_0()
+#define DECLARGS_1(arg1) \
+       unsigned int gpr2 = (unsigned int) (arg1);
+#define DECLARGS_2(arg1, arg2) \
+       DECLARGS_1(arg1) \
+       unsigned int gpr3 = (unsigned int) (arg2);
+#define DECLARGS_3(arg1, arg2, arg3) \
+       DECLARGS_2(arg1, arg2) \
+       unsigned int gpr4 = (unsigned int) (arg3);
+#define DECLARGS_4(arg1, arg2, arg3, arg4) \
+       DECLARGS_3(arg1, arg2, arg3) \
+       unsigned int gpr5 = (unsigned int) (arg4);
+#define DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \
+       DECLARGS_4(arg1, arg2, arg3, arg4) \
+       unsigned int gpr6 = (unsigned int) (arg5);
+
+#define LOADARGS_0
+#define LOADARGS_1            "L     2,%2\n\t"
+#define LOADARGS_2 LOADARGS_1 "L     3,%3\n\t"
+#define LOADARGS_3 LOADARGS_2 "L     4,%4\n\t"
+#define LOADARGS_4 LOADARGS_3 "L     5,%5\n\t"
+#define LOADARGS_5 LOADARGS_4 "L     6,%6\n\t"
+
+#define ASMFMT_0
+#define ASMFMT_1 , "m" (gpr2)
+#define ASMFMT_2 , "m" (gpr2), "m" (gpr3)
+#define ASMFMT_3 , "m" (gpr2), "m" (gpr3), "m" (gpr4)
+#define ASMFMT_4 , "m" (gpr2), "m" (gpr3), "m" (gpr4), "m" (gpr5)
+#define ASMFMT_5 , "m" (gpr2), "m" (gpr3), "m" (gpr4), "m" (gpr5), "m" (gpr6)
+
+#if 0
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...)                                     \
+  ({                                                                          \
+    DECLARGS_##nr(args)                                                       \
+    asm volatile (                                                            \
+    "svc    %b1\n\t"                                                          \
+    : "+d" (gpr2)                                                             \
+    : "I" (__NR_##name) ASMFMT_##nr : "memory", "cc");                        \
+    if (gpr2 >= 0xfffff001)                                                   \
+     {                                                                        \
+       __set_errno(-gpr2);                                                    \
+       gpr2 = 0xffffffff;                                                     \
+     }                                                                        \
+    (int) gpr2; })
+
+#define DECLARGS_0() \
+       register unsigned int gpr2 asm("2");
+#define DECLARGS_1(arg1) \
+       register unsigned int gpr2 asm("2") = (unsigned int) (arg1);
+#define DECLARGS_2(arg1, arg2) \
+       DECLARGS_1(arg1) \
+       register unsigned int gpr3 asm("3") = (unsigned int) (arg2);
+#define DECLARGS_3(arg1, arg2, arg3) \
+       DECLARGS_2(arg1, arg2) \
+       register unsigned int gpr4 asm("4") = (unsigned int) (arg3);
+#define DECLARGS_4(arg1, arg2, arg3, arg4) \
+       DECLARGS_3(arg1, arg2, arg3) \
+       register unsigned int gpr5 asm("5") = (unsigned int) (arg4);
+#define DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \
+       DECLARGS_4(arg1, arg2, arg3, arg4) \
+       register unsigned int gpr6 asm("6") = (unsigned int) (arg5);
+
+#define ASMFMT_0
+#define ASMFMT_1
+#define ASMFMT_2 , "d" (gpr3)
+#define ASMFMT_3 , "d" (gpr3), "d" (gpr4)
+#define ASMFMT_4 , "d" (gpr3), "d" (gpr4), "d" (gpr5)
+#define ASMFMT_5 , "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6)
+
+#endif /* 0 */
+
+#endif /* _LINUX_S390_SYSDEP_H */