about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r--sysdeps/unix/sysv/linux/s390/Dist9
-rw-r--r--sysdeps/unix/sysv/linux/s390/Makefile4
-rw-r--r--sysdeps/unix/sysv/linux/s390/bits/fcntl.h151
-rw-r--r--sysdeps/unix/sysv/linux/s390/bits/mman.h93
-rw-r--r--sysdeps/unix/sysv/linux/s390/bits/resource.h205
-rw-r--r--sysdeps/unix/sysv/linux/s390/bits/time.h79
-rw-r--r--sysdeps/unix/sysv/linux/s390/brk.c57
-rw-r--r--sysdeps/unix/sysv/linux/s390/clone.S66
-rw-r--r--sysdeps/unix/sysv/linux/s390/fchown.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/getegid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/geteuid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/getgid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/getgroups.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/getmsg.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/getpmsg.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/getresgid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/getresuid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/getuid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/mmap.S60
-rw-r--r--sysdeps/unix/sysv/linux/s390/msgctl.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/profil-counter.h27
-rw-r--r--sysdeps/unix/sysv/linux/s390/putmsg.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/putpmsg.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/register-dump.h130
-rw-r--r--sysdeps/unix/sysv/linux/s390/semctl.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/setegid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/seteuid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/setfsgid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/setfsuid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/setgid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/setgroups.c2
-rw-r--r--sysdeps/unix/sysv/linux/s390/setregid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/setresgid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/setresuid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/setreuid.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/setuid.c2
-rw-r--r--sysdeps/unix/sysv/linux/s390/shmctl.c1
-rw-r--r--sysdeps/unix/sysv/linux/s390/sigcontextinfo.h26
-rw-r--r--sysdeps/unix/sysv/linux/s390/socket.S98
-rw-r--r--sysdeps/unix/sysv/linux/s390/sys/elf.h28
-rw-r--r--sysdeps/unix/sysv/linux/s390/sys/ptrace.h138
-rw-r--r--sysdeps/unix/sysv/linux/s390/sys/ucontext.h96
-rw-r--r--sysdeps/unix/sysv/linux/s390/sys/user.h24
-rw-r--r--sysdeps/unix/sysv/linux/s390/syscall.S51
-rw-r--r--sysdeps/unix/sysv/linux/s390/sysdep.S104
-rw-r--r--sysdeps/unix/sysv/linux/s390/sysdep.h212
46 files changed, 1686 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/Dist b/sysdeps/unix/sysv/linux/s390/Dist
new file mode 100644
index 0000000000..eaf8731d34
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/Dist
@@ -0,0 +1,9 @@
+clone.S
+setresuid.c
+setresgid.c
+setfsuid.c
+setfsgid.c
+sys/elf.h
+sys/perm.h
+sys/procfs.h
+sys/user.h
diff --git a/sysdeps/unix/sysv/linux/s390/Makefile b/sysdeps/unix/sysv/linux/s390/Makefile
new file mode 100644
index 0000000000..7ca98f0ebe
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/Makefile
@@ -0,0 +1,4 @@
+ifeq ($(subdir),misc)
+sysdep_routines += setfsgid setfsuid setresgid setresuid
+sysdep_headers += sys/elf.h sys/reg.h
+endif
diff --git a/sysdeps/unix/sysv/linux/s390/bits/fcntl.h b/sysdeps/unix/sysv/linux/s390/bits/fcntl.h
new file mode 100644
index 0000000000..a54784a977
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/bits/fcntl.h
@@ -0,0 +1,151 @@
+/* O_*, F_*, FD_* bit values for Linux.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#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
+
+#ifdef __USE_GNU
+# define O_DIRECT	 040000	/* Direct disk access.  */
+# define O_DIRECTORY	0200000	/* Must be a directory.  */
+# define O_NOFOLLOW	0400000	/* Do not follow links.  */
+#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
+
+#ifdef __USE_LARGEFILE64
+# define O_LARGEFILE	0100000
+#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).  */
+
+/* XXX missing */
+#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
+
+/* 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
+
+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').  */
+#ifndef __USE_FILE_OFFSET64
+    __off_t l_start;	/* Offset where the lock begins.  */
+    __off_t l_len;	/* Size of the locked area; zero means until EOF.  */
+#else
+    __off64_t l_start;	/* Offset where the lock begins.  */
+    __off64_t l_len;	/* Size of the locked area; zero means until EOF.  */
+#endif
+    __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	4 /* Don't need these pages.  */
+# define POSIX_FADV_NOREUSE	5 /* Data will be accessed once.  */
+#endif
diff --git a/sysdeps/unix/sysv/linux/s390/bits/mman.h b/sysdeps/unix/sysv/linux/s390/bits/mman.h
new file mode 100644
index 0000000000..70069e9f06
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/bits/mman.h
@@ -0,0 +1,93 @@
+/* Definitions for POSIX memory map interface.  Linux/s390 version.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#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_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	1		/* Sync memory asynchronously.  */
+#define MS_SYNC		4		/* Synchronous memory sync.  */
+#define MS_INVALIDATE	2		/* Invalidate the caches.  */
+
+/* Flags for `mlockall'.  */
+#define MCL_CURRENT	1		/* Lock all currently mapped pages.  */
+#define MCL_FUTURE	2		/* 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/bits/resource.h b/sysdeps/unix/sysv/linux/s390/bits/resource.h
new file mode 100644
index 0000000000..8dd3972a4b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/bits/resource.h
@@ -0,0 +1,205 @@
+/* Bit values & structures for resource limits.  Linux version.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#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 open files.  */
+  RLIMIT_NOFILE = 7,
+  RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same.  */
+#define RLIMIT_NOFILE RLIMIT_NOFILE
+#define RLIMIT_OFILE RLIMIT_OFILE
+
+  /* Address space limit.  */
+  RLIMIT_AS = 9,
+#define RLIMIT_AS RLIMIT_AS
+
+  /* Number of processes.  */
+  RLIMIT_NPROC = 6,
+#define RLIMIT_NPROC RLIMIT_NPROC
+
+  /* Locked-in-memory address space.  */
+  RLIMIT_MEMLOCK = 8,
+#define RLIMIT_MEMLOCK RLIMIT_MEMLOCK
+
+  RLIMIT_NLIMITS = 10,
+  RLIM_NLIMITS = RLIMIT_NLIMITS
+#define RLIMIT_NLIMITS RLIMIT_NLIMITS
+#define RLIM_NLIMITS RLIM_NLIMITS
+};
+
+/* Value to indicate that there is no limit.  */
+#ifndef __USE_FILE_OFFSET64
+# define RLIM_INFINITY ((unsigned long int) (~0UL))
+#else
+# define RLIM_INFINITY 0xffffffffffffffffuLL
+#endif
+
+#ifdef __USE_LARGEFILE64
+# define RLIM64_INFINITY 0xffffffffffffffffuLL
+#endif
+
+/* We can represent all limits.  */
+#define RLIM_SAVED_MAX	RLIM_INFINITY
+#define RLIM_SAVED_CUR	RLIM_INFINITY
+
+
+/* Type for resource quantity measurement.  */
+#ifndef __USE_FILE_OFFSET64
+typedef __rlim_t rlim_t;
+#else
+typedef __rlim64_t rlim_t;
+#endif
+#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/bits/time.h b/sysdeps/unix/sysv/linux/s390/bits/time.h
new file mode 100644
index 0000000000..dd1b0512b2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/bits/time.h
@@ -0,0 +1,79 @@
+/* System-dependent timing definitions.  Linux version.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/*
+ * Never include this file directly; use <time.h> instead.
+ */
+
+#ifndef __need_timeval
+# ifndef _BITS_TIME_H
+#  define _BITS_TIME_H	1
+
+/* ISO/IEC 9899:1990 7.12.1: <time.h>
+   The macro `CLOCKS_PER_SEC' is the number per second of the value
+   returned by the `clock' function. */
+/* CAE XSH, Issue 4, Version 2: <time.h>
+   The value of CLOCKS_PER_SEC is required to be 1 million on all
+   XSI-conformant systems. */
+#  define CLOCKS_PER_SEC  1000000
+
+#  ifndef __STRICT_ANSI__
+/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
+   presents the real value for clock ticks per second for the system.  */
+#   define CLK_TCK 100
+#  endif
+
+/* Clock ID used in clock and timer functions.  */
+typedef int __clockid_t;
+
+/* Timer ID returned by `timer_create'.  */
+typedef int __timer_t;
+
+#  ifdef __USE_POSIX199309
+/* Identifier for system-wide realtime clock.  */
+#   define CLOCK_REALTIME		0
+/* Monotonic clock.  */
+#   define CLOCK_MONOTONIC		1
+/* High-resolution timer from the CPU.  */
+#   define CLOCK_PROCESS_CPUTIME_ID	2
+/* Thread-specific CPU-time clock.  */
+#   define CLOCK_THREAD_CPUTIME_ID	3
+
+/* Flag to indicate time is absolute.  */
+#   define TIMER_ABSTIME		1
+#  endif
+
+# endif	/* bits/time.h */
+#endif
+
+#ifdef __need_timeval
+# undef __need_timeval
+# ifndef _STRUCT_TIMEVAL
+#  define _STRUCT_TIMEVAL	1
+#  include <bits/types.h>
+
+/* A time value that is accurate to the nearest
+   microsecond but also has a range of years.  */
+struct timeval
+  {
+    __time_t tv_sec;		/* Seconds.  */
+    __suseconds_t tv_usec;	/* Microseconds.  */
+  };
+# endif	/* struct timeval */
+#endif	/* need timeval */
diff --git a/sysdeps/unix/sysv/linux/s390/brk.c b/sysdeps/unix/sysv/linux/s390/brk.c
new file mode 100644
index 0000000000..fe22f382ef
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/brk.c
@@ -0,0 +1,57 @@
+/*
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sysdep.h>
+
+void *__curbrk = 0;
+
+/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
+   to work around different old braindamage in the old Linux/x86 ELF
+   dynamic linker.  Sigh.  */
+weak_alias (__curbrk, ___brk_addr)
+
+int
+__brk (void *addr)
+{
+  void *newbrk;
+
+  {
+    register long r0 asm ("2");
+    register void *__addr asm("2") = addr;
+
+    asm ("svc  %b1\n\t"		/* call sys_brk */
+	 : "=d" (r0)
+	 : "I" (SYS_ify(brk)), "r" (__addr)
+	 : _svc_clobber );
+    newbrk = (void *) r0;
+  }
+  __curbrk = newbrk;
+
+  if (newbrk < addr)
+    {
+      __set_errno (ENOMEM);
+      return -1;
+    }
+
+  return 0;
+}
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/s390/clone.S b/sysdeps/unix/sysv/linux/s390/clone.S
new file mode 100644
index 0000000000..bde800d3b2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/clone.S
@@ -0,0 +1,66 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* clone is even more special than fork as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sysdep.h>
+#define _ERRNO_H	1
+#include <bits/errno.h>
+
+/*int __clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg);*/
+/* sys_clone(void *child_stack, unsigned long flags) */
+
+	.text
+ENTRY(__clone)
+	/* Sanity check arguments & move registers */
+	ltr     %r1,%r2			/* no NULL function pointers */
+	lhi     %r2,-EINVAL
+	jz      SYSCALL_ERROR_LABEL
+	ltr     %r3,%r3			/* no NULL stack pointers */
+	jz      SYSCALL_ERROR_LABEL
+	/* move child_stack and flags, then call SVC */
+	lr      %r2,%r3
+	lr      %r3,%r4
+	svc     SYS_ify(clone)
+	ltr     %r2,%r2			/* check return code */
+	jm      SYSCALL_ERROR_LABEL
+	jz      thread_start
+	br      %r14
+
+thread_start:
+	/* fn is in gpr 1, arg in gpr 5 */
+	lr      %r2,%r5         /* set first parameter to void *arg */
+	sr      %r11,%r11	/* terminate the stack frame */
+	ahi     %r15,-96        /* make room on the stack for the save area */
+	basr    %r14,%r1        /* jump to fn */
+#ifdef PIC
+	basr    %r12,0
+.L0:    lr      %r1,%r12
+	al      %r12,.L1-.L0(%r12)
+	al      %r1,.L2-.L0(%r1)
+	br      %r1             /* branch to _exit -> thread termination */
+.L1:	.long   _GLOBAL_OFFSET_TABLE_ - .L0
+.L2:	.long   _exit@PLT - .L0
+#else
+	basr    %r1,0
+.L0:	al      %r1,.L1-.L0(0,%r1)
+	br      %r1             /* branch to _exit -> thread termination */
+.L1:	.long   _exit - .L0
+#endif
+PSEUDO_END (__clone)
diff --git a/sysdeps/unix/sysv/linux/s390/fchown.c b/sysdeps/unix/sysv/linux/s390/fchown.c
new file mode 100644
index 0000000000..3a69ecc9e7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/fchown.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fchown.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getegid.c b/sysdeps/unix/sysv/linux/s390/getegid.c
new file mode 100644
index 0000000000..37b4b4a530
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/getegid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getegid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/geteuid.c b/sysdeps/unix/sysv/linux/s390/geteuid.c
new file mode 100644
index 0000000000..ebcb555b5e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/geteuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/geteuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getgid.c b/sysdeps/unix/sysv/linux/s390/getgid.c
new file mode 100644
index 0000000000..0a4d6061f0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/getgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getgid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getgroups.c b/sysdeps/unix/sysv/linux/s390/getgroups.c
new file mode 100644
index 0000000000..20a7166103
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/getgroups.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getgroups.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getmsg.c b/sysdeps/unix/sysv/linux/s390/getmsg.c
new file mode 100644
index 0000000000..3a1fa08525
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/getmsg.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getmsg.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getpmsg.c b/sysdeps/unix/sysv/linux/s390/getpmsg.c
new file mode 100644
index 0000000000..bb65f81bf9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/getpmsg.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getpmsg.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getresgid.c b/sysdeps/unix/sysv/linux/s390/getresgid.c
new file mode 100644
index 0000000000..b703a414cc
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/getresgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresgid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getresuid.c b/sysdeps/unix/sysv/linux/s390/getresuid.c
new file mode 100644
index 0000000000..0b14cefe34
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/getresuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/getuid.c b/sysdeps/unix/sysv/linux/s390/getuid.c
new file mode 100644
index 0000000000..d682c79a49
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/getuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/mmap.S b/sysdeps/unix/sysv/linux/s390/mmap.S
new file mode 100644
index 0000000000..0ba58ccf82
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/mmap.S
@@ -0,0 +1,60 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+	.text
+
+ENTRY(__mmap)
+	/* Save registers and setup stack frame.  */
+	stm     %r6,%r15,24(%r15)
+	lr      %r1,%r15
+	l       %r0,4(0,%r15)           /* load eos */
+	ahi     %r15,-120               /* buy stack space */
+	st      %r1,0(0,%r15)           /* store back chain */
+	st      %r0,4(0,%r15)           /* store eos */
+
+	/* Store parameters on stack, because old_mmap
+	 * takes only one parameter: a pointer to the parameter area
+	 */
+	mvc     0x74(4,%r15),216(%r15)  /* move 'offset'  */
+	st      %r6,0x70(0,%r15)        /* store 'fd'     */
+	st      %r5,0x6C(0,%r15)        /* store 'flags'  */
+	st      %r4,0x68(0,%r15)        /* store 'prot'   */
+	st      %r3,0x64(0,%r15)        /* store 'length' */
+	st      %r2,0x60(0,%r15)        /* store 'start'  */
+
+	la      %r2,0x60(0,%r15)        /* load address of parameter list */
+	/* Do the system call trap.  */
+	svc     SYS_ify(mmap)
+
+	l       %r15,0(0,%r15)          /* load back chain */
+	lm      %r6,%r15,24(%r15)       /* load registers */
+
+	/* check gpr 2 for error */
+	lhi     %r0,-4096
+	clr     %r2,%r0
+	jnl     SYSCALL_ERROR_LABEL
+
+	/* Successful; return the syscall's value.  */
+	br      %r14
+
+PSEUDO_END (__mmap)
+
+weak_alias (__mmap, mmap)
diff --git a/sysdeps/unix/sysv/linux/s390/msgctl.c b/sysdeps/unix/sysv/linux/s390/msgctl.c
new file mode 100644
index 0000000000..9f9b8431a3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/msgctl.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/msgctl.c>
diff --git a/sysdeps/unix/sysv/linux/s390/profil-counter.h b/sysdeps/unix/sysv/linux/s390/profil-counter.h
new file mode 100644
index 0000000000..33630b9384
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/profil-counter.h
@@ -0,0 +1,27 @@
+/* Low-level statistical profiling support function.  Linux/s390 version.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <signal.h>
+#include <sigcontextinfo.h>
+
+static void
+profil_counter (int signo, SIGCONTEXT scp)
+{
+  profil_count ((void *) GET_PC (scp));
+}
diff --git a/sysdeps/unix/sysv/linux/s390/putmsg.c b/sysdeps/unix/sysv/linux/s390/putmsg.c
new file mode 100644
index 0000000000..ebc1680ca7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/putmsg.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/putmsg.c>
diff --git a/sysdeps/unix/sysv/linux/s390/putpmsg.c b/sysdeps/unix/sysv/linux/s390/putpmsg.c
new file mode 100644
index 0000000000..fbfa59892a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/putpmsg.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/putpmsg.c>
diff --git a/sysdeps/unix/sysv/linux/s390/register-dump.h b/sysdeps/unix/sysv/linux/s390/register-dump.h
new file mode 100644
index 0000000000..3c859aae88
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/register-dump.h
@@ -0,0 +1,130 @@
+/* Dump registers.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sys/uio.h>
+#include <stdio-common/_itoa.h>
+
+/* We will print the register dump in this format:
+
+ GPR0: XXXXXXXX  GPR1: XXXXXXXX  GPR2: XXXXXXXX  GPR3: XXXXXXXX
+ GPR4: XXXXXXXX  GPR5: XXXXXXXX  GPR6: XXXXXXXX  GPR7: XXXXXXXX
+ GPR8: XXXXXXXX  GPR9: XXXXXXXX  GPRA: XXXXXXXX  GPRB: XXXXXXXX
+ GPRC: XXXXXXXX  GPRD: XXXXXXXX  GPRE: XXXXXXXX  GPRF: XXXXXXXX
+
+ PSW.MASK: XXXXXXXX   PSW.ADDR: XXXXXXXX
+
+ ST(0) XXXX XXXXXXXXXXXXXXXX   ST(1) XXXX XXXXXXXXXXXXXXXX
+ ST(2) XXXX XXXXXXXXXXXXXXXX   ST(3) XXXX XXXXXXXXXXXXXXXX
+ ST(4) XXXX XXXXXXXXXXXXXXXX   ST(5) XXXX XXXXXXXXXXXXXXXX
+ ST(6) XXXX XXXXXXXXXXXXXXXX   ST(7) XXXX XXXXXXXXXXXXXXXX
+
+ */
+
+static void
+hexvalue (unsigned long int value, char *buf, size_t len)
+{
+  char *cp = _itoa_word (value, buf + len, 16, 0);
+  while (cp > buf)
+    *--cp = '0';
+}
+
+static void
+register_dump (int fd, struct sigcontext *ctx)
+{
+  char regs[19][8];
+  struct iovec iov[40];
+  size_t nr = 0;
+
+#define ADD_STRING(str) \
+  iov[nr].iov_base = (char *) str;					      \
+  iov[nr].iov_len = strlen (str);					      \
+  ++nr
+#define ADD_MEM(str, len) \
+  iov[nr].iov_base = str;						      \
+  iov[nr].iov_len = len;						      \
+  ++nr
+
+  /* Generate strings of register contents.  */
+  hexvalue (ctx->sregs->regs.gprs[0], regs[0], 8);
+  hexvalue (ctx->sregs->regs.gprs[1], regs[1], 8);
+  hexvalue (ctx->sregs->regs.gprs[2], regs[2], 8);
+  hexvalue (ctx->sregs->regs.gprs[3], regs[3], 8);
+  hexvalue (ctx->sregs->regs.gprs[4], regs[4], 8);
+  hexvalue (ctx->sregs->regs.gprs[5], regs[5], 8);
+  hexvalue (ctx->sregs->regs.gprs[6], regs[6], 8);
+  hexvalue (ctx->sregs->regs.gprs[7], regs[7], 8);
+  hexvalue (ctx->sregs->regs.gprs[8], regs[8], 8);
+  hexvalue (ctx->sregs->regs.gprs[9], regs[9], 8);
+  hexvalue (ctx->sregs->regs.gprs[10], regs[10], 8);
+  hexvalue (ctx->sregs->regs.gprs[11], regs[11], 8);
+  hexvalue (ctx->sregs->regs.gprs[12], regs[12], 8);
+  hexvalue (ctx->sregs->regs.gprs[13], regs[13], 8);
+  hexvalue (ctx->sregs->regs.gprs[14], regs[14], 8);
+  hexvalue (ctx->sregs->regs.gprs[15], regs[15], 8);
+  hexvalue (ctx->sregs->regs.psw.mask, regs[16], 8);
+  hexvalue (ctx->sregs->regs.psw.addr, regs[17], 8);
+
+  /* Generate the output.  */
+  ADD_STRING ("Register dump:\n\n GPR0: ");
+  ADD_MEM (regs[0], 8);
+  ADD_STRING ("  GPR1: ");
+  ADD_MEM (regs[1], 8);
+  ADD_STRING ("  GPR2: ");
+  ADD_MEM (regs[2], 8);
+  ADD_STRING ("  GPR3: ");
+  ADD_MEM (regs[3], 8);
+  ADD_STRING ("\n GPR4: ");
+  ADD_MEM (regs[4], 8);
+  ADD_STRING ("  GPR5: ");
+  ADD_MEM (regs[5], 8);
+  ADD_STRING ("  GPR6: ");
+  ADD_MEM (regs[6], 8);
+  ADD_STRING ("  GPR7: ");
+  ADD_MEM (regs[7], 8);
+  ADD_STRING ("\n GPR8: ");
+  ADD_MEM (regs[8], 8);
+  ADD_STRING ("  GPR9: ");
+  ADD_MEM (regs[9], 8);
+  ADD_STRING ("  GPRA: ");
+  ADD_MEM (regs[10], 8);
+  ADD_STRING ("  GPRB: ");
+  ADD_MEM (regs[11], 8);
+  ADD_STRING ("\n GPRC: ");
+  ADD_MEM (regs[12], 8);
+  ADD_STRING ("  GPRD: ");
+  ADD_MEM (regs[13], 8);
+  ADD_STRING ("  GPRE: ");
+  ADD_MEM (regs[14], 8);
+  ADD_STRING ("  GPRF: ");
+  ADD_MEM (regs[15], 8);
+  ADD_STRING ("\n\n PSW.MASK: ");
+  ADD_MEM (regs[16], 8);
+  ADD_STRING ("  PSW.ADDR: ");
+  ADD_MEM (regs[17], 8);
+  ADD_STRING ("  TRAP: ");
+  ADD_MEM (regs[18], 4);
+  ADD_STRING ("\n");
+
+  /* Write the stuff out.  */
+  writev (fd, iov, nr);
+}
+
+
+#define REGISTER_DUMP register_dump (fd, &ctx)
diff --git a/sysdeps/unix/sysv/linux/s390/semctl.c b/sysdeps/unix/sysv/linux/s390/semctl.c
new file mode 100644
index 0000000000..e9b1a483c9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/semctl.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/semctl.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setegid.c b/sysdeps/unix/sysv/linux/s390/setegid.c
new file mode 100644
index 0000000000..2e3a54c893
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/setegid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setegid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/seteuid.c b/sysdeps/unix/sysv/linux/s390/seteuid.c
new file mode 100644
index 0000000000..18e41d08c1
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/seteuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/seteuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setfsgid.c b/sysdeps/unix/sysv/linux/s390/setfsgid.c
new file mode 100644
index 0000000000..0886712569
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/setfsgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsgid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setfsuid.c b/sysdeps/unix/sysv/linux/s390/setfsuid.c
new file mode 100644
index 0000000000..a9f22eb8ab
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/setfsuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setgid.c b/sysdeps/unix/sysv/linux/s390/setgid.c
new file mode 100644
index 0000000000..377021d9ec
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/setgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setgid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setgroups.c b/sysdeps/unix/sysv/linux/s390/setgroups.c
new file mode 100644
index 0000000000..0e7086278f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/setgroups.c
@@ -0,0 +1,2 @@
+/* We also have to rewrite the kernel gid_t to the user land type.  */
+#include <sysdeps/unix/sysv/linux/i386/setgroups.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setregid.c b/sysdeps/unix/sysv/linux/s390/setregid.c
new file mode 100644
index 0000000000..99c57ad20f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/setregid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setregid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setresgid.c b/sysdeps/unix/sysv/linux/s390/setresgid.c
new file mode 100644
index 0000000000..daca1a4833
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/setresgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresgid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setresuid.c b/sysdeps/unix/sysv/linux/s390/setresuid.c
new file mode 100644
index 0000000000..3aeabe9ad7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/setresuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setreuid.c b/sysdeps/unix/sysv/linux/s390/setreuid.c
new file mode 100644
index 0000000000..8ad61226e9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/setreuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setreuid.c>
diff --git a/sysdeps/unix/sysv/linux/s390/setuid.c b/sysdeps/unix/sysv/linux/s390/setuid.c
new file mode 100644
index 0000000000..c8fa23e354
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/setuid.c
@@ -0,0 +1,2 @@
+#include <sysdeps/unix/sysv/linux/i386/setuid.c>
+
diff --git a/sysdeps/unix/sysv/linux/s390/shmctl.c b/sysdeps/unix/sysv/linux/s390/shmctl.c
new file mode 100644
index 0000000000..7eac6380dd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/shmctl.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/shmctl.c>
diff --git a/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h b/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h
new file mode 100644
index 0000000000..ccd5a41354
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h
@@ -0,0 +1,26 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <signal.h>
+
+#define SIGCONTEXT struct sigcontext *
+#define SIGCONTEXT_EXTRA_ARGS
+#define GET_PC(ctx)	((void *)((ctx)->sregs->regs.psw.addr))
+#define GET_FRAME(ctx)	(*(void **)((ctx)->sregs->regs.gprs[11]))
+#define GET_STACK(ctx)	((void *)((ctx)->sregs->regs.gprs[15]))
diff --git a/sysdeps/unix/sysv/linux/s390/socket.S b/sysdeps/unix/sysv/linux/s390/socket.S
new file mode 100644
index 0000000000..562b98f933
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/socket.S
@@ -0,0 +1,98 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+#include <socketcall.h>
+
+/* &%/$&!! preprocessor */
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+	.text
+/* The socket-oriented system calls are handled unusally in Linux.
+   They are all gated through the single `socketcall' system call number.
+   `socketcall' takes two arguments: the first is the subcode, specifying
+   which socket function is being called; and the second is a pointer to
+   the arguments to the specific function.
+
+   The .S files for the other calls just #define socket and #include this.  */
+
+#ifndef __socket
+#ifndef NO_WEAK_ALIAS
+#define __socket P(__,socket)
+#else
+#define __socket socket
+#endif
+#endif
+
+#ifndef NARGS      /* the socket.o object is compiled directly ... */
+#define NARGS 3
+#endif
+
+.globl __socket
+ENTRY(__socket)
+
+	/* Save registers and setup stack.  */
+	stm     %r6,%r15,24(%r15)       /* save registers */
+	lr      %r1,%r15
+	l       %r0,4(0,%r15)           /* load eos */
+	ahi     %r15,-120               /* buy stack space */
+	st      %r1,0(0,%r15)           /* store back chain */
+	st      %r0,4(0,%r15)           /* store eos */
+
+	/* Reorder arguments */
+#if (NARGS >= 6)
+	mvc     0x74(4,%r15),216(%r15)  /* move between parameter lists */
+#endif
+#if (NARGS >= 5)
+	st      %r6,0x70(0,%r15)        /* store into parameter list */
+#endif
+#if (NARGS >= 4)
+	st      %r5,0x6C(0,%r15)        /* store into parameter list */
+#endif
+#if (NARGS >= 3)
+	st      %r4,0x68(0,%r15)        /* store into parameter list */
+#endif
+#if (NARGS >= 2)
+	st      %r3,0x64(0,%r15)        /* store into parameter list */
+	st      %r2,0x60(0,%r15)
+#endif
+	/* load subcode for socket syscall */
+	lhi     %r2,P(SOCKOP_,socket)
+	la      %r3,0x60(0,%r15)        /* load address of parameter list */
+
+	/* Do the system call trap.  */
+	svc     SYS_ify(socketcall)
+
+	l       %r15,0(0,%r15)          /* load back chain */
+	lm      %r6,15,24(%r15)         /* load registers */
+
+	/* gpr2 is < 0 if there was an error.  */
+	lhi     %r0,-125
+	clr     %r2,%r0
+	jnl     SYSCALL_ERROR_LABEL
+
+	/* Successful; return the syscall's value.  */
+	br      %r14
+
+PSEUDO_END (__socket)
+
+#ifndef NO_WEAK_ALIAS
+weak_alias (__socket, socket)
+#endif
diff --git a/sysdeps/unix/sysv/linux/s390/sys/elf.h b/sysdeps/unix/sysv/linux/s390/sys/elf.h
new file mode 100644
index 0000000000..ecf6705a05
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/sys/elf.h
@@ -0,0 +1,28 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_ELF_H
+#define _SYS_ELF_H	1
+
+/*
+ * ELF register definitions..
+ */
+
+#include <asm/elf.h>
+
+#endif	/* _SYS_ELF_H */
diff --git a/sysdeps/unix/sysv/linux/s390/sys/ptrace.h b/sysdeps/unix/sysv/linux/s390/sys/ptrace.h
new file mode 100644
index 0000000000..b82730e559
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/sys/ptrace.h
@@ -0,0 +1,138 @@
+/* `ptrace' debugger support interface.  Linux version.
+   Copyright (C) 2000 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_PTRACE_H
+#define _SYS_PTRACE_H	1
+
+#include <features.h>
+
+__BEGIN_DECLS
+#ifdef _LINUX_PTRACE_H
+/* Kludge to stop stuff gdb & strace compiles from getting upset
+ */
+#undef PTRACE_TRACEME
+#undef PTRACE_PEEKTEXT
+#undef PTRACE_PEEKDATA
+#undef PTRACE_PEEKUSR
+#undef PTRACE_POKETEXT
+#undef PTRACE_POKEDATA
+#undef PTRACE_POKEUSR
+#undef PTRACE_CONT
+#undef PTRACE_KILL
+#undef PTRACE_SINGLESTEP
+
+#undef PTRACE_ATTACH
+#undef PTRACE_DETACH
+
+#undef PTRACE_SYSCALL
+#endif
+/* Type of the REQUEST argument to `ptrace.'  */
+enum __ptrace_request
+{
+  /* Indicate that the process making this request should be traced.
+     All signals received by this process can be intercepted by its
+     parent, and its parent can use the other `ptrace' requests.  */
+  PTRACE_TRACEME = 0,
+#define PT_TRACE_ME PTRACE_TRACEME
+
+  /* Return the word in the process's text space at address ADDR.  */
+  PTRACE_PEEKTEXT = 1,
+#define PT_READ_I PTRACE_PEEKTEXT
+
+  /* Return the word in the process's data space at address ADDR.  */
+  PTRACE_PEEKDATA = 2,
+#define PT_READ_D PTRACE_PEEKDATA
+
+  /* Return the word in the process's user area at offset ADDR.  */
+  PTRACE_PEEKUSER = 3,
+#define PT_READ_U PTRACE_PEEKUSER
+
+  /* Write the word DATA into the process's text space at address ADDR.  */
+  PTRACE_POKETEXT = 4,
+#define PT_WRITE_I PTRACE_POKETEXT
+
+  /* Write the word DATA into the process's data space at address ADDR.  */
+  PTRACE_POKEDATA = 5,
+#define PT_WRITE_D PTRACE_POKEDATA
+
+  /* Write the word DATA into the process's user area at offset ADDR.  */
+  PTRACE_POKEUSER = 6,
+#define PT_WRITE_U PTRACE_POKEUSER
+
+  /* Continue the process.  */
+  PTRACE_CONT = 7,
+#define PT_CONTINUE PTRACE_CONT
+
+  /* Kill the process.  */
+  PTRACE_KILL = 8,
+#define PT_KILL PTRACE_KILL
+
+  /* Single step the process.
+     This is not supported on all machines.  */
+  PTRACE_SINGLESTEP = 9,
+#define PT_STEP PTRACE_SINGLESTEP
+
+  /* Get all general purpose registers used by a processes.
+     This is not supported on all machines.  */
+   PTRACE_GETREGS = 12,
+#define PT_GETREGS PTRACE_GETREGS
+
+  /* Set all general purpose registers used by a processes.
+     This is not supported on all machines.  */
+   PTRACE_SETREGS = 13,
+#define PT_SETREGS PTRACE_SETREGS
+
+  /* Get all floating point registers used by a processes.
+     This is not supported on all machines.  */
+   PTRACE_GETFPREGS = 14,
+#define PT_GETFPREGS PTRACE_GETFPREGS
+
+  /* Set all floating point registers used by a processes.
+     This is not supported on all machines.  */
+   PTRACE_SETFPREGS = 15,
+#define PT_SETFPREGS PTRACE_SETFPREGS
+
+  /* Attach to a process that is already running. */
+  PTRACE_ATTACH = 16,
+#define PT_ATTACH PTRACE_ATTACH
+
+  /* Detach from a process attached to with PTRACE_ATTACH.  */
+  PTRACE_DETACH = 17,
+#define PT_DETACH PTRACE_DETACH
+
+  /* Continue and stop at the next (return from) syscall.  */
+  PTRACE_SYSCALL = 24
+#define PT_SYSCALL PTRACE_SYSCALL
+};
+
+/* Perform process tracing functions.  REQUEST is one of the values
+   above, and determines the action to be taken.
+   For all requests except PTRACE_TRACEME, PID specifies the process to be
+   traced.
+
+   PID and the other arguments described above for the various requests should
+   appear (those that are used for the particular request) as:
+     pid_t PID, void *ADDR, int DATA, void *ADDR2
+   after REQUEST.  */
+extern long int ptrace (enum __ptrace_request __request, ...);
+
+__END_DECLS
+
+#endif /* _SYS_PTRACE_H */
diff --git a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h b/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
new file mode 100644
index 0000000000..4723ce1810
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
@@ -0,0 +1,96 @@
+/* Copyright (C) 2000 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
+
+#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 general register.  */
+typedef int greg_t;
+
+/* Number of general registers.  */
+#define NGREG	16
+
+/* Number of each register is the `gregset_t' array.  */
+enum
+{
+  GPR0 = 0,
+#define GPR0 GPR0
+  GPR1,
+#define GPR1 GPR1
+  GPR2,
+#define GPR2 GPR2
+  GPR3,
+#define GPR3 GPR3
+  GPR4,
+#define GPR4 GPR4
+  GPR5,
+#define GPR5 GPR5
+  GPR6,
+#define GPR6 GPR6
+  GPR7,
+#define GPR7 GPR7
+  GPR8,
+#define GPR8 GPR8
+  GPR9,
+#define GPR9 GPR9
+  GPRA,
+#define GPRA GPRA
+  GPRB,
+#define GPRB GPRB
+  GPRC,
+#define GPRC GPRC
+  GPRD,
+#define GPRD GPRD
+  GPRE,
+#define GPRE GPRE
+  GPRF
+#define GPRF 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;
+
+/* 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/sys/user.h b/sysdeps/unix/sysv/linux/s390/sys/user.h
new file mode 100644
index 0000000000..50821826e4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/sys/user.h
@@ -0,0 +1,24 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_USER_H
+#define _SYS_USER_H	1
+
+#include <asm/user.h>
+
+#endif	/* _SYS_USER_H */
diff --git a/sysdeps/unix/sysv/linux/s390/syscall.S b/sysdeps/unix/sysv/linux/s390/syscall.S
new file mode 100644
index 0000000000..dbd8d6887c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/syscall.S
@@ -0,0 +1,51 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+/* Please consult the file sysdeps/unix/sysv/linux/s390/sysdep.h for
+   more information about the value -4095 used below.*/
+
+ENTRY (syscall)
+	/* Save registers and setup stack.  */
+	stm     %r6,%r15,24(%r15)  /* save registers */
+	lr      %r1,%r15
+	l       %r0,4(0,%r15)      /* load eos */
+	ahi     %r15,-96           /* buy stack space */
+	st      %r1,0(0,%r15)      /* store back chain */
+	st      %r0,4(0,%r15)      /* store eos */
+
+	lr     %r1,%r2             /* move syscall number */
+	lr     %r2,%r3             /* first parameter  */
+	lr     %r3,%r4             /* second parameter */
+	lr     %r4,%r5             /* third parameter  */
+	lr     %r5,%r6             /* fourth parameter */
+	l      %r6,192(%r15)       /* fifth parameter  */
+	basr   %r7,0
+.L0:    ex     %r1,.L1-.L0(%r7)    /* lsb of R1 is subsituted as SVC number */
+
+	l       %r15,0(0,%r15)     /* load back chain */
+	lm      %r6,15,24(%r15)    /* load registers */
+
+	lhi    %r0,-4095
+	clr    %r2,%r0             /* check R2 for error */
+	jnl    SYSCALL_ERROR_LABEL
+	br     %r14                /* return to caller */
+.L1:    .word  0x0A00              /* opcode for SVC 0 */
+PSEUDO_END (syscall)
diff --git a/sysdeps/unix/sysv/linux/s390/sysdep.S b/sysdeps/unix/sysv/linux/s390/sysdep.S
new file mode 100644
index 0000000000..5515c0f9ce
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/sysdep.S
@@ -0,0 +1,104 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+/* Because the Linux version is in fact m68k/ELF and the start.? file
+   for this system (sysdeps/m68k/elf/start.S) is also used by The Hurd
+   and therefore this files must not contain the definition of the
+   `errno' variable (I don't know why, ask Roland), we have to define
+   it somewhere else.
+
+    ...and this place is here.  */
+	.bss
+	.globl	errno
+	.type errno,@object
+	.size errno,4
+errno:
+	.space	4
+weak_alias (errno, _errno)
+
+/* The following code is only used in the shared library when we
+   compile the reentrant version.  Otherwise each system call defines
+   each own version.  */
+
+/* The syscall stubs jump here when they detect an error.  */
+
+#undef CALL_MCOUNT
+#define CALL_MCOUNT
+
+	.text
+ENTRY(__syscall_error)
+#ifndef PIC
+#ifndef _LIBC_REENTRANT
+	lcr     %r2,%r2
+	basr    %r1,0
+.L0:    l       %r1,.L1-.L0(%r1)
+	st      %r2,0(0,%r1)
+	lhi     %r2,-1
+	br      %r14
+.L1:    .long  errno
+#else
+	stm     %r11,%r15,44(%r15)
+	lr      %r0,%r15
+	ahi     %r15,-96
+	st      %r0,0(%r15)
+	lcr     %r11,%r2
+	basr    %r13,0
+.L0:	l       %r1,.L1-.L0(%r13)
+	basr    %r14,%r1
+	st      %r11,0(%r2)
+	lhi     %r2,-1
+	l       %r15,0(%r15)
+	lm      %r11,%r15,44(%r15)
+	br      %r14
+.L1:	.long  __errno_location
+#endif
+#else
+#ifndef _LIBC_REENTRANT
+	basr    %r1,0
+.L0:    al      %r1,.L1-.L0(%r1)
+	l       %r1,errno@GOT12(%r1)
+	lcr     %r2,%r2
+	st      %r2,0(0,%r1)
+	lhi     %r2,-1
+	br      %r14
+.L1:    .long   _GLOBAL_OFFSET_TABLE_-0b
+#else
+	stm     %r11,%r15,44(%r15)
+	lr      %r0,%r15
+	ahi     %r15,-96
+	st      %r0,0(%r15)
+	lcr     %r11,%r2
+	basr    %r13,0
+.L0:	l       %r12,.L1-.L0(%r13)
+	ar      %r12,%r13
+	l       %r14,.L2-.L0(%r13)
+	bas     %r14,0(%r14,%r13)
+	st      %r11,0(0,%r2)
+	lhi     %r2,-1
+	l       %r15,0(%r15)
+	lm      %r11,%r15,44(%r15)
+	br      %r14
+.L1:	.long _GLOBAL_OFFSET_TABLE_ - .L0
+.L2:    .long __errno_location@PLT - .L0
+#endif
+#endif
+
+END (__syscall_error)
diff --git a/sysdeps/unix/sysv/linux/s390/sysdep.h b/sysdeps/unix/sysv/linux/s390/sysdep.h
new file mode 100644
index 0000000000..be58e7f94d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/sysdep.h
@@ -0,0 +1,212 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _LINUX_S390_SYSDEP_H
+#define _LINUX_S390_SYSEDP_H
+
+#include <sysdeps/s390/sysdep.h>
+#include <sysdeps/unix/sysdep.h>
+
+/* For Linux we can use the system call table in the header file
+	/usr/include/asm/unistd.h
+   of the kernel.  But these symbols do not follow the SYS_* syntax
+   so we have to redefine the `SYS_ify' macro here.  */
+/* in newer 2.1 kernels __NR_syscall is missing so we define it here */
+#define __NR_syscall 0
+
+#undef SYS_ify
+#define SYS_ify(syscall_name)	__NR_##syscall_name
+
+/* ELF-like local names start with `.L'.  */
+#undef L
+#define L(name)	.L##name
+
+#ifdef __ASSEMBLER__
+
+/* Linux uses a negative return value to indicate syscall errors, unlike
+   most Unices, which use the condition codes' carry flag.
+
+   Since version 2.1 the return value of a system call might be negative
+   even if the call succeeded.  E.g., the `lseek' system call might return
+   a large offset.  Therefore we must not anymore test for < 0, but test
+   for a real error by making sure the value in gpr2 is a real error
+   number.  Linus said he will make sure the no syscall returns a value
+   in -1 .. -4095 as a valid result so we can savely test with -4095.  */
+
+#define SYSCALL_ERROR_LABEL 0f
+
+#undef PSEUDO
+#define	PSEUDO(name, syscall_name, args)				      \
+  .text;                                                                      \
+  ENTRY (name)							              \
+    DO_CALL (args, syscall_name);                                             \
+    lhi  %r4,-4095 ;                                                          \
+    clr  %r2,%r4 ;		                                              \
+    jnl  SYSCALL_ERROR_LABEL ;                                                \
+  L(pseudo_end):
+
+#undef PSEUDO_END
+#define PSEUDO_END(name)						      \
+  SYSCALL_ERROR_HANDLER;						      \
+  END (name)
+
+#ifndef _LIBC_REENTRANT
+#ifndef PIC
+#define SYSCALL_ERROR_HANDLER                                                 \
+0:  lcr     %r2,%r2 ;                                                         \
+    basr    %r1,0 ;                                                           \
+1:  l       %r1,2f-1b(%r1)                                                    \
+    st      %r2,0(%r1)                                                        \
+    lhi     %r2,-1                                                            \
+    br      %r14                                                              \
+2:  .long   errno
+#else
+#define SYSCALL_ERROR_HANDLER						      \
+0:  basr    %r1,0 ;                                                           \
+1:  al      %r1,2f-1b(%r1) ;                                                  \
+    l       %r1,errno@GOT12(%r1) ;                                            \
+    lcr     %r2,%r2 ;							      \
+    st      %r2,0(%r1) ;						      \
+    lhi     %r2,-1 ;                                                          \
+    br      %r14 ;                                                            \
+2:  .long   _GLOBAL_OFFSET_TABLE_-1b
+#endif /* PIC */
+#else
+#define SYSCALL_ERROR_HANDLER                                                 \
+0:  basr    %r1,0 ;                                                           \
+1:  al      %r1,2f-1b(%r1) ;                                                  \
+    br      %r1 ;                                                             \
+2:  .long   __syscall_error@PLT-1b
+#endif /* _LIBC_REENTRANT */
+
+/* Linux takes system call arguments in registers:
+
+	syscall number	1	     call-clobbered
+	arg 1		2	     call-clobbered
+	arg 2		3	     call-clobbered
+	arg 3		4	     call-clobbered
+	arg 4		5	     call-clobbered
+	arg 5		6	     call-saved
+
+   (Of course a function with say 3 arguments does not have entries for
+   arguments 4 and 5.)
+   S390 does not need to do ANY stack operations to get its parameters
+   right.
+ */
+
+#define DO_CALL(args, syscall)						      \
+    svc     SYS_ify (syscall)
+
+#define ret                                                                   \
+    br      14
+
+#endif /* __ASSEMBLER__ */
+
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...)                                     \
+  ({                                                                          \
+    DECLARGS_##nr(args)                                                       \
+    int err;                                                                  \
+    asm volatile (                                                            \
+    LOADARGS_##nr                                                             \
+    "svc    %b1\n\t"                                                          \
+    "lr     %0,%%r2\n\t"                                                      \
+    : "=d" (err)                                                              \
+    : "I" (__NR_##name) ASMFMT_##nr                                           \
+    : "memory", "cc", "2", "3", "4", "5", "6");                               \
+    if (err >= 0xfffff001)                                                    \
+     {                                                                        \
+       __set_errno(-err);                                                     \
+       err = 0xffffffff;                                                      \
+     }                                                                        \
+    (int) err; })
+
+#define DECLARGS_0()
+#define DECLARGS_1(arg1) \
+	unsigned int gpr2 = (unsigned int) (arg1);
+#define DECLARGS_2(arg1, arg2) \
+	DECLARGS_1(arg1) \
+	unsigned int gpr3 = (unsigned int) (arg2);
+#define DECLARGS_3(arg1, arg2, arg3) \
+	DECLARGS_2(arg1, arg2) \
+	unsigned int gpr4 = (unsigned int) (arg3);
+#define DECLARGS_4(arg1, arg2, arg3, arg4) \
+	DECLARGS_3(arg1, arg2, arg3) \
+	unsigned int gpr5 = (unsigned int) (arg4);
+#define DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \
+	DECLARGS_4(arg1, arg2, arg3, arg4) \
+	unsigned int gpr6 = (unsigned int) (arg5);
+
+#define LOADARGS_0
+#define LOADARGS_1            "L     2,%2\n\t"
+#define LOADARGS_2 LOADARGS_1 "L     3,%3\n\t"
+#define LOADARGS_3 LOADARGS_2 "L     4,%4\n\t"
+#define LOADARGS_4 LOADARGS_3 "L     5,%5\n\t"
+#define LOADARGS_5 LOADARGS_4 "L     6,%6\n\t"
+
+#define ASMFMT_0
+#define ASMFMT_1 , "m" (gpr2)
+#define ASMFMT_2 , "m" (gpr2), "m" (gpr3)
+#define ASMFMT_3 , "m" (gpr2), "m" (gpr3), "m" (gpr4)
+#define ASMFMT_4 , "m" (gpr2), "m" (gpr3), "m" (gpr4), "m" (gpr5)
+#define ASMFMT_5 , "m" (gpr2), "m" (gpr3), "m" (gpr4), "m" (gpr5), "m" (gpr6)
+
+#if 0
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...)                                     \
+  ({                                                                          \
+    DECLARGS_##nr(args)                                                       \
+    asm volatile (                                                            \
+    "svc    %b1\n\t"                                                          \
+    : "+d" (gpr2)                                                             \
+    : "I" (__NR_##name) ASMFMT_##nr : "memory", "cc");                        \
+    if (gpr2 >= 0xfffff001)                                                   \
+     {                                                                        \
+       __set_errno(-gpr2);                                                    \
+       gpr2 = 0xffffffff;                                                     \
+     }                                                                        \
+    (int) gpr2; })
+
+#define DECLARGS_0() \
+	register unsigned int gpr2 asm("2");
+#define DECLARGS_1(arg1) \
+	register unsigned int gpr2 asm("2") = (unsigned int) (arg1);
+#define DECLARGS_2(arg1, arg2) \
+	DECLARGS_1(arg1) \
+	register unsigned int gpr3 asm("3") = (unsigned int) (arg2);
+#define DECLARGS_3(arg1, arg2, arg3) \
+	DECLARGS_2(arg1, arg2) \
+	register unsigned int gpr4 asm("4") = (unsigned int) (arg3);
+#define DECLARGS_4(arg1, arg2, arg3, arg4) \
+	DECLARGS_3(arg1, arg2, arg3) \
+	register unsigned int gpr5 asm("5") = (unsigned int) (arg4);
+#define DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \
+	DECLARGS_4(arg1, arg2, arg3, arg4) \
+	register unsigned int gpr6 asm("6") = (unsigned int) (arg5);
+
+#define ASMFMT_0
+#define ASMFMT_1
+#define ASMFMT_2 , "d" (gpr3)
+#define ASMFMT_3 , "d" (gpr3), "d" (gpr4)
+#define ASMFMT_4 , "d" (gpr3), "d" (gpr4), "d" (gpr5)
+#define ASMFMT_5 , "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6)
+
+#endif /* 0 */
+
+#endif /* _LINUX_S390_SYSDEP_H */