aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/s390/gmp-mparam.h16
-rw-r--r--sysdeps/s390/s390-32/Dist (renamed from sysdeps/s390/Dist)0
-rw-r--r--sysdeps/s390/s390-32/Implies (renamed from sysdeps/s390/Implies)0
-rw-r--r--sysdeps/s390/s390-32/Makefile (renamed from sysdeps/s390/Makefile)0
-rw-r--r--sysdeps/s390/s390-32/Versions (renamed from sysdeps/s390/Versions)0
-rw-r--r--sysdeps/s390/s390-32/__longjmp.c (renamed from sysdeps/s390/__longjmp.c)8
-rw-r--r--sysdeps/s390/s390-32/add_n.S (renamed from sysdeps/s390/add_n.S)2
-rw-r--r--sysdeps/s390/s390-32/addmul_1.S (renamed from sysdeps/s390/addmul_1.S)2
-rw-r--r--sysdeps/s390/s390-32/atomicity.h (renamed from sysdeps/s390/atomicity.h)2
-rw-r--r--sysdeps/s390/s390-32/backtrace.c (renamed from sysdeps/s390/backtrace.c)2
-rw-r--r--sysdeps/s390/s390-32/bcopy.S (renamed from sysdeps/s390/bcopy.S)2
-rw-r--r--sysdeps/s390/s390-32/bits/byteswap.h (renamed from sysdeps/s390/bits/byteswap.h)2
-rw-r--r--sysdeps/s390/s390-32/bits/huge_val.h (renamed from sysdeps/s390/bits/huge_val.h)2
-rw-r--r--sysdeps/s390/s390-32/bits/setjmp.h (renamed from sysdeps/s390/bits/setjmp.h)4
-rw-r--r--sysdeps/s390/s390-32/bits/string.h (renamed from sysdeps/s390/bits/string.h)10
-rw-r--r--sysdeps/s390/s390-32/bsd-_setjmp.S (renamed from sysdeps/s390/bsd-_setjmp.S)2
-rw-r--r--sysdeps/s390/s390-32/bsd-setjmp.S (renamed from sysdeps/s390/bsd-setjmp.S)2
-rw-r--r--sysdeps/s390/s390-32/bzero.S (renamed from sysdeps/s390/bzero.S)2
-rw-r--r--sysdeps/s390/s390-32/dl-machine.h (renamed from sysdeps/s390/dl-machine.h)3
-rw-r--r--sysdeps/s390/s390-32/elf/bsd-_setjmp.S (renamed from sysdeps/s390/elf/bsd-_setjmp.S)0
-rw-r--r--sysdeps/s390/s390-32/elf/bsd-setjmp.S (renamed from sysdeps/s390/elf/bsd-setjmp.S)0
-rw-r--r--sysdeps/s390/s390-32/elf/setjmp.S (renamed from sysdeps/s390/elf/setjmp.S)7
-rw-r--r--sysdeps/s390/s390-32/elf/start.S (renamed from sysdeps/s390/elf/start.S)2
-rw-r--r--sysdeps/s390/s390-32/ffs.c (renamed from sysdeps/s390/ffs.c)2
-rw-r--r--sysdeps/s390/s390-32/initfini.c (renamed from sysdeps/s390/initfini.c)6
-rw-r--r--sysdeps/s390/s390-32/memchr.S (renamed from sysdeps/s390/memchr.S)2
-rw-r--r--sysdeps/s390/s390-32/memcpy.S (renamed from sysdeps/s390/memcpy.S)2
-rw-r--r--sysdeps/s390/s390-32/memset.S (renamed from sysdeps/s390/memset.S)2
-rw-r--r--sysdeps/s390/s390-32/mul_1.S (renamed from sysdeps/s390/mul_1.S)4
-rw-r--r--sysdeps/s390/s390-32/s390-mcount.S (renamed from sysdeps/s390/s390-mcount.S)2
-rw-r--r--sysdeps/s390/s390-32/setjmp.S (renamed from sysdeps/s390/setjmp.S)4
-rw-r--r--sysdeps/s390/s390-32/strcpy.S (renamed from sysdeps/s390/strcpy.S)2
-rw-r--r--sysdeps/s390/s390-32/strncpy.S (renamed from sysdeps/s390/strncpy.S)2
-rw-r--r--sysdeps/s390/s390-32/sub_n.S (renamed from sysdeps/s390/sub_n.S)4
-rw-r--r--sysdeps/s390/s390-32/sysdep.h (renamed from sysdeps/s390/sysdep.h)2
-rw-r--r--sysdeps/s390/s390-64/Dist3
-rw-r--r--sysdeps/s390/s390-64/Implies4
-rw-r--r--sysdeps/s390/s390-64/Makefile11
-rw-r--r--sysdeps/s390/s390-64/__longjmp.c46
-rw-r--r--sysdeps/s390/s390-64/add_n.S63
-rw-r--r--sysdeps/s390/s390-64/atomicity.h76
-rw-r--r--sysdeps/s390/s390-64/backtrace.c81
-rw-r--r--sysdeps/s390/s390-64/bcopy.S61
-rw-r--r--sysdeps/s390/s390-64/bits/byteswap.h93
-rw-r--r--sysdeps/s390/s390-64/bits/huge_val.h69
-rw-r--r--sysdeps/s390/s390-64/bits/setjmp.h53
-rw-r--r--sysdeps/s390/s390-64/bits/string.h153
-rw-r--r--sysdeps/s390/s390-64/bsd-_setjmp.S35
-rw-r--r--sysdeps/s390/s390-64/bsd-setjmp.S34
-rw-r--r--sysdeps/s390/s390-64/bzero.S42
-rw-r--r--sysdeps/s390/s390-64/dl-machine.h434
-rw-r--r--sysdeps/s390/s390-64/elf/bsd-_setjmp.S1
-rw-r--r--sysdeps/s390/s390-64/elf/bsd-setjmp.S1
-rw-r--r--sysdeps/s390/s390-64/elf/setjmp.S53
-rw-r--r--sysdeps/s390/s390-64/elf/start.S84
-rw-r--r--sysdeps/s390/s390-64/ffs.c68
-rw-r--r--sysdeps/s390/s390-64/initfini.c136
-rw-r--r--sysdeps/s390/s390-64/memchr.S40
-rw-r--r--sysdeps/s390/s390-64/memcpy.S41
-rw-r--r--sysdeps/s390/s390-64/memset.S43
-rw-r--r--sysdeps/s390/s390-64/s390x-mcount.S72
-rw-r--r--sysdeps/s390/s390-64/setjmp.S43
-rw-r--r--sysdeps/s390/s390-64/strcpy.S35
-rw-r--r--sysdeps/s390/s390-64/strncpy.S90
-rw-r--r--sysdeps/s390/s390-64/sub_n.S60
-rw-r--r--sysdeps/s390/s390-64/sysdep.h112
-rw-r--r--sysdeps/s390/sys/ucontext.h95
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/Dist (renamed from sysdeps/unix/sysv/linux/s390/Dist)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/Makefile (renamed from sysdeps/unix/sysv/linux/s390/Makefile)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/Versions (renamed from sysdeps/unix/sysv/linux/s390/Versions)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/alphasort64.c (renamed from sysdeps/unix/sysv/linux/s390/alphasort64.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/bits/fcntl.h (renamed from sysdeps/unix/sysv/linux/s390/bits/fcntl.h)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/bits/mman.h (renamed from sysdeps/unix/sysv/linux/s390/bits/mman.h)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/bits/resource.h (renamed from sysdeps/unix/sysv/linux/s390/bits/resource.h)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/bits/stat.h (renamed from sysdeps/unix/sysv/linux/s390/bits/stat.h)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/chown.c (renamed from sysdeps/unix/sysv/linux/s390/chown.c)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/clone.S (renamed from sysdeps/unix/sysv/linux/s390/clone.S)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/fchown.c (renamed from sysdeps/unix/sysv/linux/s390/fchown.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c (renamed from sysdeps/unix/sysv/linux/s390/fcntl.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/fxstat.c (renamed from sysdeps/unix/sysv/linux/s390/fxstat.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/getdents64.c (renamed from sysdeps/unix/sysv/linux/s390/getdents64.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/getegid.c (renamed from sysdeps/unix/sysv/linux/s390/getegid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/geteuid.c (renamed from sysdeps/unix/sysv/linux/s390/geteuid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/getgid.c (renamed from sysdeps/unix/sysv/linux/s390/getgid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/getgroups.c (renamed from sysdeps/unix/sysv/linux/s390/getgroups.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/getresgid.c (renamed from sysdeps/unix/sysv/linux/s390/getresgid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/getresuid.c (renamed from sysdeps/unix/sysv/linux/s390/getresuid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/getrlimit.c (renamed from sysdeps/unix/sysv/linux/s390/getrlimit.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/getrlimit64.c (renamed from sysdeps/unix/sysv/linux/s390/getrlimit64.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/getuid.c (renamed from sysdeps/unix/sysv/linux/s390/getuid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/lchown.c (renamed from sysdeps/unix/sysv/linux/s390/lchown.c)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/lockf64.c (renamed from sysdeps/unix/sysv/linux/s390/lockf64.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/lxstat.c (renamed from sysdeps/unix/sysv/linux/s390/lxstat.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/mmap.S (renamed from sysdeps/unix/sysv/linux/s390/mmap.S)4
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S (renamed from sysdeps/unix/sysv/linux/s390/mmap64.S)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/msgctl.c (renamed from sysdeps/unix/sysv/linux/s390/msgctl.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/oldgetrlimit64.c (renamed from sysdeps/unix/sysv/linux/s390/oldgetrlimit64.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/readdir64.c (renamed from sysdeps/unix/sysv/linux/s390/readdir64.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/readdir64_r.c (renamed from sysdeps/unix/sysv/linux/s390/readdir64_r.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/register-dump.h (renamed from sysdeps/unix/sysv/linux/s390/register-dump.h)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/scandir64.c (renamed from sysdeps/unix/sysv/linux/s390/scandir64.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/semctl.c (renamed from sysdeps/unix/sysv/linux/s390/semctl.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setegid.c (renamed from sysdeps/unix/sysv/linux/s390/setegid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/seteuid.c (renamed from sysdeps/unix/sysv/linux/s390/seteuid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setfsgid.c (renamed from sysdeps/unix/sysv/linux/s390/setfsgid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setfsuid.c (renamed from sysdeps/unix/sysv/linux/s390/setfsuid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setgid.c (renamed from sysdeps/unix/sysv/linux/s390/setgid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setgroups.c (renamed from sysdeps/unix/sysv/linux/s390/setgroups.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setregid.c (renamed from sysdeps/unix/sysv/linux/s390/setregid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setresgid.c (renamed from sysdeps/unix/sysv/linux/s390/setresgid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setresuid.c (renamed from sysdeps/unix/sysv/linux/s390/setresuid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setreuid.c (renamed from sysdeps/unix/sysv/linux/s390/setreuid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setrlimit.c (renamed from sysdeps/unix/sysv/linux/s390/setrlimit.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/setuid.c (renamed from sysdeps/unix/sysv/linux/s390/setuid.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/shmctl.c (renamed from sysdeps/unix/sysv/linux/s390/shmctl.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/socket.S (renamed from sysdeps/unix/sysv/linux/s390/socket.S)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/sys/procfs.h (renamed from sysdeps/unix/sysv/linux/s390/sys/procfs.h)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/sys/ucontext.h (renamed from sysdeps/unix/sysv/linux/s390/sys/ucontext.h)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/syscall.S (renamed from sysdeps/unix/sysv/linux/s390/syscall.S)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/syscalls.list (renamed from sysdeps/unix/sysv/linux/s390/syscalls.list)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S (renamed from sysdeps/unix/sysv/linux/s390/sysdep.S)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (renamed from sysdeps/unix/sysv/linux/s390/sysdep.h)2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/versionsort64.c (renamed from sysdeps/unix/sysv/linux/s390/versionsort64.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/xstat.c (renamed from sysdeps/unix/sysv/linux/s390/xstat.c)0
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/Dist4
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/Makefile8
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/elfclass.h34
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/fcntl.h174
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/ipc.h78
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/mman.h94
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/msq.h68
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/resource.h196
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/sem.h85
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/shm.h87
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/sigaction.h72
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/siginfo.h297
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/sigstack.h59
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/stat.h107
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/bits/types.h115
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/clone.S55
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/fstatfs64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/ftruncate64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/fxstat.c42
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/fxstat64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/getdents.c4
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/getdents64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/getrlimit64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/glob.c7
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/glob64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/kernel_stat.h46
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/lxstat.c42
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/lxstat64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/mmap.S67
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/mmap64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/pread64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/pwrite64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/readdir.c7
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/readdir64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/readdir64_r.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/readdir_r.c4
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/register-dump.h133
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/setrlimit64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sigaction.c50
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sigpending.c41
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sigprocmask.c44
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sigsuspend.c39
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/socket.S99
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/statfs64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sys/procfs.h118
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sys/ucontext.h77
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/syscall.S52
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list55
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S90
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h164
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/truncate64.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/xstat.c42
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/xstat64.c1
177 files changed, 4988 insertions, 152 deletions
diff --git a/sysdeps/s390/gmp-mparam.h b/sysdeps/s390/gmp-mparam.h
index 59aaff12cc..a103bf6b8f 100644
--- a/sysdeps/s390/gmp-mparam.h
+++ b/sysdeps/s390/gmp-mparam.h
@@ -1,5 +1,5 @@
/* gmp-mparam.h -- Compiler/machine parameter header file.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU MP Library.
@@ -19,11 +19,13 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#define BITS_PER_MP_LIMB 32
-#define BYTES_PER_MP_LIMB 4
-#define BITS_PER_LONGINT 32
-#define BITS_PER_INT 32
-#define BITS_PER_SHORTINT 16
-#define BITS_PER_CHAR 8
+#include <bits/wordsize.h>
+
+#define BITS_PER_MP_LIMB __WORDSIZE
+#define BYTES_PER_MP_LIMB (__WORDSIZE / 8)
+#define BITS_PER_LONGINT __WORDSIZE
+#define BITS_PER_INT 32
+#define BITS_PER_SHORTINT 16
+#define BITS_PER_CHAR 8
#define IEEE_DOUBLE_BIG_ENDIAN 0
diff --git a/sysdeps/s390/Dist b/sysdeps/s390/s390-32/Dist
index fdba667f31..fdba667f31 100644
--- a/sysdeps/s390/Dist
+++ b/sysdeps/s390/s390-32/Dist
diff --git a/sysdeps/s390/Implies b/sysdeps/s390/s390-32/Implies
index 71bec4de0c..71bec4de0c 100644
--- a/sysdeps/s390/Implies
+++ b/sysdeps/s390/s390-32/Implies
diff --git a/sysdeps/s390/Makefile b/sysdeps/s390/s390-32/Makefile
index 057862d91b..057862d91b 100644
--- a/sysdeps/s390/Makefile
+++ b/sysdeps/s390/s390-32/Makefile
diff --git a/sysdeps/s390/Versions b/sysdeps/s390/s390-32/Versions
index 2b020f8f58..2b020f8f58 100644
--- a/sysdeps/s390/Versions
+++ b/sysdeps/s390/s390-32/Versions
diff --git a/sysdeps/s390/__longjmp.c b/sysdeps/s390/s390-32/__longjmp.c
index 6f5bf12dbe..3020abd810 100644
--- a/sysdeps/s390/__longjmp.c
+++ b/sysdeps/s390/s390-32/__longjmp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
@@ -31,10 +31,12 @@ __longjmp (__jmp_buf env, int val)
{
/* Restore registers and jump back. */
asm volatile ("lr %%r2,%0\n\t" /* PUT val in grp 2. */
- "lm %%r6,%%r15,%1\n\t"
+ "ld %%f6,48(%1)\n\t"
+ "ld %%f4,40(%1)\n\t"
+ "lm %%r6,%%r15,0(%1)\n\t"
"br %%r14"
: : "r" (val == 0 ? 1 : val),
- "m" (env->gregs[__JB_GPR6]) : "2" );
+ "a" (env) : "2" );
/* Avoid `volatile function does return' warnings. */
for (;;);
diff --git a/sysdeps/s390/add_n.S b/sysdeps/s390/s390-32/add_n.S
index 4b7d8418c9..76160733a1 100644
--- a/sysdeps/s390/add_n.S
+++ b/sysdeps/s390/s390-32/add_n.S
@@ -1,6 +1,6 @@
/* Add two limb vectors of the same length > 0 and store sum in a third
limb vector.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU MP Library.
diff --git a/sysdeps/s390/addmul_1.S b/sysdeps/s390/s390-32/addmul_1.S
index c98a4c1524..5a7ccf8640 100644
--- a/sysdeps/s390/addmul_1.S
+++ b/sysdeps/s390/s390-32/addmul_1.S
@@ -1,6 +1,6 @@
/* S390 __mpn_addmul_1 -- Multiply a limb vector with a limb and add
the result to a second limb vector.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU MP Library.
diff --git a/sysdeps/s390/atomicity.h b/sysdeps/s390/s390-32/atomicity.h
index a5347debab..f56388afc0 100644
--- a/sysdeps/s390/atomicity.h
+++ b/sysdeps/s390/s390-32/atomicity.h
@@ -1,5 +1,5 @@
/* Low-level functions for atomic operations. S390 version.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/s390/backtrace.c b/sysdeps/s390/s390-32/backtrace.c
index 5e7f802810..8e3ca7ecca 100644
--- a/sysdeps/s390/backtrace.c
+++ b/sysdeps/s390/s390-32/backtrace.c
@@ -1,5 +1,5 @@
/* Return backtrace of current program state.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/s390/bcopy.S b/sysdeps/s390/s390-32/bcopy.S
index dafe9ee186..8bf5bbbefa 100644
--- a/sysdeps/s390/bcopy.S
+++ b/sysdeps/s390/s390-32/bcopy.S
@@ -1,6 +1,6 @@
/* bcopy -- copy a block from source to destination. For IBM S390
This file is part of the GNU C Library.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/s390/bits/byteswap.h b/sysdeps/s390/s390-32/bits/byteswap.h
index ad20e97dc6..cc6cf41428 100644
--- a/sysdeps/s390/bits/byteswap.h
+++ b/sysdeps/s390/s390-32/bits/byteswap.h
@@ -1,5 +1,5 @@
/* Macros to swap the order of bytes in integer values. s390 version.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/s390/bits/huge_val.h b/sysdeps/s390/s390-32/bits/huge_val.h
index 0c8264c90f..65e0fe2487 100644
--- a/sysdeps/s390/bits/huge_val.h
+++ b/sysdeps/s390/s390-32/bits/huge_val.h
@@ -1,6 +1,6 @@
/* `HUGE_VAL' constants for s390 (where it is infinity).
Used by <stdlib.h> and <math.h> functions for overflow.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/s390/bits/setjmp.h b/sysdeps/s390/s390-32/bits/setjmp.h
index 0e4e36e713..d3afbe5f07 100644
--- a/sysdeps/s390/bits/setjmp.h
+++ b/sysdeps/s390/s390-32/bits/setjmp.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 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
@@ -39,7 +39,7 @@ typedef struct {
long int gregs[10];
/* We save fpu registers 4 and 6. */
- long long fpregs[2];
+ long fpregs[4];
} __jmp_buf[1];
#endif
diff --git a/sysdeps/s390/bits/string.h b/sysdeps/s390/s390-32/bits/string.h
index 791f939225..7474244a1d 100644
--- a/sysdeps/s390/bits/string.h
+++ b/sysdeps/s390/s390-32/bits/string.h
@@ -40,6 +40,7 @@
#endif
#define _HAVE_STRING_ARCH_strlen 1
+#ifndef _FORCE_INLINES
__STRING_INLINE size_t
strlen (__const char *__str)
{
@@ -55,9 +56,11 @@ strlen (__const char *__str)
: "cc", "0" );
return __len;
}
+#endif
/* Copy SRC to DEST. */
#define _HAVE_STRING_ARCH_strcpy 1
+#ifndef _FORCE_INLINES
__STRING_INLINE char *
strcpy (char *__dest, __const char *__src)
{
@@ -70,8 +73,10 @@ strcpy (char *__dest, __const char *__src)
: "cc", "memory", "0" );
return tmp;
}
+#endif
#define _HAVE_STRING_ARCH_strncpy 1
+#ifndef _FORCE_INLINES
__STRING_INLINE char *
strncpy (char *__dest, __const char *__src, size_t __n)
{
@@ -94,9 +99,11 @@ strncpy (char *__dest, __const char *__src, size_t __n)
: "cc", "memory", "0" );
return tmp;
}
+#endif
/* Append SRC onto DEST. */
#define _HAVE_STRING_ARCH_strcat 1
+#ifndef _FORCE_INLINES
__STRING_INLINE char *
strcat(char *__dest, const char *__src)
{
@@ -113,9 +120,11 @@ strcat(char *__dest, const char *__src)
: "cc", "memory", "0" );
return tmp;
}
+#endif
/* Append no more than N characters from SRC onto DEST. */
#define _HAVE_STRING_ARCH_strncat 1
+#ifndef _FORCE_INLINES
__STRING_INLINE char *
strncat (char *__dest, __const char *__src, size_t __n)
{
@@ -140,5 +149,6 @@ strncat (char *__dest, __const char *__src, size_t __n)
: "cc", "memory", "0" );
return tmp;
}
+#endif
#endif /* Use string inlines && GNU CC. */
diff --git a/sysdeps/s390/bsd-_setjmp.S b/sysdeps/s390/s390-32/bsd-_setjmp.S
index 2b664409de..db07a3d103 100644
--- a/sysdeps/s390/bsd-_setjmp.S
+++ b/sysdeps/s390/s390-32/bsd-_setjmp.S
@@ -1,5 +1,5 @@
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. s390 version.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/s390/bsd-setjmp.S b/sysdeps/s390/s390-32/bsd-setjmp.S
index ab5aa0c663..e2463196f0 100644
--- a/sysdeps/s390/bsd-setjmp.S
+++ b/sysdeps/s390/s390-32/bsd-setjmp.S
@@ -1,5 +1,5 @@
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. s390 version.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/s390/bzero.S b/sysdeps/s390/s390-32/bzero.S
index 4d0db82fa0..b6d9811b9d 100644
--- a/sysdeps/s390/bzero.S
+++ b/sysdeps/s390/s390-32/bzero.S
@@ -1,6 +1,6 @@
/* bzero -- set a block of memory to zero. IBM S390 version
This file is part of the GNU C Library.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/s390/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
index 0f0ec8f694..93613b023b 100644
--- a/sysdeps/s390/dl-machine.h
+++ b/sysdeps/s390/s390-32/dl-machine.h
@@ -35,7 +35,8 @@
static inline int
elf_machine_matches_host (const Elf32_Ehdr *ehdr)
{
- return (ehdr->e_machine == EM_S390 || ehdr->e_machine == EM_S390_OLD);
+ return (ehdr->e_machine == EM_S390 || ehdr->e_machine == EM_S390_OLD)
+ && ehdr->e_ident[EI_CLASS] == ELFCLASS32;
}
diff --git a/sysdeps/s390/elf/bsd-_setjmp.S b/sysdeps/s390/s390-32/elf/bsd-_setjmp.S
index 1417270201..1417270201 100644
--- a/sysdeps/s390/elf/bsd-_setjmp.S
+++ b/sysdeps/s390/s390-32/elf/bsd-_setjmp.S
diff --git a/sysdeps/s390/elf/bsd-setjmp.S b/sysdeps/s390/s390-32/elf/bsd-setjmp.S
index 1417270201..1417270201 100644
--- a/sysdeps/s390/elf/bsd-setjmp.S
+++ b/sysdeps/s390/s390-32/elf/bsd-setjmp.S
diff --git a/sysdeps/s390/elf/setjmp.S b/sysdeps/s390/s390-32/elf/setjmp.S
index e00c903b69..fd0a169c4c 100644
--- a/sysdeps/s390/elf/setjmp.S
+++ b/sysdeps/s390/s390-32/elf/setjmp.S
@@ -28,15 +28,20 @@
ENTRY (setjmp)
.weak C_SYMBOL_NAME (setjmp)
lhi %r3,1 /* second argument of one */
- j __sigsetjmp /* branch relativ to __sigsetjmp */
+ j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
END (setjmp)
+ /* Binary compatibility entry point. */
ENTRY(_setjmp)
.weak C_SYMBOL_NAME (_setjmp)
+ENTRY(__setjmp)
lhi %r3,0 /* second argument of zero */
ENTRY(__sigsetjmp)
+.Linternal_sigsetjmp:
stm %r6,%r15,0(%r2) /* store registers in jmp_buf */
+ std %f4,40(%r2)
+ std %f6,48(%r2)
#ifdef PIC
/* We cannot use the PLT, because it requires that %r12 be set, but
we can't save and restore our caller's value. Instead, we do an
diff --git a/sysdeps/s390/elf/start.S b/sysdeps/s390/s390-32/elf/start.S
index 1455572af8..7313b92e08 100644
--- a/sysdeps/s390/elf/start.S
+++ b/sysdeps/s390/s390-32/elf/start.S
@@ -1,5 +1,5 @@
/* Startup code compliant to the ELF s390 ABI.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/s390/ffs.c b/sysdeps/s390/s390-32/ffs.c
index b6ed821e58..12f265d7b2 100644
--- a/sysdeps/s390/ffs.c
+++ b/sysdeps/s390/s390-32/ffs.c
@@ -1,6 +1,6 @@
/* ffs -- find first set bit in a word, counted from least significant end.
This file is part of the GNU C Library.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/s390/initfini.c b/sysdeps/s390/s390-32/initfini.c
index e332a1d615..f6dfc3244b 100644
--- a/sysdeps/s390/initfini.c
+++ b/sysdeps/s390/s390-32/initfini.c
@@ -1,5 +1,5 @@
/* Special .init and .fini section support for S/390.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it
@@ -82,7 +82,7 @@ _init:
BASR 14,1
.L22:
#APP
- ALIGN
+ .align 4,0x07
END_INIT
/*@_init_PROLOG_ENDS*/
@@ -127,7 +127,7 @@ _fini:
L 12,.LC17-.LT2_0(13)
AR 12,13
#APP
- ALIGN
+ .align 4,0x07
END_FINI
/*@_fini_PROLOG_ENDS*/
diff --git a/sysdeps/s390/memchr.S b/sysdeps/s390/s390-32/memchr.S
index 72b4682745..81cefefd55 100644
--- a/sysdeps/s390/memchr.S
+++ b/sysdeps/s390/s390-32/memchr.S
@@ -1,5 +1,5 @@
/* Search a character in a block of memory. For IBM S390
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/s390/memcpy.S b/sysdeps/s390/s390-32/memcpy.S
index 94119ea0e1..4bbec7c633 100644
--- a/sysdeps/s390/memcpy.S
+++ b/sysdeps/s390/s390-32/memcpy.S
@@ -1,5 +1,5 @@
/* Set a block of memory to some byte value. For IBM S390
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/s390/memset.S b/sysdeps/s390/s390-32/memset.S
index e917fe031b..047b14c2be 100644
--- a/sysdeps/s390/memset.S
+++ b/sysdeps/s390/s390-32/memset.S
@@ -1,5 +1,5 @@
/* Set a block of memory to some byte value. For IBM S390
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/s390/mul_1.S b/sysdeps/s390/s390-32/mul_1.S
index 1804114741..48009719d0 100644
--- a/sysdeps/s390/mul_1.S
+++ b/sysdeps/s390/s390-32/mul_1.S
@@ -1,6 +1,6 @@
-/* i80386 __mpn_mul_1 -- Multiply a limb vector with a limb and store
+/* __mpn_mul_1 -- Multiply a limb vector with a limb and store
the result in a second limb vector.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU MP Library.
diff --git a/sysdeps/s390/s390-mcount.S b/sysdeps/s390/s390-32/s390-mcount.S
index e7c16b7052..6896291157 100644
--- a/sysdeps/s390/s390-mcount.S
+++ b/sysdeps/s390/s390-32/s390-mcount.S
@@ -1,5 +1,5 @@
/* S/390-specific implemetation of profiling support.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com)
diff --git a/sysdeps/s390/setjmp.S b/sysdeps/s390/s390-32/setjmp.S
index 5c92191b0f..23d1039a19 100644
--- a/sysdeps/s390/setjmp.S
+++ b/sysdeps/s390/s390-32/setjmp.S
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
@@ -30,6 +30,8 @@
ENTRY(__sigsetjmp)
stm %r6,%r15,0(%r2) /* store registers in jmp_buf */
+ std %f4,40(%r2)
+ std %f6,48(%r2)
#ifdef PIC
/* We cannot use the PLT, because it requires that %r12 be set, but
we can't save and restore our caller's value. Instead, we do an
diff --git a/sysdeps/s390/strcpy.S b/sysdeps/s390/s390-32/strcpy.S
index fedefd8f31..cd8600c184 100644
--- a/sysdeps/s390/strcpy.S
+++ b/sysdeps/s390/s390-32/strcpy.S
@@ -1,6 +1,6 @@
/* strcpy - copy a string from source to destination. For IBM S390
This file is part of the GNU C Library.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/s390/strncpy.S b/sysdeps/s390/s390-32/strncpy.S
index 823eeb4f5e..1286526cc6 100644
--- a/sysdeps/s390/strncpy.S
+++ b/sysdeps/s390/s390-32/strncpy.S
@@ -1,7 +1,7 @@
/* strncpy - copy at most n characters from a string from source to
destination. For IBM S390
This file is part of the GNU C Library.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/s390/sub_n.S b/sysdeps/s390/s390-32/sub_n.S
index 5eee0fb13d..dd182434cf 100644
--- a/sysdeps/s390/sub_n.S
+++ b/sysdeps/s390/s390-32/sub_n.S
@@ -1,6 +1,6 @@
-/* i80386 __mpn_sub_n -- Add two limb vectors of the same length > 0 and store
+/* __mpn_sub_n -- Add two limb vectors of the same length > 0 and store
sum in a third limb vector.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU MP Library.
diff --git a/sysdeps/s390/sysdep.h b/sysdeps/s390/s390-32/sysdep.h
index 6915379de4..a05b83cede 100644
--- a/sysdeps/s390/sysdep.h
+++ b/sysdeps/s390/s390-32/sysdep.h
@@ -1,5 +1,5 @@
/* Assembler macros for s390.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/s390/s390-64/Dist b/sysdeps/s390/s390-64/Dist
new file mode 100644
index 0000000000..f25a6dc50c
--- /dev/null
+++ b/sysdeps/s390/s390-64/Dist
@@ -0,0 +1,3 @@
+s390x-mcount.S
+machine-gmon.h
+fpu/fenv_libc.h
diff --git a/sysdeps/s390/s390-64/Implies b/sysdeps/s390/s390-64/Implies
new file mode 100644
index 0000000000..b3f92020c5
--- /dev/null
+++ b/sysdeps/s390/s390-64/Implies
@@ -0,0 +1,4 @@
+wordsize-64
+ieee754
+ieee754/dbl-64
+ieee754/flt-32
diff --git a/sysdeps/s390/s390-64/Makefile b/sysdeps/s390/s390-64/Makefile
new file mode 100644
index 0000000000..179c122de7
--- /dev/null
+++ b/sysdeps/s390/s390-64/Makefile
@@ -0,0 +1,11 @@
+pic-ccflag = -fPIC
+
+ifeq ($(subdir),gmon)
+sysdep_routines += s390x-mcount
+endif
+
+ifeq ($(subdir),elf)
+CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused
+CFLAGS-dl-load.c += -Wno-unused
+CFLAGS-dl-reloc.c += -Wno-unused
+endif
diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c
new file mode 100644
index 0000000000..d194024dde
--- /dev/null
+++ b/sysdeps/s390/s390-64/__longjmp.c
@@ -0,0 +1,46 @@
+/* Copyright (C) 2001 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ 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. */
+
+#include <errno.h>
+#include <sysdep.h>
+#include <setjmp.h>
+#include <bits/setjmp.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+/* Jump to the position specified by ENV, causing the
+ setjmp call there to return VAL, or 1 if VAL is 0. */
+void
+__longjmp (__jmp_buf env, int val)
+{
+ /* Restore registers and jump back. */
+ asm volatile ("lgr %%r2,%0\n\t" /* Put val in grp 2. */
+ "ld %%f7,104(%1)\n\t"
+ "ld %%f5,96(%1)\n\t"
+ "ld %%f3,88(%1)\n\t"
+ "ld %%f1,80(%1)\n\t"
+ "lmg %%r6,%%r15,0(%1)\n\t"
+ "br %%r14"
+ : : "r" (val == 0 ? 1 : val),
+ "a" (env) : "2" );
+
+ /* Avoid `volatile function does return' warnings. */
+ for (;;);
+}
+
diff --git a/sysdeps/s390/s390-64/add_n.S b/sysdeps/s390/s390-64/add_n.S
new file mode 100644
index 0000000000..734b7736e5
--- /dev/null
+++ b/sysdeps/s390/s390-64/add_n.S
@@ -0,0 +1,63 @@
+/* Add two limb vectors of the same length > 0 and store sum in a third
+ limb vector.
+ Copyright (C) 2001 Free Software Foundation, Inc.
+ Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+ This file is part of the GNU MP Library.
+
+ The GNU MP 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 MP 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 MP 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. */
+
+/*
+ INPUT PARAMETERS
+ res_ptr %r2
+ s1_ptr %r3
+ s2_ptr %r4
+ size %r5
+*/
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+ .text
+ENTRY(__mpn_add_n)
+ stg %r6,48(%r15) # save register 6
+ slgr %r1,%r1
+ lghi %r0,1 # cannot use ahi to add carry, use alr
+.L0: lg %r6,0(%r1,%r3) # .L0 -> no carry from last add
+ alg %r6,0(%r1,%r4)
+ stg %r6,0(%r1,%r2)
+ la %r1,8(%r1)
+ brc 3,.L3
+.L1: brct %r5,.L0
+ slgr %r2,%r2 # no last carry to return
+ j .Lexit
+.L2: lg %r6,0(%r1,%r3) # .L2 -> carry from last add
+ alg %r6,0(%r1,%r4)
+ brc 3,.L4
+ algr %r6,%r0 # no carry yet, add carry from last add
+ stg %r6,0(%r1,%r2)
+ la %r1,8(%r1)
+ brc 12,.L1 # new carry ?
+.L3: brct %r5,.L2
+ lgr %r2,%r0 # return last carry
+ j .Lexit
+.L4: algr %r6,%r0 # already a carry, add carry from last add
+ stg %r6,0(%r1,%r2)
+ la %r1,8(%r1)
+ brct %r5,.L2
+ lgr %r2,%r0 # return last carry
+.Lexit: lg %r6,48(%r15) # restore register 6
+ br %r14
+END(__mpn_add_n)
diff --git a/sysdeps/s390/s390-64/atomicity.h b/sysdeps/s390/s390-64/atomicity.h
new file mode 100644
index 0000000000..039496e905
--- /dev/null
+++ b/sysdeps/s390/s390-64/atomicity.h
@@ -0,0 +1,76 @@
+/* Low-level functions for atomic operations. 64 bit S/390 version.
+ Copyright (C) 2001 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 _ATOMICITY_H
+#define _ATOMICITY_H 1
+
+#include <inttypes.h>
+
+static inline int
+__attribute__ ((unused))
+exchange_and_add (volatile uint32_t *mem, int val)
+{
+ int result;
+ __asm__ __volatile__(
+ " L %0,%2\n"
+ " LA 2,%1\n"
+ "0: LR 0,%0\n"
+ " AR 0,%3\n"
+ " CS %0,0,0(2)\n"
+ " JL 0b"
+ : "=&d" (result), "=m" (*mem)
+ : "1" (*mem), "d" (val) : "0", "1", "2" );
+ return result;
+}
+
+static inline void
+__attribute__ ((unused))
+atomic_add (volatile uint32_t *mem, int val)
+{
+ __asm__ __volatile__(
+ " LA 2,%0\n"
+ "0: L 0,%1\n"
+ " LR 1,0\n"
+ " AR 1,%2\n"
+ " CS 0,1,0(2)\n"
+ " JL 0b"
+ : "=m" (*mem) : "0" (*mem), "d" (val) : "0", "1", "2" );
+}
+
+static inline int
+__attribute__ ((unused))
+compare_and_swap (volatile long int *p, long int oldval, long int newval)
+{
+ int retval;
+
+ __asm__ __volatile__(
+ " la 1,%1\n"
+ " lgr 0,%2\n"
+ " csg 0,%3,0(1)\n"
+ " ipm %0\n"
+ " srl %0,28\n"
+ "0:"
+ : "=&r" (retval), "+m" (*p)
+ : "d" (oldval) , "d" (newval)
+ : "memory", "0", "1", "cc");
+ return !retval;
+}
+
+#endif /* atomicity.h */
diff --git a/sysdeps/s390/s390-64/backtrace.c b/sysdeps/s390/s390-64/backtrace.c
new file mode 100644
index 0000000000..15ab214875
--- /dev/null
+++ b/sysdeps/s390/s390-64/backtrace.c
@@ -0,0 +1,81 @@
+/* Return backtrace of current program state. 64 bit S/390 version.
+ Copyright (C) 2001 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 <execinfo.h>
+#include <stddef.h>
+
+
+/* This is a global variable set at program start time. It marks the
+ highest used stack address. */
+extern void *__libc_stack_end;
+
+
+/* This is the stack layout we see for every non-leaf function.
+ size offset
+ %r15 -> +------------------+
+ 8 | back chain | 0
+ 8 | end of stack | 8
+ 32 | scratch | 16
+ 80 | save area r6-r15 | 48
+ 16 | save area f4,f6 | 128
+ 16 | empty | 144
+ +------------------+
+ r14 in the save area holds the return address.
+*/
+
+struct layout
+{
+ long back_chain;
+ long end_of_stack;
+ long scratch[4];
+ long save_grps[10];
+ long save_fp[2];
+ long empty[2];
+};
+
+int
+__backtrace (array, size)
+ void **array;
+ int size;
+{
+ /* We assume that all the code is generated with frame pointers set. */
+ struct layout *stack;
+ int cnt = 0;
+
+ asm ("LGR %0,%%r15" : "=d" (stack) );
+ /* We skip the call to this function, it makes no sense to record it. */
+ stack = (struct layout *) stack->back_chain;
+ while (cnt < size)
+ {
+ if (stack == NULL || (void *) stack > __libc_stack_end)
+ /* This means the address is out of range. Note that for the
+ toplevel we see a frame pointer with value NULL which clearly is
+ out of range. */
+ break;
+
+ array[cnt++] = stack->save_grps[9];
+
+ stack = (struct layout *) stack->back_chain;
+ }
+
+ return cnt;
+}
+weak_alias (__backtrace, backtrace)
+
diff --git a/sysdeps/s390/s390-64/bcopy.S b/sysdeps/s390/s390-64/bcopy.S
new file mode 100644
index 0000000000..5cb02b3162
--- /dev/null
+++ b/sysdeps/s390/s390-64/bcopy.S
@@ -0,0 +1,61 @@
+/* bcopy -- copy a block from source to destination. 64 bit S/390 version.
+ This file is part of the GNU C Library.
+ Copyright (C) 2001 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. */
+
+/* INPUT PARAMETERS
+ %r2 = address of source
+ %r3 = address of destination
+ %r4 = number of bytes to copy. */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+ .text
+ENTRY(__bcopy)
+ clgr %r2,%r3 # check against destructive overlap
+ jnl .L0
+ lgr %r1,%r2
+ algr %r1,%r4
+ clgr %r1,%r3
+ jh .L2
+.L0:
+ lgr %r5,%r4 # source length
+ lgr %r4,%r2 # source address
+ sgr %r1,%r1 # set pad byte to zero
+ lgr %r2,%r3 # set destination
+ lgr %r3,%r5 # destination length = source length
+.L1: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
+ jo .L1
+ br %r14
+.L2: # destructive overlay, can not use mvcle
+ lgr %r1,%r2 # bcopy is called with source,dest
+ lgr %r2,%r3 # memmove with dest,source! Oh, well...
+ lgr %r3,%r1
+#ifdef PIC
+ jg memmove@PLT
+#else
+ jg memmove
+#endif
+
+END(__bcopy)
+
+#ifndef NO_WEAK_ALIAS
+weak_alias (__bcopy, bcopy)
+#endif
+
diff --git a/sysdeps/s390/s390-64/bits/byteswap.h b/sysdeps/s390/s390-64/bits/byteswap.h
new file mode 100644
index 0000000000..71b33f0d85
--- /dev/null
+++ b/sysdeps/s390/s390-64/bits/byteswap.h
@@ -0,0 +1,93 @@
+/* Macros to swap the order of bytes in integer values. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
+# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
+#endif
+
+#define __bswap_constant_16(x) \
+ ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
+
+/* Swap bytes in 16 bit value. */
+#if defined __GNUC__ && __GNUC__ >= 2
+# define __bswap_16(x) \
+ (__extension__ \
+ ({ unsigned short int __v; \
+ if (__builtin_constant_p (x)) \
+ __v = __bswap_constant_16 (x); \
+ else { \
+ unsigned short int __tmp = (unsigned short int) (x); \
+ __asm__ __volatile__ ( \
+ "lrvh %0,%1" \
+ : "=&d" (__v) : "m" (__tmp) ); \
+ } \
+ __v; }))
+#else
+/* This is better than nothing. */
+#define __bswap_16(x) __bswap_constant_16 (x)
+#endif
+
+/* Swap bytes in 32 bit value. */
+#define __bswap_constant_32(x) \
+ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
+ (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
+
+#if defined __GNUC__ && __GNUC__ >= 2
+# define __bswap_32(x) \
+ (__extension__ \
+ ({ unsigned int __v; \
+ if (__builtin_constant_p (x)) \
+ __v = __bswap_constant_32 (x); \
+ else { \
+ unsigned int __tmp = (unsigned int) (x); \
+ __asm__ __volatile__ ( \
+ "lrv %0,%1" \
+ : "=&d" (__v) : "m" (__tmp)); \
+ } \
+ __v; }))
+#else
+# define __bswap_32(x) __bswap_constant_32 (x)
+#endif
+
+/* Swap bytes in 64 bit value. */
+#define __bswap_constant_64(x) \
+ ((((x)&0xff00000000000000) >> 56) | (((x)&0x00ff000000000000) >> 40) | \
+ (((x)&0x0000ff0000000000) >> 24) | (((x)&0x000000ff00000000) >> 8) | \
+ (((x)&0x00000000ff000000) << 8) | (((x)&0x0000000000ff0000) << 24) | \
+ (((x)&0x000000000000ff00) << 40) | (((x)&0x00000000000000ff) << 56))
+
+#if defined __GNUC__ && __GNUC__ >= 2
+# define __bswap_64(x) \
+ (__extension__ \
+ ({ unsigned long __w; \
+ if (__builtin_constant_p (x)) \
+ __w = __bswap_constant_64 (x); \
+ else { \
+ unsigned long __tmp = (unsigned long) (x); \
+ __asm__ __volatile__ ( \
+ "lrvg %0,%1" \
+ : "=&d" (__w) : "m" (__tmp)); \
+ } \
+ __w; }))
+#else
+# define __bswap_64(x) __bswap_constant_64 (x)
+#endif
+
+
diff --git a/sysdeps/s390/s390-64/bits/huge_val.h b/sysdeps/s390/s390-64/bits/huge_val.h
new file mode 100644
index 0000000000..f6fd431953
--- /dev/null
+++ b/sysdeps/s390/s390-64/bits/huge_val.h
@@ -0,0 +1,69 @@
+/* `HUGE_VAL' constants for 64 bit S/390 (where it is infinity).
+ Used by <stdlib.h> and <math.h> functions for overflow.
+ Copyright (C) 2001 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 _MATH_H
+# error "Never use <bits/huge_val.h> directly; include <math.h> instead."
+#endif
+
+#include <features.h>
+
+/* IEEE positive infinity (-HUGE_VAL is negative infinity). */
+
+#if __GNUC_PREREQ(2,96)
+# define HUGE_VAL (__extension__ 0x1.0p2047)
+#else
+# define __HUGE_VAL_bytes { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 }
+
+# define __huge_val_t union { unsigned char __c[8]; double __d; }
+# ifdef __GNUC__
+# define HUGE_VAL (__extension__ \
+ ((__huge_val_t) { __c: __HUGE_VAL_bytes }).__d)
+# else /* Not GCC. */
+static __huge_val_t __huge_val = { __HUGE_VAL_bytes };
+# define HUGE_VAL (__huge_val.__d)
+# endif /* GCC. */
+#endif /* GCC 2.95 */
+
+
+/* ISO C 99 extensions: (float) HUGE_VALF and (long double) HUGE_VALL. */
+
+#ifdef __USE_ISOC99
+
+# if __GNUC_PREREQ(2,96)
+# define HUGE_VALF (__extension__ 0x1.0p255f)
+# define HUGE_VALL (__extension__ 0x1.0p255f)
+# else
+# define __HUGE_VALF_bytes { 0x7f, 0x80, 0, 0 }
+# define __huge_valf_t union { unsigned char __c[4]; float __f; }
+# ifdef __GNUC__
+# define HUGE_VALF (__extension__ \
+ ((__huge_valf_t) { __c: __HUGE_VALF_bytes }).__f)
+# else /* Not GCC. */
+static __huge_valf_t __huge_valf = { __HUGE_VALF_bytes };
+# define HUGE_VALF (__huge_valf.__f)
+# endif /* GCC. */
+
+/* On 390 there is no 'long double' format. Make it the same as 'double' */
+# define HUGE_VALL HUGE_VAL
+
+# endif /* GCC 2.95 */
+
+#endif /* __USE_ISOC99. */
diff --git a/sysdeps/s390/s390-64/bits/setjmp.h b/sysdeps/s390/s390-64/bits/setjmp.h
new file mode 100644
index 0000000000..d5c7d564e1
--- /dev/null
+++ b/sysdeps/s390/s390-64/bits/setjmp.h
@@ -0,0 +1,53 @@
+/* Copyright (C) 2001 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. */
+
+/* Define the machine-dependent type `jmp_buf'. 64 bit S/390 version. */
+
+#ifndef __S390_SETJMP_H__
+#define __S390_SETJMP_H__
+
+#define __JB_GPR6 0
+#define __JB_GPR7 1
+#define __JB_GPR8 2
+#define __JB_GPR9 3
+#define __JB_GPR10 4
+#define __JB_GPR11 5
+#define __JB_GPR12 6
+#define __JB_GPR13 7
+#define __JB_GPR14 8
+#define __JB_GPR15 9
+
+#ifndef _ASM
+
+typedef struct {
+ /* We save registers 6-15. */
+ long int gregs[10];
+
+ /* We save fpu registers 4 and 6. */
+ long fpregs[8];
+} __jmp_buf[1];
+
+#endif
+
+/* Test if longjmp to JMPBUF would unwind the frame
+ containing a local variable at ADDRESS. */
+#define _JMPBUF_UNWINDS(jmpbuf, address) \
+ ((int) (address) < (jmpbuf)->gregs[__JB_GPR15])
+
+#endif /* __S390_SETJMP_H__ */
+
diff --git a/sysdeps/s390/s390-64/bits/string.h b/sysdeps/s390/s390-64/bits/string.h
new file mode 100644
index 0000000000..7acc2b128f
--- /dev/null
+++ b/sysdeps/s390/s390-64/bits/string.h
@@ -0,0 +1,153 @@
+/* Optimized, inlined string functions. 64 bit S/390 version.
+ Copyright (C) 2001 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 _STRING_H
+# error "Never use <bits/string.h> directly; include <string.h> instead."
+#endif
+
+/* The s390 processors can access unaligned multi-byte variables. */
+#define _STRING_ARCH_unaligned 1
+
+/* We only provide optimizations if the user selects them and if
+ GNU CC is used. */
+#if !defined __NO_STRING_INLINES && defined __USE_STRING_INLINES \
+ && defined __GNUC__ && __GNUC__ >= 2
+
+#ifndef __STRING_INLINE
+# ifdef __cplusplus
+# define __STRING_INLINE inline
+# else
+# define __STRING_INLINE extern __inline
+# endif
+#endif
+
+#define _HAVE_STRING_ARCH_strlen 1
+#ifndef _FORCE_INLINES
+__STRING_INLINE size_t
+strlen (__const char *__str)
+{
+ size_t __len;
+
+ __asm__ __volatile__ (" sgr 0,0\n"
+ " lgr %0,%1\n"
+ "0: srst 0,%0\n"
+ " jo 0b\n"
+ " lgr %0,0\n"
+ " sgr %0,%1"
+ : "=&a" (__len) : "a" (__str)
+ : "cc", "0" );
+ return __len;
+}
+#endif
+
+/* Copy SRC to DEST. */
+#define _HAVE_STRING_ARCH_strcpy 1
+#ifndef _FORCE_INLINES
+__STRING_INLINE char *
+strcpy (char *__dest, __const char *__src)
+{
+ char *tmp = __dest;
+
+ __asm__ __volatile__ (" sgr 0,0\n"
+ "0: mvst %0,%1\n"
+ " jo 0b"
+ : "+&a" (__dest), "+&a" (__src) :
+ : "cc", "memory", "0" );
+ return tmp;
+}
+#endif
+
+#define _HAVE_STRING_ARCH_strncpy 1
+#ifndef _FORCE_INLINES
+__STRING_INLINE char *
+strncpy (char *__dest, __const char *__src, size_t __n)
+{
+ char *tmp = __dest;
+
+ if (__n <= 0)
+ return tmp;
+ __asm__ __volatile (" slgr %0,%1\n"
+ "0: icm 0,1,0(%1)\n"
+ " stc 0,0(%0,%1)\n"
+ " jz 2f\n"
+ " la %1,1(%1)\n"
+ " brct %2,0b\n"
+ " j 3f\n"
+ "1: la %1,1(%1)\n"
+ " stc 0,0(%0,%1)\n"
+ "2: brct %2,1b\n"
+ "3:"
+ : "+&a" (__dest), "+&a" (__src), "+&d" (__n) :
+ : "cc", "memory", "0" );
+ return tmp;
+}
+#endif
+
+/* Append SRC onto DEST. */
+#define _HAVE_STRING_ARCH_strcat 1
+#ifndef _FORCE_INLINES
+__STRING_INLINE char *
+strcat(char *__dest, const char *__src)
+{
+ char *tmp = __dest;
+
+ __asm__ __volatile__ (" sgr 0,0\n"
+ "0: srst 0,%0\n"
+ " jo 0b\n"
+ " lgr %0,0\n"
+ " sgr 0,0\n"
+ "1: mvst %0,%1\n"
+ " jo 1b"
+ : "+&a" (__dest), "+&a" (__src) :
+ : "cc", "memory", "0" );
+ return tmp;
+}
+#endif
+
+/* Append no more than N characters from SRC onto DEST. */
+#define _HAVE_STRING_ARCH_strncat 1
+#ifndef _FORCE_INLINES
+__STRING_INLINE char *
+strncat (char *__dest, __const char *__src, size_t __n)
+{
+ char *tmp = __dest;
+
+ if (__n <= 0)
+ return tmp;
+ __asm__ __volatile__ (" sgr 0,0\n"
+ "0: srst 0,%0\n"
+ " jo 0b\n"
+ " lgr %0,0\n"
+ " slgr %0,%1\n"
+ "1: icm 0,1,0(%1)\n"
+ " stc 0,0(%0,%1)\n"
+ " jz 2f\n"
+ " la %1,1(%1)\n"
+ " brct %2,1b\n"
+ " la %0,0(%0,%1)\n"
+ " xc 0(1,%0),0(%0)\n"
+ "2:"
+ : "+&a" (__dest), "+&a" (__src), "+&d" (__n) :
+ : "cc", "memory", "0" );
+ return tmp;
+}
+#endif
+
+#endif /* Use string inlines && GNU CC. */
diff --git a/sysdeps/s390/s390-64/bsd-_setjmp.S b/sysdeps/s390/s390-64/bsd-_setjmp.S
new file mode 100644
index 0000000000..210b24d63b
--- /dev/null
+++ b/sysdeps/s390/s390-64/bsd-_setjmp.S
@@ -0,0 +1,35 @@
+/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+/* This just does a tail-call to `__sigsetjmp (ARG, 0)'.
+ We cannot do it in C because it must be a tail-call, so frame-unwinding
+ in setjmp doesn't clobber the state restored by longjmp. */
+
+#include <sysdep.h>
+
+ENTRY(_setjmp)
+ slgr %r3,%r3 /* Second argument of zero. */
+#ifdef PIC
+ jg __sigsetjmp@PLT /* Branch to PLT of __sigsetjmp. */
+#else
+ jg __sigsetjmp /* Branch to __sigsetjmp. */
+#endif
+END (_setjmp)
+
diff --git a/sysdeps/s390/s390-64/bsd-setjmp.S b/sysdeps/s390/s390-64/bsd-setjmp.S
new file mode 100644
index 0000000000..4bded05851
--- /dev/null
+++ b/sysdeps/s390/s390-64/bsd-setjmp.S
@@ -0,0 +1,34 @@
+/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+/* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
+ We cannot do it in C because it must be a tail-call, so frame-unwinding
+ in setjmp doesn't clobber the state restored by longjmp. */
+
+#include <sysdep.h>
+
+ENTRY(setjmp)
+ lghi %r1,1 /* Second argument of one. */
+#ifdef PIC
+ jg __sigsetjmp@PLT /* Branch to PLT of __sigsetjmp. */
+#else
+ jg __sigsetjmp /* Branch to __sigsetjmp. */
+#endif
+END (setjmp)
diff --git a/sysdeps/s390/s390-64/bzero.S b/sysdeps/s390/s390-64/bzero.S
new file mode 100644
index 0000000000..7aad19ba60
--- /dev/null
+++ b/sysdeps/s390/s390-64/bzero.S
@@ -0,0 +1,42 @@
+/* bzero -- set a block of memory to zero. 64 bit S/390 version.
+ This file is part of the GNU C Library.
+ Copyright (C) 2001 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. */
+
+/* INPUT PARAMETERS
+ %r2 = address of memory area
+ %r3 = number of bytes to fill. */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+ .text
+ENTRY(__bzero)
+ ltgr %r3,%r3
+ jz .L1
+ sgr %r1,%r1 # set pad byte to zero
+ sgr %r4,%r4 # no source for MVCLE, only a pad byte
+ sgr %r5,%r5
+.L0: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
+ jo .L0
+.L1: br %r14
+END(__bzero)
+
+#ifndef NO_WEAK_ALIAS
+weak_alias (__bzero, bzero)
+#endif
diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h
new file mode 100644
index 0000000000..fd1c752df9
--- /dev/null
+++ b/sysdeps/s390/s390-64/dl-machine.h
@@ -0,0 +1,434 @@
+/* Machine-dependent ELF dynamic relocation inline functions.
+ 64 bit S/390 Version.
+ Copyright (C) 2001 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 dl_machine_h
+#define dl_machine_h
+
+#define ELF_MACHINE_NAME "s390x"
+
+#include <sys/param.h>
+#include <string.h>
+#include <link.h>
+
+/* This is an older, now obsolete value. */
+#define EM_S390_OLD 0xA390
+
+/* Return nonzero iff E_MACHINE is compatible with the running host. */
+static inline int
+elf_machine_matches_host (const Elf64_Ehdr *ehdr)
+{
+ return (ehdr->e_machine == EM_S390 || ehdr->e_machine == EM_S390_OLD)
+ && ehdr->e_ident[EI_CLASS] == ELFCLASS64;
+}
+
+/* Return the link-time address of _DYNAMIC. Conveniently, this is the
+ first element of the GOT. This must be inlined in a function which
+ uses global data. */
+
+static inline Elf64_Addr
+elf_machine_dynamic (void)
+{
+ register Elf64_Addr *got;
+
+ asm( " larl %0,_GLOBAL_OFFSET_TABLE_\n"
+ : "=&a" (got) : : "0" );
+
+ return *got;
+}
+
+/* Return the run-time load address of the shared object. */
+static inline Elf64_Addr
+elf_machine_load_address (void)
+{
+ Elf64_Addr addr;
+
+ asm( " larl %0,_dl_start\n"
+ " larl 1,_GLOBAL_OFFSET_TABLE_\n"
+ " lghi 2,_dl_start@GOT\n"
+ " slg %0,0(2,1)"
+ : "=&d" (addr) : : "1", "2" );
+ return addr;
+}
+
+/* Set up the loaded object described by L so its unrelocated PLT
+ entries will jump to the on-demand fixup code in dl-runtime.c. */
+
+static inline int __attribute__ ((unused))
+elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+{
+ extern void _dl_runtime_resolve (Elf64_Word);
+ extern void _dl_runtime_profile (Elf64_Word);
+
+ if (l->l_info[DT_JMPREL] && lazy)
+ {
+ /* The GOT entries for functions in the PLT have not yet been filled
+ in. Their initial contents will arrange when called to push an
+ offset into the .rela.plt section, push _GLOBAL_OFFSET_TABLE_[1],
+ and then jump to _GLOBAL_OFFSET_TABLE[2]. */
+ Elf64_Addr *got;
+ got = (Elf64_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
+ got[1] = (Elf64_Addr) l; /* Identify this shared object. */
+
+ /* The got[2] entry contains the address of a function which gets
+ called to get the address of a so far unresolved function and
+ jump to it. The profiling extension of the dynamic linker allows
+ to intercept the calls to collect information. In this case we
+ don't store the address in the GOT so that all future calls also
+ end in this function. */
+ if (__builtin_expect (profile, 0))
+ {
+ got[2] = (Elf64_Addr) &_dl_runtime_profile;
+
+ if (_dl_name_match_p (_dl_profile, l))
+ /* This is the object we are looking for. Say that we really
+ want profiling and the timers are started. */
+ _dl_profile_map = l;
+ }
+ else
+ /* This function will get called to fix up the GOT entry indicated by
+ the offset on the stack, and then jump to the resolved address. */
+ got[2] = (Elf64_Addr) &_dl_runtime_resolve;
+ }
+
+ return lazy;
+}
+
+/* This code is used in dl-runtime.c to call the `fixup' function
+ and then redirect to the address it returns. */
+
+/* s390:
+ Arguments are in register.
+ r2 - r7 holds the original parameters for the function call, fixup
+ and trampoline code use r0-r5 and r14-15. For the correct function
+ call r2-r5 and r14-15 must be restored.
+ Arguments from the PLT are stored at 48(r15) and 56(r15)
+ and must be moved to r2 and r3 for the fixup call (see elf32-s390.c
+ in the binutils for the PLT code).
+ Fixup function address in r2.
+*/
+#ifndef PROF
+#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
+ asm ( "\
+ .text\n\
+ .globl _dl_runtime_resolve\n\
+ .type _dl_runtime_resolve, @function\n\
+ .align 16\n\
+_dl_runtime_resolve:\n\
+ # save registers\n\
+ stmg 2,5,64(15)\n\
+ stg 14,96(15)\n\
+ lgr 0,15\n\
+ aghi 15,-160\n\
+ stg 0,0(15)\n\
+ # load args saved by PLT\n\
+ lmg 2,3,208(15)\n\
+ brasl 14,fixup # call fixup
+ lgr 1,2 # function addr returned in r2\n\
+ # restore registers\n\
+ aghi 15,160\n\
+ lg 14,96(15)\n\
+ lmg 2,5,64(15)\n\
+ br 1\n\
+ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
+\n\
+ .globl _dl_runtime_profile\n\
+ .type _dl_runtime_profile, @function\n\
+ .align 16\n\
+_dl_runtime_profile:\n\
+ # save registers\n\
+ stmg 2,5,64(15)\n\
+ stg 14,96(15)\n\
+ lgr 0,15\n\
+ aghi 15,-160\n\
+ stg 0,0(15)\n\
+ # load args saved by PLT\n\
+ lmg 2,3,208(15)\n\
+ # load return address as third parameter\n\
+ lgr 4,14\n\
+ brasl 14,profile_fixup # call fixup\n\
+ lgr 1,2 # function addr returned in r2\n\
+ # restore registers\n\
+ aghi 15,160\n\
+ lg 14,96(15)\n\
+ lmg 2,5,64(15)\n\
+ br 1\n\
+ .size _dl_runtime_profile, .-_dl_runtime_profile\n\
+");
+#else
+#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
+ asm ( "\
+ .text\n\
+ .globl _dl_runtime_resolve\n\
+ .globl _dl_runtime_profile\n\
+ .type _dl_runtime_resolve, @function\n\
+ .type _dl_runtime_profile, @function\n\
+ .align 16\n\
+_dl_runtime_resolve:\n\
+_dl_runtime_profile:\n\
+ # save registers\n\
+ stmg 2,5,64(15)\n\
+ stg 14,96(15)\n\
+ lgr 0,15\n\
+ aghi 15,-160\n\
+ stg 0,0(15)\n\
+ # load args saved by PLT\n\
+ lmg 2,3,208(15)\n\
+ # load return address as third parameter\n\
+ lgr 4,14\n\
+ brasl 14,profile_fixup # call fixup\n\
+ lgr 1,2 # function addr returned in r2\n\
+ # restore registers\n\
+ aghi 15,160\n\
+ lg 14,96(15)\n\
+ lmg 2,5,64(15)\n\
+ br 1\n\
+ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
+ .size _dl_runtime_profile, .-_dl_runtime_profile\n\
+");
+#endif
+
+/* Initial entry point code for the dynamic linker.
+ The C function `_dl_start' is the real entry point;
+ its return value is the user program's entry point. */
+
+#define RTLD_START asm ("\n\
+.text\n\
+.align 4\n\
+.globl _start\n\
+.globl _dl_start_user\n\
+_start:\n\
+ lgr %r2,%r15\n\
+ # Alloc stack frame\n\
+ aghi %r15,-160\n\
+ # Set the back chain to zero\n\
+ xc 0(8,%r15),0(%r15)\n\
+ # Call _dl_start with %r2 pointing to arg on stack\n\
+ brasl %r14,_dl_start # call _dl_start\n\
+_dl_start_user:\n\
+ # Save the user entry point address in %r8.\n\
+ lgr %r8,%r2\n\
+ # Point %r12 at the GOT.\n\
+ larl %r12,_GLOBAL_OFFSET_TABLE_\n\
+ # Store the highest stack address\n\
+ lghi %r1,__libc_stack_end@GOT
+ lg %r1,0(%r1,%r12)\n\
+ stg %r15, 0(%r1)\n\
+ # See if we were run as a command with the executable file\n\
+ # name as an extra leading argument.\n\
+ lghi %r1,_dl_skip_args@GOT
+ lg %r1,0(%r1,%r12)\n\
+ lgf %r1,0(%r1) # load _dl_skip_args\n\
+ # Get the original argument count.\n\
+ lg %r0,160(%r15)\n\
+ # Subtract _dl_skip_args from it.\n\
+ sgr %r0,%r1\n\
+ # Adjust the stack pointer to skip _dl_skip_args words.\n\
+ sllg %r1,%r1,3\n\
+ agr %r15,%r1\n\
+ # Set the back chain to zero again\n\
+ xc 0(8,%r15),0(%r15)\n\
+ # Store back the modified argument count.\n\
+ stg %r0,160(%r15)\n\
+ # The special initializer gets called with the stack just\n\
+ # as the application's entry point will see it; it can\n\
+ # switch stacks if it moves these contents over.\n\
+" RTLD_START_SPECIAL_INIT "\n\
+ # Call the function to run the initializers.\n\
+ # Load the parameters:\n\
+ # (%r2, %r3, %r4, %r5) = (_dl_loaded, argc, argv, envp)\n\
+ lghi %r2,_dl_loaded@GOT
+ lg %r2,0(%r2,%r12)\n\
+ lg %r2,0(%r2)\n\
+ lg %r3,160(%r15)\n\
+ la %r4,168(%r15)\n\
+ lgr %r5,%r3\n\
+ sllg %r5,%r5,3\n\
+ la %r5,176(%r5,%r15)\n\
+ brasl %r14,_dl_init@PLT\n
+ # Pass our finalizer function to the user in %r14, as per ELF ABI.\n\
+ lghi %r14,_dl_fini@GOT
+ lg %r14,0(%r14,%r12)\n\
+ # Free stack frame\n\
+ aghi %r15,160\n\
+ # Jump to the user's entry point (saved in %r8).\n\
+ br %r8\n\
+");
+
+#ifndef RTLD_START_SPECIAL_INIT
+#define RTLD_START_SPECIAL_INIT /* nothing */
+#endif
+
+/* Nonzero iff TYPE should not be allowed to resolve to one of
+ the main executable's symbols, as for a COPY reloc. */
+#define elf_machine_lookup_noexec_p(type) ((type) == R_390_COPY)
+
+/* Nonzero iff TYPE describes relocation of a PLT entry, so
+ PLT entries should not be allowed to define the value. */
+#define elf_machine_lookup_noplt_p(type) ((type) == R_390_JMP_SLOT)
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
+#define ELF_MACHINE_JMP_SLOT R_390_JMP_SLOT
+
+/* The 64 bit S/390 never uses Elf64_Rel relocations. */
+#define ELF_MACHINE_NO_REL 1
+
+/* We define an initialization functions. This is called very early in
+ _dl_sysdep_start. */
+#define DL_PLATFORM_INIT dl_platform_init ()
+
+extern const char *_dl_platform;
+
+static inline void __attribute__ ((unused))
+dl_platform_init (void)
+{
+ if (_dl_platform != NULL && *_dl_platform == '\0')
+ /* Avoid an empty string which would disturb us. */
+ _dl_platform = NULL;
+}
+
+static inline Elf64_Addr
+elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+ const Elf64_Rela *reloc,
+ Elf64_Addr *reloc_addr, Elf64_Addr value)
+{
+ return *reloc_addr = value;
+}
+
+/* Return the final value of a plt relocation. */
+static inline Elf64_Addr
+elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
+ Elf64_Addr value)
+{
+ return value;
+}
+
+#endif /* !dl_machine_h */
+
+#ifdef RESOLVE
+
+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+ MAP is the object containing the reloc. */
+
+static inline void
+elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
+ const Elf64_Sym *sym, const struct r_found_version *version,
+ Elf64_Addr *const reloc_addr)
+{
+ if (ELF64_R_TYPE (reloc->r_info) == R_390_RELATIVE) {
+#ifndef RTLD_BOOTSTRAP
+ weak_extern (_dl_rtld_map);
+ if (map != &_dl_rtld_map) /* Already done in rtld itself. */
+#endif
+ *reloc_addr = map->l_addr + reloc->r_addend;
+ }
+ else if (ELF64_R_TYPE (reloc->r_info) != R_390_NONE)
+ {
+ const Elf64_Sym *const refsym = sym;
+ Elf64_Addr value = RESOLVE (&sym, version, ELF64_R_TYPE (reloc->r_info));
+ if (sym)
+ value += sym->st_value;
+
+ switch (ELF64_R_TYPE (reloc->r_info))
+ {
+ case R_390_GLOB_DAT:
+ case R_390_JMP_SLOT:
+ *reloc_addr = value + reloc->r_addend;
+ break;
+#ifndef RTLD_BOOTSTRAP
+ case R_390_COPY:
+ if (sym == NULL)
+ /* This can happen in trace mode if an object could not be
+ found. */
+ break;
+ if (__builtin_expect (sym->st_size > refsym->st_size, 0)
+ || (__builtin_expect (sym->st_size < refsym->st_size, 0)
+ && __builtin_expect (_dl_verbose, 0)))
+ {
+ const char *strtab;
+
+ strtab = (const char *) D_PTR (map,l_info[DT_STRTAB]);
+ _dl_error_printf ("\
+%s: Symbol `%s' has different size in shared object, consider re-linking\n",
+ _dl_argv[0] ?: "<program name unknown>",
+ strtab + refsym->st_name);
+ }
+ memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
+ refsym->st_size));
+ break;
+ case R_390_64:
+ *reloc_addr = value + reloc->r_addend;
+ break;
+ case R_390_32:
+ *(unsigned int *) reloc_addr = value + reloc->r_addend;
+ break;
+ case R_390_16:
+ *(unsigned short *) reloc_addr = value + reloc->r_addend;
+ break;
+ case R_390_8:
+ *(char *) reloc_addr = value + reloc->r_addend;
+ break;
+ case R_390_PC64:
+ *reloc_addr = value +reloc->r_addend - (Elf64_Addr) reloc_addr;
+ break;
+ case R_390_PC32DBL:
+ case R_390_PLT32DBL:
+ *(unsigned int *) reloc_addr = (unsigned int)
+ ((int) (value + reloc->r_addend - (Elf64_Addr) reloc_addr) >> 1);
+ break;
+ case R_390_PC32:
+ *(unsigned int *) reloc_addr =
+ value + reloc->r_addend - (Elf64_Addr) reloc_addr;
+ break;
+ case R_390_PC16DBL:
+ case R_390_PLT16DBL:
+ *(unsigned short *) reloc_addr = (unsigned short)
+ ((short) (value + reloc->r_addend - (Elf64_Addr) reloc_addr) >> 1);
+ break;
+ case R_390_PC16:
+ *(unsigned short *) reloc_addr =
+ value + reloc->r_addend - (Elf64_Addr) reloc_addr;
+ break;
+#endif
+#if !defined(RTLD_BOOTSTRAP) || defined(_NDEBUG)
+ default:
+ /* We add these checks in the version to relocate ld.so only
+ if we are still debugging. */
+ _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0);
+ break;
+#endif
+ }
+ }
+}
+
+static inline void
+elf_machine_lazy_rel (struct link_map *map,
+ Elf64_Addr l_addr, const Elf64_Rela *reloc)
+{
+ Elf64_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
+ /* Check for unexpected PLT reloc type. */
+ if (__builtin_expect (ELF64_R_TYPE (reloc->r_info), R_390_JMP_SLOT)
+ == R_390_JMP_SLOT)
+ *reloc_addr += l_addr;
+ else
+ _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
+}
+
+#endif /* RESOLVE */
diff --git a/sysdeps/s390/s390-64/elf/bsd-_setjmp.S b/sysdeps/s390/s390-64/elf/bsd-_setjmp.S
new file mode 100644
index 0000000000..1417270201
--- /dev/null
+++ b/sysdeps/s390/s390-64/elf/bsd-_setjmp.S
@@ -0,0 +1 @@
+/* We don't need any code here since the setjmp.S file contains it. */
diff --git a/sysdeps/s390/s390-64/elf/bsd-setjmp.S b/sysdeps/s390/s390-64/elf/bsd-setjmp.S
new file mode 100644
index 0000000000..1417270201
--- /dev/null
+++ b/sysdeps/s390/s390-64/elf/bsd-setjmp.S
@@ -0,0 +1 @@
+/* We don't need any code here since the setjmp.S file contains it. */
diff --git a/sysdeps/s390/s390-64/elf/setjmp.S b/sysdeps/s390/s390-64/elf/setjmp.S
new file mode 100644
index 0000000000..ab1931507a
--- /dev/null
+++ b/sysdeps/s390/s390-64/elf/setjmp.S
@@ -0,0 +1,53 @@
+/* setjmp for 64 bit S/390, ELF version.
+ Copyright (C) 2001 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>
+#define _ASM
+#define _SETJMP_H
+#include <bits/setjmp.h>
+
+ /* We include the BSD entry points here as well but we make
+ them weak. */
+ENTRY (setjmp)
+ .weak C_SYMBOL_NAME (setjmp)
+ lghi %r3,1 /* Second argument of one. */
+ j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
+END (setjmp)
+
+ /* Binary compatibility entry point. */
+ENTRY(_setjmp)
+ .weak C_SYMBOL_NAME (_setjmp)
+ENTRY(__setjmp)
+ slgr %r3,%r3 /* Second argument of zero. */
+
+ENTRY(__sigsetjmp)
+.Linternal_sigsetjmp:
+ stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */
+ std %f1,80(%r2)
+ std %f3,88(%r2)
+ std %f5,96(%r2)
+ std %f7,104(%r2)
+#ifdef PIC
+ jg __sigjmp_save@PLT /* Branch to PLT of __sigsetjmp. */
+#else
+ jg __sigjmp_save
+#endif
+END (__sigsetjmp)
+
diff --git a/sysdeps/s390/s390-64/elf/start.S b/sysdeps/s390/s390-64/elf/start.S
new file mode 100644
index 0000000000..d85c0805a9
--- /dev/null
+++ b/sysdeps/s390/s390-64/elf/start.S
@@ -0,0 +1,84 @@
+/* Startup code compliant to the 64 bit S/390 ELF ABI.
+ Copyright (C) 2001 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. */
+
+/*
+ This is the canonical entry point, usually the first thing in the text
+ segment. Most registers' values are unspecified, except for:
+
+ %r14 Contains a function pointer to be registered with `atexit'.
+ This is how the dynamic linker arranges to have DT_FINI
+ functions called for shared libraries that have been loaded
+ before this code runs.
+
+ %r15 The stack contains the arguments and environment:
+ 0(%r15) argc
+ 8(%r15) argv[0]
+ ...
+ (8*argc)(%r15) NULL
+ (8*(argc+1))(%r15) envp[0]
+ ...
+ NULL
+*/
+
+ .text
+ .globl _start
+_start:
+ /* Load argc and argv from stack. */
+ la %r4,8(%r15) # get argv
+ lg %r3,0(%r15) # get argc
+
+ /* Align the stack to a double word boundary. */
+ lghi %r0,-16
+ ngr %r15,%r0
+
+ /* Setup a stack frame and a parameter area. */
+ aghi %r15,-176 # make room on stack
+ xc 0(8,%r15),0(%r15) # clear back-chain
+
+ /* Set up arguments for __libc_start_main:
+ main, argc, argv, envp, _init, _fini, rtld_fini, stack_end
+ Note that envp will be determined later in __libc_start_main.
+ */
+ stmg %r14,%r15,160(%r15) # store rtld_fini/stack_end to parameter area
+ la %r7,160(%r15)
+ larl %r6,_fini # load pointer to _fini
+ larl %r5,_init # load pointer to _init
+ larl %r2,main # load pointer to main
+
+ /* Ok, now branch to the libc main routine. */
+ brasl %r14,__libc_start_main
+
+ /* Crash if __libc_start_main returns. */
+ .word 0
+
+ /* FIXME: FPU flags or what ?!? */
+
+ .section .rodata
+ .globl _fp_hw
+ .long 3
+ .size _fp_hw, 4
+
+ /* Define a symbol for the first piece of initialized data. */
+ .data
+ .globl __data_start
+__data_start:
+ .long 0
+ .weak data_start
+ data_start = __data_start
diff --git a/sysdeps/s390/s390-64/ffs.c b/sysdeps/s390/s390-64/ffs.c
new file mode 100644
index 0000000000..64e0d8911e
--- /dev/null
+++ b/sysdeps/s390/s390-64/ffs.c
@@ -0,0 +1,68 @@
+/* ffs -- find first set bit in a word, counted from least significant end.
+ 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+#define ffsl __something_else
+#include <string.h>
+
+#undef ffs
+
+/* ffs: find first bit set. This is defined the same way as
+ the libc and compiler builtin ffs routines, therefore
+ differs in spirit from the above ffz (man ffs). */
+
+int
+__ffs (x)
+ int x;
+{
+ int r;
+
+ if (x == 0)
+ return 0;
+ __asm__(" lr %%r1,%1\n"
+ " sr %0,%0\n"
+ " tml %%r1,0xFFFF\n"
+ " jnz 0f\n"
+ " ahi %0,16\n"
+ " srl %%r1,16\n"
+ "0: tml %%r1,0x00FF\n"
+ " jnz 1f\n"
+ " ahi %0,8\n"
+ " srl %%r1,8\n"
+ "1: tml %%r1,0x000F\n"
+ " jnz 2f\n"
+ " ahi %0,4\n"
+ " srl %%r1,4\n"
+ "2: tml %%r1,0x0003\n"
+ " jnz 3f\n"
+ " ahi %0,2\n"
+ " srl %%r1,2\n"
+ "3: tml %%r1,0x0001\n"
+ " jnz 4f\n"
+ " ahi %0,1\n"
+ "4:"
+ : "=&d" (r) : "d" (x) : "cc", "1" );
+ return r+1;
+}
+
+weak_alias (__ffs, ffs)
+#undef ffsl
+weak_alias (__ffs, ffsl)
+
diff --git a/sysdeps/s390/s390-64/initfini.c b/sysdeps/s390/s390-64/initfini.c
new file mode 100644
index 0000000000..3d14b0b283
--- /dev/null
+++ b/sysdeps/s390/s390-64/initfini.c
@@ -0,0 +1,136 @@
+/* Special .init and .fini section support for 64 bit S/390.
+ Copyright (C) 2001 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.
+
+ In addition to the permissions in the GNU Library General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file with other
+ programs, and to distribute those programs without any restriction
+ coming from the use of this file. (The Library General Public
+ License restrictions do apply in other respects; for example, they
+ cover modification of the file, and distribution when not linked
+ into another program.)
+
+ 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, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* This file is compiled into assembly code which is then munged by a sed
+ script into two files: crti.s and crtn.s.
+
+ * crti.s puts a function prologue at the beginning of the
+ .init and .fini sections and defines global symbols for
+ those addresses, so they can be called as functions.
+
+ * crtn.s puts the corresponding function epilogues
+ in the .init and .fini sections. */
+
+__asm__ ("
+
+#include \"defs.h\"
+
+/*@HEADER_ENDS*/
+
+/*@TESTS_BEGIN*/
+
+/*@TESTS_END*/
+
+/*@_init_PROLOG_BEGINS*/
+
+ .section .init
+#NO_APP
+ .align 4
+.globl _init
+ .type _init,@function
+_init:
+# leaf function 0
+# automatics 0
+# outgoing args 0
+# need frame pointer 0
+# call alloca 0
+# has varargs 0
+# incoming args (stack) 0
+# function length 36
+ STMG 6,15,48(15)
+ LGR 1,15
+ AGHI 15,-160
+ STG 1,0(15)
+ LARL 12,_GLOBAL_OFFSET_TABLE_
+ LGHI 1,__gmon_start__@GOT
+ LG 1,0(1,12)
+ LTGR 1,1
+ JE .L22
+ BASR 14,1
+.L22:
+#APP
+ .align 4,0x07
+ END_INIT
+
+/*@_init_PROLOG_ENDS*/
+
+/*@_init_EPILOG_BEGINS*/
+ .align 4
+ .section .init
+#NO_APP
+ .align 4
+ LG 4,272(15)
+ LMG 6,15,208(15)
+ BR 4
+#APP
+ END_INIT
+
+/*@_init_EPILOG_ENDS*/
+
+/*@_fini_PROLOG_BEGINS*/
+ .section .fini
+#NO_APP
+ .align 4
+.globl _fini
+ .type _fini,@function
+_fini:
+# leaf function 0
+# automatics 0
+# outgoing args 0
+# need frame pointer 0
+# call alloca 0
+# has varargs 0
+# incoming args (stack) 0
+# function length 30
+ STMG 6,15,48(15)
+ LGR 1,15
+ AGHI 15,-160
+ STG 1,0(15)
+ LARL 12,_GLOBAL_OFFSET_TABLE_
+#APP
+ .align 4,0x07
+ END_FINI
+
+/*@_fini_PROLOG_ENDS*/
+
+/*@_fini_EPILOG_BEGINS*/
+ .align 4
+ .section .fini
+#NO_APP
+ .align 4
+ LG 4,272(15)
+ LMG 6,15,208(15)
+ BR 4
+#APP
+ END_FINI
+
+/*@_fini_EPILOG_ENDS*/
+
+/*@TRAILER_BEGINS*/
+");
diff --git a/sysdeps/s390/s390-64/memchr.S b/sysdeps/s390/s390-64/memchr.S
new file mode 100644
index 0000000000..ecf5a5db46
--- /dev/null
+++ b/sysdeps/s390/s390-64/memchr.S
@@ -0,0 +1,40 @@
+/* Search a character in a block of memory. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+/* INPUT PARAMETERS
+ %r2 = address to memory area
+ %r3 = character to find
+ %r4 = number of bytes to search. */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+ .text
+ENTRY(memchr)
+ lghi %r0,0xff
+ ngr %r0,%r3
+ lgr %r1,%r2
+ la %r2,0(%r4,%r1)
+0: srst %r2,%r1
+ jo 0b
+ brc 13,1f
+ slgr %r2,%r2
+1: br %r14
+END(memchr)
diff --git a/sysdeps/s390/s390-64/memcpy.S b/sysdeps/s390/s390-64/memcpy.S
new file mode 100644
index 0000000000..c59d3fbb79
--- /dev/null
+++ b/sysdeps/s390/s390-64/memcpy.S
@@ -0,0 +1,41 @@
+/* Set a block of memory to some byte value. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+/* INPUT PARAMETERS
+ %r2 = address to destination memory area
+ %r3 = address to source memory area
+ %r4 = number of bytes to copy. */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+ .text
+ENTRY(memcpy)
+ ltgr %r5,%r4
+ jz .L1
+ lgr %r4,%r3 # %r4/%r5 = source ptr/len
+ lgr %r3,%r5 # %r2/%r3 = dest ptr/len
+ lgr %r0,%r2 # save source address
+.L0: mvcle %r2,%r4,0 # thats it, MVCLE is your friend
+ jo .L0
+ lgr %r2,%r0 # return value is source address
+.L1:
+ br %r14
+END(memset)
diff --git a/sysdeps/s390/s390-64/memset.S b/sysdeps/s390/s390-64/memset.S
new file mode 100644
index 0000000000..b71c036f72
--- /dev/null
+++ b/sysdeps/s390/s390-64/memset.S
@@ -0,0 +1,43 @@
+/* Set a block of memory to some byte value. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+/* INPUT PARAMETERS
+ %r2 = address of memory area
+ %r3 = byte to fill memory with
+ %r4 = number of bytes to fill. */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+ .text
+ENTRY(memset)
+ ltgr %r4,%r4
+ jz .L1
+ lgr %r0,%r2 # save source address
+ lgr %r1,%r3 # move pad byte to R1
+ lgr %r3,%r4
+ sgr %r4,%r4 # no source for MVCLE, only a pad byte
+ sgr %r5,%r5
+.L0: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
+ jo .L0
+ lgr %r2,%r0 # return value is source address
+.L1:
+ br %r14
+END(memset)
diff --git a/sysdeps/s390/s390-64/s390x-mcount.S b/sysdeps/s390/s390-64/s390x-mcount.S
new file mode 100644
index 0000000000..831af9c552
--- /dev/null
+++ b/sysdeps/s390/s390-64/s390x-mcount.S
@@ -0,0 +1,72 @@
+/* 64 bit S/390-specific implemetation of profiling support.
+ Copyright (C) 2001 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>
+
+/* How profiling works on 64 bit S/390:
+ On the start of each function _mcount is called with the address of a
+ data word in %r1 (initialized to 0, used for counting). The compiler
+ with the option -p generates code of the form:
+
+ STM 6,15,24(15)
+ BRAS 13,.LTN0_0
+ .LT0_0:
+ .LC13: .long .LP0
+ .data
+ .align 4
+ .LP0: .long 0
+ .text
+ # function profiler
+ stg 14,4(15)
+ lg 1,.LC13-.LT0_0(13)
+ brasl 14,_mcount
+ lg 14,4(15)
+
+ The _mcount implementation now has to call __mcount_internal with the
+ address of .LP0 as first parameter and the return address as second
+ parameter. &.LP0 was loaded to %r1 and the return address is in %r14.
+ _mcount may not modify any register. */
+
+ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(_mcount)
+ ASM_TYPE_DIRECTIVE(C_SYMBOL_NAME(_mcount), @function)
+ .align ALIGNARG(4)
+C_LABEL(_mcount)
+ /* Save the caller-clobbered registers. */
+ aghi %r15,-224
+ stmg %r14,%r5,160(%r15)
+ lg %r2,232(%r15) # callers address = first parameter
+ la %r2,0(%r2) # clear bit 0
+ la %r3,0(%r14) # callees address = second parameter
+
+#ifdef PIC
+ brasl %r14,__mcount_internal@PLT
+#else
+ brasl %r14,__mcount_internal
+#endif
+
+ /* Pop the saved registers. Please note that `mcount' has no
+ return value. */
+ lmg %r14,%r5,160(%r15)
+ ahi %r15,224
+ br %r14
+ ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount))
+
+#undef mcount
+weak_alias(_mcount, mcount)
diff --git a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/s390-64/setjmp.S
new file mode 100644
index 0000000000..32f2bd44be
--- /dev/null
+++ b/sysdeps/s390/s390-64/setjmp.S
@@ -0,0 +1,43 @@
+/* Copyright (C) 2001 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 _ASM
+#define _ASM
+#endif
+
+#include <sysdep.h>
+#include <bits/setjmp.h>
+
+/* Save the current program position in ENV and return 0. */
+/* R2 = pointer to jmp_buf, R3 = savemask. */
+
+ENTRY(__sigsetjmp)
+ stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */
+ std %f1,80(%r2)
+ std %f3,88(%r2)
+ std %f5,96(%r2)
+ std %f7,104(%r2)
+#ifdef PIC
+ jg __sigjmp_save@PLT /* Tail-call __sigjmp_save. */
+#else
+ jg __sigjmp_save /* Tail-call __sigjmp_save. */
+#endif
+END (__sigsetjmp)
+
+
diff --git a/sysdeps/s390/s390-64/strcpy.S b/sysdeps/s390/s390-64/strcpy.S
new file mode 100644
index 0000000000..65a555e10b
--- /dev/null
+++ b/sysdeps/s390/s390-64/strcpy.S
@@ -0,0 +1,35 @@
+/* strcpy - copy a string from source to destination. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+/* INPUT PARAMETERS
+ %r2 = address of destination
+ %r3 = address of source. */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+ .text
+ENTRY(strcpy)
+ slgr %r0,%r0
+ lgr %r1,%r2
+0: mvst %r1,%r3
+ jo 0b
+ br %r14
+END(strcpy)
diff --git a/sysdeps/s390/s390-64/strncpy.S b/sysdeps/s390/s390-64/strncpy.S
new file mode 100644
index 0000000000..5ea2cd58b8
--- /dev/null
+++ b/sysdeps/s390/s390-64/strncpy.S
@@ -0,0 +1,90 @@
+/* strncpy - copy at most n characters from a string from source to
+ destination. 64 bit S/390 version
+ Copyright (C) 2001 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. */
+
+/* INPUT PARAMETERS
+ %r2 = address of destination (dst)
+ %r3 = address of source (src)
+ %r4 = max of bytes to copy. */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+ENTRY(strncpy)
+ .text
+ stg %r2,48(%r15) # save dst pointer
+ slgr %r2,%r3 # %r3 points to src, %r2+%r3 to dst
+ lghi %r1,7
+ ngr %r1,%r4 # last 3 bits of # bytes
+ srlg %r4,%r4,3
+ ltgr %r4,%r4 # less than 8 bytes to copy ?
+ jz .L1
+ bras %r5,.L0 # enter loop & load address of a 0
+ .long 0
+.L0: icmh %r0,8,0(%r3) # first byte
+ jz .L3
+ icmh %r0,4,1(%r3) # second byte
+ jz .L4
+ icmh %r0,2,2(%r3) # third byte
+ jz .L5
+ icmh %r0,1,3(%r3) # fourth byte
+ jz .L6
+ icm %r0,8,4(%r3) # fifth byte
+ jz .L7
+ icm %r0,4,5(%r3) # sixth byte
+ jz .L8
+ icm %r0,2,6(%r3) # seventh byte
+ jz .L9
+ icm %r0,1,7(%r3) # eigth byte
+ jz .L10
+ stg %r0,0(%r2,%r3) # store all eight to dest.
+ la %r3,8(%r3)
+ brct %r4,.L0
+.L1: ltgr %r1,%r1
+ jz .Lexit
+.L2: icm %r0,1,0(%r3)
+ stc %r0,0(%r2,%r3)
+ la %r3,1(%r3)
+ jz .L11
+ brct %r1,.L2
+ j .Lexit
+.L3: icmh %r0,4,0(%r5)
+.L4: icmh %r0,2,0(%r5)
+.L5: icmh %r0,1,0(%r5)
+.L6: icm %r0,8,0(%r5)
+.L7: icm %r0,4,0(%r5)
+.L8: icm %r0,2,0(%r5)
+.L9: icm %r0,1,0(%r5)
+.L10: stg %r0,0(%r2,%r3)
+ la %r3,8(%r3)
+ aghi %r4,-1
+ j .L12
+.L11: aghi %r1,-1
+.L12: sllg %r4,%r4,3
+ algr %r4,%r1
+ algr %r2,%r3 # start of dst area to be zeroed
+ lgr %r3,%r4
+ slgr %r4,%r4
+ slgr %r5,%r5
+.L13: mvcle %r2,%r4,0 # pad dst with zeroes
+ jo .L13
+.Lexit: lg %r2,48(%r15) # return dst pointer
+ br %r14
+END(strncpy)
diff --git a/sysdeps/s390/s390-64/sub_n.S b/sysdeps/s390/s390-64/sub_n.S
new file mode 100644
index 0000000000..183ebb7fed
--- /dev/null
+++ b/sysdeps/s390/s390-64/sub_n.S
@@ -0,0 +1,60 @@
+/* __mpn_sub_n -- Add two limb vectors of the same length > 0 and store
+ sum in a third limb vector. 64 bit S/390 version.
+ Copyright (C) 2001 Free Software Foundation, Inc.
+ Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+ This file is part of the GNU MP 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. */
+
+/* INPUT PARAMETERS
+ %r2 = res_ptr
+ %r3 = s1_ptr
+ %r4 = s2_ptr
+ %r5 = size. */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+ENTRY(__mpn_sub_n)
+ stg %r6,48(%r15) # save register 6
+ sgr %r1,%r1
+ lghi %r0,1 # cannot use ahi to add carry, use slr
+.L0: lg %r6,0(%r1,%r3) # .L0 -> no carry from last sub
+ slg %r6,0(%r1,%r4)
+ stg %r6,0(%r1,%r2)
+ la %r1,8(%r1)
+ brc 4,.L3
+.L1: brct %r5,.L0
+ slgr %r2,%r2 # no last carry to return
+ j .Lexit
+.L2: lg %r6,0(%r1,%r3) # .L2 -> carry from last sub
+ slg %r6,0(%r1,%r4)
+ brc 4,.L4
+ slgr %r6,%r0 # no carry yet, add carry from last sub
+ stg %r6,0(%r1,%r2)
+ la %r1,8(%r1)
+ brc 11,.L1 # new carry ?
+.L3: brct %r5,.L2
+ lgr %r2,%r0 # return last carry
+ j .Lexit
+.L4: slgr %r6,%r0 # already a carry, add carry from last sub
+ stg %r6,0(%r1,%r2)
+ la %r1,8(%r1)
+ brct %r5,.L2
+ lgr %r2,%r0 # return last carry
+.Lexit: lg %r6,48(%r15) # restore register 6
+ br %r14
+END(__mpn_sub_n)
diff --git a/sysdeps/s390/s390-64/sysdep.h b/sysdeps/s390/s390-64/sysdep.h
new file mode 100644
index 0000000000..12f8c3a087
--- /dev/null
+++ b/sysdeps/s390/s390-64/sysdep.h
@@ -0,0 +1,112 @@
+/* Assembler macros for 64 bit S/390.
+ Copyright (C) 2001 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 <sysdeps/generic/sysdep.h>
+
+#ifdef __ASSEMBLER__
+
+/* Syntactic details of assembler. */
+
+#ifdef HAVE_ELF
+
+/* ELF uses byte-counts for .align, most others use log2 of count of bytes. */
+#define ALIGNARG(log2) 1<<log2
+/* For ELF we need the `.type' directive to make shared libs work right. */
+#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
+#define ASM_SIZE_DIRECTIVE(name) .size name,.-name;
+
+/* In ELF C symbols are asm symbols. */
+#undef NO_UNDERSCORES
+#define NO_UNDERSCORES
+
+#else
+
+#define ALIGNARG(log2) log2
+#define ASM_TYPE_DIRECTIVE(name,type) /* Nothing is specified. */
+#define ASM_SIZE_DIRECTIVE(name) /* Nothing is specified. */
+
+#endif
+
+
+/* Define an entry point visible from C. */
+#define ENTRY(name) \
+ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \
+ ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \
+ .align ALIGNARG(2); \
+ C_LABEL(name) \
+ CALL_MCOUNT
+
+#undef END
+#define END(name) \
+ ASM_SIZE_DIRECTIVE(name) \
+
+/* If compiled for profiling, call `mcount' at the start of each function. */
+#ifdef PROF
+#ifdef PIC
+#define CALL_MCOUNT \
+ lgr 0,14 ; larl 1,0f ; brasl 14,_mcount@PLT ; lgr 14,0 ; \
+ .data ; .align 4 ; 0: .long 0 ; .text ;
+#else
+#define CALL_MCOUNT \
+ lgr 0,14 ; larl 1,0f ; brasl 14,_mcount ; lgr 14,0 ; \
+ .data ; .align 4 ; 0: .long 0 ; .text ;
+#endif
+#else
+#define CALL_MCOUNT /* Do nothing. */
+#endif
+
+#ifdef NO_UNDERSCORES
+/* Since C identifiers are not normally prefixed with an underscore
+ on this system, the asm identifier `syscall_error' intrudes on the
+ C name space. Make sure we use an innocuous name. */
+#define syscall_error __syscall_error
+#define mcount _mcount
+#endif
+
+#define PSEUDO(name, syscall_name, args) \
+lose: SYSCALL_PIC_SETUP \
+ JUMPTARGET(syscall_error) \
+ .globl syscall_error; \
+ ENTRY (name) \
+ DO_CALL (syscall_name, args); \
+ jm lose
+
+#undef PSEUDO_END
+#define PSEUDO_END(name) \
+ END (name)
+
+#ifdef PIC
+#define JUMPTARGET(name) \
+ brasl name##@PLT
+#define SYSCALL_PIC_SETUP \
+ larl %r12,_GLOBAL_OFFSET_TABLE_
+#else
+#define JUMPTARGET(name) \
+ brasl name
+#define SYSCALL_PIC_SETUP /* Nothing. */
+#endif
+
+/* Local label name for asm code. */
+#ifndef L
+#define L(name) name
+#endif
+
+#endif /* __ASSEMBLER__ */
+
diff --git a/sysdeps/s390/sys/ucontext.h b/sysdeps/s390/sys/ucontext.h
deleted file mode 100644
index c00bb5c786..0000000000
--- a/sysdeps/s390/sys/ucontext.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* 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. */
-
-/* System V/s390 ABI compliant context switching support. */
-
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H 1
-
-#include <features.h>
-#include <signal.h>
-
-/* Type for general register. */
-typedef int greg_t;
-
-/* Number of general registers. */
-#define NGREG 16
-
-/* Number of each register is the `greg_t gregs[NREG]' array. */
-enum
-{
- R_GPR0 = 0,
-#define R_GPR0 R_GPR0
- R_GPR1 = 1,
-#define R_GPR1 R_GPR1
- R_GPR2 = 2,
-#define R_GPR2 R_GPR2
- R_GPR3 = 3,
-#define R_GPR3 R_GPR3
- R_GPR4 = 4,
-#define R_GPR4 R_GPR4
- R_GPR5 = 5,
-#define R_GPR5 R_GPR5
- R_GPR6 = 6,
-#define R_GPR6 R_GPR6
- R_GPR7 = 7,
-#define R_GPR7 R_GPR7
- R_GPR8 = 8,
-#define R_GPR8 R_GPR8
- R_GPR9 = 9,
-#define R_GPR9 R_GPR9
- R_GPRA = 10,
-#define R_GPRA R_GPRA
- R_GPRB = 11,
-#define R_GPRB R_GPRB
- R_GPRC = 12,
-#define R_GPRC R_GPRC
- R_GPRD = 13,
-#define R_GPRD R_GPRD
- R_GPRE = 14,
-#define R_GPRE R_GPRE
- R_GPRF = 15
-#define R_GPRF R_GPRF
-};
-
-/* Structure to describe FPU registers. */
-typedef long long fpreg_t;
-
-/* Context to describe whole processor state. */
-typedef struct
-{
- int version;
- greg_t gregs[NGREG];
- fpreg_t fpregs[16];
-} mcontext_t;
-
-#define MCONTEXT_VERSION 1
-
-/* Userlevel context. */
-typedef struct ucontext
-{
- unsigned long int uc_flags;
- struct ucontext *uc_links;
- __sigset_t uc_sigmask;
- stack_t uc_stack;
- mcontext_t uc_mcontext;
- long int uc_filler[170];
-} ucontext_t;
-
-#endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/s390/Dist b/sysdeps/unix/sysv/linux/s390/s390-32/Dist
index d0740c12f9..d0740c12f9 100644
--- a/sysdeps/unix/sysv/linux/s390/Dist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/Dist
diff --git a/sysdeps/unix/sysv/linux/s390/Makefile b/sysdeps/unix/sysv/linux/s390/s390-32/Makefile
index 2115e40a2a..2115e40a2a 100644
--- a/sysdeps/unix/sysv/linux/s390/Makefile
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/Makefile
diff --git a/sysdeps/unix/sysv/linux/s390/Versions b/sysdeps/unix/sysv/linux/s390/s390-32/Versions
index 5a56361b60..5a56361b60 100644
--- a/sysdeps/unix/sysv/linux/s390/Versions
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/Versions
diff --git a/sysdeps/unix/sysv/linux/s390/alphasort64.c b/sysdeps/unix/sysv/linux/s390/s390-32/alphasort64.c
index 0b5ae47d2f..0b5ae47d2f 100644
--- a/sysdeps/unix/sysv/linux/s390/alphasort64.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/alphasort64.c
diff --git a/sysdeps/unix/sysv/linux/s390/bits/fcntl.h b/sysdeps/unix/sysv/linux/s390/s390-32/bits/fcntl.h
index a6a2e131da..0ae79d7adc 100644
--- a/sysdeps/unix/sysv/linux/s390/bits/fcntl.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/bits/fcntl.h
@@ -1,5 +1,5 @@
/* O_*, F_*, FD_* bit values for Linux.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/unix/sysv/linux/s390/bits/mman.h b/sysdeps/unix/sysv/linux/s390/s390-32/bits/mman.h
index 70069e9f06..d7fc58a915 100644
--- a/sysdeps/unix/sysv/linux/s390/bits/mman.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/bits/mman.h
@@ -1,5 +1,5 @@
/* Definitions for POSIX memory map interface. Linux/s390 version.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/unix/sysv/linux/s390/bits/resource.h b/sysdeps/unix/sysv/linux/s390/s390-32/bits/resource.h
index 8dd3972a4b..b04764e6bf 100644
--- a/sysdeps/unix/sysv/linux/s390/bits/resource.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/bits/resource.h
@@ -1,5 +1,5 @@
/* Bit values & structures for resource limits. Linux version.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 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
diff --git a/sysdeps/unix/sysv/linux/s390/bits/stat.h b/sysdeps/unix/sysv/linux/s390/s390-32/bits/stat.h
index a40159b023..a40159b023 100644
--- a/sysdeps/unix/sysv/linux/s390/bits/stat.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/bits/stat.h
diff --git a/sysdeps/unix/sysv/linux/s390/chown.c b/sysdeps/unix/sysv/linux/s390/s390-32/chown.c
index 0e22192858..682f2dd01e 100644
--- a/sysdeps/unix/sysv/linux/s390/chown.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/chown.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 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
diff --git a/sysdeps/unix/sysv/linux/s390/clone.S b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
index bde800d3b2..433246fc2e 100644
--- a/sysdeps/unix/sysv/linux/s390/clone.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 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
diff --git a/sysdeps/unix/sysv/linux/s390/fchown.c b/sysdeps/unix/sysv/linux/s390/s390-32/fchown.c
index 3a69ecc9e7..3a69ecc9e7 100644
--- a/sysdeps/unix/sysv/linux/s390/fchown.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/fchown.c
diff --git a/sysdeps/unix/sysv/linux/s390/fcntl.c b/sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c
index ea951bc4f9..ea951bc4f9 100644
--- a/sysdeps/unix/sysv/linux/s390/fcntl.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c
diff --git a/sysdeps/unix/sysv/linux/s390/fxstat.c b/sysdeps/unix/sysv/linux/s390/s390-32/fxstat.c
index 4f219f0b9d..4f219f0b9d 100644
--- a/sysdeps/unix/sysv/linux/s390/fxstat.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/fxstat.c
diff --git a/sysdeps/unix/sysv/linux/s390/getdents64.c b/sysdeps/unix/sysv/linux/s390/s390-32/getdents64.c
index 0c75fb5a06..0c75fb5a06 100644
--- a/sysdeps/unix/sysv/linux/s390/getdents64.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/getdents64.c
diff --git a/sysdeps/unix/sysv/linux/s390/getegid.c b/sysdeps/unix/sysv/linux/s390/s390-32/getegid.c
index 37b4b4a530..37b4b4a530 100644
--- a/sysdeps/unix/sysv/linux/s390/getegid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/getegid.c
diff --git a/sysdeps/unix/sysv/linux/s390/geteuid.c b/sysdeps/unix/sysv/linux/s390/s390-32/geteuid.c
index ebcb555b5e..ebcb555b5e 100644
--- a/sysdeps/unix/sysv/linux/s390/geteuid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/geteuid.c
diff --git a/sysdeps/unix/sysv/linux/s390/getgid.c b/sysdeps/unix/sysv/linux/s390/s390-32/getgid.c
index 0a4d6061f0..0a4d6061f0 100644
--- a/sysdeps/unix/sysv/linux/s390/getgid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/getgid.c
diff --git a/sysdeps/unix/sysv/linux/s390/getgroups.c b/sysdeps/unix/sysv/linux/s390/s390-32/getgroups.c
index 20a7166103..20a7166103 100644
--- a/sysdeps/unix/sysv/linux/s390/getgroups.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/getgroups.c
diff --git a/sysdeps/unix/sysv/linux/s390/getresgid.c b/sysdeps/unix/sysv/linux/s390/s390-32/getresgid.c
index b703a414cc..b703a414cc 100644
--- a/sysdeps/unix/sysv/linux/s390/getresgid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/getresgid.c
diff --git a/sysdeps/unix/sysv/linux/s390/getresuid.c b/sysdeps/unix/sysv/linux/s390/s390-32/getresuid.c
index 0b14cefe34..0b14cefe34 100644
--- a/sysdeps/unix/sysv/linux/s390/getresuid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/getresuid.c
diff --git a/sysdeps/unix/sysv/linux/s390/getrlimit.c b/sysdeps/unix/sysv/linux/s390/s390-32/getrlimit.c
index fc06dbd641..fc06dbd641 100644
--- a/sysdeps/unix/sysv/linux/s390/getrlimit.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/getrlimit.c
diff --git a/sysdeps/unix/sysv/linux/s390/getrlimit64.c b/sysdeps/unix/sysv/linux/s390/s390-32/getrlimit64.c
index fef018f471..fef018f471 100644
--- a/sysdeps/unix/sysv/linux/s390/getrlimit64.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/getrlimit64.c
diff --git a/sysdeps/unix/sysv/linux/s390/getuid.c b/sysdeps/unix/sysv/linux/s390/s390-32/getuid.c
index d682c79a49..d682c79a49 100644
--- a/sysdeps/unix/sysv/linux/s390/getuid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/getuid.c
diff --git a/sysdeps/unix/sysv/linux/s390/lchown.c b/sysdeps/unix/sysv/linux/s390/s390-32/lchown.c
index 8ca77fc037..acee703b9f 100644
--- a/sysdeps/unix/sysv/linux/s390/lchown.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/lchown.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 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
diff --git a/sysdeps/unix/sysv/linux/s390/lockf64.c b/sysdeps/unix/sysv/linux/s390/s390-32/lockf64.c
index a88f5a784a..a88f5a784a 100644
--- a/sysdeps/unix/sysv/linux/s390/lockf64.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/lockf64.c
diff --git a/sysdeps/unix/sysv/linux/s390/lxstat.c b/sysdeps/unix/sysv/linux/s390/s390-32/lxstat.c
index 0efa0aea49..0efa0aea49 100644
--- a/sysdeps/unix/sysv/linux/s390/lxstat.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/lxstat.c
diff --git a/sysdeps/unix/sysv/linux/s390/mmap.S b/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S
index f9650e9f03..f101408bf5 100644
--- a/sysdeps/unix/sysv/linux/s390/mmap.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
@@ -19,7 +19,7 @@
#include <sysdep.h>
-#define EINVAL 22
+#define EINVAL 22
.text
ENTRY(__mmap)
diff --git a/sysdeps/unix/sysv/linux/s390/mmap64.S b/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S
index b42ff6f22c..f53fe4cc5d 100644
--- a/sysdeps/unix/sysv/linux/s390/mmap64.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/unix/sysv/linux/s390/msgctl.c b/sysdeps/unix/sysv/linux/s390/s390-32/msgctl.c
index 9f9b8431a3..9f9b8431a3 100644
--- a/sysdeps/unix/sysv/linux/s390/msgctl.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/msgctl.c
diff --git a/sysdeps/unix/sysv/linux/s390/oldgetrlimit64.c b/sysdeps/unix/sysv/linux/s390/s390-32/oldgetrlimit64.c
index 4c27e957bf..4c27e957bf 100644
--- a/sysdeps/unix/sysv/linux/s390/oldgetrlimit64.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/oldgetrlimit64.c
diff --git a/sysdeps/unix/sysv/linux/s390/readdir64.c b/sysdeps/unix/sysv/linux/s390/s390-32/readdir64.c
index 2ea26dd409..2ea26dd409 100644
--- a/sysdeps/unix/sysv/linux/s390/readdir64.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/readdir64.c
diff --git a/sysdeps/unix/sysv/linux/s390/readdir64_r.c b/sysdeps/unix/sysv/linux/s390/s390-32/readdir64_r.c
index 9f54f897e3..9f54f897e3 100644
--- a/sysdeps/unix/sysv/linux/s390/readdir64_r.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/readdir64_r.c
diff --git a/sysdeps/unix/sysv/linux/s390/register-dump.h b/sysdeps/unix/sysv/linux/s390/s390-32/register-dump.h
index 3c859aae88..0bd95991a4 100644
--- a/sysdeps/unix/sysv/linux/s390/register-dump.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/register-dump.h
@@ -1,5 +1,5 @@
/* Dump registers.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/unix/sysv/linux/s390/scandir64.c b/sysdeps/unix/sysv/linux/s390/s390-32/scandir64.c
index 506fd8877c..506fd8877c 100644
--- a/sysdeps/unix/sysv/linux/s390/scandir64.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/scandir64.c
diff --git a/sysdeps/unix/sysv/linux/s390/semctl.c b/sysdeps/unix/sysv/linux/s390/s390-32/semctl.c
index e9b1a483c9..e9b1a483c9 100644
--- a/sysdeps/unix/sysv/linux/s390/semctl.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/semctl.c
diff --git a/sysdeps/unix/sysv/linux/s390/setegid.c b/sysdeps/unix/sysv/linux/s390/s390-32/setegid.c
index 2e3a54c893..2e3a54c893 100644
--- a/sysdeps/unix/sysv/linux/s390/setegid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setegid.c
diff --git a/sysdeps/unix/sysv/linux/s390/seteuid.c b/sysdeps/unix/sysv/linux/s390/s390-32/seteuid.c
index 18e41d08c1..18e41d08c1 100644
--- a/sysdeps/unix/sysv/linux/s390/seteuid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/seteuid.c
diff --git a/sysdeps/unix/sysv/linux/s390/setfsgid.c b/sysdeps/unix/sysv/linux/s390/s390-32/setfsgid.c
index 0886712569..0886712569 100644
--- a/sysdeps/unix/sysv/linux/s390/setfsgid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setfsgid.c
diff --git a/sysdeps/unix/sysv/linux/s390/setfsuid.c b/sysdeps/unix/sysv/linux/s390/s390-32/setfsuid.c
index a9f22eb8ab..a9f22eb8ab 100644
--- a/sysdeps/unix/sysv/linux/s390/setfsuid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setfsuid.c
diff --git a/sysdeps/unix/sysv/linux/s390/setgid.c b/sysdeps/unix/sysv/linux/s390/s390-32/setgid.c
index 377021d9ec..377021d9ec 100644
--- a/sysdeps/unix/sysv/linux/s390/setgid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setgid.c
diff --git a/sysdeps/unix/sysv/linux/s390/setgroups.c b/sysdeps/unix/sysv/linux/s390/s390-32/setgroups.c
index 0e7086278f..0e7086278f 100644
--- a/sysdeps/unix/sysv/linux/s390/setgroups.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setgroups.c
diff --git a/sysdeps/unix/sysv/linux/s390/setregid.c b/sysdeps/unix/sysv/linux/s390/s390-32/setregid.c
index 99c57ad20f..99c57ad20f 100644
--- a/sysdeps/unix/sysv/linux/s390/setregid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setregid.c
diff --git a/sysdeps/unix/sysv/linux/s390/setresgid.c b/sysdeps/unix/sysv/linux/s390/s390-32/setresgid.c
index daca1a4833..daca1a4833 100644
--- a/sysdeps/unix/sysv/linux/s390/setresgid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setresgid.c
diff --git a/sysdeps/unix/sysv/linux/s390/setresuid.c b/sysdeps/unix/sysv/linux/s390/s390-32/setresuid.c
index 3aeabe9ad7..3aeabe9ad7 100644
--- a/sysdeps/unix/sysv/linux/s390/setresuid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setresuid.c
diff --git a/sysdeps/unix/sysv/linux/s390/setreuid.c b/sysdeps/unix/sysv/linux/s390/s390-32/setreuid.c
index 8ad61226e9..8ad61226e9 100644
--- a/sysdeps/unix/sysv/linux/s390/setreuid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setreuid.c
diff --git a/sysdeps/unix/sysv/linux/s390/setrlimit.c b/sysdeps/unix/sysv/linux/s390/s390-32/setrlimit.c
index bfaef74c38..bfaef74c38 100644
--- a/sysdeps/unix/sysv/linux/s390/setrlimit.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setrlimit.c
diff --git a/sysdeps/unix/sysv/linux/s390/setuid.c b/sysdeps/unix/sysv/linux/s390/s390-32/setuid.c
index c8fa23e354..c8fa23e354 100644
--- a/sysdeps/unix/sysv/linux/s390/setuid.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/setuid.c
diff --git a/sysdeps/unix/sysv/linux/s390/shmctl.c b/sysdeps/unix/sysv/linux/s390/s390-32/shmctl.c
index 7eac6380dd..7eac6380dd 100644
--- a/sysdeps/unix/sysv/linux/s390/shmctl.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/shmctl.c
diff --git a/sysdeps/unix/sysv/linux/s390/socket.S b/sysdeps/unix/sysv/linux/s390/s390-32/socket.S
index 562b98f933..9bed2f7db5 100644
--- a/sysdeps/unix/sysv/linux/s390/socket.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/socket.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/unix/sysv/linux/s390/sys/procfs.h b/sysdeps/unix/sysv/linux/s390/s390-32/sys/procfs.h
index 8b60338cdb..968d0855da 100644
--- a/sysdeps/unix/sysv/linux/s390/sys/procfs.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/sys/procfs.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 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
diff --git a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h b/sysdeps/unix/sysv/linux/s390/s390-32/sys/ucontext.h
index b9ec8069b0..cb1869c8f6 100644
--- a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/sys/ucontext.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/unix/sysv/linux/s390/syscall.S b/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
index dbd8d6887c..5a0674ad15 100644
--- a/sysdeps/unix/sysv/linux/s390/syscall.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/unix/sysv/linux/s390/syscalls.list b/sysdeps/unix/sysv/linux/s390/s390-32/syscalls.list
index 913f051ff4..913f051ff4 100644
--- a/sysdeps/unix/sysv/linux/s390/syscalls.list
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/syscalls.list
diff --git a/sysdeps/unix/sysv/linux/s390/sysdep.S b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S
index 5515c0f9ce..15b822a4eb 100644
--- a/sysdeps/unix/sysv/linux/s390/sysdep.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
diff --git a/sysdeps/unix/sysv/linux/s390/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
index 099ce3d176..507867b727 100644
--- a/sysdeps/unix/sysv/linux/s390/sysdep.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
@@ -20,7 +20,7 @@
#ifndef _LINUX_S390_SYSDEP_H
#define _LINUX_S390_SYSDEP_H
-#include <sysdeps/s390/sysdep.h>
+#include <sysdeps/s390/s390-32/sysdep.h>
#include <sysdeps/unix/sysdep.h>
/* For Linux we can use the system call table in the header file
diff --git a/sysdeps/unix/sysv/linux/s390/versionsort64.c b/sysdeps/unix/sysv/linux/s390/s390-32/versionsort64.c
index 144b691e56..144b691e56 100644
--- a/sysdeps/unix/sysv/linux/s390/versionsort64.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/versionsort64.c
diff --git a/sysdeps/unix/sysv/linux/s390/xstat.c b/sysdeps/unix/sysv/linux/s390/s390-32/xstat.c
index e9869f5508..e9869f5508 100644
--- a/sysdeps/unix/sysv/linux/s390/xstat.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/xstat.c
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/Dist b/sysdeps/unix/sysv/linux/s390/s390-64/Dist
new file mode 100644
index 0000000000..fe5ca68f09
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/Dist
@@ -0,0 +1,4 @@
+clone.S
+sys/elf.h
+sys/procfs.h
+sys/user.h
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/Makefile b/sysdeps/unix/sysv/linux/s390/s390-64/Makefile
new file mode 100644
index 0000000000..0217d83a6c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/Makefile
@@ -0,0 +1,8 @@
+ifeq ($(subdir),csu)
+CFLAGS-initfini.s += -DWEAK_GMON_START
+endif
+
+ifeq ($(subdir),misc)
+sysdep_routines += setfsgid setfsuid setresgid setresuid
+sysdep_headers += sys/elf.h
+endif
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/elfclass.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/elfclass.h
new file mode 100644
index 0000000000..73034d5926
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/elfclass.h
@@ -0,0 +1,34 @@
+/* Copyright (C) 2001 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. */
+
+/* This file specifies the native word size of the machine, which indicates
+ the ELF file class used for executables and shared objects on this
+ machine. */
+
+#ifndef _LINK_H
+# error "Never use <bits/elfclass.h> directly; include <link.h> instead."
+#endif
+
+#include <bits/wordsize.h>
+
+#define __ELF_NATIVE_CLASS __WORDSIZE
+
+/* 64 bit Linux for S/390 is exceptional as it has .hash section with
+ 64 bit entries. */
+typedef uint64_t Elf_Symndx;
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/fcntl.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/fcntl.h
new file mode 100644
index 0000000000..d92df75f37
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/fcntl.h
@@ -0,0 +1,174 @@
+/* O_*, F_*, FD_* bit values for Linux for 64 bit S/390.
+ Copyright (C) 2001 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. */
+
+#ifndef _FCNTL_H
+# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
+#endif
+
+
+#include <sys/types.h>
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+ located on an ext2 file system */
+#define O_ACCMODE 0003
+#define O_RDONLY 00
+#define O_WRONLY 01
+#define O_RDWR 02
+#define O_CREAT 0100 /* not fcntl */
+#define O_EXCL 0200 /* not fcntl */
+#define O_NOCTTY 0400 /* not fcntl */
+#define O_TRUNC 01000 /* not fcntl */
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_NDELAY O_NONBLOCK
+#define O_SYNC 010000
+#define O_FSYNC O_SYNC
+#define O_ASYNC 020000
+#define O_DIRECT 040000
+
+#ifdef __USE_GNU
+# define O_DIRECTORY 0200000 /* must be a directory */
+# define O_NOFOLLOW 0400000 /* don't follow links */
+#endif
+
+#ifdef __USE_LARGEFILE64
+/* Not necessary, files are always with 64bit off_t. */
+# define O_LARGEFILE 0
+#endif
+
+/* For now Linux has synchronisity options for data and read operations.
+ We define the symbols here but let them do the same as O_SYNC since
+ this is a superset. */
+#if defined __USE_POSIX199309 || defined __USE_UNIX98
+# define O_DSYNC O_SYNC /* Synchronize data. */
+# define O_RSYNC O_SYNC /* Synchronize read operations. */
+#endif
+
+/* Values for the second argument to `fcntl'. */
+#define F_DUPFD 0 /* Duplicate file descriptor. */
+#define F_GETFD 1 /* Get file descriptor flags. */
+#define F_SETFD 2 /* Set file descriptor flags. */
+#define F_GETFL 3 /* Get file status flags. */
+#define F_SETFL 4 /* Set file status flags. */
+#define F_GETLK 5 /* Get record locking info. */
+#define F_SETLK 6 /* Set record locking info (non-blocking). */
+#define F_SETLKW 7 /* Set record locking info (blocking). */
+
+/* Not necessary, we always have 64-bit offsets. */
+#define F_GETLK64 5 /* Get record locking info. */
+#define F_SETLK64 6 /* Set record locking info (non-blocking). */
+#define F_SETLKW64 7 /* Set record locking info (blocking). */
+
+#if defined __USE_BSD || defined __USE_XOPEN2K
+# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */
+# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */
+#endif
+
+#ifdef __USE_GNU
+# define F_SETSIG 10 /* Set number of signal to be sent. */
+# define F_GETSIG 11 /* Get number of signal to be sent. */
+#endif
+
+#ifdef __USE_GNU
+# define F_SETLEASE 1024 /* Set a lease. */
+# define F_GETLEASE 1025 /* Enquire what lease is active. */
+# define F_NOTIFY 1026 /* Request notfications on a directory. */
+#endif
+
+/* For F_[GET|SET]FL. */
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */
+#define F_RDLCK 0 /* Read lock. */
+#define F_WRLCK 1 /* Write lock. */
+#define F_UNLCK 2 /* Remove lock. */
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK 4 /* or 3 */
+#define F_SHLCK 8 /* or 4 */
+
+#ifdef __USE_BSD
+/* Operations for bsd flock(), also used by the kernel implementation */
+# define LOCK_SH 1 /* shared lock */
+# define LOCK_EX 2 /* exclusive lock */
+# define LOCK_NB 4 /* or'd with one of the above to prevent
+ blocking */
+# define LOCK_UN 8 /* remove lock */
+#endif
+
+#ifdef __USE_GNU
+# define LOCK_MAND 32 /* This is a mandatory flock: */
+# define LOCK_READ 64 /* ... which allows concurrent read operations. */
+# define LOCK_WRITE 128 /* ... which allows concurrent write operations. */
+# define LOCK_RW 192 /* ... Which allows concurrent read & write operations. */
+#endif
+
+
+#ifdef __USE_GNU
+/* Types of directory notifications that may be requested with F_NOTIFY. */
+# define DN_ACCESS 0x00000001 /* File accessed. */
+# define DN_MODIFY 0x00000002 /* File modified. */
+# define DN_CREATE 0x00000004 /* File created. */
+# define DN_DELETE 0x00000008 /* File removed. */
+# define DN_RENAME 0x00000010 /* File renamed. */
+# define DN_ATTRIB 0x00000020 /* File changed attibutes. */
+# define DN_MULTISHOT 0x80000000 /* Don't remove notifier. */
+#endif
+
+/* We don't need to support __USE_FILE_OFFSET64. */
+struct flock
+ {
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+ __off_t l_start; /* Offset where the lock begins. */
+ __off_t l_len; /* Size of the locked area; zero means until EOF. */
+ __pid_t l_pid; /* Process holding the lock. */
+ };
+
+#ifdef __USE_LARGEFILE64
+struct flock64
+ {
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+ __off64_t l_start; /* Offset where the lock begins. */
+ __off64_t l_len; /* Size of the locked area; zero means until EOF. */
+ __pid_t l_pid; /* Process holding the lock. */
+ };
+#endif
+
+
+/* Define some more compatibility macros to be backward compatible with
+ BSD systems which did not managed to hide these kernel macros. */
+#ifdef __USE_BSD
+# define FAPPEND O_APPEND
+# define FFSYNC O_FSYNC
+# define FASYNC O_ASYNC
+# define FNONBLOCK O_NONBLOCK
+# define FNDELAY O_NDELAY
+#endif /* Use BSD. */
+
+/* Advise to `posix_fadvise'. */
+#ifdef __USE_XOPEN2K
+# define POSIX_FADV_NORMAL 0 /* No further special treatment. */
+# define POSIX_FADV_RANDOM 1 /* Expect random page references. */
+# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define POSIX_FADV_WILLNEED 3 /* Will need these pages. */
+# define POSIX_FADV_DONTNEED 6 /* Don't need these pages. */
+# define POSIX_FADV_NOREUSE 7 /* Data will be accessed once. */
+#endif
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/ipc.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/ipc.h
new file mode 100644
index 0000000000..4354cb6598
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/ipc.h
@@ -0,0 +1,78 @@
+/* Copyright (C) 2001 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. */
+
+#ifndef _SYS_IPC_H
+# error "Never use <bits/ipc.h> directly; include <sys/ipc.h> instead."
+#endif
+
+#include <sys/types.h>
+
+/* Mode bits for `msgget', `semget', and `shmget'. */
+#define IPC_CREAT 01000 /* Create key if key does not exist. */
+#define IPC_EXCL 02000 /* Fail if key exists. */
+#define IPC_NOWAIT 04000 /* Return error on wait. */
+
+/* Control commands for `msgctl', `semctl', and `shmctl'. */
+#define IPC_RMID 0 /* Remove identifier. */
+#define IPC_SET 1 /* Set `ipc_perm' options. */
+#define IPC_STAT 2 /* Get `ipc_perm' options. */
+#ifdef __USE_GNU
+#define IPC_INFO 3 /* See ipcs. */
+#endif
+
+/* Special key values. */
+#define IPC_PRIVATE ((__key_t) 0) /* Private key. */
+
+
+/* Data structure used to pass permission information to IPC operations. */
+struct ipc_perm
+ {
+ __key_t __key; /* Key. */
+ __uid_t uid; /* Owner's user ID. */
+ __gid_t gid; /* Owner's group ID. */
+ __uid_t cuid; /* Creator's user ID. */
+ __gid_t cgid; /* Creator's group ID. */
+ __mode_t mode; /* Read/write permission. */
+ unsigned short int __seq; /* Sequence number. */
+ unsigned short int __pad1;
+ unsigned long int __unused1;
+ unsigned long int __unused2;
+ };
+
+
+
+__BEGIN_DECLS
+
+/* The actual system call: all functions are multiplexed by this. */
+extern int __ipc __P ((int __call, int __first, int __second, int __third,
+ void *__ptr));
+
+__END_DECLS
+
+/* The codes for the functions to use the multiplexer `__ipc'. */
+#define IPCOP_semop 1
+#define IPCOP_semget 2
+#define IPCOP_semctl 3
+#define IPCOP_msgsnd 11
+#define IPCOP_msgrcv 12
+#define IPCOP_msgget 13
+#define IPCOP_msgctl 14
+#define IPCOP_shmat 21
+#define IPCOP_shmdt 22
+#define IPCOP_shmget 23
+#define IPCOP_shmctl 24
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/mman.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/mman.h
new file mode 100644
index 0000000000..83797750bb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/mman.h
@@ -0,0 +1,94 @@
+/* Definitions for POSIX memory map interface. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+#ifndef _SYS_MMAN_H
+# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
+#endif
+
+/* The following definitions basically come from the kernel headers.
+ But the kernel header is not namespace clean. */
+
+
+/* Protections are chosen from these bits, OR'd together. The
+ implementation does not necessarily support PROT_EXEC or PROT_WRITE
+ without PROT_READ. The only guarantees are that no writing will be
+ allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
+
+#define PROT_READ 0x1 /* Page can be read. */
+#define PROT_WRITE 0x2 /* Page can be written. */
+#define PROT_EXEC 0x4 /* Page can be executed. */
+#define PROT_NONE 0x0 /* Page can not be accessed. */
+
+/* Sharing types (must choose one and only one of these). */
+#define MAP_SHARED 0x01 /* Share changes. */
+#define MAP_PRIVATE 0x02 /* Changes are private. */
+#ifdef __USE_MISC
+# define MAP_TYPE 0x0f /* Mask for type of mapping. */
+#endif
+
+/* Other flags. */
+#define MAP_FIXED 0x10 /* Interpret addr exactly. */
+#ifdef __USE_MISC
+# define MAP_FILE 0
+# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
+# define MAP_ANON MAP_ANONYMOUS
+#endif
+
+/* These are Linux-specific. */
+#ifdef __USE_MISC
+# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */
+# define MAP_GROWSUP 0x0200 /* Register stack-like segment */
+# define MAP_DENYWRITE 0x0800 /* ETXTBSY */
+# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */
+# define MAP_LOCKED 0x2000 /* Lock the mapping. */
+# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */
+#endif
+
+/* Flags to `msync'. */
+#define MS_ASYNC 0x1 /* Sync memory asynchronously. */
+#define MS_SYNC 0x4 /* Synchronous memory sync. */
+#define MS_INVALIDATE 0x2 /* Invalidate the caches. */
+
+/* Flags for `mlockall'. */
+#define MCL_CURRENT 0x1 /* Lock all currently mapped pages. */
+#define MCL_FUTURE 0x2 /* Lock all additions to address
+ space. */
+
+/* Flags for `mremap'. */
+#ifdef __USE_GNU
+# define MREMAP_MAYMOVE 1
+#endif
+
+/* Advice to `madvise'. */
+#ifdef __USE_BSD
+# define MADV_NORMAL 0 /* No further special treatment. */
+# define MADV_RANDOM 1 /* Expect random page references. */
+# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define MADV_WILLNEED 3 /* Will need these pages. */
+# define MADV_DONTNEED 4 /* Don't need these pages. */
+#endif
+
+/* The POSIX people had to invent similar names for the same things. */
+#ifdef __USE_XOPEN2K
+# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
+# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
+# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
+# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
+#endif
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/msq.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/msq.h
new file mode 100644
index 0000000000..0d43633805
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/msq.h
@@ -0,0 +1,68 @@
+/* Copyright (C) 2001 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. */
+
+#ifndef _SYS_MSG_H
+#error "Never use <bits/msq.h> directly; include <sys/msg.h> instead."
+#endif
+
+#include <sys/types.h>
+
+/* Define options for message queue functions. */
+#define MSG_NOERROR 010000 /* no error if message is too big */
+#define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+
+
+/* Structure of record for one message inside the kernel.
+ The type `struct __msg' is opaque. */
+struct msqid_ds
+{
+ struct ipc_perm msg_perm; /* structure describing operation permission */
+ __time_t msg_stime; /* time of last msgsnd command */
+ __time_t msg_rtime; /* time of last msgrcv command */
+ __time_t msg_ctime; /* time of last change */
+ unsigned long int __msg_cbytes; /* current number of bytes on queue */
+ unsigned long int msg_qnum; /* number of messages currently on queue */
+ unsigned long int msg_qbytes; /* max number of bytes allowed on queue */
+ __pid_t msg_lspid; /* pid of last msgsnd() */
+ __pid_t msg_lrpid; /* pid of last msgrcv() */
+ unsigned long int __unused1;
+ unsigned long int __unused2;
+};
+
+#ifdef __USE_MISC
+
+# define msg_cbytes __msg_cbytes
+
+/* ipcs ctl commands */
+# define MSG_STAT 11
+# define MSG_INFO 12
+
+/* buffer for msgctl calls IPC_INFO, MSG_INFO */
+struct msginfo
+ {
+ int msgpool;
+ int msgmap;
+ int msgmax;
+ int msgmnb;
+ int msgmni;
+ int msgssz;
+ int msgtql;
+ unsigned short int msgseg;
+ };
+
+#endif /* __USE_MISC */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/resource.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/resource.h
new file mode 100644
index 0000000000..791c7b8f87
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/resource.h
@@ -0,0 +1,196 @@
+/* Bit values & structures for resource limits. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+#ifndef _SYS_RESOURCE_H
+# error "Never use <bits/resource.h> directly; include <sys/resource.h> instead."
+#endif
+
+#include <bits/types.h>
+
+/* Transmute defines to enumerations. The macro re-definitions are
+ necessary because some programs want to test for operating system
+ features with #ifdef RUSAGE_SELF. In ISO C the reflexive
+ definition is a no-op. */
+
+/* Kinds of resource limit. */
+enum __rlimit_resource
+{
+ /* Per-process CPU limit, in seconds. */
+ RLIMIT_CPU = 0,
+#define RLIMIT_CPU RLIMIT_CPU
+
+ /* Largest file that can be created, in bytes. */
+ RLIMIT_FSIZE = 1,
+#define RLIMIT_FSIZE RLIMIT_FSIZE
+
+ /* Maximum size of data segment, in bytes. */
+ RLIMIT_DATA = 2,
+#define RLIMIT_DATA RLIMIT_DATA
+
+ /* Maximum size of stack segment, in bytes. */
+ RLIMIT_STACK = 3,
+#define RLIMIT_STACK RLIMIT_STACK
+
+ /* Largest core file that can be created, in bytes. */
+ RLIMIT_CORE = 4,
+#define RLIMIT_CORE RLIMIT_CORE
+
+ /* Largest resident set size, in bytes.
+ This affects swapping; processes that are exceeding their
+ resident set size will be more likely to have physical memory
+ taken from them. */
+ RLIMIT_RSS = 5,
+#define RLIMIT_RSS RLIMIT_RSS
+
+ /* Number of processes. */
+ RLIMIT_NPROC = 6,
+#define RLIMIT_NPROC RLIMIT_NPROC
+
+ /* Number of open files. */
+ RLIMIT_NOFILE = 7,
+ RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same. */
+#define RLIMIT_NOFILE RLIMIT_NOFILE
+#define RLIMIT_OFILE RLIMIT_OFILE
+
+ /* Locked-in-memory address space. */
+ RLIMIT_MEMLOCK = 8,
+#define RLIMIT_MEMLOCK RLIMIT_MEMLOCK
+
+ /* Address space limit (?) */
+ RLIMIT_AS = 9,
+#define RLIMIT_AS RLIMIT_AS
+
+ RLIM_NLIMITS = 10
+#define RLIMIT_NLIMITS RLIMIT_NLIMITS
+#define RLIM_NLIMITS RLIM_NLIMITS
+};
+
+/* Value to indicate that there is no limit. */
+# define RLIM_INFINITY ~0UL
+
+#ifdef __USE_LARGEFILE64
+# define RLIM64_INFINITY ~0UL
+#endif
+
+/* We can represent all limits. */
+#define RLIM_SAVED_MAX RLIM_INFINITY
+#define RLIM_SAVED_CUR RLIM_INFINITY
+
+
+/* Type for resource quantity measurement. */
+typedef __rlim64_t rlim_t;
+#ifdef __USE_LARGEFILE64
+typedef __rlim64_t rlim64_t;
+#endif
+
+struct rlimit
+ {
+ /* The current (soft) limit. */
+ rlim_t rlim_cur;
+ /* The hard limit. */
+ rlim_t rlim_max;
+ };
+
+#ifdef __USE_LARGEFILE64
+struct rlimit64
+ {
+ /* The current (soft) limit. */
+ rlim64_t rlim_cur;
+ /* The hard limit. */
+ rlim64_t rlim_max;
+ };
+#endif
+
+/* Whose usage statistics do you want? */
+enum __rusage_who
+{
+ /* The calling process. */
+ RUSAGE_SELF = 0,
+#define RUSAGE_SELF RUSAGE_SELF
+
+ /* All of its terminated child processes. */
+ RUSAGE_CHILDREN = -1,
+#define RUSAGE_CHILDREN RUSAGE_CHILDREN
+
+ /* Both. */
+ RUSAGE_BOTH = -2
+#define RUSAGE_BOTH RUSAGE_BOTH
+};
+
+#define __need_timeval
+#include <bits/time.h> /* For `struct timeval'. */
+
+/* Structure which says how much of each resource has been used. */
+struct rusage
+ {
+ /* Total amount of user time used. */
+ struct timeval ru_utime;
+ /* Total amount of system time used. */
+ struct timeval ru_stime;
+ /* Maximum resident set size (in kilobytes). */
+ long int ru_maxrss;
+ /* Amount of sharing of text segment memory
+ with other processes (kilobyte-seconds). */
+ long int ru_ixrss;
+ /* Amount of data segment memory used (kilobyte-seconds). */
+ long int ru_idrss;
+ /* Amount of stack memory used (kilobyte-seconds). */
+ long int ru_isrss;
+ /* Number of soft page faults (i.e. those serviced by reclaiming
+ a page from the list of pages awaiting reallocation. */
+ long int ru_minflt;
+ /* Number of hard page faults (i.e. those that required I/O). */
+ long int ru_majflt;
+ /* Number of times a process was swapped out of physical memory. */
+ long int ru_nswap;
+ /* Number of input operations via the file system. Note: This
+ and `ru_oublock' do not include operations with the cache. */
+ long int ru_inblock;
+ /* Number of output operations via the file system. */
+ long int ru_oublock;
+ /* Number of IPC messages sent. */
+ long int ru_msgsnd;
+ /* Number of IPC messages received. */
+ long int ru_msgrcv;
+ /* Number of signals delivered. */
+ long int ru_nsignals;
+ /* Number of voluntary context switches, i.e. because the process
+ gave up the process before it had to (usually to wait for some
+ resource to be available). */
+ long int ru_nvcsw;
+ /* Number of involuntary context switches, i.e. a higher priority process
+ became runnable or the current process used up its time slice. */
+ long int ru_nivcsw;
+ };
+
+/* Priority limits. */
+#define PRIO_MIN -20 /* Minimum priority a process can have. */
+#define PRIO_MAX 20 /* Maximum priority a process can have. */
+
+/* The type of the WHICH argument to `getpriority' and `setpriority',
+ indicating what flavor of entity the WHO argument specifies. */
+enum __priority_which
+{
+ PRIO_PROCESS = 0, /* WHO is a process ID. */
+#define PRIO_PROCESS PRIO_PROCESS
+ PRIO_PGRP = 1, /* WHO is a process group ID. */
+#define PRIO_PGRP PRIO_PGRP
+ PRIO_USER = 2 /* WHO is a user ID. */
+#define PRIO_USER PRIO_USER
+};
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/sem.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/sem.h
new file mode 100644
index 0000000000..091925638a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/sem.h
@@ -0,0 +1,85 @@
+/* Copyright (C) 2001 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. */
+
+#ifndef _SYS_SEM_H
+# error "Never include <bits/sem.h> directly; use <sys/sem.h> instead."
+#endif
+
+#include <sys/types.h>
+
+/* Flags for `semop'. */
+#define SEM_UNDO 0x1000 /* undo the operation on exit */
+
+/* Commands for `semctl'. */
+#define GETPID 11 /* get sempid */
+#define GETVAL 12 /* get semval */
+#define GETALL 13 /* get all semval's */
+#define GETNCNT 14 /* get semncnt */
+#define GETZCNT 15 /* get semzcnt */
+#define SETVAL 16 /* set semval */
+#define SETALL 17 /* set all semval's */
+
+
+/* Data structure describing a set of semaphores. */
+struct semid_ds
+{
+ struct ipc_perm sem_perm; /* operation permission struct */
+ __time_t sem_otime; /* last semop() time */
+ __time_t sem_ctime; /* last time changed by semctl() */
+ unsigned long int sem_nsems; /* number of semaphores in set */
+ unsigned long int __unused1;
+ unsigned long int __unused2;
+};
+
+/* The user should define a union like the following to use it for arguments
+ for `semctl'.
+
+ union semun
+ {
+ int val; <= value for SETVAL
+ struct semid_ds *buf; <= buffer for IPC_STAT & IPC_SET
+ unsigned short int *array; <= array for GETALL & SETALL
+ struct seminfo *__buf; <= buffer for IPC_INFO
+ };
+
+ Previous versions of this file used to define this union but this is
+ incorrect. One can test the macro _SEM_SEMUN_UNDEFINED to see whether
+ one must define the union or not. */
+#define _SEM_SEMUN_UNDEFINED 1
+
+#ifdef __USE_MISC
+
+/* ipcs ctl cmds */
+# define SEM_STAT 18
+# define SEM_INFO 19
+
+struct seminfo
+{
+ int semmap;
+ int semmni;
+ int semmns;
+ int semmnu;
+ int semmsl;
+ int semopm;
+ int semume;
+ int semusz;
+ int semvmx;
+ int semaem;
+};
+
+#endif /* __USE_MISC */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/shm.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/shm.h
new file mode 100644
index 0000000000..3b39b64171
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/shm.h
@@ -0,0 +1,87 @@
+/* Copyright (C) 2001 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. */
+
+#ifndef _SYS_SHM_H
+# error "Never include <bits/shm.h> directly; use <sys/shm.h> instead."
+#endif
+
+#include <sys/types.h>
+
+/* Permission flag for shmget. */
+#define SHM_R 0400 /* or S_IRUGO from <linux/stat.h> */
+#define SHM_W 0200 /* or S_IWUGO from <linux/stat.h> */
+
+/* Flags for `shmat'. */
+#define SHM_RDONLY 010000 /* attach read-only else read-write */
+#define SHM_RND 020000 /* round attach address to SHMLBA */
+#define SHM_REMAP 040000 /* take-over region on attach */
+
+/* Commands for `shmctl'. */
+#define SHM_LOCK 11 /* lock segment (root only) */
+#define SHM_UNLOCK 12 /* unlock segment (root only) */
+
+
+/* Data structure describing a set of semaphores. */
+struct shmid_ds
+ {
+ struct ipc_perm shm_perm; /* operation permission struct */
+ size_t shm_segsz; /* size of segment in bytes */
+ __time_t shm_atime; /* time of last shmat() */
+ __time_t shm_dtime; /* time of last shmdt() */
+ __time_t shm_ctime; /* time of last change by shmctl() */
+ __pid_t shm_cpid; /* pid of creator */
+ __pid_t shm_lpid; /* pid of last shmop */
+ unsigned long int shm_nattch; /* number of current attaches */
+ unsigned long int __unused1;
+ unsigned long int __unused2;
+ };
+
+#ifdef __USE_MISC
+
+/* ipcs ctl commands */
+# define SHM_STAT 13
+# define SHM_INFO 14
+
+/* shm_mode upper byte flags */
+# define SHM_DEST 01000 /* segment will be destroyed on last detach */
+# define SHM_LOCKED 02000 /* segment will not be swapped */
+
+struct shminfo
+ {
+ unsigned long int shmmax;
+ unsigned long int shmmin;
+ unsigned long int shmmni;
+ unsigned long int shmseg;
+ unsigned long int shmall;
+ unsigned long int __unused1;
+ unsigned long int __unused2;
+ unsigned long int __unused3;
+ unsigned long int __unused4;
+ };
+
+struct shm_info
+ {
+ int used_ids;
+ unsigned long int shm_tot; /* total allocated shm */
+ unsigned long int shm_rss; /* total resident shm */
+ unsigned long int shm_swp; /* total swapped shm */
+ unsigned long int swap_attempts;
+ unsigned long int swap_successes;
+ };
+
+#endif /* __USE_MISC */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/sigaction.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/sigaction.h
new file mode 100644
index 0000000000..5b96272c9f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/sigaction.h
@@ -0,0 +1,72 @@
+/* Definitions for 64 bit S/390 sigaction. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+#ifndef _SIGNAL_H
+# error "Never include <bits/sigaction.h> directly; use <signal.h> instead."
+#endif
+
+/* Structure describing the action to be taken when a signal arrives. */
+struct sigaction
+ {
+ /* Signal handler. */
+#ifdef __USE_POSIX199309
+ union
+ {
+ /* Used if SA_SIGINFO is not set. */
+ __sighandler_t sa_handler;
+ /* Used if SA_SIGINFO is set. */
+ void (*sa_sigaction) (int, siginfo_t *, void *);
+ }
+ __sigaction_handler;
+# define sa_handler __sigaction_handler.sa_handler
+# define sa_sigaction __sigaction_handler.sa_sigaction
+#else
+ __sighandler_t sa_handler;
+#endif
+
+ /* Special flags. */
+ unsigned long int sa_flags;
+
+ /* Additional set of signals to be blocked. */
+ __sigset_t sa_mask;
+ };
+
+/* Bits in `sa_flags'. */
+#define SA_NOCLDSTOP 0x00000001 /* Don't send SIGCHLD when children stop. */
+#define SA_SIGINFO 0x00000004
+#ifdef __USE_MISC
+# define SA_ONSTACK 0x08000000 /* Use signal stack by using `sa_restorer'. */
+# define SA_RESTART 0x10000000 /* Restart syscall on signal return. */
+# define SA_NODEFER 0x40000000 /* Don't automatically block the signal
+ when its handler is being executed. */
+# define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler. */
+#endif
+#ifdef __USE_MISC
+# define SA_INTERRUPT 0x20000000 /* Historic no-op. */
+
+/* Some aliases for the SA_ constants. */
+# define SA_NOMASK SA_NODEFER
+# define SA_ONESHOT SA_RESETHAND
+# define SA_STACK SA_ONSTACK
+#endif
+
+/* Values for the HOW argument to `sigprocmask'. */
+#define SIG_BLOCK 0 /* for blocking signals */
+#define SIG_UNBLOCK 1 /* for unblocking signals */
+#define SIG_SETMASK 2 /* for setting the signal mask */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/siginfo.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/siginfo.h
new file mode 100644
index 0000000000..90e860c269
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/siginfo.h
@@ -0,0 +1,297 @@
+/* siginfo_t, sigevent and constants. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+#if !defined _SIGNAL_H && !defined __need_siginfo_t \
+ && !defined __need_sigevent_t
+# error "Never include this file directly. Use <signal.h> instead"
+#endif
+
+#if (!defined __have_sigval_t \
+ && (defined _SIGNAL_H || defined __need_siginfo_t \
+ || defined __need_sigevent_t))
+# define __have_sigval_t 1
+
+/* Type for data associated with a signal. */
+typedef union sigval
+ {
+ int sival_int;
+ void *sival_ptr;
+ } sigval_t;
+#endif
+
+#if (!defined __have_siginfo_t \
+ && (defined _SIGNAL_H || defined __need_siginfo_t))
+# define __have_siginfo_t 1
+
+# define __SI_MAX_SIZE 128
+# define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 4)
+
+typedef struct siginfo
+ {
+ int si_signo; /* Signal number. */
+ int si_errno; /* If non-zero, an errno value associated with
+ this signal, as defined in <errno.h>. */
+ int si_code; /* Signal code. */
+
+ union
+ {
+ int _pad[__SI_PAD_SIZE];
+
+ /* kill(). */
+ struct
+ {
+ __pid_t si_pid; /* Sending process ID. */
+ __uid_t si_uid; /* Real user ID of sending process. */
+ } _kill;
+
+ /* POSIX.1b timers. */
+ struct
+ {
+ unsigned int _timer1;
+ unsigned int _timer2;
+ } _timer;
+
+ /* POSIX.1b signals. */
+ struct
+ {
+ __pid_t si_pid; /* Sending process ID. */
+ __uid_t si_uid; /* Real user ID of sending process. */
+ sigval_t si_sigval; /* Signal value. */
+ } _rt;
+
+ /* SIGCHLD. */
+ struct
+ {
+ __pid_t si_pid; /* Which child. */
+ __uid_t si_uid; /* Real user ID of sending process. */
+ int si_status; /* Exit value or signal. */
+ __clock_t si_utime;
+ __clock_t si_stime;
+ } _sigchld;
+
+ /* SIGILL, SIGFPE, SIGSEGV, SIGBUS. */
+ struct
+ {
+ void *si_addr; /* Faulting insn/memory ref. */
+ int si_trapno;
+ } _sigfault;
+
+ /* SIGPOLL. */
+ struct
+ {
+ long int si_band; /* Band event for SIGPOLL. */
+ int si_fd;
+ } _sigpoll;
+ } _sifields;
+ } siginfo_t;
+
+
+/* X/Open requires some more fields with fixed names. */
+# define si_pid _sifields._kill.si_pid
+# define si_uid _sifields._kill.si_uid
+# define si_timer1 _sifields._timer._timer1
+# define si_timer2 _sifields._timer._timer2
+# define si_status _sifields._sigchld.si_status
+# define si_utime _sifields._sigchld.si_utime
+# define si_stime _sifields._sigchld.si_stime
+# define si_value _sifields._rt.si_sigval
+# define si_int _sifields._rt.si_sigval.sival_int
+# define si_ptr _sifields._rt.si_sigval.sival_ptr
+# define si_addr _sifields._sigfault.si_addr
+# define si_trapno _sifields._sigfault.si_trapno
+# define si_band _sifields._sigpoll.si_band
+# define si_fd _sifields._sigpoll.si_fd
+
+/* Values for `si_code'. Positive values are reserved for kernel-generated
+ signals. */
+enum
+{
+ SI_ASYNCNL = -6, /* Sent by asynch name lookup completion. */
+# define SI_ASYNCNL SI_ASYNCNL
+ SI_SIGIO, /* Sent by queued SIGIO. */
+# define SI_SIGIO SI_SIGIO
+ SI_ASYNCIO, /* Sent by AIO completion. */
+# define SI_ASYNCIO SI_ASYNCIO
+ SI_MESGQ, /* Sent by real time mesq state change. */
+# define SI_MESGQ SI_MESGQ
+ SI_TIMER, /* Sent by timer expiration. */
+# define SI_TIMER SI_TIMER
+ SI_QUEUE, /* Sent by sigqueue. */
+# define SI_QUEUE SI_QUEUE
+ SI_USER, /* Sent by kill, sigsend, raise. */
+# define SI_USER SI_USER
+ SI_KERNEL = 0x80 /* Send by kernel. */
+#define SI_KERNEL SI_KERNEL
+};
+
+
+/* `si_code' values for SIGILL signal. */
+enum
+{
+ ILL_ILLOPC = 1, /* Illegal opcode. */
+# define ILL_ILLOPC ILL_ILLOPC
+ ILL_ILLOPN, /* Illegal operand. */
+# define ILL_ILLOPN ILL_ILLOPN
+ ILL_ILLADR, /* Illegal addressing mode. */
+# define ILL_ILLADR ILL_ILLADR
+ ILL_ILLTRP, /* Illegal trap. */
+# define ILL_ILLTRP ILL_ILLTRP
+ ILL_PRVOPC, /* Privileged opcode. */
+# define ILL_PRVOPC ILL_PRVOPC
+ ILL_PRVREG, /* Privileged register. */
+# define ILL_PRVREG ILL_PRVREG
+ ILL_COPROC, /* Coprocessor error. */
+# define ILL_COPROC ILL_COPROC
+ ILL_BADSTK /* Internal stack error. */
+# define ILL_BADSTK ILL_BADSTK
+};
+
+/* `si_code' values for SIGFPE signal. */
+enum
+{
+ FPE_INTDIV = 1, /* Integer divide by zero. */
+# define FPE_INTDIV FPE_INTDIV
+ FPE_INTOVF, /* Integer overflow. */
+# define FPE_INTOVF FPE_INTOVF
+ FPE_FLTDIV, /* Floating point divide by zero. */
+# define FPE_FLTDIV FPE_FLTDIV
+ FPE_FLTOVF, /* Floating point overflow. */
+# define FPE_FLTOVF FPE_FLTOVF
+ FPE_FLTUND, /* Floating point underflow. */
+# define FPE_FLTUND FPE_FLTUND
+ FPE_FLTRES, /* Floating point inexact result. */
+# define FPE_FLTRES FPE_FLTRES
+ FPE_FLTINV, /* Floating point invalid operation. */
+# define FPE_FLTINV FPE_FLTINV
+ FPE_FLTSUB /* Subscript out of range. */
+# define FPE_FLTSUB FPE_FLTSUB
+};
+
+/* `si_code' values for SIGSEGV signal. */
+enum
+{
+ SEGV_MAPERR = 1, /* Address not mapped to object. */
+# define SEGV_MAPERR SEGV_MAPERR
+ SEGV_ACCERR /* Invalid permissions for mapped object. */
+# define SEGV_ACCERR SEGV_ACCERR
+};
+
+/* `si_code' values for SIGBUS signal. */
+enum
+{
+ BUS_ADRALN = 1, /* Invalid address alignment. */
+# define BUS_ADRALN BUS_ADRALN
+ BUS_ADRERR, /* Non-existant physical address. */
+# define BUS_ADRERR BUS_ADRERR
+ BUS_OBJERR /* Object specific hardware error. */
+# define BUS_OBJERR BUS_OBJERR
+};
+
+/* `si_code' values for SIGTRAP signal. */
+enum
+{
+ TRAP_BRKPT = 1, /* Process breakpoint. */
+# define TRAP_BRKPT TRAP_BRKPT
+ TRAP_TRACE /* Process trace trap. */
+# define TRAP_TRACE TRAP_TRACE
+};
+
+/* `si_code' values for SIGCHLD signal. */
+enum
+{
+ CLD_EXITED = 1, /* Child has exited. */
+# define CLD_EXITED CLD_EXITED
+ CLD_KILLED, /* Child was killed. */
+# define CLD_KILLED CLD_KILLED
+ CLD_DUMPED, /* Child terminated abnormally. */
+# define CLD_DUMPED CLD_DUMPED
+ CLD_TRAPPED, /* Traced child has trapped. */
+# define CLD_TRAPPED CLD_TRAPPED
+ CLD_STOPPED, /* Child has stopped. */
+# define CLD_STOPPED CLD_STOPPED
+ CLD_CONTINUED /* Stopped child has continued. */
+# define CLD_CONTINUED CLD_CONTINUED
+};
+
+/* `si_code' values for SIGPOLL signal. */
+enum
+{
+ POLL_IN = 1, /* Data input available. */
+# define POLL_IN POLL_IN
+ POLL_OUT, /* Output buffers available. */
+# define POLL_OUT POLL_OUT
+ POLL_MSG, /* Input message available. */
+# define POLL_MSG POLL_MSG
+ POLL_ERR, /* I/O error. */
+# define POLL_ERR POLL_ERR
+ POLL_PRI, /* High priority input available. */
+# define POLL_PRI POLL_PRI
+ POLL_HUP /* Device disconnected. */
+# define POLL_HUP POLL_HUP
+};
+
+# undef __need_siginfo_t
+#endif /* !have siginfo_t && (have _SIGNAL_H || need siginfo_t). */
+
+
+#if (defined _SIGNAL_H || defined __need_sigevent_t) \
+ && !defined __have_sigevent_t
+# define __have_sigevent_t 1
+
+/* Structure to transport application-defined values with signals. */
+# define __SIGEV_MAX_SIZE 64
+# define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
+
+/* Forward declaration of the `pthread_attr_t' type. */
+struct __pthread_attr_s;
+
+typedef struct sigevent
+ {
+ sigval_t sigev_value;
+ int sigev_signo;
+ int sigev_notify;
+
+ union
+ {
+ int _pad[__SIGEV_PAD_SIZE];
+
+ struct
+ {
+ void (*_function) (sigval_t); /* Function to start. */
+ struct __pthread_attr_s *_attribute; /* Really pthread_attr_t. */
+ } _sigev_thread;
+ } _sigev_un;
+ } sigevent_t;
+
+/* POSIX names to access some of the members. */
+# define sigev_notify_function _sigev_un._sigev_thread._function
+# define sigev_notify_attributes _sigev_un._sigev_thread._attribute
+
+/* `sigev_notify' values. */
+enum
+{
+ SIGEV_SIGNAL = 0, /* Notify via signal. */
+# define SIGEV_SIGNAL SIGEV_SIGNAL
+ SIGEV_NONE, /* Other notification: meaningless. */
+# define SIGEV_NONE SIGEV_NONE
+ SIGEV_THREAD /* Deliver via thread creation. */
+# define SIGEV_THREAD SIGEV_THREAD
+};
+
+#endif /* have _SIGNAL_H. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/sigstack.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/sigstack.h
new file mode 100644
index 0000000000..d4e108a26e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/sigstack.h
@@ -0,0 +1,59 @@
+/* sigstack, sigaltstack definitions. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+#ifndef _SIGNAL_H
+# error "Never include this file directly. Use <signal.h> instead"
+#endif
+
+#ifndef _SIGSTACK_H
+#define _SIGSTACK_H 1
+
+/* Structure describing a signal stack (obsolete). */
+struct sigstack
+ {
+ __ptr_t ss_sp; /* Signal stack pointer. */
+ int ss_onstack; /* Nonzero if executing on this stack. */
+ };
+
+
+/* Possible values for `ss_flags.'. */
+enum
+{
+ SS_ONSTACK = 1,
+#define SS_ONSTACK SS_ONSTACK
+ SS_DISABLE
+#define SS_DISABLE SS_DISABLE
+};
+
+/* Minimum stack size for a signal handler. */
+#define MINSIGSTKSZ 2048
+
+/* System default stack size. */
+#define SIGSTKSZ 8192
+
+
+/* Alternate, preferred interface. */
+typedef struct sigaltstack
+ {
+ __ptr_t ss_sp;
+ int ss_flags;
+ size_t ss_size;
+ } stack_t;
+
+#endif /* bits/sigstack.h */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/stat.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/stat.h
new file mode 100644
index 0000000000..2bdae97383
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/stat.h
@@ -0,0 +1,107 @@
+/* Copyright (C) 2001 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. */
+
+#ifndef _SYS_STAT_H
+# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead."
+#endif
+
+/* Versions of the `struct stat' data structure. */
+#define _STAT_VER_KERNEL 0
+#define _STAT_VER_LINUX 1
+#define _STAT_VER _STAT_VER_LINUX
+
+/* Versions of the `xmknod' interface. */
+#define _MKNOD_VER_LINUX 0
+
+struct stat
+ {
+ __dev_t st_dev; /* Device. */
+ __ino_t st_ino; /* File serial number. */
+ __nlink_t st_nlink; /* Link count. */
+ __mode_t st_mode; /* File mode. */
+ __uid_t st_uid; /* User ID of the file's owner. */
+ __gid_t st_gid; /* Group ID of the file's group.*/
+ int pad0;
+ __dev_t st_rdev; /* Device number, if device. */
+ __off_t st_size; /* Size of file, in bytes. */
+ __time_t st_atime; /* Time of last access. */
+ long int __reserved0; /* Reserved for atime.nanoseconds. */
+ __time_t st_mtime; /* Time of last modification. */
+ long int __reserved1; /* Reserved for mtime.nanoseconds. */
+ __time_t st_ctime; /* Time of last status change. */
+ long int __reserved2; /* Reserved for ctime.nanoseconds. */
+ __blksize_t st_blksize; /* Optimal block size for I/O. */
+ __blkcnt_t st_blocks; /* Nr. 512-byte blocks allocated. */
+ long int __unused[3];
+ };
+
+#ifdef __USE_LARGEFILE64
+/* Note stat64 is the same shape as stat. */
+struct stat64
+ {
+ __dev_t st_dev; /* Device. */
+ __ino64_t st_ino; /* File serial number. */
+ __nlink_t st_nlink; /* Link count. */
+ __mode_t st_mode; /* File mode. */
+ __uid_t st_uid; /* User ID of the file's owner. */
+ __gid_t st_gid; /* Group ID of the file's group.*/
+ int pad0;
+ __dev_t st_rdev; /* Device number, if device. */
+ __off_t st_size; /* Size of file, in bytes. */
+ __time_t st_atime; /* Time of last access. */
+ long int __reserved0; /* Reserved for atime.nanoseconds. */
+ __time_t st_mtime; /* Time of last modification. */
+ long int __reserved1; /* Reserved for mtime.nanoseconds. */
+ __time_t st_ctime; /* Time of last status change. */
+ long int __reserved2; /* Reserved for ctime.nanoseconds. */
+ __blksize_t st_blksize; /* Optimal block size for I/O. */
+ __blkcnt64_t st_blocks; /* Nr. 512-byte blocks allocated. */
+ long int __unused[3];
+ };
+#endif
+
+/* Tell code we have these members. */
+#define _STATBUF_ST_BLKSIZE
+#define _STATBUF_ST_RDEV
+
+/* Encoding of the file mode. */
+
+#define __S_IFMT 0170000 /* These bits determine file type. */
+
+/* File types. */
+#define __S_IFDIR 0040000 /* Directory. */
+#define __S_IFCHR 0020000 /* Character device. */
+#define __S_IFBLK 0060000 /* Block device. */
+#define __S_IFREG 0100000 /* Regular file. */
+#define __S_IFIFO 0010000 /* FIFO. */
+#define __S_IFLNK 0120000 /* Symbolic link. */
+#define __S_IFSOCK 0140000 /* Socket. */
+
+/* POSIX.1b objects. */
+#define __S_TYPEISMQ(buf) ((buf)->st_mode - (buf)->st_mode)
+#define __S_TYPEISSEM(buf) ((buf)->st_mode - (buf)->st_mode)
+#define __S_TYPEISSHM(buf) ((buf)->st_mode - (buf)->st_mode)
+
+/* Protection bits. */
+
+#define __S_ISUID 04000 /* Set user ID on execution. */
+#define __S_ISGID 02000 /* Set group ID on execution. */
+#define __S_ISVTX 01000 /* Save swapped text after use (sticky). */
+#define __S_IREAD 0400 /* Read by owner. */
+#define __S_IWRITE 0200 /* Write by owner. */
+#define __S_IEXEC 0100 /* Execute by owner. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/bits/types.h b/sysdeps/unix/sysv/linux/s390/s390-64/bits/types.h
new file mode 100644
index 0000000000..45c4dc8d41
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/bits/types.h
@@ -0,0 +1,115 @@
+/* Copyright (C) 2001 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. */
+
+/*
+ * Never include this file directly; use <sys/types.h> instead.
+ */
+
+#ifndef _BITS_TYPES_H
+#define _BITS_TYPES_H 1
+
+#include <features.h>
+
+#define __need_size_t
+#include <stddef.h>
+
+/* Convenience types. */
+typedef unsigned char __u_char;
+typedef unsigned short int __u_short;
+typedef unsigned int __u_int;
+typedef unsigned long int __u_long;
+typedef unsigned long int __u_quad_t;
+typedef long int __quad_t;
+typedef signed char __int8_t;
+typedef unsigned char __uint8_t;
+typedef signed short int __int16_t;
+typedef unsigned short int __uint16_t;
+typedef signed int __int32_t;
+typedef unsigned int __uint32_t;
+typedef signed long int __int64_t;
+typedef unsigned long int __uint64_t;
+typedef __quad_t *__qaddr_t;
+
+typedef __uint64_t __dev_t; /* Type of device numbers. */
+typedef __uint32_t __uid_t; /* Type of user identifications. */
+typedef __uint32_t __gid_t; /* Type of group identifications. */
+typedef __uint64_t __ino_t; /* Type of file serial numbers. */
+typedef __uint64_t __ino64_t; /* "" (LFS) */
+typedef __uint32_t __mode_t; /* Type of file attribute bitmasks. */
+typedef __uint64_t __nlink_t; /* Type of file link counts. */
+typedef __int64_t __off_t; /* Type of file sizes and offsets. */
+typedef __int64_t __off64_t; /* "" (LFS) */
+typedef __int64_t __loff_t; /* Type of file sizes and offsets. */
+typedef __int32_t __pid_t; /* Type of process identifications. */
+typedef __int64_t __ssize_t; /* Type of a byte count, or error. */
+typedef __uint64_t __rlim_t; /* Type of resource counts. */
+typedef __uint64_t __rlim64_t; /* "" (LFS) */
+typedef __int64_t __blkcnt_t; /* Type to count nr disk blocks. */
+typedef __int64_t __blkcnt64_t; /* "" (LFS) */
+typedef __uint64_t __fsblkcnt_t; /* Type to count file system blocks. */
+typedef __uint64_t __fsblkcnt64_t; /* "" (LFS) */
+typedef __uint64_t __fsfilcnt_t; /* Type to count file system inodes. */
+typedef __uint64_t __fsfilcnt64_t; /* "" (LFS) */
+typedef __uint32_t __id_t; /* General type for IDs. */
+
+typedef struct
+ {
+ int __val[2];
+ } __fsid_t; /* Type of file system IDs. */
+
+/* Everythin' else. */
+typedef int __daddr_t; /* Type of a disk address. */
+typedef char *__caddr_t; /* Type of a core address. */
+typedef long int __time_t;
+typedef unsigned int __useconds_t;
+typedef long int __suseconds_t;
+typedef long int __swblk_t; /* Type of a swap block maybe? */
+typedef long int __clock_t;
+typedef int __key_t; /* Type of a SYSV IPC key. */
+
+/* Clock ID used in clock and timer functions. */
+typedef int __clockid_t;
+
+/* Timer ID returned by `timer_create'. */
+typedef int __timer_t;
+
+/* Used in `struct shmid_ds'. */
+typedef int __ipc_pid_t;
+
+/* type to represent block size. */
+typedef long int __blksize_t;
+
+/* Number of descriptors that can fit in an `fd_set'. */
+#define __FD_SETSIZE 1024
+
+/* Used in XTI. */
+typedef int __t_scalar_t;
+typedef unsigned int __t_uscalar_t;
+
+/* Duplicates info from stdint.h but this is used in unistd.h. */
+typedef long int __intptr_t;
+
+/* Duplicate info from sys/socket.h. */
+typedef unsigned int __socklen_t;
+
+/* Now add the thread types. */
+#if defined __USE_POSIX199506 || defined __USE_UNIX98
+# include <bits/pthreadtypes.h>
+#endif
+
+#endif /* bits/types.h */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
new file mode 100644
index 0000000000..c6b160ac39
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
@@ -0,0 +1,55 @@
+/* Wrapper around clone system call. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+/* 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>
+
+ .text
+ENTRY(__clone)
+ /* Sanity check arguments & move registers */
+ ltgr %r1,%r2 /* no NULL function pointers */
+ lghi %r2,-EINVAL
+ jz SYSCALL_ERROR_LABEL
+ ltgr %r3,%r3 /* no NULL stack pointers */
+ jz SYSCALL_ERROR_LABEL
+ /* move child_stack and flags, then call SVC */
+ lgr %r2,%r3
+ lgr %r3,%r4
+ svc SYS_ify(clone)
+ ltgr %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 */
+ lgr %r2,%r5 /* set first parameter to void *arg */
+ sgr %r11,%r11 /* terminate the stack frame */
+ aghi %r15,-96 /* make room on the stack for the save area */
+ basr %r14,%r1 /* jump to fn */
+#ifdef PIC
+ larl %r12,_GLOBAL_OFFSET_TABLE_
+#endif
+ jg _exit@PLT /* branch to _exit -> thread termination */
+PSEUDO_END (__clone)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/fstatfs64.c b/sysdeps/unix/sysv/linux/s390/s390-64/fstatfs64.c
new file mode 100644
index 0000000000..2be4e59ba4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/fstatfs64.c
@@ -0,0 +1 @@
+/* fstatfs64 is the same as fstatfs. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/ftruncate64.c b/sysdeps/unix/sysv/linux/s390/s390-64/ftruncate64.c
new file mode 100644
index 0000000000..673a8b525a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/ftruncate64.c
@@ -0,0 +1 @@
+/* ftruncate64 is the same as ftruncate. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/fxstat.c b/sysdeps/unix/sysv/linux/s390/s390-64/fxstat.c
new file mode 100644
index 0000000000..96b71167cd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/fxstat.c
@@ -0,0 +1,42 @@
+/* fxstat using old-style Unix fstat system call. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+/* Ho hum, since xstat == xstat64 we must get rid of the prototype or gcc
+ will complain since they don't strictly match. */
+#define __fxstat64 __fxstat64_disable
+
+#include <errno.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+extern int __syscall_fstat (int, struct stat *);
+
+/* Get information about the file FD in BUF. */
+int
+__fxstat (int vers, int fd, struct stat *buf)
+{
+ return INLINE_SYSCALL (fstat, 2, fd, buf);
+}
+
+weak_alias (__fxstat, _fxstat);
+#undef __fxstat64
+strong_alias (__fxstat, __fxstat64);
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/fxstat64.c b/sysdeps/unix/sysv/linux/s390/s390-64/fxstat64.c
new file mode 100644
index 0000000000..9eff9ebeb7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/fxstat64.c
@@ -0,0 +1 @@
+/* fxstat64 is in fxstat.c */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/getdents.c b/sysdeps/unix/sysv/linux/s390/s390-64/getdents.c
new file mode 100644
index 0000000000..491fa9dfb2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/getdents.c
@@ -0,0 +1,4 @@
+#define __getdents64 __no___getdents64_decl
+#include <sysdeps/unix/sysv/linux/getdents.c>
+#undef __getdents64
+weak_alias(__getdents, __getdents64);
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/getdents64.c b/sysdeps/unix/sysv/linux/s390/s390-64/getdents64.c
new file mode 100644
index 0000000000..0df2c8f4c6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/getdents64.c
@@ -0,0 +1 @@
+/* getdents64 is in getdents.c */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/getrlimit64.c b/sysdeps/unix/sysv/linux/s390/s390-64/getrlimit64.c
new file mode 100644
index 0000000000..9feab0e6b8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/getrlimit64.c
@@ -0,0 +1 @@
+/* getrlimit64 is the same as getrlimit. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/glob.c b/sysdeps/unix/sysv/linux/s390/s390-64/glob.c
new file mode 100644
index 0000000000..b6da989e57
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/glob.c
@@ -0,0 +1,7 @@
+#define glob64 __no_glob64_decl
+#define globfree64 __no_globfree64_decl
+#include <sysdeps/generic/glob.c>
+#undef glob64
+#undef globfree64
+weak_alias (glob, glob64)
+weak_alias (globfree, globfree64)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/glob64.c b/sysdeps/unix/sysv/linux/s390/s390-64/glob64.c
new file mode 100644
index 0000000000..33918ea6a5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/glob64.c
@@ -0,0 +1 @@
+/* glob64 is in glob.c */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/kernel_stat.h b/sysdeps/unix/sysv/linux/s390/s390-64/kernel_stat.h
new file mode 100644
index 0000000000..10f17b28ee
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/kernel_stat.h
@@ -0,0 +1,46 @@
+/* Definition of `struct stat' used in the kernel. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+struct kernel_stat
+ {
+ unsigned int st_dev;
+ unsigned int st_ino;
+ unsigned int st_mode;
+ unsigned int st_nlink;
+ unsigned int st_uid;
+ unsigned int st_gid;
+ unsigned int st_rdev;
+ unsigned int __pad1;
+ unsigned long int st_size;
+ unsigned long int st_atime;
+ unsigned long int st_mtime;
+ unsigned long int st_ctime;
+ unsigned int st_blksize;
+ int st_blocks;
+ unsigned long __unused1;
+ unsigned long __unused2;
+ };
+
+extern int __xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf);
+
+#define XSTAT_IS_XSTAT64 1
+#define _HAVE___UNUSED1
+#define _HAVE___UNUSED2
+
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/lxstat.c b/sysdeps/unix/sysv/linux/s390/s390-64/lxstat.c
new file mode 100644
index 0000000000..1b80b11163
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/lxstat.c
@@ -0,0 +1,42 @@
+/* lxstat using old-style Unix fstat system call. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+/* Ho hum, since xstat == xstat64 we must get rid of the prototype or gcc
+ will complain since they don't strictly match. */
+#define __lxstat64 __lxstat64_disable
+
+#include <errno.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+extern int __syscall_lstat (const char *, struct stat *);
+
+/* Get information about the file FD in BUF. */
+int
+__lxstat (int vers, const char *name, struct stat *buf)
+{
+ return INLINE_SYSCALL (lstat, 2, name, buf);
+}
+
+weak_alias (__lxstat, _lxstat);
+#undef __lxstat64
+strong_alias (__lxstat, __lxstat64);
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/lxstat64.c b/sysdeps/unix/sysv/linux/s390/s390-64/lxstat64.c
new file mode 100644
index 0000000000..bb5dbd0fff
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/lxstat64.c
@@ -0,0 +1 @@
+/* lxstat64 is in lxstat.c */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/mmap.S b/sysdeps/unix/sysv/linux/s390/s390-64/mmap.S
new file mode 100644
index 0000000000..72d73d4416
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/mmap.S
@@ -0,0 +1,67 @@
+/* Wrapper around mmap system call. 64 bit S/390 version.
+ Copyright (C) 2001 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>
+
+#define EINVAL 22
+
+ .text
+
+ENTRY(__mmap)
+ /* Save registers and setup stack frame. */
+ stmg %r6,%r15,48(%r15)
+ lgr %r1,%r15
+ lg %r0,8(%r15) /* Load eos. */
+ aghi %r15,-208 /* Buy stack space. */
+ stg %r1,0(%r15) /* Store back chain. */
+ stg %r0,8(%r15) /* Store eos. */
+
+ /* Store parameters on stack, because old_mmap
+ takes only one parameter: a pointer to the parameter area. */
+ mvc 200(8,%r15),368(%r15) /* Move 'offset'. */
+ lgfr %r6,%r6
+ stg %r6,192(%r15) /* Store 'fd'. */
+ lgfr %r5,%r5
+ stg %r5,184(%r15) /* Store 'flags'. */
+ lgfr %r4,%r4
+ stg %r4,176(%r15) /* Store 'prot'. */
+ stg %r3,168(%r15) /* Store 'length'. */
+ stg %r2,160(%r15) /* Store 'start'. */
+
+ la %r2,160(%r15) /* Load address of parameter list. */
+ /* Do the system call trap. */
+ svc SYS_ify(mmap)
+
+ lg %r15,0(%r15) /* Load back chain. */
+ lmg %r6,%r15,48(%r15) /* Load registers. */
+
+ /* Check gpr 2 for error. */
+ lghi %r0,-4096
+ clgr %r2,%r0
+ jnl SYSCALL_ERROR_LABEL
+
+ /* Successful; return the syscall's value. */
+ br %r14
+
+PSEUDO_END (__mmap)
+
+weak_alias (__mmap, mmap)
+weak_alias (__mmap, mmap64)
+
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/mmap64.c b/sysdeps/unix/sysv/linux/s390/s390-64/mmap64.c
new file mode 100644
index 0000000000..0dbd384a6a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/mmap64.c
@@ -0,0 +1 @@
+/* mmap64 is the same as mmap. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/pread64.c b/sysdeps/unix/sysv/linux/s390/s390-64/pread64.c
new file mode 100644
index 0000000000..b7f298dea8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/pread64.c
@@ -0,0 +1 @@
+/* Empty since the pread syscall is equivalent. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/pwrite64.c b/sysdeps/unix/sysv/linux/s390/s390-64/pwrite64.c
new file mode 100644
index 0000000000..b1b25f65a3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/pwrite64.c
@@ -0,0 +1 @@
+/* Empty since the pwrite syscall is equivalent. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/readdir.c b/sysdeps/unix/sysv/linux/s390/s390-64/readdir.c
new file mode 100644
index 0000000000..300ebb2629
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/readdir.c
@@ -0,0 +1,7 @@
+#define readdir64 __no_readdir64_decl
+#define __readdir64 __no___readdir64_decl
+#include <sysdeps/unix/readdir.c>
+#undef __readdir64
+strong_alias (__readdir, __readdir64)
+#undef readdir64
+weak_alias (__readdir, readdir64)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/readdir64.c b/sysdeps/unix/sysv/linux/s390/s390-64/readdir64.c
new file mode 100644
index 0000000000..9796431dc4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/readdir64.c
@@ -0,0 +1 @@
+/* readdir64 is in readdir.c */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/readdir64_r.c b/sysdeps/unix/sysv/linux/s390/s390-64/readdir64_r.c
new file mode 100644
index 0000000000..b8fe9a31b4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/readdir64_r.c
@@ -0,0 +1 @@
+/* readdir64_r is in readdir_r.c */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/readdir_r.c b/sysdeps/unix/sysv/linux/s390/s390-64/readdir_r.c
new file mode 100644
index 0000000000..adb92db6af
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/readdir_r.c
@@ -0,0 +1,4 @@
+#define readdir64_r __no_readdir64_r_decl
+#include <sysdeps/unix/readdir_r.c>
+#undef readdir64_r
+weak_alias (__readdir_r, readdir64_r)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/register-dump.h b/sysdeps/unix/sysv/linux/s390/s390-64/register-dump.h
new file mode 100644
index 0000000000..a9da7d84d7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/register-dump.h
@@ -0,0 +1,133 @@
+/* Dump registers. 64 bit S/390 version.
+ Copyright (C) 2001 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: XXXXXXXXXXXXXXXX GPR1: XXXXXXXXXXXXXXXX
+ GPR2: XXXXXXXXXXXXXXXX GPR3: XXXXXXXXXXXXXXXX
+ GPR4: XXXXXXXXXXXXXXXX GPR5: XXXXXXXXXXXXXXXX
+ GPR6: XXXXXXXXXXXXXXXX GPR7: XXXXXXXXXXXXXXXX
+ GPR8: XXXXXXXXXXXXXXXX GPR9: XXXXXXXXXXXXXXXX
+ GPRA: XXXXXXXXXXXXXXXX GPRB: XXXXXXXXXXXXXXXX
+ GPRC: XXXXXXXXXXXXXXXX GPRD: XXXXXXXXXXXXXXXX
+ GPRE: XXXXXXXXXXXXXXXX GPRF: XXXXXXXXXXXXXXXX
+
+ PSW.MASK: XXXXXXXXXXXXXXXX PSW.ADDR: XXXXXXXXXXXXXXXX
+
+ 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][16];
+ 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], 16);
+ hexvalue (ctx->sregs->regs.gprs[1], regs[1], 16);
+ hexvalue (ctx->sregs->regs.gprs[2], regs[2], 16);
+ hexvalue (ctx->sregs->regs.gprs[3], regs[3], 16);
+ hexvalue (ctx->sregs->regs.gprs[4], regs[4], 16);
+ hexvalue (ctx->sregs->regs.gprs[5], regs[5], 16);
+ hexvalue (ctx->sregs->regs.gprs[6], regs[6], 16);
+ hexvalue (ctx->sregs->regs.gprs[7], regs[7], 16);
+ hexvalue (ctx->sregs->regs.gprs[8], regs[8], 16);
+ hexvalue (ctx->sregs->regs.gprs[9], regs[9], 16);
+ hexvalue (ctx->sregs->regs.gprs[10], regs[10], 16);
+ hexvalue (ctx->sregs->regs.gprs[11], regs[11], 16);
+ hexvalue (ctx->sregs->regs.gprs[12], regs[12], 16);
+ hexvalue (ctx->sregs->regs.gprs[13], regs[13], 16);
+ hexvalue (ctx->sregs->regs.gprs[14], regs[14], 16);
+ hexvalue (ctx->sregs->regs.gprs[15], regs[15], 16);
+ hexvalue (ctx->sregs->regs.psw.mask, regs[16], 16);
+ hexvalue (ctx->sregs->regs.psw.addr, regs[17], 16);
+
+ /* Generate the output. */
+ ADD_STRING ("Register dump:\n\n GPR0: ");
+ ADD_MEM (regs[0], 16);
+ ADD_STRING (" GPR1: ");
+ ADD_MEM (regs[1], 16);
+ ADD_STRING (" GPR2: ");
+ ADD_MEM (regs[2], 16);
+ ADD_STRING (" GPR3: ");
+ ADD_MEM (regs[3], 16);
+ ADD_STRING ("\n GPR4: ");
+ ADD_MEM (regs[4], 16);
+ ADD_STRING (" GPR5: ");
+ ADD_MEM (regs[5], 16);
+ ADD_STRING (" GPR6: ");
+ ADD_MEM (regs[6], 16);
+ ADD_STRING (" GPR7: ");
+ ADD_MEM (regs[7], 16);
+ ADD_STRING ("\n GPR8: ");
+ ADD_MEM (regs[8], 16);
+ ADD_STRING (" GPR9: ");
+ ADD_MEM (regs[9], 16);
+ ADD_STRING (" GPRA: ");
+ ADD_MEM (regs[10], 16);
+ ADD_STRING (" GPRB: ");
+ ADD_MEM (regs[11], 16);
+ ADD_STRING ("\n GPRC: ");
+ ADD_MEM (regs[12], 16);
+ ADD_STRING (" GPRD: ");
+ ADD_MEM (regs[13], 16);
+ ADD_STRING (" GPRE: ");
+ ADD_MEM (regs[14], 16);
+ ADD_STRING (" GPRF: ");
+ ADD_MEM (regs[15], 16);
+ ADD_STRING ("\n\n PSW.MASK: ");
+ ADD_MEM (regs[16], 16);
+ ADD_STRING (" PSW.ADDR: ");
+ ADD_MEM (regs[17], 16);
+ 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/s390-64/setrlimit64.c b/sysdeps/unix/sysv/linux/s390/s390-64/setrlimit64.c
new file mode 100644
index 0000000000..8edcff0086
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/setrlimit64.c
@@ -0,0 +1 @@
+/* setrlimit64 is the same as setrlimit. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sigaction.c b/sysdeps/unix/sysv/linux/s390/s390-64/sigaction.c
new file mode 100644
index 0000000000..9e2ffa8e76
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sigaction.c
@@ -0,0 +1,50 @@
+/* Copyright (C) 2001 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. */
+
+/* 64 bit Linux for S/390 only has rt signals, thus we do not even want to try
+ falling back to the old style signals as the default Linux handler does. */
+
+#include <errno.h>
+#include <signal.h>
+#include <string.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+extern int __syscall_rt_sigaction (int, const struct sigaction *,
+ struct sigaction *, size_t);
+
+/* The variable is shared between all wrappers around signal handling
+ functions which have RT equivalents. This is the definition. */
+
+
+/* If ACT is not NULL, change the action for SIG to *ACT.
+ If OACT is not NULL, put the old action for SIG in *OACT. */
+int
+__libc_sigaction (sig, act, oact)
+ int sig;
+ const struct sigaction *act;
+ struct sigaction *oact;
+{
+ /* XXX The size argument hopefully will have to be changed to the
+ real size of the user-level sigset_t. */
+ return INLINE_SYSCALL (rt_sigaction, 4, sig, act, oact, _NSIG / 8);
+}
+
+weak_alias (__libc_sigaction, __sigaction)
+weak_alias (__libc_sigaction, sigaction)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sigpending.c b/sysdeps/unix/sysv/linux/s390/s390-64/sigpending.c
new file mode 100644
index 0000000000..cdaacd769c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sigpending.c
@@ -0,0 +1,41 @@
+/* Copyright (C) 2001 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. */
+
+/* 64 bit Linux for S/390 only has rt signals, thus we do not even want to try
+ falling back to the old style signals as the default Linux handler does. */
+
+#include <errno.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+extern int __syscall_rt_sigpending (sigset_t *, size_t);
+
+
+/* Change the set of blocked signals to SET,
+ wait until a signal arrives, and restore the set of blocked signals. */
+int
+sigpending (set)
+ sigset_t *set;
+{
+ /* XXX The size argument hopefully will have to be changed to the
+ real size of the user-level sigset_t. */
+ return INLINE_SYSCALL (rt_sigpending, 2, set, _NSIG / 8);
+}
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sigprocmask.c b/sysdeps/unix/sysv/linux/s390/s390-64/sigprocmask.c
new file mode 100644
index 0000000000..1a580b0554
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sigprocmask.c
@@ -0,0 +1,44 @@
+/* Copyright (C) 2001 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. */
+
+/* 64 bit Linux for S/390 only has rt signals, thus we do not even want to try
+ falling back to the old style signals as the default Linux handler does. */
+
+#include <errno.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+extern int __syscall_rt_sigprocmask (int, const sigset_t *,
+ sigset_t *, size_t);
+
+/* Get and/or change the set of blocked signals. */
+int
+__sigprocmask (how, set, oset)
+ int how;
+ const sigset_t *set;
+ sigset_t *oset;
+{
+
+ /* XXX The size argument hopefully will have to be changed to the
+ real size of the user-level sigset_t. */
+ return INLINE_SYSCALL (rt_sigprocmask, 4, how, set, oset, _NSIG / 8);
+}
+weak_alias (__sigprocmask, sigprocmask)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sigsuspend.c b/sysdeps/unix/sysv/linux/s390/s390-64/sigsuspend.c
new file mode 100644
index 0000000000..af7797eeb8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sigsuspend.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 2001 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 <errno.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+extern int __syscall_rt_sigsuspend (const sigset_t *, size_t);
+
+
+/* Change the set of blocked signals to SET,
+ wait until a signal arrives, and restore the set of blocked signals. */
+int
+__sigsuspend (set)
+ const sigset_t *set;
+{
+ /* XXX The size argument hopefully will have to be changed to the
+ real size of the user-level sigset_t. */
+ return INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8);
+}
+weak_alias (__sigsuspend, sigsuspend)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/socket.S b/sysdeps/unix/sysv/linux/s390/s390-64/socket.S
new file mode 100644
index 0000000000..471c0b5ef2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/socket.S
@@ -0,0 +1,99 @@
+/* Copyright (C) 2001 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. */
+ stmg %r6,%r15,48(%r15) /* Save registers. */
+ lgr %r1,%r15
+ lg %r0,8(%r15) /* Load eos. */
+ ahi %r15,-208 /* Buy stack space. */
+ stg %r1,0(%r15) /* Store back chain. */
+ stg %r0,8(%r15) /* Store eos. */
+
+ /* Reorder arguments. */
+#if (NARGS >= 6)
+ mvc 200(8,%r15),368(%r15) /* Move between parameter lists. */
+#endif
+#if (NARGS >= 5)
+ stg %r6,192(%r15) /* Store into parameter list. */
+#endif
+#if (NARGS >= 4)
+ stg %r5,184(%r15) /* Store into parameter list. */
+#endif
+#if (NARGS >= 3)
+ stg %r4,176(%r15) /* Store into parameter list. */
+#endif
+#if (NARGS >= 2)
+ stg %r3,168(%r15) /* Store into parameter list. */
+ stg %r2,160(%r15)
+#endif
+ /* Load subcode for socket syscall. */
+ lghi %r2,P(SOCKOP_,socket)
+ la %r3,160(%r15) /* Load address of parameter list. */
+
+ /* Do the system call trap. */
+ svc SYS_ify(socketcall)
+
+ lg %r15,0(%r15) /* Load back chain. */
+ lmg %r6,15,48(%r15) /* Load registers. */
+
+ /* gpr2 is < 0 if there was an error. */
+ lghi %r0,-125
+ clgr %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/s390-64/statfs64.c b/sysdeps/unix/sysv/linux/s390/s390-64/statfs64.c
new file mode 100644
index 0000000000..06bc68826f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/statfs64.c
@@ -0,0 +1 @@
+/* statfs64 is the same as statfs. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sys/procfs.h b/sysdeps/unix/sysv/linux/s390/s390-64/sys/procfs.h
new file mode 100644
index 0000000000..3e91109bf5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sys/procfs.h
@@ -0,0 +1,118 @@
+/* Copyright (C) 2001 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. */
+
+#ifndef _SYS_PROCFS_H
+#define _SYS_PROCFS_H 1
+
+/* This is somewhat modelled after the file of the same name on SVR4
+ systems. It provides a definition of the core file format for ELF
+ used on Linux. It doesn't have anything to do with the /proc file
+ system, even though Linux has one.
+
+ Anyway, the whole purpose of this file is for GDB and GDB only.
+ Don't read too much into it. Don't use it for anything other than
+ GDB unless you know what you are doing. */
+
+#include <features.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/user.h>
+#include <sys/ucontext.h>
+
+__BEGIN_DECLS
+
+typedef greg_t elf_greg_t;
+#define ELF_NGREG NGREG
+typedef gregset_t elf_gregset_t;
+typedef fpreg_t elf_fpreg_t;
+typedef fpregset_t elf_fpregset_t;
+
+/* Signal info. */
+struct elf_siginfo
+ {
+ int si_signo; /* Signal number. */
+ int si_code; /* Extra code. */
+ int si_errno; /* Errno. */
+ };
+
+
+/* Definitions to generate Intel SVR4-like core files. These mostly
+ have the same names as the SVR4 types with "elf_" tacked on the
+ front to prevent clashes with Linux definitions, and the typedef
+ forms have been avoided. This is mostly like the SVR4 structure,
+ but more Linuxy, with things that Linux does not support and which
+ GDB doesn't really use excluded. */
+
+struct elf_prstatus
+ {
+ struct elf_siginfo pr_info; /* Info associated with signal. */
+ short int pr_cursig; /* Current signal. */
+ unsigned long int pr_sigpend; /* Set of pending signals. */
+ unsigned long int pr_sighold; /* Set of held signals. */
+ __pid_t pr_pid;
+ __pid_t pr_ppid;
+ __pid_t pr_pgrp;
+ __pid_t pr_sid;
+ struct timeval pr_utime; /* User time. */
+ struct timeval pr_stime; /* System time. */
+ struct timeval pr_cutime; /* Cumulative user time. */
+ struct timeval pr_cstime; /* Cumulative system time. */
+ elf_gregset_t pr_reg; /* GP registers. */
+ int pr_fpvalid; /* True if math copro being used. */
+ };
+
+
+#define ELF_PRARGSZ (80) /* Number of chars for args. */
+
+struct elf_prpsinfo
+ {
+ char pr_state; /* Numeric process state. */
+ char pr_sname; /* Char for pr_state. */
+ char pr_zomb; /* Zombie. */
+ char pr_nice; /* Nice val. */
+ unsigned long int pr_flag; /* Flags. */
+ unsigned int pr_uid;
+ unsigned int pr_gid;
+ int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+ /* Lots missing */
+ char pr_fname[16]; /* Filename of executable. */
+ char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
+ };
+
+/* The rest of this file provides the types for emulation of the
+ Solaris <proc_service.h> interfaces that should be implemented by
+ users of libthread_db. */
+
+/* Addresses. */
+typedef void *psaddr_t;
+
+/* Register sets. Linux has different names. */
+typedef elf_gregset_t prgregset_t;
+typedef elf_fpregset_t prfpregset_t;
+
+/* We don't have any differences between processes and threads,
+ therefore have only one PID type. */
+typedef __pid_t lwpid_t;
+
+/* Process status and info. In the end we do provide typedefs for them. */
+typedef struct elf_prstatus prstatus_t;
+typedef struct elf_prpsinfo prpsinfo_t;
+
+__END_DECLS
+
+#endif /* sys/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sys/ucontext.h b/sysdeps/unix/sysv/linux/s390/s390-64/sys/ucontext.h
new file mode 100644
index 0000000000..773841cf01
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sys/ucontext.h
@@ -0,0 +1,77 @@
+/* Copyright (C) 2001 Free Software Foundation, Inc.
+ Contributed by Denis Joseph Barrow (djbarrow@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 _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+/* Forward definition to avoid parse errors */
+struct ucontext;
+typedef struct ucontext ucontext_t;
+#include <features.h>
+#include <signal.h>
+
+/* We need the signal context definitions even if they are not used
+ included in <signal.h>. */
+#include <bits/sigcontext.h>
+
+
+/* Type for a general-purpose register. */
+typedef unsigned long greg_t;
+
+/* And the whole bunch of them. We should have used `struct s390_regs',
+ but to avoid name space pollution and since the tradition says that
+ the register set is an array, we make gregset_t a simple array
+ that has the same size as s390_regs. */
+#define NGREG 27
+#define NUM_FPRS 16
+/* Must match kernels psw_t alignment */
+typedef greg_t gregset_t[NGREG] __attribute__ ((aligned(8)));
+
+typedef union
+{
+ double d;
+ float f;
+} fpreg_t;
+
+/* Register set for the floating-point registers. */
+typedef struct {
+ unsigned int fpc;
+ fpreg_t fprs[NUM_FPRS];
+} fpregset_t;
+
+/* Context to describe whole processor state. */
+typedef struct
+ {
+ int version;
+ gregset_t gregs;
+ fpregset_t fpregs;
+ } mcontext_t;
+
+/* Userlevel context. */
+struct ucontext
+ {
+ unsigned long int uc_flags;
+ struct ucontext *uc_links;
+ __sigset_t uc_sigmask;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ long int uc_filler[170];
+ };
+
+
+#endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S b/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
new file mode 100644
index 0000000000..b632ced19a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
@@ -0,0 +1,52 @@
+/* Copyright (C) 2001 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. */
+ stmg %r6,%r15,48(%r15) /* Save registers. */
+ lgr %r1,%r15
+ lg %r0,8(%r15) /* Load eos. */
+ aghi %r15,-160 /* Buy stack space. */
+ stg %r1,0(%r15) /* Store back chain. */
+ stg %r0,8(%r15) /* Store eos. */
+
+ lgr %r1,%r2 /* Move syscall number. */
+ lgr %r2,%r3 /* First parameter. */
+ lgr %r3,%r4 /* Second parameter. */
+ lgr %r4,%r5 /* Third parameter. */
+ lgr %r5,%r6 /* Fourth parameter. */
+ lg %r6,320(%r15) /* Fifth parameter. */
+ basr %r7,0
+.L0: ex %r1,.L1-.L0(%r7) /* Lsb of R1 is subsituted as SVC number. */
+
+ lg %r15,0(%r15) /* Load back chain. */
+ lmg %r6,15,48(%r15) /* Load registers. */
+
+ lghi %r0,-4095
+ clgr %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/s390-64/syscalls.list b/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
new file mode 100644
index 0000000000..0d72f06cf9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
@@ -0,0 +1,55 @@
+# File name Caller Syscall name # args Strong name Weak names
+
+llseek EXTRA lseek 3 __libc_lseek64 __lseek llseek __lseek64 lseek64
+pread - pread 4 __libc_pread __libc_pread64 __pread pread __pread64 pread64
+pwrite - pwrite 4 __libc_pwrite __libc_pwrite64 __pwrite pwrite __pwrite64 pwrite64
+fstatfs - fstatfs i:ip __fstatfs fstatfs fstatfs64 __fstatfs64
+statfs - statfs i:sp __statfs statfs statfs64
+getpeername - getpeername i:ipp __getpeername getpeername
+getpriority - getpriority i:ii __getpriority getpriority
+ftruncate - ftruncate 2 __ftruncate ftruncate ftruncate64 __ftruncate64
+truncate - truncate 2 truncate truncate64
+getrlimit - getrlimit 2 __getrlimit getrlimit getrlimit64
+setrlimit - setrlimit 2 __setrlimit setrlimit setrlimit64
+
+# semaphore and shm system calls
+msgctl - msgctl i:iip __msgctl msgctl
+msgget - msgget i:ii __msgget msgget
+msgrcv - msgrcv i:ibnii __msgrcv msgrcv
+msgsnd - msgsnd i:ibni __msgsnd msgsnd
+shmat - shmat i:ipi __shmat shmat
+shmctl - shmctl i:iip __shmctl shmctl
+shmdt - shmdt i:s __shmdt shmdt
+shmget - shmget i:iii __shmget shmget
+semop - semop i:ipi __semop semop
+semget - semget i:iii __semget semget
+semctl - semctl i:iiii __semctl semctl
+
+# proper socket implementations:
+accept - accept i:iBN __libc_accept __accept accept
+bind - bind i:ipi __bind bind
+connect - connect i:ipi __libc_connect __connect connect
+getpeername - getpeername i:ipp __getpeername getpeername
+getsockname - getsockname i:ipp __getsockname getsockname
+getsockopt - getsockopt i:iiiBN __getsockopt getsockopt
+listen - listen i:ii __listen listen
+recv - recv i:ibni __libc_recv __recv recv
+recvfrom - recvfrom i:ibniBN __libc_recvfrom __recvfrom recvfrom
+recvmsg - recvmsg i:ipi __libc_recvmsg recvmsg
+send - send i:ibni __libc_send __send send
+sendmsg - sendmsg i:ipi __libc_sendmsg sendmsg
+sendto - sendto i:ibnibn __libc_sendto __sendto sendto
+setsockopt - setsockopt i:iiibn __setsockopt setsockopt
+shutdown - shutdown i:ii __shutdown shutdown
+socket - socket i:iii __socket socket
+socketpair - socketpair i:iiif __socketpair socketpair
+
+getresuid - getresuid i:ppp getresuid
+getresgid - getresgid i:ppp getresgid
+
+rt_sigaction EXTRA rt_sigaction i:ippi __syscall_rt_sigaction rt_sigaction
+rt_sigpending EXTRA rt_sigpending i:pi __syscall_rt_sigpending rt_sigpending
+rt_sigprocmask EXTRA rt_sigprocmask i:ippi __syscall_rt_sigprocmask rt_sigprocmask
+rt_sigqueueinfo EXTRA rt_sigqueueinfo i:iip __syscall_rt_sigqueueinfo rt_sigqueueinfo
+rt_sigsuspend EXTRA rt_sigsuspend i:pi __syscall_rt_sigsuspend rt_sigsuspend
+rt_sigtimedwait EXTRA rt_sigtimedwait i:pppi __syscall_rt_sigtimedwait rt_sigtimedwait
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S
new file mode 100644
index 0000000000..7b216c8caf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S
@@ -0,0 +1,90 @@
+/* Copyright (C) 2001 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
+ larl %r1,errno
+ st %r2,0(%r1)
+ lghi %r2,-1
+ br %r14
+#else
+ stmg %r13,%r15,104(%r15)
+ lgr %r0,%r15
+ aghi %r15,-160
+ lcr %r13,%r2
+ stg %r0,0(%r15)
+ brasl %r14,__errno_location
+ st %r13,0(%r2)
+ lmg %r13,%r15,264(%r15)
+ lghi %r2,-1
+ br %r14
+#endif
+#else
+#ifndef _LIBC_REENTRANT
+ larl %r1,_GLOBAL_OFFSET_TABLE_
+ lg %r1,errno@GOT(%r1)
+ lcr %r2,%r2
+ st %r2,0(%r1)
+ lghi %r2,-1
+ br %r14
+#else
+ stmg %r13,%r15,104(%r15)
+ lgr %r0,%r15
+ aghi %r15,-160
+ lcr %r13,%r2
+ stg %r0,0(%r15)
+ brasl %r14,__errno_location@PLT
+ st %r13,0(%r2)
+ lmg %r13,%r15,264(%r15)
+ lghi %r2,-1
+ br %r14
+#endif
+#endif
+
+END (__syscall_error)
+
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
new file mode 100644
index 0000000000..d52e623999
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
@@ -0,0 +1,164 @@
+/* Assembler macros for 64 bit S/390.
+ Copyright (C) 2001 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/s390-64/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); \
+ lghi %r4,-4095 ; \
+ clgr %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 ; \
+ larl %r1,errno ; \
+ st %r2,0(%r1) ; \
+ lghi %r2,-1 ; \
+ br %r14
+#else
+#define SYSCALL_ERROR_HANDLER \
+0: larl %r1,_GLOBAL_OFFSET_TABLE_ ; \
+ lg %r1,errno@GOT(%r1) ; \
+ lcr %r2,%r2 ; \
+ st %r2,0(%r1) ; \
+ lghi %r2,-1 ; \
+ br %r14
+#endif /* PIC */
+#else
+#define SYSCALL_ERROR_HANDLER \
+0: jg __syscall_error@PLT
+#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" \
+ "lgr %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 = -1; \
+ } \
+ (int) err; })
+
+#define DECLARGS_0()
+#define DECLARGS_1(arg1) \
+ unsigned long gpr2 = (unsigned long) (arg1);
+#define DECLARGS_2(arg1, arg2) \
+ DECLARGS_1(arg1) \
+ unsigned long gpr3 = (unsigned long) (arg2);
+#define DECLARGS_3(arg1, arg2, arg3) \
+ DECLARGS_2(arg1, arg2) \
+ unsigned long gpr4 = (unsigned long) (arg3);
+#define DECLARGS_4(arg1, arg2, arg3, arg4) \
+ DECLARGS_3(arg1, arg2, arg3) \
+ unsigned long gpr5 = (unsigned long) (arg4);
+#define DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \
+ DECLARGS_4(arg1, arg2, arg3, arg4) \
+ unsigned long gpr6 = (unsigned long) (arg5);
+
+#define LOADARGS_0
+#define LOADARGS_1 "LG 2,%2\n\t"
+#define LOADARGS_2 LOADARGS_1 "LG 3,%3\n\t"
+#define LOADARGS_3 LOADARGS_2 "LG 4,%4\n\t"
+#define LOADARGS_4 LOADARGS_3 "LG 5,%5\n\t"
+#define LOADARGS_5 LOADARGS_4 "LG 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)
+
+#endif /* _LINUX_S390_SYSDEP_H */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/truncate64.c b/sysdeps/unix/sysv/linux/s390/s390-64/truncate64.c
new file mode 100644
index 0000000000..8999768874
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/truncate64.c
@@ -0,0 +1 @@
+/* truncate64 is the same as truncate. */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/xstat.c b/sysdeps/unix/sysv/linux/s390/s390-64/xstat.c
new file mode 100644
index 0000000000..788f785dcf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/xstat.c
@@ -0,0 +1,42 @@
+/* xstat using old-style Unix stat system call. 64 bit S/390 version.
+ Copyright (C) 2001 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. */
+
+/* Ho hum, since xstat == xstat64 we must get rid of the prototype or gcc
+ will complain since they don't strictly match. */
+#define __xstat64 __xstat64_disable
+
+#include <errno.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+extern int __syscall_stat (const char *, struct stat *);
+
+/* Get information about the file NAME in BUF. */
+int
+__xstat (int vers, const char *name, struct stat *buf)
+{
+ return INLINE_SYSCALL (stat, 2, name, buf);
+}
+
+weak_alias (__xstat, _xstat);
+#undef __xstat64
+strong_alias (__xstat, __xstat64);
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/xstat64.c b/sysdeps/unix/sysv/linux/s390/s390-64/xstat64.c
new file mode 100644
index 0000000000..e7acd3b45e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/xstat64.c
@@ -0,0 +1 @@
+/* xstat64 is in xstat.c */