about summary refs log tree commit diff
path: root/REORG.TODO/sysdeps/s390/s390-32
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/sysdeps/s390/s390-32')
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/Implies1
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/Makefile9
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/Versions6
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/__longjmp.c83
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/add_n.S63
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/addmul_1.S58
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/backtrace.c148
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/bcopy.S85
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/bits/wordsize.h11
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/bsd-_setjmp.S1
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/bsd-setjmp.S1
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/bzero.S42
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/crti.S102
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/crtn.S47
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/dl-machine.h522
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/dl-sysdep.h23
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/dl-trampoline.S33
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/dl-trampoline.h231
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/memchr.S41
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/memcmp.S66
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/memcpy.S89
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/memset.S65
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/mul_1.S55
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/Makefile4
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/memchr.c21
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/memcmp-s390.S107
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/memcmp.c27
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/memcpy-s390.S128
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/memcpy.c27
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/memset-s390.S116
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/memset.c26
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/strcmp.c21
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/strcpy.c21
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/multiarch/strncpy.c21
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/s390-mcount.S89
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/setjmp.S123
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/stackguard-macros.h15
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/start.S211
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/strcmp.S41
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/strcpy.S36
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/strncpy.S79
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/sub_n.S62
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/symbol-hacks.h21
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/sysdep.h101
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/tls-macros.h104
-rw-r--r--REORG.TODO/sysdeps/s390/s390-32/tst-audit.h25
46 files changed, 3208 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/s390/s390-32/Implies b/REORG.TODO/sysdeps/s390/s390-32/Implies
new file mode 100644
index 0000000000..39a34c5f57
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/Implies
@@ -0,0 +1 @@
+wordsize-32
diff --git a/REORG.TODO/sysdeps/s390/s390-32/Makefile b/REORG.TODO/sysdeps/s390/s390-32/Makefile
new file mode 100644
index 0000000000..a07f2986ae
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/Makefile
@@ -0,0 +1,9 @@
+ifeq ($(subdir),gmon)
+sysdep_routines += s390-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/REORG.TODO/sysdeps/s390/s390-32/Versions b/REORG.TODO/sysdeps/s390/s390-32/Versions
new file mode 100644
index 0000000000..2b020f8f58
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/Versions
@@ -0,0 +1,6 @@
+libc {
+  GLIBC_2.0 {
+    # Functions from libgcc.
+    __divdi3; __moddi3; __udivdi3; __umoddi3;
+  }
+}
diff --git a/REORG.TODO/sysdeps/s390/s390-32/__longjmp.c b/REORG.TODO/sysdeps/s390/s390-32/__longjmp.c
new file mode 100644
index 0000000000..abdd9641e6
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/__longjmp.c
@@ -0,0 +1,83 @@
+/* Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <sysdep.h>
+#include <setjmp.h>
+#include <bits/setjmp.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stap-probe.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)
+{
+#ifdef PTR_DEMANGLE
+  uintptr_t guard = THREAD_GET_POINTER_GUARD ();
+# ifdef CHECK_SP
+  CHECK_SP (env, guard);
+# endif
+#elif defined CHECK_SP
+  CHECK_SP (env, 0);
+#endif
+  register int r2 __asm__ ("%r2") = val == 0 ? 1 : val;
+#ifdef PTR_DEMANGLE
+  register uintptr_t r3 __asm__ ("%r3") = guard;
+  register void *r1 __asm__ ("%r1") = (void *) env;
+#endif
+  /* Restore registers and jump back.  */
+  __asm__ __volatile__ (
+		/* longjmp probe expects longjmp first argument, second
+		   argument and target address.  */
+#ifdef PTR_DEMANGLE
+			"lm   %%r4,%%r5,32(%1)\n\t"
+			"xr   %%r4,%2\n\t"
+			"xr   %%r5,%2\n\t"
+			LIBC_PROBE_ASM (longjmp, 4@%1 -4@%0 4@%%r4)
+#else
+			LIBC_PROBE_ASM (longjmp, 4@%1 -4@%0 4@%%r14)
+#endif
+
+			/* restore fpregs  */
+			"ld   %%f6,48(%1)\n\t"
+			"ld   %%f4,40(%1)\n\t"
+
+			/* restore gregs and return to jmp_buf target  */
+#ifdef PTR_DEMANGLE
+			"lm   %%r6,%%r13,0(%1)\n\t"
+			"lr   %%r15,%%r5\n\t"
+			LIBC_PROBE_ASM (longjmp_target, 4@%1 -4@%0 4@%%r4)
+			"br   %%r4"
+#else
+			"lm   %%r6,%%r15,0(%1)\n\t"
+			LIBC_PROBE_ASM (longjmp_target, 4@%1 -4@%0 4@%%r14)
+			"br   %%r14"
+#endif
+			: : "r" (r2),
+#ifdef PTR_DEMANGLE
+			  "r" (r1), "r" (r3)
+#else
+			  "a" (env)
+#endif
+			);
+
+  /* Avoid `volatile function does return' warnings.  */
+  for (;;);
+}
diff --git a/REORG.TODO/sysdeps/s390/s390-32/add_n.S b/REORG.TODO/sysdeps/s390/s390-32/add_n.S
new file mode 100644
index 0000000000..ed9cc27693
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/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) 2000-2017 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 Lesser General Public License as published by
+   the Free Software Foundation; either version 2.1 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 Lesser General Public
+   License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with the GNU MP Library; see the file COPYING.LIB.  If not,
+   see <http://www.gnu.org/licenses/>.  */
+
+/*
+  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)
+	st     %r6,24(%r15)   # save register 6
+	cfi_offset (%r6, -72)
+	sr     %r1,%r1
+        lhi    %r0,1          # cannot use ahi to add carry, use alr
+.L0:	l      %r6,0(%r1,%r3) # .L0 -> no carry from last add
+	al     %r6,0(%r1,%r4)
+	st     %r6,0(%r1,%r2)
+	la     %r1,4(0,%r1)
+	brc    3,.L3
+.L1:	brct   %r5,.L0
+	slr    %r2,%r2        # no last carry to return
+	j      .Lexit
+.L2:    l      %r6,0(%r1,%r3) # .L2 -> carry from last add
+	al     %r6,0(%r1,%r4)
+	brc    3,.L4
+	alr    %r6,%r0        # no carry yet, add carry from last add
+	st     %r6,0(%r1,%r2)
+	la     %r1,4(0,%r1)
+	brc    12,.L1          # new carry ?
+.L3:	brct   %r5,.L2
+	lr     %r2,%r0        # return last carry
+	j      .Lexit
+.L4:	alr    %r6,%r0        # already a carry, add carry from last add
+	st     %r6,0(%r1,%r2)
+	la     %r1,4(0,%r1)
+	brct   %r5,.L2
+	lr     %r2,%r0        # return last carry
+.Lexit:	l      %r6,24(%r15)   # restore register 6
+	br     %r14
+END(__mpn_add_n)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/addmul_1.S b/REORG.TODO/sysdeps/s390/s390-32/addmul_1.S
new file mode 100644
index 0000000000..6a4318ce49
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/addmul_1.S
@@ -0,0 +1,58 @@
+/* S390 __mpn_addmul_1 -- Multiply a limb vector with a limb and add
+   the result to a second limb vector.
+   Copyright (C) 2000-2017 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 Lesser General Public License as published by
+   the Free Software Foundation; either version 2.1 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 Lesser General Public
+   License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with the GNU MP Library; see the file COPYING.LIB.  If not,
+   see <http://www.gnu.org/licenses/>.  */
+
+/*
+   INPUT PARAMETERS
+   res_ptr	%r2
+   s1_ptr	%r3
+   sizeP	%r4
+   s2_limb	%r5
+*/
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+	.text
+ENTRY(__mpn_addmul_1)
+	st     %r6,24(%r15)
+	cfi_offset (%r6, -72)
+	slr    %r6,%r6            # cy_limb = 0
+.L0:	icm    %r1,15,0(%r3)      # get s1_ptr[i]
+	mr     %r0,%r5            # umul_ppmm(prod_high,prod_low,s1_ptr[j],s2_limb)
+	jnm    .L1
+	alr    %r0,%r5
+.L1:	ltr    %r5,%r5
+	jnm    .L2
+	al     %r0,0(%r3)
+.L2:	alr    %r1,%r6            # prod_low += cy_limb
+	lr     %r6,%r0            # cy_limb = prod_high
+	brc    12,.L3
+	ahi    %r6,1              #           + (prod_low < cy_limb)
+.L3:	al     %r1,0(%r2)         # prod_low += res_ptr[i]
+	brc    12,.L4
+	ahi    %r6,1              # cy_limb++
+.L4:	st     %r1,0(%r2)
+	la     %r2,4(0,%r2)
+	la     %r3,4(0,%r3)
+	brct   %r4,.L0
+        lr     %r2,%r6            # return cy_limb
+	l      %r6,24(%r15)
+.Lexit:	br     %r14
+END(__mpn_addmul_1)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/backtrace.c b/REORG.TODO/sysdeps/s390/s390-32/backtrace.c
new file mode 100644
index 0000000000..705b05d139
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/backtrace.c
@@ -0,0 +1,148 @@
+/* Return backtrace of current program state.
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <libc-lock.h>
+#include <dlfcn.h>
+#include <execinfo.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <unwind.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 ->    +------------------+
+             4 | back chain       |  0
+             4 | end of stack     |  4
+             8 | glue             |  8
+             8 | scratch          | 16
+            40 | save area r6-r15 | 24
+            16 | save area f4,f6  | 64
+            16 | empty            | 80
+               +------------------+
+   r14 in the save area holds the return address.
+*/
+
+struct layout
+{
+  int back_chain;
+  int end_of_stack;
+  int glue[2];
+  int scratch[2];
+  int save_grps[10];
+  int save_fp[4];
+  int empty[2];
+};
+
+struct trace_arg
+{
+  void **array;
+  int cnt, size;
+};
+
+#ifdef SHARED
+static _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *);
+static _Unwind_Ptr (*unwind_getip) (struct _Unwind_Context *);
+
+static void
+init (void)
+{
+  void *handle = __libc_dlopen ("libgcc_s.so.1");
+
+  if (handle == NULL)
+    return;
+
+  unwind_backtrace = __libc_dlsym (handle, "_Unwind_Backtrace");
+  unwind_getip = __libc_dlsym (handle, "_Unwind_GetIP");
+  if (unwind_getip == NULL)
+    unwind_backtrace = NULL;
+}
+
+static int
+__backchain_backtrace (void **array, int size)
+{
+  /* We assume that all the code is generated with frame pointers set.  */
+  struct layout *stack;
+  int cnt = 0;
+
+  __asm__ ("LR  %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++] = (void *) (stack->save_grps[8] & 0x7fffffff);
+
+      stack = (struct layout *) stack->back_chain;
+    }
+
+  return cnt;
+}
+#else
+# define unwind_backtrace _Unwind_Backtrace
+# define unwind_getip _Unwind_GetIP
+#endif
+
+static _Unwind_Reason_Code
+backtrace_helper (struct _Unwind_Context *ctx, void *a)
+{
+  struct trace_arg *arg = a;
+
+  /* We are first called with address in the __backtrace function.
+     Skip it.  */
+  if (arg->cnt != -1)
+    arg->array[arg->cnt] = (void *) unwind_getip (ctx);
+  if (++arg->cnt == arg->size)
+    return _URC_END_OF_STACK;
+  return _URC_NO_REASON;
+}
+
+int
+__backtrace (void **array, int size)
+{
+  struct trace_arg arg = { .array = array, .size = size, .cnt = -1 };
+
+  if (size <= 0)
+    return 0;
+
+#ifdef SHARED
+  __libc_once_define (static, once);
+
+  __libc_once (once, init);
+
+  if (unwind_backtrace == NULL)
+    return __backchain_backtrace (array, size);
+#endif
+
+  unwind_backtrace (backtrace_helper, &arg);
+
+  return arg.cnt != -1 ? arg.cnt : 0;
+}
+
+weak_alias (__backtrace, backtrace)
+libc_hidden_def (__backtrace)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/bcopy.S b/REORG.TODO/sysdeps/s390/s390-32/bcopy.S
new file mode 100644
index 0000000000..06f51f3aa7
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/bcopy.S
@@ -0,0 +1,85 @@
+/* bcopy -- copy a block from source to destination.  S/390 version.
+   This file is part of the GNU C Library.
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* 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)
+	ltr     %r1,%r4             # zero bcopy ?
+	jz      .L4
+        clr     %r2,%r3             # check against destructive overlap
+        jnl     .L0
+        alr     %r1,%r2
+        clr     %r1,%r3
+        jh      .L7
+.L0:	ahi     %r4,-1              # length - 1
+	lr      %r1,%r4
+	srl     %r1,8
+	ltr     %r1,%r1             # < 256 bytes to move ?
+	jz      .L2
+	chi     %r1,255             # > 1MB to move ?
+	jh      .L5
+.L1:	mvc     0(256,%r3),0(%r2)   # move in 256 byte chunks
+	la      %r2,256(%r2)
+	la      %r3,256(%r3)
+	brct    %r1,.L1
+.L2:	bras    %r1,.L3             # setup base pointer for execute
+	mvc     0(1,%r3),0(%r2)     # instruction for execute
+.L3:	ex      %r4,0(%r1)          # execute mvc with length ((%r4)&255)+1
+.L4:	br      %r14
+
+	# data copies > 1MB are faster with mvcle.
+.L5:	ahi     %r4,1               # length + 1
+	lr      %r5,%r4	            # source length
+	lr	%r4,%r2             # source address
+	lr	%r2,%r3             # set destination
+	lr	%r3,%r5             # destination length = source length
+.L6:	mvcle	%r2,%r4,0           # thats it, MVCLE is your friend
+	jo	.L6
+	br	%r14
+.L7:                                # destructive overlay, can not use mvcle
+        lr     %r1,%r2              # bcopy is called with source,dest
+        lr     %r2,%r3              # memmove with dest,source! Oh, well...
+        lr     %r3,%r1
+        basr   %r1,0
+.L8:
+#ifdef PIC
+        al     %r1,.L9-.L8(%r1)     # get address of global offset table
+                                    # load address of memmove
+        l      %r1,memmove@GOT(%r1)
+        br     %r1
+.L9:    .long  _GLOBAL_OFFSET_TABLE_-.L8
+#else
+        al     %r1,.L9-.L8(%r1)     # load address of memmove
+        br     %r1                  # jump to memmove
+.L9:    .long  memmove-.L8
+#endif
+
+END(__bcopy)
+
+#ifndef NO_WEAK_ALIAS
+weak_alias (__bcopy, bcopy)
+#endif
+
diff --git a/REORG.TODO/sysdeps/s390/s390-32/bits/wordsize.h b/REORG.TODO/sysdeps/s390/s390-32/bits/wordsize.h
new file mode 100644
index 0000000000..129e47182b
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/bits/wordsize.h
@@ -0,0 +1,11 @@
+/* Determine the wordsize from the preprocessor defines.  */
+
+#if defined __s390x__
+# define __WORDSIZE	64
+#else
+# define __WORDSIZE	32
+# define __WORDSIZE32_SIZE_ULONG       1
+# define __WORDSIZE32_PTRDIFF_LONG      0
+#endif
+
+#define __WORDSIZE_TIME64_COMPAT32     0
diff --git a/REORG.TODO/sysdeps/s390/s390-32/bsd-_setjmp.S b/REORG.TODO/sysdeps/s390/s390-32/bsd-_setjmp.S
new file mode 100644
index 0000000000..1417270201
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/bsd-_setjmp.S
@@ -0,0 +1 @@
+/* We don't need any code here since the setjmp.S file contains it.  */
diff --git a/REORG.TODO/sysdeps/s390/s390-32/bsd-setjmp.S b/REORG.TODO/sysdeps/s390/s390-32/bsd-setjmp.S
new file mode 100644
index 0000000000..1417270201
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/bsd-setjmp.S
@@ -0,0 +1 @@
+/* We don't need any code here since the setjmp.S file contains it.  */
diff --git a/REORG.TODO/sysdeps/s390/s390-32/bzero.S b/REORG.TODO/sysdeps/s390/s390-32/bzero.S
new file mode 100644
index 0000000000..b6f85e681f
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/bzero.S
@@ -0,0 +1,42 @@
+/* bzero -- set a block of memory to zero.  IBM S390 version
+   This file is part of the GNU C Library.
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/*
+ * R2 = address to memory area
+ * R3 = number of bytes to fill
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+	.text
+ENTRY(__bzero)
+	ltr     %r3,%r3
+	jz      .L1
+	sr      %r1,%r1             # set pad byte to zero
+	sr      %r4,%r4             # no source for MVCLE, only a pad byte
+	sr      %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/REORG.TODO/sysdeps/s390/s390-32/crti.S b/REORG.TODO/sysdeps/s390/s390-32/crti.S
new file mode 100644
index 0000000000..54bd4590c0
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/crti.S
@@ -0,0 +1,102 @@
+/* Special .init and .fini section support for S/390.
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser 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 GNU Lesser 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.)
+
+   Note that people who make modified versions of this file are not
+   obligated to grant this special exception for their modified
+   versions; it is their choice whether to do so. The GNU Lesser
+   General Public License gives permission to release a modified
+   version without this exception; this exception also makes it
+   possible to release a modified version which carries forward this
+   exception.
+
+   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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* 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.  The symbols _init and _fini are
+   magic and cause the linker to emit DT_INIT and DT_FINI.  */
+
+#include <libc-symbols.h>
+#include <sysdep.h>
+
+#ifndef PREINIT_FUNCTION
+# define PREINIT_FUNCTION __gmon_start__
+#endif
+
+#ifndef PREINIT_FUNCTION_WEAK
+# define PREINIT_FUNCTION_WEAK 1
+#endif
+
+#if PREINIT_FUNCTION_WEAK
+	weak_extern (PREINIT_FUNCTION)
+#else
+	.hidden PREINIT_FUNCTION
+#endif
+
+	.section .init,"ax",@progbits
+	.globl	_init
+	.type	_init,@function
+	.align	4
+_init:
+	stm	%r6,%r15,24(%r15)
+	bras	%r13,1f
+0:
+#if PREINIT_FUNCTION_WEAK
+	.long	PREINIT_FUNCTION@GOT
+#else
+	.long	PREINIT_FUNCTION-0b
+#endif
+	.long	_GLOBAL_OFFSET_TABLE_-0b
+1:	lr	%r1,%r15
+	ahi	%r15,-96
+	st	%r1,0(%r15)
+	l	%r12,4(%r13)
+	ar	%r12,%r13
+	l	%r1,0(%r13)
+#if PREINIT_FUNCTION_WEAK
+	l	%r1,0(%r1,%r12)
+	ltr	%r1,%r1
+	je	2f
+#else
+	la	%r1,0(%r1,%r13)
+#endif
+	basr	%r14,%r1
+	.align	4,0x07
+2:
+
+	.section .fini,"ax",@progbits
+	.globl	_fini
+	.type	_fini,@function
+	.align	4
+_fini:
+	stm	%r6,%r15,24(%r15)
+	bras	%r13,1f
+0:	.long	_GLOBAL_OFFSET_TABLE_-0b
+1:	lr	%r1,%r15
+	ahi	%r15,-96
+	st	%r1,0(%r15)
+	l	%r12,0(%r13)
+	ar	%r12,%r13
+	.align	4,0x07
diff --git a/REORG.TODO/sysdeps/s390/s390-32/crtn.S b/REORG.TODO/sysdeps/s390/s390-32/crtn.S
new file mode 100644
index 0000000000..3f5d85e2b2
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/crtn.S
@@ -0,0 +1,47 @@
+/* Special .init and .fini section support for S/390.
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser 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 GNU Lesser 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.)
+
+   Note that people who make modified versions of this file are not
+   obligated to grant this special exception for their modified
+   versions; it is their choice whether to do so. The GNU Lesser
+   General Public License gives permission to release a modified
+   version without this exception; this exception also makes it
+   possible to release a modified version which carries forward this
+   exception.
+
+   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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* crtn.S puts function epilogues in the .init and .fini sections
+   corresponding to the prologues in crti.S. */
+
+	.section .init,"ax",@progbits
+	l	%r4,152(%r15)
+	lm	%r6,%r15,120(%r15)
+	br	%r4
+
+	.section .fini,"ax",@progbits
+	l	%r4,152(%r15)
+	lm	%r6,%r15,120(%r15)
+	br	%r4
diff --git a/REORG.TODO/sysdeps/s390/s390-32/dl-machine.h b/REORG.TODO/sysdeps/s390/s390-32/dl-machine.h
new file mode 100644
index 0000000000..2e3c77c58e
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/dl-machine.h
@@ -0,0 +1,522 @@
+/* Machine-dependent ELF dynamic relocation inline functions.  S390 Version.
+   Copyright (C) 2000-2017 Free Software Foundation, Inc.
+   Contributed by Carl Pederson & Martin Schwidefsky.
+   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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef dl_machine_h
+#define dl_machine_h
+
+#define ELF_MACHINE_NAME "s390"
+
+#include <sys/param.h>
+#include <string.h>
+#include <link.h>
+#include <sysdeps/s390/dl-procinfo.h>
+#include <dl-irel.h>
+
+/* This is an older, now obsolete value.  */
+#define EM_S390_OLD	0xA390
+
+/* Return nonzero iff ELF header is compatible with the running host.  */
+static inline int
+elf_machine_matches_host (const Elf32_Ehdr *ehdr)
+{
+  /* Check if the kernel provides the high gpr facility if needed by
+     the binary.  */
+  if ((ehdr->e_flags & EF_S390_HIGH_GPRS)
+      && !(GLRO (dl_hwcap) & HWCAP_S390_HIGH_GPRS))
+    return 0;
+
+  return (ehdr->e_machine == EM_S390 || ehdr->e_machine == EM_S390_OLD)
+	 && ehdr->e_ident[EI_CLASS] == ELFCLASS32;
+}
+
+
+/* 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 Elf32_Addr
+elf_machine_dynamic (void)
+{
+  register Elf32_Addr *got;
+
+  __asm__( "        bras   %0,2f\n"
+	   "1:      .long  _GLOBAL_OFFSET_TABLE_-1b\n"
+	   "2:      al     %0,0(%0)"
+	   : "=&a" (got) : : "0" );
+
+  return *got;
+}
+
+
+/* Return the run-time load address of the shared object.  */
+static inline Elf32_Addr
+elf_machine_load_address (void)
+{
+  Elf32_Addr addr;
+
+  __asm__( "   bras  1,2f\n"
+	   "1: .long _GLOBAL_OFFSET_TABLE_ - 1b\n"
+	   "   .long (_dl_start - 1b - 0x80000000) & 0x00000000ffffffff\n"
+	   "2: l     %0,4(1)\n"
+	   "   ar    %0,1\n"
+	   "   al    1,0(1)\n"
+	   "   sl    %0,_dl_start@GOT(1)"
+	   : "=&d" (addr) : : "1" );
+  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 (Elf32_Word);
+  extern void _dl_runtime_profile (Elf32_Word);
+#if defined HAVE_S390_VX_ASM_SUPPORT
+  extern void _dl_runtime_resolve_vx (Elf32_Word);
+  extern void _dl_runtime_profile_vx (Elf32_Word);
+#endif
+
+
+  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 .rel.plt section, push _GLOBAL_OFFSET_TABLE_[1],
+	 and then jump to _GLOBAL_OFFSET_TABLE[2].  */
+      Elf32_Addr *got;
+      got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
+      /* If a library is prelinked but we have to relocate anyway,
+	 we have to be able to undo the prelinking of .got.plt.
+	 The prelinker saved us here address of .plt + 0x2c.  */
+      if (got[1])
+	{
+	  l->l_mach.plt = got[1] + l->l_addr;
+	  l->l_mach.jmprel = (const Elf32_Rela *) D_PTR (l, l_info[DT_JMPREL]);
+	}
+      got[1] = (Elf32_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 (__glibc_unlikely (profile))
+	{
+#if defined HAVE_S390_VX_ASM_SUPPORT
+	  if (GLRO(dl_hwcap) & HWCAP_S390_VX)
+	    got[2] = (Elf32_Addr) &_dl_runtime_profile_vx;
+	  else
+	    got[2] = (Elf32_Addr) &_dl_runtime_profile;
+#else
+	  got[2] = (Elf32_Addr) &_dl_runtime_profile;
+#endif
+
+	  if (GLRO(dl_profile) != NULL
+	      && _dl_name_match_p (GLRO(dl_profile), l))
+	    /* This is the object we are looking for.  Say that we really
+	       want profiling and the timers are started.  */
+	    GL(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.  */
+#if defined HAVE_S390_VX_ASM_SUPPORT
+	  if (GLRO(dl_hwcap) & HWCAP_S390_VX)
+	    got[2] = (Elf32_Addr) &_dl_runtime_resolve_vx;
+	  else
+	    got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+#else
+	  got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+#endif
+	}
+    }
+
+  return lazy;
+}
+
+/* Mask identifying addresses reserved for the user program,
+   where the dynamic linker should not map anything.  */
+#define ELF_MACHINE_USER_ADDRESS_MASK   0xf8000000UL
+
+/* 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\
+	basr  %r13,0\n\
+0:      ahi   %r13,.Llit-0b\n\
+	lr    %r2,%r15\n\
+	# Alloc stack frame\n\
+	ahi   %r15,-96\n\
+	# Set the back chain to zero\n\
+	xc    0(4,%r15),0(%r15)\n\
+	# Call _dl_start with %r2 pointing to arg on stack\n\
+	l     %r14,.Ladr1-.Llit(%r13)\n\
+	bas   %r14,0(%r14,%r13)   # call _dl_start\n\
+_dl_start_user:\n\
+	# Save the user entry point address in %r8.\n\
+	lr    %r8,%r2\n\
+	# Point %r12 at the GOT.\n\
+	l     %r12,.Ladr0-.Llit(%r13)\n\
+	ar    %r12,%r13\n\
+	# See if we were run as a command with the executable file\n\
+	# name as an extra leading argument.\n\
+	l     %r1,_dl_skip_args@GOT(%r12)\n\
+	l     %r1,0(%r1)	# load _dl_skip_args\n\
+	ltr   %r1,%r1\n\
+	je    4f		# Skip the arg adjustment if there were none.\n\
+	# Get the original argument count.\n\
+	l     %r0,96(%r15)\n\
+	# Subtract _dl_skip_args from it.\n\
+	sr    %r0,%r1\n\
+	# Store back the modified argument count.\n\
+	st    %r0,96(%r15)\n\
+	# Copy argv and envp forward to account for skipped argv entries.\n\
+	# We skipped at least one argument or we would not get here.\n\
+	la    %r6,100(%r15)	# Destination pointer i.e. &argv[0]\n\
+	lr    %r5,%r6\n\
+	lr    %r0,%r1\n\
+	sll   %r0,2\n		# Number of skipped bytes.\n\
+	ar    %r5,%r0		# Source pointer = Dest + Skipped args.\n\
+	# argv copy loop:\n\
+1:	l     %r7,0(%r5)	# Load a word from the source.\n\
+	st    %r7,0(%r6)	# Store the word in the destination.\n\
+	ahi   %r5,4\n\
+	ahi   %r6,4\n\
+	ltr   %r7,%r7\n\
+	jne   1b		# Stop after copying the NULL.\n\
+	# envp copy loop:\n\
+2:	l     %r7,0(%r5)	# Load a word from the source.\n\
+	st    %r7,0(%r6)	# Store the word in the destination.\n\
+	ahi   %r5,4\n\
+	ahi   %r6,4\n\
+	ltr   %r7,%r7\n\
+	jne   2b		# Stop after copying the NULL.\n\
+	# Now we have to zero out the envp entries after NULL to allow\n\
+	# start.S to properly find auxv by skipping zeroes.\n\
+	# zero out loop:\n\
+	lhi   %r7,0\n\
+3:	st    %r7,0(%r6)	# Store zero.\n\
+	ahi   %r6,4		# Advance dest pointer.\n\
+	ahi   %r1,-1		# Subtract one from the word count.\n\
+	ltr   %r1,%r1\n\
+	jne    3b		# Keep copying if the word count is non-zero.\n\
+	# Adjust _dl_argv\n\
+	la    %r6,100(%r15)\n\
+	l     %r1,_dl_argv@GOT(%r12)\n\
+	st    %r6,0(%r1)\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\
+4:	l     %r2,_rtld_local@GOT(%r12)\n\
+	l     %r2,0(%r2)\n\
+	l     %r3,96(%r15)\n\
+	la    %r4,100(%r15)\n\
+	lr    %r5,%r3\n\
+	sll   %r5,2\n\
+	la    %r5,104(%r5,%r15)\n\
+	l     %r1,.Ladr4-.Llit(%r13)\n\
+	bas   %r14,0(%r1,%r13)\n\
+	# Pass our finalizer function to the user in %r14, as per ELF ABI.\n\
+	l     %r14,_dl_fini@GOT(%r12)\n\
+	# Free stack frame\n\
+	ahi   %r15,96\n\
+	# Jump to the user's entry point (saved in %r8).\n\
+	br    %r8\n\
+.Llit:\n\
+.Ladr0: .long _GLOBAL_OFFSET_TABLE_-.Llit\n\
+.Ladr1: .long _dl_start-.Llit\n\
+.Ladr4: .long _dl_init@PLT-.Llit\n\
+");
+
+#ifndef RTLD_START_SPECIAL_INIT
+#define RTLD_START_SPECIAL_INIT /* nothing */
+#endif
+
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or
+   TLS variable, so undefined references should not be allowed to
+   define the value.
+   ELF_RTYPE_CLASS_COPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_390_JMP_SLOT || (type) == R_390_TLS_DTPMOD		      \
+     || (type) == R_390_TLS_DTPOFF || (type) == R_390_TLS_TPOFF)	      \
+    * ELF_RTYPE_CLASS_PLT)						      \
+   | (((type) == R_390_COPY) * ELF_RTYPE_CLASS_COPY))
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
+#define ELF_MACHINE_JMP_SLOT    R_390_JMP_SLOT
+
+/* The S390 never uses Elf32_Rel relocations.  */
+#define ELF_MACHINE_NO_REL 1
+#define ELF_MACHINE_NO_RELA 0
+
+/* We define an initialization functions.  This is called very early in
+   _dl_sysdep_start.  */
+#define DL_PLATFORM_INIT dl_platform_init ()
+
+static inline void __attribute__ ((unused))
+dl_platform_init (void)
+{
+  if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
+    /* Avoid an empty string which would disturb us.  */
+    GLRO(dl_platform) = NULL;
+}
+
+static inline Elf32_Addr
+elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+		       const Elf32_Rela *reloc,
+		       Elf32_Addr *reloc_addr, Elf32_Addr value)
+{
+  return *reloc_addr = value;
+}
+
+/* Return the final value of a plt relocation.  */
+static inline Elf32_Addr
+elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
+		       Elf32_Addr value)
+{
+  return value;
+}
+
+/* Names of the architecture-specific auditing callback functions.  */
+#define ARCH_LA_PLTENTER s390_32_gnu_pltenter
+#define ARCH_LA_PLTEXIT s390_32_gnu_pltexit
+
+#endif /* !dl_machine_h */
+
+
+#ifdef RESOLVE_MAP
+
+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+   MAP is the object containing the reloc.  */
+
+auto inline void
+__attribute__ ((always_inline))
+elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
+		  const Elf32_Sym *sym, const struct r_found_version *version,
+		  void *const reloc_addr_arg, int skip_ifunc)
+{
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
+  const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
+
+#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
+  if (__glibc_unlikely (r_type == R_390_RELATIVE))
+    {
+# if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
+      /* This is defined in rtld.c, but nowhere in the static libc.a;
+	 make the reference weak so static programs can still link.
+	 This declaration cannot be done when compiling rtld.c
+	 (i.e. #ifdef RTLD_BOOTSTRAP) because rtld.c contains the
+	 common defn for _dl_rtld_map, which is incompatible with a
+	 weak decl in the same file.  */
+#  ifndef SHARED
+      weak_extern (GL(dl_rtld_map));
+#  endif
+      if (map != &GL(dl_rtld_map)) /* Already done in rtld itself.  */
+# endif
+	*reloc_addr = map->l_addr + reloc->r_addend;
+    }
+  else
+#endif
+  if (__glibc_unlikely (r_type == R_390_NONE))
+    return;
+  else
+    {
+#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
+      /* Only needed for R_390_COPY below.  */
+      const Elf32_Sym *const refsym = sym;
+#endif
+      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
+      Elf32_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
+
+      if (sym != NULL
+	  && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0)
+	  && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)
+	  && __builtin_expect (!skip_ifunc, 1))
+	value = elf_ifunc_invoke (value);
+
+      switch (r_type)
+	{
+	case R_390_IRELATIVE:
+	  value = map->l_addr + reloc->r_addend;
+	  if (__glibc_likely (!skip_ifunc))
+	    value = elf_ifunc_invoke (value);
+	  *reloc_addr = value;
+	  break;
+
+	case R_390_GLOB_DAT:
+	case R_390_JMP_SLOT:
+	  *reloc_addr = value + reloc->r_addend;
+	  break;
+
+#ifndef RESOLVE_CONFLICT_FIND_MAP
+	case R_390_TLS_DTPMOD:
+# ifdef RTLD_BOOTSTRAP
+	  /* During startup the dynamic linker is always the module
+	     with index 1.
+	     XXX If this relocation is necessary move before RESOLVE
+	     call.  */
+	  *reloc_addr = 1;
+# else
+	  /* Get the information from the link map returned by the
+	     resolv function.  */
+	  if (sym_map != NULL)
+	    *reloc_addr = sym_map->l_tls_modid;
+# endif
+	  break;
+	case R_390_TLS_DTPOFF:
+# ifndef RTLD_BOOTSTRAP
+	  /* During relocation all TLS symbols are defined and used.
+	     Therefore the offset is already correct.  */
+	  if (sym != NULL)
+	    *reloc_addr = sym->st_value + reloc->r_addend;
+# endif
+	  break;
+	case R_390_TLS_TPOFF:
+	  /* The offset is negative, forward from the thread pointer.  */
+# ifdef RTLD_BOOTSTRAP
+	  *reloc_addr = sym->st_value + reloc->r_addend - map->l_tls_offset;
+# else
+	  /* We know the offset of the object the symbol is contained in.
+	     It is a negative value which will be added to the
+	     thread pointer.  */
+	  if (sym != NULL)
+	    {
+	      CHECK_STATIC_TLS (map, sym_map);
+	      *reloc_addr = (sym->st_value + reloc->r_addend
+			     - sym_map->l_tls_offset);
+	    }
+#endif
+	  break;
+#endif  /* use TLS */
+
+#ifndef RTLD_BOOTSTRAP
+# ifndef RESOLVE_CONFLICT_FIND_MAP
+	/* Not needed in dl-conflict.c.  */
+	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 (GLRO(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",
+				RTLD_PROGNAME, strtab + refsym->st_name);
+	    }
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
+	  break;
+# endif
+	case R_390_32:
+	  *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;
+# ifndef RESOLVE_CONFLICT_FIND_MAP
+	case R_390_PC32:
+	  *reloc_addr = value + reloc->r_addend - (Elf32_Addr) reloc_addr;
+	  break;
+	case R_390_PC16DBL:
+	  *(unsigned short *) reloc_addr = (unsigned short)
+	    ((short) (value + reloc->r_addend - (Elf32_Addr) reloc_addr) >> 1);
+	  break;
+	case R_390_PC32DBL:
+	  *(unsigned int *) reloc_addr = (unsigned int)
+	    ((int) (value + reloc->r_addend - (Elf32_Addr) reloc_addr) >> 1);
+	  break;
+	case R_390_PC16:
+	  *(unsigned short *) reloc_addr =
+	    value + reloc->r_addend - (Elf32_Addr) reloc_addr;
+	  break;
+	case R_390_NONE:
+	  break;
+# endif
+#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, r_type, 0);
+	  break;
+#endif
+	}
+    }
+}
+
+auto inline void
+__attribute__ ((always_inline))
+elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+			   void *const reloc_addr_arg)
+{
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
+  *reloc_addr = l_addr + reloc->r_addend;
+}
+
+auto inline void
+__attribute__ ((always_inline))
+elf_machine_lazy_rel (struct link_map *map,
+		      Elf32_Addr l_addr, const Elf32_Rela *reloc,
+		      int skip_ifunc)
+{
+  Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
+  const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
+  /* Check for unexpected PLT reloc type.  */
+  if (__glibc_likely (r_type == R_390_JMP_SLOT))
+    {
+      if (__builtin_expect (map->l_mach.plt, 0) == 0)
+	*reloc_addr += l_addr;
+      else
+	*reloc_addr = map->l_mach.plt + (reloc - map->l_mach.jmprel) * 32;
+    }
+  else if (__glibc_likely (r_type == R_390_IRELATIVE))
+    {
+      Elf32_Addr value = map->l_addr + reloc->r_addend;
+      if (__glibc_likely (!skip_ifunc))
+	value = elf_ifunc_invoke (value);
+      *reloc_addr = value;
+    }
+  else
+    _dl_reloc_bad_type (map, r_type, 1);
+}
+
+#endif /* RESOLVE_MAP */
diff --git a/REORG.TODO/sysdeps/s390/s390-32/dl-sysdep.h b/REORG.TODO/sysdeps/s390/s390-32/dl-sysdep.h
new file mode 100644
index 0000000000..f32114bf56
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/dl-sysdep.h
@@ -0,0 +1,23 @@
+/* System-specific settings for dynamic linker code.  S/390 version.
+   Copyright (C) 2014-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include_next <dl-sysdep.h>
+
+/* _dl_argv cannot be attribute_relro, because _dl_start_user
+   might write into it after _dl_start returns.  */
+#define DL_ARGV_NOT_RELRO 1
diff --git a/REORG.TODO/sysdeps/s390/s390-32/dl-trampoline.S b/REORG.TODO/sysdeps/s390/s390-32/dl-trampoline.S
new file mode 100644
index 0000000000..34377e7c51
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/dl-trampoline.S
@@ -0,0 +1,33 @@
+/* PLT trampolines.  s390 version.
+   Copyright (C) 2005-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+
+	.text
+/* Create variant of _dl_runtime_resolve/profile for machines before z13.
+   No vector registers are saved/restored.  */
+#include <dl-trampoline.h>
+
+#if defined HAVE_S390_VX_ASM_SUPPORT
+/* Create variant of _dl_runtime_resolve/profile for z13 and newer.
+   The vector registers are saved/restored, too.*/
+# define _dl_runtime_resolve _dl_runtime_resolve_vx
+# define _dl_runtime_profile _dl_runtime_profile_vx
+# define RESTORE_VRS
+# include <dl-trampoline.h>
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/dl-trampoline.h b/REORG.TODO/sysdeps/s390/s390-32/dl-trampoline.h
new file mode 100644
index 0000000000..19776eec8a
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/dl-trampoline.h
@@ -0,0 +1,231 @@
+/* PLT trampolines.  s390 version.
+   Copyright (C) 2016-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This code is used in dl-runtime.c to call the `fixup' function
+   and then redirect to the address it returns.  */
+
+/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile
+ * with the following linkage:
+ *   r2 - r6 : parameter registers
+ *   f0, f2 : floating point parameter registers
+ *   v24, v26, v28, v30, v25, v27, v29, v31 : vector parameter registers
+ *   24(r15), 28(r15) : PLT arguments PLT1, PLT2
+ *   96(r15) : additional stack parameters
+ * The normal clobber rules for function calls apply:
+ *   r0 - r5 : call clobbered
+ *   r6 - r13 :	call saved
+ *   r14 : return address (call clobbered)
+ *   r15 : stack pointer (call saved)
+ *   f4, f6 : call saved
+ *   f0 - f3, f5, f7 - f15 : call clobbered
+ *   v0 - v3, v5, v7 - v15 : bytes 0-7 overlap with fprs: call clobbered
+               bytes 8-15: call clobbered
+ *   v4, v6 : bytes 0-7 overlap with f4, f6: call saved
+              bytes 8-15: call clobbered
+ *   v16 - v31 : call clobbered
+ */
+
+
+	.globl _dl_runtime_resolve
+	.type _dl_runtime_resolve, @function
+	cfi_startproc
+	.align 16
+_dl_runtime_resolve:
+	stm    %r2,%r5,32(%r15)		# save registers
+	cfi_offset (r2, -64)
+	cfi_offset (r3, -60)
+	cfi_offset (r4, -56)
+	cfi_offset (r5, -52)
+	std    %f0,56(%r15)
+	cfi_offset (f0, -40)
+	std    %f2,64(%r15)
+	cfi_offset (f2, -32)
+	st     %r14,8(%r15)
+	cfi_offset (r14, -88)
+	lr     %r0,%r15
+	lm     %r2,%r3,24(%r15)		# load args saved by PLT
+#ifdef RESTORE_VRS
+	ahi    %r15,-224		# create stack frame
+	cfi_adjust_cfa_offset (224)
+	.machine push
+	.machine "z13"
+	.machinemode "zarch_nohighgprs"
+	vstm   %v24,%v31,96(%r15)	# store call-clobbered vr arguments
+	cfi_offset (v24, -224)
+	cfi_offset (v25, -208)
+	cfi_offset (v26, -192)
+	cfi_offset (v27, -176)
+	cfi_offset (v28, -160)
+	cfi_offset (v29, -144)
+	cfi_offset (v30, -128)
+	cfi_offset (v31, -112)
+	.machine pop
+#else
+	ahi    %r15,-96			# create stack frame
+	cfi_adjust_cfa_offset (96)
+#endif
+	st     %r0,0(%r15)		# write backchain
+	basr   %r1,0
+0:	l      %r14,1f-0b(%r1)
+	bas    %r14,0(%r14,%r1)		# call _dl_fixup
+	lr     %r1,%r2			# function addr returned in r2
+#ifdef RESTORE_VRS
+	.machine push
+	.machine "z13"
+	.machinemode "zarch_nohighgprs"
+	vlm    %v24,%v31,96(%r15)	# restore vector registers
+	.machine pop
+	ahi   %r15,224			# remove stack frame
+	cfi_adjust_cfa_offset (-224)
+#else
+	ahi    %r15,96			# remove stack frame
+	cfi_adjust_cfa_offset (-96)
+#endif
+	l      %r14,8(15)		# restore registers
+	ld     %f0,56(%r15)
+	ld     %f2,64(%r15)
+	lm     %r2,%r5,32(%r15)
+	br     %r1
+1:	.long  _dl_fixup - 0b
+	cfi_endproc
+	.size _dl_runtime_resolve, .-_dl_runtime_resolve
+
+
+#ifndef PROF
+	.globl _dl_runtime_profile
+	.type _dl_runtime_profile, @function
+	cfi_startproc
+	.align 16
+_dl_runtime_profile:
+	st     %r12,12(%r15)		# r12 is used as backup of r15
+	cfi_offset (r12, -84)
+	st     %r14,16(%r15)
+	cfi_offset (r14, -80)
+	lr     %r12,%r15		# backup stack pointer
+	cfi_def_cfa_register (12)
+	ahi    %r15,-264		# create stack frame:
+					# 96 + sizeof(La_s390_32_regs)
+	st     %r12,0(%r15)		# save backchain
+
+	stm    %r2,%r6,96(%r15)		# save registers
+	cfi_offset (r2, -264)		# + r6 needed as arg for
+	cfi_offset (r3, -260)		#  _dl_profile_fixup
+	cfi_offset (r4, -256)
+	cfi_offset (r5, -252)
+	cfi_offset (r6, -248)
+	std    %f0,120(%r15)
+	cfi_offset (f0, -240)
+	std    %f2,128(%r15)
+	cfi_offset (f2, -232)
+#ifdef RESTORE_VRS
+	.machine push
+	.machine "z13"
+	.machinemode "zarch_nohighgprs"
+	vstm   %v24,%v31,136(%r15)	# store call-clobbered vr arguments
+	cfi_offset (v24, -224)
+	cfi_offset (v25, -208)
+	cfi_offset (v26, -192)
+	cfi_offset (v27, -176)
+	cfi_offset (v28, -160)
+	cfi_offset (v29, -144)
+	cfi_offset (v30, -128)
+	cfi_offset (v31, -112)
+	.machine pop
+#endif
+
+	lm     %r2,%r3,24(%r12)		# load arguments saved by PLT
+	lr     %r4,%r14			# return address as third parameter
+	basr   %r1,0
+0:	l      %r14,6f-0b(%r1)
+	la     %r5,96(%r15)		# pointer to struct La_s390_32_regs
+	la     %r6,20(%r12)		# long int * framesize
+	bas    %r14,0(%r14,%r1)		# call resolver
+	lr     %r1,%r2			# function addr returned in r2
+	ld     %f0,120(%r15)		# restore call-clobbered arg fprs
+	ld     %f2,128(%r15)
+#ifdef RESTORE_VRS
+	.machine push
+	.machine "z13"
+	.machinemode "zarch_nohighgprs"
+	vlm    %v24,%v31,136(%r15)	# restore call-clobbered arg vrs
+	.machine pop
+#endif
+	icm    %r0,15,20(%r12)		# load & test framesize
+	jnm    2f
+
+	lm     %r2,%r6,96(%r15)		# framesize < 0 means no pltexit call
+					# so we can do a tail call without
+					# copying the arg overflow area
+	lr     %r15,%r12		# remove stack frame
+	cfi_def_cfa_register (15)
+	l      %r14,16(%r15)		# restore registers
+	l      %r12,12(%r15)
+	br     %r1			# tail-call to the resolved function
+
+	cfi_def_cfa_register (12)
+2:	la     %r4,96(%r15)		# pointer to struct La_s390_32_regs
+	st     %r4,32(%r12)
+	jz     4f			# framesize == 0 ?
+	ahi    %r0,7			# align framesize to 8
+	lhi    %r2,-8
+	nr     %r0,%r2
+	slr    %r15,%r0			# make room for framesize bytes
+	st     %r12,0(%r15)		# save backchain
+	la     %r2,96(%r15)
+	la     %r3,96(%r12)
+	srl    %r0,3
+3:	mvc    0(8,%r2),0(%r3)		# copy additional parameters
+	la     %r2,8(%r2)
+	la     %r3,8(%r3)
+	brct   %r0,3b
+4:	lm     %r2,%r6,0(%r4)		# load register parameters
+	basr   %r14,%r1			# call resolved function
+	stm    %r2,%r3,40(%r12)		# store return values r2, r3, f0
+	std    %f0,48(%r12)		# to struct La_s390_32_retval
+#ifdef RESTORE_VRS
+	.machine push
+	.machine "z13"
+	vst    %v24,56(%r12)		# store return value v24
+	.machine pop
+#endif
+	lm     %r2,%r4,24(%r12)		# r2, r3: load arguments saved by PLT
+					# r4: pointer to struct La_s390_32_regs
+	basr   %r1,0
+5:	l      %r14,7f-5b(%r1)
+	la     %r5,40(%r12)		# pointer to struct La_s390_32_retval
+	bas    %r14,0(%r14,%r1)		# call _dl_call_pltexit
+
+	lr     %r15,%r12		# remove stack frame
+	cfi_def_cfa_register (15)
+	l      %r14,16(%r15)		# restore registers
+	l      %r12,12(%r15)
+	lm     %r2,%r3,40(%r15)		# restore return values
+	ld     %f0,48(%r15)
+#ifdef RESTORE_VRS
+	.machine push
+	.machine "z13"
+	vl    %v24,56(%r15)		# restore return value v24
+	.machine pop
+#endif
+	br     %r14
+
+6:	.long  _dl_profile_fixup - 0b
+7:	.long  _dl_call_pltexit - 5b
+	cfi_endproc
+	.size _dl_runtime_profile, .-_dl_runtime_profile
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/memchr.S b/REORG.TODO/sysdeps/s390/s390-32/memchr.S
new file mode 100644
index 0000000000..4ffac6061c
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/memchr.S
@@ -0,0 +1,41 @@
+/* Search a character in a block of memory.  For IBM S390
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/*
+ * 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)
+	lhi   %r0,0xff
+	nr    %r0,%r3
+	lr    %r1,%r2
+	la    %r2,0(%r4,%r1)
+0:      srst  %r2,%r1
+	jo    0b
+	brc   13,1f
+	slr   %r2,%r2
+1:      br    %r14
+END(memchr)
+libc_hidden_builtin_def (memchr)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/memcmp.S b/REORG.TODO/sysdeps/s390/s390-32/memcmp.S
new file mode 100644
index 0000000000..ca02144a4a
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/memcmp.S
@@ -0,0 +1,66 @@
+/* memcmp - compare two memory blocks.  32 bit S/390 version.
+   Copyright (C) 2012-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/* INPUT PARAMETERS
+     %r2 = address of first memory area
+     %r3 = address of second memory area
+     %r4 = number of bytes to compare.  */
+
+       .text
+#ifdef USE_MULTIARCH
+ENTRY(__memcmp_default)
+#else
+ENTRY(memcmp)
+#endif
+	.machine "g5"
+	basr    %r5,0
+.L_G5_16:
+	ltr     %r4,%r4
+	je      .L_G5_4
+	ahi     %r4,-1
+	lr      %r1,%r4
+	srl     %r1,8
+	ltr     %r1,%r1
+	jne     .L_G5_12
+	ex      %r4,.L_G5_17-.L_G5_16(%r5)
+.L_G5_4:
+	ipm     %r2
+	sll     %r2,2
+	sra     %r2,30
+	br      %r14
+.L_G5_12:
+	clc     0(256,%r3),0(%r2)
+	jne     .L_G5_4
+	la      %r3,256(%r3)
+	la      %r2,256(%r2)
+	brct    %r1,.L_G5_12
+	ex      %r4,.L_G5_17-.L_G5_16(%r5)
+	j       .L_G5_4
+.L_G5_17:
+	clc     0(1,%r3),0(%r2)
+#ifdef USE_MULTIARCH
+END(__memcmp_default)
+#else
+END(memcmp)
+libc_hidden_builtin_def (memcmp)
+weak_alias(memcmp, bcmp)
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/memcpy.S b/REORG.TODO/sysdeps/s390/s390-32/memcpy.S
new file mode 100644
index 0000000000..0177f19431
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/memcpy.S
@@ -0,0 +1,89 @@
+/* memcpy - copy a block from source to destination.  S/390 version.
+   Copyright (C) 2012-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/* INPUT PARAMETERS
+     %r2 = address of destination memory area
+     %r3 = address of source memory area
+     %r4 = number of bytes to copy.  */
+
+       .text
+ENTRY(__mempcpy)
+	.machine "g5"
+	lr      %r1,%r2             # Use as dest
+	la      %r2,0(%r4,%r2)      # Return dest + n
+	j	.L_G5_start
+END(__mempcpy)
+#ifndef USE_MULTIARCH
+libc_hidden_def (__mempcpy)
+weak_alias (__mempcpy, mempcpy)
+libc_hidden_builtin_def (mempcpy)
+#endif
+
+ENTRY(memcpy)
+	.machine "g5"
+	lr      %r1,%r2             # r1: Use as dest ; r2: Return dest
+.L_G5_start:
+	ltr     %r4,%r4
+	je      .L_G5_99
+	ahi     %r4,-1
+	lr      %r5,%r4
+	srl     %r5,8
+	ltr     %r5,%r5
+	jne     .L_G5_13
+.L_G5_4:
+	basr    %r5,0
+.L_G5_16:
+	ex      %r4,.L_G5_17-.L_G5_16(%r5)
+.L_G5_99:
+	br      %r14
+.L_G5_13:
+	chi	%r5,4096            # Switch to mvcle for copies >1MB
+	jh	__memcpy_mvcle
+.L_G5_12:
+	mvc     0(256,%r1),0(%r3)
+	la      %r1,256(%r1)
+	la      %r3,256(%r3)
+	brct    %r5,.L_G5_12
+	j       .L_G5_4
+.L_G5_17:
+	mvc     0(1,%r1),0(%r3)
+END(memcpy)
+#ifndef USE_MULTIARCH
+libc_hidden_builtin_def (memcpy)
+#endif
+
+ENTRY(__memcpy_mvcle)
+	# Using as standalone function will result in unexpected
+	# results since the length field is incremented by 1 in order to
+	# compensate the changes already done in the functions above.
+	lr      %r0,%r2             # backup return dest [ + n ]
+	ahi     %r4,1               # length + 1
+	lr      %r5,%r4             # source length
+	lr      %r4,%r3             # source address
+	lr      %r2,%r1             # destination address
+	lr      %r3,%r5             # destination length = source length
+.L_MVCLE_1:
+	mvcle   %r2,%r4,0           # thats it, MVCLE is your friend
+	jo      .L_MVCLE_1
+	lr      %r2,%r0             # return destination address
+	br      %r14
+END(__memcpy_mvcle)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/memset.S b/REORG.TODO/sysdeps/s390/s390-32/memset.S
new file mode 100644
index 0000000000..720f393c30
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/memset.S
@@ -0,0 +1,65 @@
+/* Set a block of memory to some byte value.  For IBM S390
+   Copyright (C) 2012-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/* INPUT PARAMETERS
+     %r2 = address to memory area
+     %r3 = byte to fill memory with
+     %r4 = number of bytes to fill.  */
+
+       .text
+
+#ifdef USE_MULTIARCH
+ENTRY(__memset_default)
+#else
+ENTRY(memset)
+#endif
+	.machine "g5"
+	basr    %r5,0
+.L_G5_19:
+	ltr     %r4,%r4
+	je      .L_G5_4
+	stc     %r3,0(%r2)
+	chi     %r4,1
+	lr      %r1,%r2
+	je      .L_G5_4
+	ahi     %r4,-2
+	lr      %r3,%r4
+	srl     %r3,8
+	ltr     %r3,%r3
+	jne     .L_G5_14
+	ex      %r4,.L_G5_20-.L_G5_19(%r5)
+.L_G5_4:
+	br      %r14
+.L_G5_14:
+	mvc     1(256,%r1),0(%r1)
+	la      %r1,256(%r1)
+	brct    %r3,.L_G5_14
+	ex      %r4,.L_G5_20-.L_G5_19(%r5)
+	j       .L_G5_4
+.L_G5_20:
+	mvc     1(1,%r1),0(%r1)
+#ifdef USE_MULTIARCH
+END(__memset_default)
+#else
+END(memset)
+libc_hidden_builtin_def (memset)
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/mul_1.S b/REORG.TODO/sysdeps/s390/s390-32/mul_1.S
new file mode 100644
index 0000000000..4f08fa2c80
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/mul_1.S
@@ -0,0 +1,55 @@
+/* __mpn_mul_1 -- Multiply a limb vector with a limb and store
+   the result in a second limb vector.
+   Copyright (C) 2000-2017 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 Lesser General Public License as published by
+   the Free Software Foundation; either version 2.1 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 Lesser General Public
+   License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with the GNU MP Library; see the file COPYING.LIB.  If not,
+   see <http://www.gnu.org/licenses/>.  */
+
+/*
+   INPUT PARAMETERS
+   res_ptr   %r2
+   s1_ptr    %r3
+   size	     %r4
+   s2_limb   %r5
+*/
+
+#include <sysdep.h>
+#include "asm-syntax.h"
+
+	.text
+ENTRY(__mpn_mul_1)
+	st     %r6,24(%r15)
+	cfi_offset (%r6, -72)
+	slr    %r6,%r6            # cy_limb = 0
+.L0:    icm    %r1,15,0(%r3)      # get s1_ptr[i]
+	mr     %r0,%r5            # umul_ppmm(prod_high,prod_low,s1_ptr[j],s2_limb)
+	jnm    .L1
+	alr    %r0,%r5
+.L1:    ltr    %r5,%r5
+	jnm    .L2
+	al     %r0,0(%r3)
+.L2:    alr    %r1,%r6            # prod_low += cy_limb
+	lr     %r6,%r0            # cy_limb = prod_high
+	brc    12,.L3
+	ahi    %r6,1              #           + (prod_low < cy_limb)
+.L3:    st     %r1,0(%r2)
+	la     %r2,4(0,%r2)
+	la     %r3,4(0,%r3)
+	brct   %r4,.L0
+	lr     %r2,%r6            # return cy_limb
+	l      %r6,24(%r15)
+.Lexit: br     %r14
+END(__mpn_mul_1)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/Makefile b/REORG.TODO/sysdeps/s390/s390-32/multiarch/Makefile
new file mode 100644
index 0000000000..f8aee14bbd
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/Makefile
@@ -0,0 +1,4 @@
+ifeq ($(subdir),string)
+sysdep_routines += memset memset-s390 memcpy memcpy-s390 \
+		   memcmp memcmp-s390
+endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/memchr.c b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memchr.c
new file mode 100644
index 0000000000..808c3b837a
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memchr.c
@@ -0,0 +1,21 @@
+/* Multiple versions of memchr.
+   Copyright (C) 2015-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This wrapper-file is needed, because otherwise file
+   sysdeps/s390/s390-[32|64]/memchr.S will be used.  */
+#include <sysdeps/s390/multiarch/memchr.c>
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcmp-s390.S b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcmp-s390.S
new file mode 100644
index 0000000000..86a76b4c98
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcmp-s390.S
@@ -0,0 +1,107 @@
+/* CPU specific memcmp implementations.  32 bit S/390 version.
+   Copyright (C) 2012-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/* INPUT PARAMETERS
+     %r2 = address of first memory area
+     %r3 = address of second memory area
+     %r4 = number of bytes to compare.  */
+
+       .text
+
+#if IS_IN (libc)
+
+ENTRY(__memcmp_z196)
+	.machine "z196"
+	.machinemode "zarch_nohighgprs"
+	ltr     %r4,%r4
+	je      .L_Z196_4
+	ahi     %r4,-1
+	srlk    %r1,%r4,8
+	ltr     %r1,%r1
+	jne     .L_Z196_2
+.L_Z196_3:
+	exrl    %r4,.L_Z196_14
+.L_Z196_4:
+	ipm     %r2
+	sll     %r2,2
+	sra     %r2,30
+	br      %r14
+.L_Z196_17:
+	la      %r3,256(%r3)
+	la      %r2,256(%r2)
+	ahi     %r1,-1
+	je      .L_Z196_3
+.L_Z196_2:
+	pfd     1,512(%r3)
+	pfd     1,512(%r2)
+	clc     0(256,%r3),0(%r2)
+	je      .L_Z196_17
+	ipm     %r2
+	sll     %r2,2
+	sra     %r2,30
+	br      %r14
+.L_Z196_14:
+	clc     0(1,%r3),0(%r2)
+END(__memcmp_z196)
+
+ENTRY(__memcmp_z10)
+	.machine "z10"
+	.machinemode "zarch_nohighgprs"
+	ltr     %r4,%r4
+	je      .L_Z10_4
+	ahi     %r4,-1
+	lr      %r1,%r4
+	srl     %r1,8
+	cijlh   %r1,0,.L_Z10_12
+.L_Z10_3:
+	exrl    %r4,.L_Z10_15
+.L_Z10_4:
+	ipm     %r2
+	sll     %r2,2
+	sra     %r2,30
+	br      %r14
+.L_Z10_12:
+	pfd     1,512(%r3)
+	pfd     1,512(%r2)
+	clc     0(256,%r3),0(%r2)
+	jne     .L_Z10_4
+	la      %r3,256(%r3)
+	la      %r2,256(%r2)
+	brct    %r1,.L_Z10_12
+	j       .L_Z10_3
+.L_Z10_15:
+	clc     0(1,%r3),0(%r2)
+END(__memcmp_z10)
+
+#endif /* IS_IN (libc) */
+
+#include "../memcmp.S"
+
+#if !IS_IN (libc)
+.globl   memcmp
+.set     memcmp,__memcmp_default
+.weak    bcmp
+.set	 bcmp,__memcmp_default
+#elif defined SHARED && IS_IN (libc)
+.globl   __GI_memcmp
+.set     __GI_memcmp,__memcmp_default
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcmp.c b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcmp.c
new file mode 100644
index 0000000000..2d8d8f4d50
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcmp.c
@@ -0,0 +1,27 @@
+/* Multiple versions of memcmp.
+   Copyright (C) 2015-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#if IS_IN (libc)
+# define memcmp __redirect_memcmp
+# include <string.h>
+# undef memcmp
+# include <ifunc-resolve.h>
+
+s390_libc_ifunc (__redirect_memcmp, __memcmp, memcmp)
+weak_alias (memcmp, bcmp);
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcpy-s390.S b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
new file mode 100644
index 0000000000..bec51af110
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
@@ -0,0 +1,128 @@
+/* CPU specific memcpy implementations.  32 bit S/390 version.
+   Copyright (C) 2012-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/* INPUT PARAMETERS
+     %r2 = target operands address
+     %r3 = source operands address
+     %r4 = number of bytes to copy.  */
+
+       .text
+
+#if defined SHARED && IS_IN (libc)
+
+ENTRY(____mempcpy_z196)
+	.machine "z196"
+	.machinemode "zarch_nohighgprs"
+	lr      %r1,%r2         # Use as dest
+	la      %r2,0(%r4,%r2)  # Return dest + n
+	j	.L_Z196_start
+END(____mempcpy_z196)
+
+ENTRY(__memcpy_z196)
+	.machine "z196"
+	.machinemode "zarch_nohighgprs"
+	lr      %r1,%r2         # r1: Use as dest ; r2: Return dest
+.L_Z196_start:
+	llgfr   %r4,%r4
+	ltgr    %r4,%r4
+	je      .L_Z196_4
+	aghi    %r4,-1
+	srlg    %r5,%r4,8
+	ltgr    %r5,%r5
+	jne     .L_Z196_5
+.L_Z196_3:
+	exrl    %r4,.L_Z196_14
+.L_Z196_4:
+	br      %r14
+.L_Z196_5:
+	cgfi    %r5,262144      # Switch to mvcle for copies >64MB
+	jh      __memcpy_mvcle
+.L_Z196_2:
+	pfd     1,768(%r3)
+	pfd     2,768(%r1)
+	mvc     0(256,%r1),0(%r3)
+	aghi    %r5,-1
+	la      %r1,256(%r1)
+	la      %r3,256(%r3)
+	jne     .L_Z196_2
+	j       .L_Z196_3
+.L_Z196_14:
+	mvc     0(1,%r1),0(%r3)
+END(__memcpy_z196)
+
+ENTRY(____mempcpy_z10)
+	.machine "z10"
+	.machinemode "zarch_nohighgprs"
+	lr      %r1,%r2         # Use as dest
+	la      %r2,0(%r4,%r2)  # Return dest + n
+	j	.L_Z10_start
+END(____mempcpy_z10)
+
+ENTRY(__memcpy_z10)
+	.machine "z10"
+	.machinemode "zarch_nohighgprs"
+	lr      %r1,%r2         # r1: Use as dest ; r2: Return dest
+.L_Z10_start:
+	llgfr   %r4,%r4
+	cgije   %r4,0,.L_Z10_4
+	aghi    %r4,-1
+	srlg    %r5,%r4,8
+	cgijlh  %r5,0,.L_Z10_13
+.L_Z10_3:
+	exrl    %r4,.L_Z10_15
+.L_Z10_4:
+	br      %r14
+.L_Z10_13:
+	cgfi    %r5,65535	# Switch to mvcle for copies >16MB
+	jh      __memcpy_mvcle
+.L_Z10_12:
+	pfd     1,768(%r3)
+	pfd     2,768(%r1)
+	mvc     0(256,%r1),0(%r3)
+	la      %r1,256(%r1)
+	la      %r3,256(%r3)
+	brctg   %r5,.L_Z10_12
+	j       .L_Z10_3
+.L_Z10_15:
+	mvc     0(1,%r1),0(%r3)
+END(__memcpy_z10)
+
+# define __mempcpy ____mempcpy_default
+#endif /* SHARED && IS_IN (libc) */
+
+#define memcpy __memcpy_default
+#include "../memcpy.S"
+#undef memcpy
+
+#if defined SHARED && IS_IN (libc)
+.globl   __GI_memcpy
+.set     __GI_memcpy,__memcpy_default
+.globl   __GI_mempcpy
+.set     __GI_mempcpy,____mempcpy_default
+.globl   __GI___mempcpy
+.set     __GI___mempcpy,____mempcpy_default
+#else
+.globl   memcpy
+.set     memcpy,__memcpy_default
+.weak    mempcpy
+.set     mempcpy,__mempcpy
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcpy.c b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcpy.c
new file mode 100644
index 0000000000..4b8e546fb0
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memcpy.c
@@ -0,0 +1,27 @@
+/* Multiple versions of memcpy.
+   Copyright (C) 2015-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* In the static lib memcpy is needed before the reloc is resolved.  */
+#if defined SHARED && IS_IN (libc)
+# define memcpy __redirect_memcpy
+# include <string.h>
+# undef memcpy
+# include <ifunc-resolve.h>
+
+s390_libc_ifunc (__redirect_memcpy, __memcpy, memcpy)
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/memset-s390.S b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memset-s390.S
new file mode 100644
index 0000000000..59660b2499
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memset-s390.S
@@ -0,0 +1,116 @@
+/* Set a block of memory to some byte value.  32 bit S/390 version.
+   Copyright (C) 2012-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/* INPUT PARAMETERS
+     %r2 = address of memory area
+     %r3 = byte to fill memory with
+     %r4 = number of bytes to fill.  */
+
+       .text
+
+#if IS_IN (libc)
+
+ENTRY(__memset_z196)
+	.machine "z196"
+	.machinemode "zarch_nohighgprs"
+	llgfr   %r4,%r4
+	ltgr    %r4,%r4
+	je      .L_Z196_4
+	stc     %r3,0(%r2)
+	lr      %r1,%r2
+	cghi    %r4,1
+	je      .L_Z196_4
+	aghi    %r4,-2
+	srlg    %r5,%r4,8
+	ltgr    %r5,%r5
+	jne     .L_Z196_1
+.L_Z196_3:
+	exrl    %r4,.L_Z196_17
+.L_Z196_4:
+	br      %r14
+.L_Z196_1:
+	cgfi	%r5,1048576
+	jh	__memset_mvcle	   # Switch to mvcle for >256MB
+.L_Z196_2:
+	pfd     2,1024(%r1)
+	mvc     1(256,%r1),0(%r1)
+	aghi    %r5,-1
+	la      %r1,256(%r1)
+	jne     .L_Z196_2
+	j       .L_Z196_3
+.L_Z196_17:
+	mvc     1(1,%r1),0(%r1)
+END(__memset_z196)
+
+ENTRY(__memset_z10)
+	.machine "z10"
+	.machinemode "zarch_nohighgprs"
+	llgfr   %r4,%r4
+	cgije   %r4,0,.L_Z10_4
+	stc     %r3,0(%r2)
+	lr      %r1,%r2
+	cgije   %r4,1,.L_Z10_4
+	aghi    %r4,-2
+	srlg    %r5,%r4,8
+	cgijlh  %r5,0,.L_Z10_15
+.L_Z10_3:
+	exrl    %r4,.L_Z10_18
+.L_Z10_4:
+	br      %r14
+.L_Z10_15:
+	cgfi	%r5,163840          # Switch to mvcle for >40MB
+	jh	__memset_mvcle
+.L_Z10_14:
+	pfd     2,1024(%r1)
+	mvc     1(256,%r1),0(%r1)
+	la      %r1,256(%r1)
+	brctg   %r5,.L_Z10_14
+	j       .L_Z10_3
+.L_Z10_18:
+	mvc     1(1,%r1),0(%r1)
+END(__memset_z10)
+
+ENTRY(__memset_mvcle)
+	ahi	%r4,2               # take back the change done by the caller
+	lr      %r0,%r2             # save source address
+	lr      %r1,%r3             # move pad byte to R1
+	lr      %r3,%r4
+	sr      %r4,%r4             # no source for MVCLE, only a pad byte
+	sr      %r5,%r5
+.L0:    mvcle   %r2,%r4,0(%r1)      # thats it, MVCLE is your friend
+	jo      .L0
+	lr      %r2,%r0             # return value is source address
+.L1:
+	br      %r14
+END(__memset_mvcle)
+
+#endif /* IS_IN (libc) */
+
+#include "../memset.S"
+
+#if !IS_IN (libc)
+.globl   memset
+.set     memset,__memset_default
+#elif defined SHARED && IS_IN (libc)
+.globl   __GI_memset
+.set     __GI_memset,__memset_default
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/memset.c b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memset.c
new file mode 100644
index 0000000000..421c0854a0
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/memset.c
@@ -0,0 +1,26 @@
+/* Multiple versions of memset.
+   Copyright (C) 2015-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#if IS_IN (libc)
+# define memset __redirect_memset
+# include <string.h>
+# undef memset
+# include <ifunc-resolve.h>
+
+s390_libc_ifunc (__redirect_memset, __memset, memset)
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/strcmp.c b/REORG.TODO/sysdeps/s390/s390-32/multiarch/strcmp.c
new file mode 100644
index 0000000000..6a20a304cc
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/strcmp.c
@@ -0,0 +1,21 @@
+/* Multiple versions of strcmp.
+   Copyright (C) 2015-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This wrapper-file is needed, because otherwise file
+   sysdeps/s390/s390-[32|64]/strcmp.S will be used.  */
+#include <sysdeps/s390/multiarch/strcmp.c>
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/strcpy.c b/REORG.TODO/sysdeps/s390/s390-32/multiarch/strcpy.c
new file mode 100644
index 0000000000..7f380a471d
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/strcpy.c
@@ -0,0 +1,21 @@
+/* Multiple versions of strcpy.
+   Copyright (C) 2015-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This wrapper-file is needed, because otherwise file
+   sysdeps/s390/s390-[32|64]/strcpy.S will be used.  */
+#include <sysdeps/s390/multiarch/strcpy.c>
diff --git a/REORG.TODO/sysdeps/s390/s390-32/multiarch/strncpy.c b/REORG.TODO/sysdeps/s390/s390-32/multiarch/strncpy.c
new file mode 100644
index 0000000000..15dacec974
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/multiarch/strncpy.c
@@ -0,0 +1,21 @@
+/* Multiple versions of strncpy.
+   Copyright (C) 2015-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This wrapper-file is needed, because otherwise file
+   sysdeps/s390/s390-[32|64]/strncpy.S will be used.  */
+#include <sysdeps/s390/multiarch/strncpy.c>
diff --git a/REORG.TODO/sysdeps/s390/s390-32/s390-mcount.S b/REORG.TODO/sysdeps/s390/s390-32/s390-mcount.S
new file mode 100644
index 0000000000..fe25c5506d
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/s390-mcount.S
@@ -0,0 +1,89 @@
+/* S/390-specific implementation of profiling support.
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+
+/*
+ * How profiling works on 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:
+ * .LC12:  .long  _mcount
+ * .LC13:  .long  .LP0
+ *         .data
+ *         .align 4
+ * .LP0:   .long  0
+ *         .text
+ * # function profiler
+ *         st     14,4(15)
+ *         l      14,.LC12-.LT0_0(13)
+ *         l      1,.LC13-.LT0_0(13)
+ *         basr   14,14
+ *         l      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.
+ */
+
+	.globl C_SYMBOL_NAME(_mcount)
+	.type C_SYMBOL_NAME(_mcount), @function
+	cfi_startproc
+	.align ALIGNARG(4)
+C_LABEL(_mcount)
+	/* Save the caller-clobbered registers.  */
+	ahi   %r15,-128
+	cfi_adjust_cfa_offset (128)
+	stm   %r14,%r5,96(%r15)
+	cfi_offset (r14, 0)
+	cfi_offset (r15, 4)
+	l     %r2,132(%r15)       # callers address  = first parameter
+	la    %r2,0(%r2)          # clear bit 0
+	la    %r3,0(%r14)         # callees address  = second parameter
+
+#ifdef PIC
+	bras  %r14,0f
+	.long _GLOBAL_OFFSET_TABLE_-.
+0:	al    %r14,0(%r14)
+	l     %r14,__mcount_internal@GOT(%r14)
+#else
+	bras  %r14,0f
+	.long __mcount_internal
+0:      l     %r14,0(%r14)
+#endif
+	basr  %r14,%r14
+
+	/*
+	 * Pop the saved registers.  Please note that `mcount' has no
+	 * return value.
+	 */
+	lm    %r14,%r5,96(%r15)
+	ahi   %r15,128
+	cfi_adjust_cfa_offset (-128)
+	br    %r14
+	cfi_endproc
+	ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount))
+
+#undef mcount
+weak_alias (_mcount, mcount)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/setjmp.S b/REORG.TODO/sysdeps/s390/s390-32/setjmp.S
new file mode 100644
index 0000000000..1e240dbc83
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/setjmp.S
@@ -0,0 +1,123 @@
+/* setjmp for s390, ELF version.
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#define _ASM
+#define _SETJMP_H
+#include <bits/setjmp.h>
+#include <shlib-compat.h>
+#include <stap-probe.h>
+
+#if !IS_IN (rtld) && defined SHARED \
+  && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20)
+# define NEED_COMPAT_SYMBOLS 1
+/* We need a unique name in case of symbol versioning.  */
+# define setjmp __v1setjmp
+# define _setjmp __v1_setjmp
+# define __sigsetjmp __v1__sigsetjmp
+#else
+# define NEED_COMPAT_SYMBOLS 0
+#endif
+
+	/* We include the BSD entry points here as well.  */
+ENTRY (setjmp)
+	lhi    %r3,1                /* second argument of one */
+	j      .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
+END (setjmp)
+
+	/* Binary compatibility entry point.  */
+ENTRY(_setjmp)
+	lhi    %r3,0                /* second argument of zero */
+	j      .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
+END (_setjmp)
+#if NEED_COMPAT_SYMBOLS
+strong_alias (_setjmp, __GI__setjmp)
+#else
+libc_hidden_def (_setjmp)
+#endif
+
+ENTRY(__setjmp)
+	lhi    %r3,0                /* second argument of zero */
+	j      .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
+END (__setjmp)
+
+ENTRY(__sigsetjmp)
+.Linternal_sigsetjmp:
+	/* setjmp probe expects sig/setjmp first argument (4@%r2), second
+	   argument (-4@%r3) and target address (4@%r14).  */
+	LIBC_PROBE (setjmp, 3, 4@%r2, -4@%r3, 4@%r14)
+#ifdef PTR_MANGLE
+	stm    %r6,%r13,0(%r2)      /* store registers in jmp_buf */
+	lr     %r4,%r14
+	lr     %r5,%r15
+	PTR_MANGLE (%r4, %r1)
+	PTR_MANGLE2 (%r5, %r1)
+	stm    %r4,%r5,32(%r2)
+#else
+	stm    %r6,%r15,0(%r2)      /* store registers in jmp_buf */
+#endif
+	std    %f4,40(%r2)
+	std    %f6,48(%r2)
+#if IS_IN (rtld)
+	/* In ld.so we never save the signal mask.  */
+	lhi    %r2,0
+	br     %r14
+#elif defined 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
+	   indirect jump through the GOT. */
+	basr   %r1,0
+.L0:    al     %r1,.L1 - .L0(0,%r1) /* get address of global offset table */
+				    /* get address of __sigjmp_save from got */
+	l      %r1,__sigjmp_save@GOT(%r1)
+	br     %r1
+.L1:    .long  _GLOBAL_OFFSET_TABLE_ - .L0
+#else
+	basr   %r1,0
+.L0:    l      %r1,.L1-.L0(0,%r1)   /* load address of __sigjmp_save */
+	br     %r1                  /* tail-call __sigjmp_save */
+.L1:    .long  __sigjmp_save
+#endif
+END (__sigsetjmp)
+#if NEED_COMPAT_SYMBOLS
+strong_alias (__sigsetjmp, __GI___sigsetjmp)
+#else
+libc_hidden_def (__sigsetjmp)
+#endif
+
+#if NEED_COMPAT_SYMBOLS
+/* In glibc release 2.19 new versions of setjmp-functions were introduced,
+   but were reverted before 2.20. Thus both versions are the same function.  */
+
+# undef setjmp
+# undef _setjmp
+# undef __sigsetjmp
+
+strong_alias (__v1setjmp, __v2setjmp);
+versioned_symbol (libc, __v1setjmp, setjmp, GLIBC_2_0);
+compat_symbol (libc, __v2setjmp, setjmp, GLIBC_2_19);
+
+strong_alias (__v1_setjmp, __v2_setjmp);
+versioned_symbol (libc, __v1_setjmp, _setjmp, GLIBC_2_0);
+compat_symbol (libc, __v2_setjmp, _setjmp, GLIBC_2_19);
+
+strong_alias (__v1__sigsetjmp, __v2__sigsetjmp);
+versioned_symbol (libc, __v1__sigsetjmp, __sigsetjmp, GLIBC_2_0);
+compat_symbol (libc, __v2__sigsetjmp, __sigsetjmp, GLIBC_2_19);
+#endif /* NEED_COMPAT_SYMBOLS */
diff --git a/REORG.TODO/sysdeps/s390/s390-32/stackguard-macros.h b/REORG.TODO/sysdeps/s390/s390-32/stackguard-macros.h
new file mode 100644
index 0000000000..46109744ed
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/stackguard-macros.h
@@ -0,0 +1,15 @@
+#include <stdint.h>
+
+#define STACK_CHK_GUARD \
+  ({ uintptr_t x; __asm__ ("ear %0,%%a0; l %0,0x14(%0)" : "=a" (x)); x; })
+
+/* On s390/s390x there is no unique pointer guard, instead we use the
+   same value as the stack guard.  */
+#define POINTER_CHK_GUARD \
+  ({								\
+    uintptr_t x;						\
+    __asm__ ("ear %0,%%a0; l %0,%1(%0)"				\
+	     : "=a" (x)						\
+	     : "i" (offsetof (tcbhead_t, stack_guard)));	\
+    x;								\
+  })
diff --git a/REORG.TODO/sysdeps/s390/s390-32/start.S b/REORG.TODO/sysdeps/s390/s390-32/start.S
new file mode 100644
index 0000000000..07400f1752
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/start.S
@@ -0,0 +1,211 @@
+/* Startup code compliant to the ELF s390 ABI.
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser 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 GNU Lesser 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.)
+
+   Note that people who make modified versions of this file are not
+   obligated to grant this special exception for their modified
+   versions; it is their choice whether to do so. The GNU Lesser
+   General Public License gives permission to release a modified
+   version without this exception; this exception also makes it
+   possible to release a modified version which carries forward this
+   exception.
+
+   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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/*
+   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
+		4(%r15)			argv[0]
+		...
+		(4*argc)(%r15)		NULL
+		(4*(argc+1))(%r15)	envp[0]
+		...
+					NULL
+*/
+
+	.text
+	.globl _start
+	.type _start,@function
+_start:
+	/* Check if the kernel provides highgprs facility if needed by
+	   the binary.  */
+
+	lr	%r6,%r15
+	la	%r6,4(%r6)     /* Skip the argument counter.  */
+
+.L11:	l	%r5,0(%r6)     /* Skip the argument vector.  */
+	la	%r6,4(%r6)
+	ltr	%r5,%r5
+	jne	.L11
+
+.L12:	l	%r5,0(%r6)     /* Skip the environment vector.  */
+	la	%r6,4(%r6)
+	ltr	%r5,%r5
+	jne	.L12
+
+	/* Usually the auxiliary vector can be expected directly after
+	   the environment variables.  But we have to skip extra zeros
+	   because the loader might have removed unsecure variables for
+	   setuid programs.  */
+
+.L26:	l	%r5,0(%r6)
+	la	%r6,4(%r6)
+	ltr	%r5,%r5
+	jz	.L26
+
+	ahi	%r6,-4
+
+	/* Obtain the needed values from the auxiliary vector.  */
+
+	lhi	%r7,16	       /* AT_HWCAP */
+	lhi	%r8,3	       /* AT_PHDR */
+	lhi	%r9,5          /* AT_PHNUM */
+	lhi	%r2,4          /* AT_PHENT */
+.L13:	l	%r5,0(%r6)
+	clr	%r5,%r7
+	jne	.L15
+	l	%r10,4(%r6)    /* r10 = AT_HWCAP value.  */
+.L15:	clr	%r5,%r8
+	jne	.L16
+	l	%r11,4(%r6)    /* r11 = AT_PHDR value.  */
+.L16:	clr	%r5,%r9
+	jne	.L17
+	l	%r12,4(%r6)    /* r12 = AT_PHNUM value.  */
+.L17:	clr	%r5,%r2
+	jne	.L18
+	l	%r0,4(%r6)     /* r0 = AT_PHENT value.  */
+.L18:	ltr	%r5,%r5
+	la	%r6,8(%r6)
+	jnz	.L13
+
+	/* Locate the ELF header by looking for the first PT_LOAD
+	   segment with a p_offset of zero.  */
+
+	lr	%r4,%r11       /* Backup AT_PHDR.  */
+	lhi	%r7,1          /* PT_LOAD id */
+	lhi	%r8,0
+.L19:	cl	%r7,0(%r4)     /* p_type == PT_LOAD? */
+	jne	.L20
+	cl	%r8,4(%r4)     /* p_offset == 0? */
+	jne	.L20
+	l	%r9,8(%r4)     /* r9 = PT_LOAD.p_vaddr <- ELF header address  */
+	j	.L24
+.L20:	alr	%r4,%r0        /* r4 += AT_PHENT value */
+	brct	%r12,.L19
+
+	j	.+2            /* Trap, there must be such a phdr.  */
+
+.L24:	lr	%r4,%r11       /* Backup AT_PHDR.  */
+	lhi	%r2,6          /* PT_PHDR id */
+.L23:	cl	%r2,0(%r4)
+	jne	.L22
+	l	%r3,8(%r4)     /* r3 = PT_PHDR p_vaddr */
+	j	.L25
+.L22:	alr	%r4,%r0        /* r4 += AT_PHENT value */
+	brct	%r12,.L23
+
+	j	.L14	       /* No PT_PHDR found - skip checking.  */
+
+.L25:	slr	%r11,%r3       /* AT_PHDR - PT_PHDR.p_vaddr (relocation offset)*/
+	alr	%r9,%r11       /* PT_LOAD.p_vaddr += relocation offset */
+
+	l	%r5,36(%r9)    /* Load the e_flags field.  */
+	tml	%r5,1
+	jz	.L14	       /* Binary does not require highgprs facility.  */
+
+	tml	%r10,512       /* Check the AT_HWCAP value.  */
+	jz	2              /* Trap if no highgprs facility available.  */
+.L14:
+
+	/* Setup pointer to literal pool of _start */
+	basr    %r13,0
+.L0:    ahi     %r13,.Llit-.L0
+
+	/* load argc and argv from stack */
+	la      %r4,4(%r15)             # get argv
+	l       %r3,0(%r15)             # get argc
+
+	/* align the stack to a double word boundary */
+	lhi     %r0,-8
+	nr      %r15,%r0
+
+	/* Setup a stack frame and a parameter area */
+	ahi     %r15,-104               # make room on stack
+	xc      0(4,%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
+	 */
+	stm     %r14,%r15,96(%r15)      # store rtld_fini/stack_end to parameter area
+	la      %r7,96(%r15)
+	l       %r6,.L2-.Llit(%r13)     # load pointer to __libc_csu_fini
+	l       %r5,.L1-.Llit(%r13)     # load pointer to __libc_csu_init
+	l       %r2,.L3-.Llit(%r13)     # load pointer to main
+	l       %r1,.L4-.Llit(%r13)	# load pointer to __libc_start_main
+#ifdef PIC
+	l       %r12,.L5-.Llit(%r13)    # load .got pointer
+	la	%r6,0(%r13,%r6)
+	la	%r5,0(%r13,%r5)
+	la	%r12,0(%r13,%r12)
+	l	%r2,0(%r12,%r2)
+	la	%r1,0(%r13,%r1)
+#endif
+
+	/* ok, now branch to the libc main routine */
+	basr    %r14,%r1
+
+	/* crash if __libc_start_main returns */
+	.word   0
+
+.Llit:
+#ifndef PIC
+.L1:    .long  __libc_csu_init
+.L2:    .long  __libc_csu_fini
+.L3:    .long  main
+.L4:    .long  __libc_start_main
+#else
+.L1:    .long  __libc_csu_init-.Llit
+.L2:    .long  __libc_csu_fini-.Llit
+.L3:    .long  main@GOT
+.L4:    .long  __libc_start_main@plt-.Llit
+.L5:    .long  _GLOBAL_OFFSET_TABLE_-.Llit
+#endif
+
+/* 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/REORG.TODO/sysdeps/s390/s390-32/strcmp.S b/REORG.TODO/sysdeps/s390/s390-32/strcmp.S
new file mode 100644
index 0000000000..69754c5f5a
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/strcmp.S
@@ -0,0 +1,41 @@
+/* strcmp - compare two string.  S/390 version.
+   This file is part of the GNU C Library.
+   Copyright (C) 2001-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* INPUT PARAMETERS
+     %r2 = address of string 1
+     %r3 = address of string 2.  */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+	.text
+ENTRY(strcmp)
+        slr   %r0,%r0
+0:	clst  %r2,%r3
+	jo    0b
+	jp    1f
+	jm    2f
+	slr   %r2,%r2
+	br    %r14
+1:	lhi   %r2,1
+	br    %r14
+2:	lhi   %r2,-1
+	br    %r14
+END(strcmp)
+libc_hidden_builtin_def (strcmp)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/strcpy.S b/REORG.TODO/sysdeps/s390/s390-32/strcpy.S
new file mode 100644
index 0000000000..ab06ff8d72
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/strcpy.S
@@ -0,0 +1,36 @@
+/* strcpy - copy a string from source to destination. For IBM S390
+   This file is part of the GNU C Library.
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/*
+ * R2 = address of destination
+ * R3 = address of source
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+	.text
+ENTRY(strcpy)
+	slr   %r0,%r0
+	lr    %r1,%r2
+0:      mvst  %r1,%r3
+	jo    0b
+	br    %r14
+END(strcpy)
+libc_hidden_builtin_def (strcpy)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/strncpy.S b/REORG.TODO/sysdeps/s390/s390-32/strncpy.S
new file mode 100644
index 0000000000..c642bce90d
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/strncpy.S
@@ -0,0 +1,79 @@
+/* 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-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/*
+ * 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
+	st    %r2,24(%r15)          # save dst pointer
+	slr   %r2,%r3               # %r3 points to src, %r2+%r3 to dst
+	lhi   %r1,3
+	nr    %r1,%r4               # last 2 bits of # bytes
+	srl   %r4,2
+	ltr   %r4,%r4               # less than 4 bytes to copy ?
+	jz    .L1
+	bras  %r5,.L0               # enter loop & load address of a 0
+	.long 0
+.L0:    icm   %r0,8,0(%r3)          # first byte
+	jz    .L3
+	icm   %r0,4,1(%r3)          # second byte
+	jz    .L4
+	icm   %r0,2,2(%r3)          # third byte
+	jz    .L5
+	icm   %r0,1,3(%r3)          # fourth byte
+	jz    .L6
+	st    %r0,0(%r2,%r3)        # store all four to dest.
+	la    %r3,4(%r3)
+	brct  %r4,.L0
+.L1:    ltr   %r1,%r1
+	jz    .Lexit
+.L2:    icm   %r0,1,0(%r3)
+	stc   %r0,0(%r2,%r3)
+	la    %r3,1(%r3)
+	jz    .L7
+	brct  %r1,.L2
+	j     .Lexit
+.L3:    icm   %r0,4,0(%r5)
+.L4:    icm   %r0,2,0(%r5)
+.L5:    icm   %r0,1,0(%r5)
+.L6:    st    %r0,0(%r2,%r3)
+	la    %r3,4(%r3)
+	ahi   %r4,-1
+	j     .L8
+.L7:    ahi   %r1,-1
+.L8:    sll   %r4,2
+	alr   %r4,%r1
+	alr   %r2,%r3               # start of dst area to be zeroed
+	lr    %r3,%r4
+	slr   %r4,%r4
+	slr   %r5,%r5
+.L9:    mvcle %r2,%r4,0             # pad dst with zeroes
+	jo    .L9
+.Lexit: l     %r2,24(%r15)          # return dst pointer
+	br    %r14
+END(strncpy)
+libc_hidden_builtin_def (strncpy)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/sub_n.S b/REORG.TODO/sysdeps/s390/s390-32/sub_n.S
new file mode 100644
index 0000000000..358c8deddb
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/sub_n.S
@@ -0,0 +1,62 @@
+/* __mpn_sub_n -- Add two limb vectors of the same length > 0 and store
+   sum in a third limb vector.
+   Copyright (C) 2000-2017 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 Lesser General Public License as published by
+   the Free Software Foundation; either version 2.1 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 Lesser General Public
+   License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with the GNU MP Library; see the file COPYING.LIB.  If not,
+   see <http://www.gnu.org/licenses/>.  */
+
+/*
+  INPUT PARAMETERS
+  res_ptr	%r2
+  s1_ptr	%r3
+  s2_ptr	%r4
+  size		%r5
+*/
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+ENTRY(__mpn_sub_n)
+	st     %r6,24(%r15)   # save register 6
+	cfi_offset (%r6, -72)
+	sr     %r1,%r1
+	lhi    %r0,1          # cannot use ahi to add carry, use slr
+.L0:    l      %r6,0(%r1,%r3) # .L0 -> no carry from last sub
+	sl     %r6,0(%r1,%r4)
+	st     %r6,0(%r1,%r2)
+	la     %r1,4(0,%r1)
+	brc    4,.L3
+.L1:    brct   %r5,.L0
+	slr    %r2,%r2        # no last carry to return
+	j      .Lexit
+.L2:    l      %r6,0(%r1,%r3) # .L2 -> carry from last sub
+	sl     %r6,0(%r1,%r4)
+	brc    4,.L4
+	slr    %r6,%r0        # no carry yet, add carry from last sub
+	st     %r6,0(%r1,%r2)
+	la     %r1,4(0,%r1)
+	brc    11,.L1         # new carry ?
+.L3:    brct   %r5,.L2
+	lr     %r2,%r0        # return last carry
+	j      .Lexit
+.L4:    slr    %r6,%r0        # already a carry, add carry from last sub
+	st     %r6,0(%r1,%r2)
+	la     %r1,4(0,%r1)
+	brct   %r5,.L2
+	lr     %r2,%r0        # return last carry
+.Lexit: l      %r6,24(%r15)   # restore register 6
+	br     %r14
+END(__mpn_sub_n)
diff --git a/REORG.TODO/sysdeps/s390/s390-32/symbol-hacks.h b/REORG.TODO/sysdeps/s390/s390-32/symbol-hacks.h
new file mode 100644
index 0000000000..585c42365a
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/symbol-hacks.h
@@ -0,0 +1,21 @@
+/* Hacks needed for symbol manipulation.  s390 version.
+   Copyright (C) 2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdeps/wordsize-32/divdi3-symbol-hacks.h>
+
+#include_next "symbol-hacks.h"
diff --git a/REORG.TODO/sysdeps/s390/s390-32/sysdep.h b/REORG.TODO/sysdeps/s390/s390-32/sysdep.h
new file mode 100644
index 0000000000..15a4e3e687
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/sysdep.h
@@ -0,0 +1,101 @@
+/* Assembler macros for s390.
+   Copyright (C) 2000-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdeps/generic/sysdep.h>
+
+#ifdef	__ASSEMBLER__
+
+/* Syntactic details of assembler.  */
+
+/* ELF uses byte-counts for .align, most others use log2 of count of bytes.  */
+#define ALIGNARG(log2) 1<<log2
+#define ASM_SIZE_DIRECTIVE(name) .size name,.-name;
+
+
+/* Define an entry point visible from C. */
+#define	ENTRY(name)							      \
+  .globl C_SYMBOL_NAME(name);						      \
+  .type C_SYMBOL_NAME(name),@function;					      \
+  .align ALIGNARG(2);							      \
+  C_LABEL(name)								      \
+  cfi_startproc;							      \
+  CALL_MCOUNT
+
+#undef	END
+#define END(name)							      \
+  cfi_endproc;								      \
+  ASM_SIZE_DIRECTIVE(name)						      \
+
+/* If compiled for profiling, call `mcount' at the start of each function.  */
+#ifdef	PROF
+#ifdef PIC
+#define CALL_MCOUNT \
+  lr 0,14 ; bras 14,.+12 ; .long _GLOBAL_OFFSET_TABLE_ - . ; .long 0f-. ; \
+  lr 1,14 ; al 1,4(14) ; al 14,0(14) ; l 14,_mcount@GOT(14) ; \
+  basr 14,14 ; lr 14,0 ; .data ; .align 4 ; 0: .long 0 ; .text ;
+#else
+#define CALL_MCOUNT \
+  lr 0,14 ; bras 14,.+12 ; .long _mcount ; .long 0f ; \
+  l 1,4(14) ; l 14,0(14) ; basr 14,14 ; lr 14,0 ; \
+  .data ; .align 4 ; 0: .long 0 ; .text ;
+#endif
+#else
+#define CALL_MCOUNT		/* Do nothing.  */
+#endif
+
+/* 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
+
+#undef PSEUDO
+#define	PSEUDO(name, syscall_name, args) \
+lose: SYSCALL_PIC_SETUP				\
+    basr %r1,0;					\
+0:  al %r1,1f-0b(%r1);				\
+    br %r1;					\
+1:  .long JUMPTARGET(syscall_error) - 0b;	\
+    .globl syscall_error;			\
+    ENTRY (name)				\
+    DO_CALL (syscall_name, args);		\
+    jm lose
+
+#undef	PSEUDO_END
+#define	PSEUDO_END(name)						      \
+  END (name)
+
+#undef JUMPTARGET
+#ifdef PIC
+#define JUMPTARGET(name)	name##@PLT
+#define SYSCALL_PIC_SETUP             \
+    bras  %r12,1f                     \
+0:  .long _GLOBAL_OFFSET_TABLE_-0b    \
+1:  al    %r12,0(%r12)
+#else
+#define JUMPTARGET(name)   	name
+#define SYSCALL_PIC_SETUP	/* Nothing.  */
+#endif
+
+/* Local label name for asm code. */
+#ifndef L
+#define L(name)		.L##name
+#endif
+
+#endif	/* __ASSEMBLER__ */
diff --git a/REORG.TODO/sysdeps/s390/s390-32/tls-macros.h b/REORG.TODO/sysdeps/s390/s390-32/tls-macros.h
new file mode 100644
index 0000000000..a4c5fffa33
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/tls-macros.h
@@ -0,0 +1,104 @@
+#define TLS_LE(x) \
+  ({ unsigned long __offset;						      \
+     __asm__ ("bras %0,1f\n"						      \
+	      "0:\t.long " #x "@ntpoff\n"				      \
+	      "1:\tl %0,0(%0)"						      \
+	      : "=a" (__offset) : : "cc" );				      \
+     (int *) (__builtin_thread_pointer() + __offset); })
+
+#ifdef PIC
+# define TLS_IE(x) \
+  ({ unsigned long __offset, __got;					      \
+     __asm__ ("bras %0,1f\n"						      \
+	      "0:\t.long _GLOBAL_OFFSET_TABLE_-0b\n\t"			      \
+	      ".long " #x "@gotntpoff\n"				      \
+	      "1:\tl %1,0(%0)\n\t"					      \
+	      "la %1,0(%1,%0)\n\t"					      \
+	      "l %0,4(%0)\n\t"						      \
+	      "l %0,0(%0,%1):tls_load:" #x "\n"				      \
+	      : "=&a" (__offset), "=&a" (__got) : : "cc" );		      \
+     (int *) (__builtin_thread_pointer() + __offset); })
+#else
+# define TLS_IE(x) \
+  ({ unsigned long  __offset;						      \
+     __asm__ ("bras %0,1f\n"						      \
+	      "0:\t.long " #x "@indntpoff\n"				      \
+	      "1:\t l %0,0(%0)\n\t"					      \
+	      "l %0,0(%0):tls_load:" #x					      \
+	      : "=&a" (__offset) : : "cc" );				      \
+     (int *) (__builtin_thread_pointer() + __offset); })
+#endif
+
+#ifdef PIC
+# define TLS_LD(x) \
+  ({ unsigned long __offset, __save12;					      \
+     __asm__ ("bras %0,1f\n"						      \
+	      "0:\t.long _GLOBAL_OFFSET_TABLE_-0b\n\t"			      \
+	      ".long __tls_get_offset@plt-0b\n\t"			      \
+	      ".long " #x "@tlsldm\n\t"					      \
+	      ".long " #x "@dtpoff\n"					      \
+	      "1:\tlr %1,%%r12\n\t"					      \
+	      "l %%r12,0(%0)\n\t"					      \
+	      "la %%r12,0(%%r12,%0)\n\t"				      \
+	      "l %%r1,4(%0)\n\t"					      \
+	      "l %%r2,8(%0)\n\t"					      \
+	      "bas %%r14,0(%%r1,%0):tls_ldcall:" #x "\n\t"		      \
+	      "l %0,12(%0)\n\t"						      \
+	      "alr %0,%%r2\n\t"						      \
+	      "lr %%r12,%1"						      \
+	      : "=&a" (__offset), "=&a" (__save12)			      \
+	      : : "cc", "0", "1", "2", "3", "4", "5", "14");		      \
+     (int *) (__builtin_thread_pointer() + __offset); })
+#else
+# define TLS_LD(x) \
+  ({ unsigned long __offset;						      \
+     __asm__ ("bras %0,1f\n"						      \
+	      "0:\t.long _GLOBAL_OFFSET_TABLE_\n\t"			      \
+	      ".long __tls_get_offset@plt\n\t"				      \
+	      ".long " #x "@tlsldm\n\t"					      \
+	      ".long " #x "@dtpoff\n"					      \
+	      "1:\tl %%r12,0(%0)\n\t"					      \
+	      "l %%r1,4(%0)\n\t"					      \
+	      "l %%r2,8(%0)\n\t"					      \
+	      "bas %%r14,0(%%r1):tls_ldcall:" #x "\n\t"			      \
+	      "l %0,12(%0)\n\t"						      \
+	      "alr %0,%%r2"						      \
+	      : "=&a" (__offset)					      \
+	      : : "cc", "0", "1", "2", "3", "4", "5", "12", "14");	      \
+     (int *) (__builtin_thread_pointer() + __offset); })
+#endif
+
+#ifdef PIC
+# define TLS_GD(x) \
+  ({ unsigned long __offset, __save12;					      \
+     __asm__ ("bras %0,1f\n"						      \
+	      "0:\t.long _GLOBAL_OFFSET_TABLE_-0b\n\t"			      \
+	      ".long __tls_get_offset@plt-0b\n\t"			      \
+	      ".long " #x "@tlsgd\n"					      \
+	      "1:\tlr %1,%%r12\n\t"					      \
+	      "l %%r12,0(%0)\n\t"					      \
+	      "la %%r12,0(%%r12,%0)\n\t"				      \
+	      "l %%r1,4(%0)\n\t"					      \
+	      "l %%r2,8(%0)\n\t"					      \
+	      "bas %%r14,0(%%r1,%0):tls_gdcall:" #x "\n\t"		      \
+	      "lr %0,%%r2\n\t"						      \
+	      "lr %%r12,%1"						      \
+	      : "=&a" (__offset), "=&a" (__save12)			      \
+	      : : "cc", "0", "1", "2", "3", "4", "5", "14");		      \
+     (int *) (__builtin_thread_pointer() + __offset); })
+#else
+# define TLS_GD(x) \
+  ({ unsigned long __offset;						      \
+     __asm__ ("bras %0,1f\n"						      \
+	      "0:\t.long _GLOBAL_OFFSET_TABLE_\n\t"			      \
+	      ".long __tls_get_offset@plt\n\t"				      \
+	      ".long " #x "@tlsgd\n"					      \
+	      "1:\tl %%r12,0(%0)\n\t"					      \
+	      "l %%r1,4(%0)\n\t"					      \
+	      "l %%r2,8(%0)\n\t"					      \
+	      "bas %%r14,0(%%r1):tls_gdcall:" #x "\n\t"			      \
+	      "lr %0,%%r2"						      \
+	      : "=&a" (__offset)					      \
+	      : : "cc", "0", "1", "2", "3", "4", "5", "12", "14");	      \
+     (int *) (__builtin_thread_pointer() + __offset); })
+#endif
diff --git a/REORG.TODO/sysdeps/s390/s390-32/tst-audit.h b/REORG.TODO/sysdeps/s390/s390-32/tst-audit.h
new file mode 100644
index 0000000000..daabc70aa9
--- /dev/null
+++ b/REORG.TODO/sysdeps/s390/s390-32/tst-audit.h
@@ -0,0 +1,25 @@
+/* Definitions for testing PLT entry/exit auditing.  S/390 32-bit version.
+
+   Copyright (C) 2012-2017 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#define pltenter la_s390_32_gnu_pltenter
+#define pltexit la_s390_32_gnu_pltexit
+#define La_regs La_s390_32_regs
+#define La_retval La_s390_32_retval
+#define int_retval lrv_r2