[PATCH 4/5] s390: Move files out of s390-64 folders

Stefan Liebler stli@linux.ibm.com
Thu Apr 9 08:47:09 GMT 2026


All the files in subfolders s390/s390-64 in sysdeps directory are moved
up to the s390/ ones.  If necessary the files were merged with the existing
ones.

sysdeps/s390/preconfigure.ac was updated to reflect the removal of s390-64
subdirectory.
---
 sysdeps/s390/Implies                          |   1 +
 sysdeps/s390/Makefile                         |  89 +++++++
 sysdeps/s390/Versions                         |   3 +
 sysdeps/s390/{s390-64 => }/__longjmp.c        |   2 +-
 sysdeps/s390/{s390-64 => }/add_n.S            |   0
 sysdeps/s390/{s390-64 => }/bsd-_setjmp.S      |   0
 sysdeps/s390/{s390-64 => }/bsd-setjmp.S       |   0
 sysdeps/s390/configure                        |  93 +++++++-
 sysdeps/s390/configure.ac                     |  56 ++++-
 sysdeps/s390/{s390-64 => }/crti.S             |   0
 sysdeps/s390/{s390-64 => }/crtn.S             |   0
 sysdeps/s390/{s390-64 => }/dl-hwcap-check.h   |   0
 .../s390/{s390-64 => }/dl-hwcaps-subdirs.c    |   0
 sysdeps/s390/{s390-64 => }/dl-machine.h       |   0
 sysdeps/s390/{s390-64 => }/dl-trampoline.S    |   0
 sysdeps/s390/{s390-64 => }/dl-trampoline.h    |   0
 sysdeps/s390/preconfigure                     |   2 +-
 sysdeps/s390/preconfigure.ac                  |   2 +-
 sysdeps/s390/s390-64/Implies                  |   1 -
 sysdeps/s390/s390-64/Makefile                 |  92 --------
 sysdeps/s390/s390-64/Versions                 |   5 -
 sysdeps/s390/s390-64/configure                |  95 --------
 sysdeps/s390/s390-64/configure.ac             |  57 -----
 sysdeps/s390/{s390-64 => }/s390x-mcount.S     |   0
 sysdeps/s390/{s390-64 => }/s390x-mcount.h     |   0
 sysdeps/s390/{s390-64 => }/setjmp.S           |   0
 .../s390/{s390-64 => }/stackguard-macros.h    |   0
 sysdeps/s390/{s390-64 => }/start.S            |   0
 sysdeps/s390/{s390-64 => }/strncpy-z900.S     |   0
 sysdeps/s390/{s390-64 => }/sub_n.S            |   0
 sysdeps/s390/{s390-64 => }/sysdep.h           |   0
 sysdeps/s390/{s390-64 => }/tst-audit.h        |   0
 sysdeps/s390/{s390-64 => }/tst-glibc-hwcaps.c |   0
 sysdeps/unix/sysv/linux/s390/Implies          |   1 +
 sysdeps/unix/sysv/linux/s390/Makefile         |  10 +
 sysdeps/unix/sysv/linux/s390/Versions         |   5 +
 .../s390/{s390-64 => }/____longjmp_chk.c      |   0
 .../s390/{s390-64 => }/__makecontext_ret.S    |   0
 .../linux/s390/{s390-64 => }/arch-syscall.h   |   0
 .../linux/s390/{s390-64 => }/c++-types.data   |   0
 .../sysv/linux/s390/{s390-64 => }/clone.S     |   0
 .../sysv/linux/s390/{s390-64 => }/clone3.S    |   0
 sysdeps/unix/sysv/linux/s390/configure        |  13 ++
 sysdeps/unix/sysv/linux/s390/configure.ac     |   2 +
 sysdeps/unix/sysv/linux/s390/dl-cache.h       |  23 ++
 .../linux/s390/{s390-64 => }/getcontext.S     |   0
 .../sysv/linux/s390/{s390-64 => }/ld.abilist  |   0
 .../{s390-64 => }/libBrokenLocale.abilist     |   0
 .../linux/s390/{s390-64 => }/libanl.abilist   |   0
 .../linux/s390/{s390-64 => }/libc.abilist     |   0
 .../{s390-64 => }/libc_malloc_debug.abilist   |   0
 .../linux/s390/{s390-64 => }/libdl.abilist    |   0
 .../linux/s390/{s390-64 => }/libm.abilist     |   0
 .../linux/s390/{s390-64 => }/libnsl.abilist   |   0
 .../s390/{s390-64 => }/libpthread.abilist     |   0
 .../s390/{s390-64 => }/libresolv.abilist      |   0
 .../linux/s390/{s390-64 => }/librt.abilist    |   0
 .../s390/{s390-64 => }/libthread_db.abilist   |   0
 .../linux/s390/{s390-64 => }/libutil.abilist  |   0
 .../linux/s390/{s390-64 => }/makecontext.c    |   0
 .../linux/s390/{s390-64 => }/pointer_guard.h  |   0
 sysdeps/unix/sysv/linux/s390/s390-64/Implies  |   1 -
 sysdeps/unix/sysv/linux/s390/s390-64/Makefile |  15 --
 sysdeps/unix/sysv/linux/s390/s390-64/Versions |   7 -
 .../unix/sysv/linux/s390/s390-64/configure    |  16 --
 .../unix/sysv/linux/s390/s390-64/configure.ac |   4 -
 .../unix/sysv/linux/s390/s390-64/dl-cache.h   |  24 --
 sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 178 --------------
 .../linux/s390/{s390-64 => }/setcontext.S     |   0
 .../linux/s390/{s390-64 => }/shlib-versions   |   0
 .../linux/s390/{s390-64 => }/single-thread.h  |   0
 .../linux/s390/{s390-64 => }/swapcontext.S    |   0
 .../sysv/linux/s390/{s390-64 => }/syscall.S   |   0
 .../linux/s390/{s390-64 => }/syscall_cancel.S |   0
 .../sysv/linux/s390/{s390-64 => }/sysdep.S    |   0
 sysdeps/unix/sysv/linux/s390/sysdep.h         | 218 +++++++++++++++---
 .../{s390-64 => }/timer_t_was_int_compat.h    |   0
 .../sysv/linux/s390/{s390-64 => }/vfork.S     |   0
 78 files changed, 481 insertions(+), 534 deletions(-)
 rename sysdeps/s390/{s390-64 => }/__longjmp.c (97%)
 rename sysdeps/s390/{s390-64 => }/add_n.S (100%)
 rename sysdeps/s390/{s390-64 => }/bsd-_setjmp.S (100%)
 rename sysdeps/s390/{s390-64 => }/bsd-setjmp.S (100%)
 rename sysdeps/s390/{s390-64 => }/crti.S (100%)
 rename sysdeps/s390/{s390-64 => }/crtn.S (100%)
 rename sysdeps/s390/{s390-64 => }/dl-hwcap-check.h (100%)
 rename sysdeps/s390/{s390-64 => }/dl-hwcaps-subdirs.c (100%)
 rename sysdeps/s390/{s390-64 => }/dl-machine.h (100%)
 rename sysdeps/s390/{s390-64 => }/dl-trampoline.S (100%)
 rename sysdeps/s390/{s390-64 => }/dl-trampoline.h (100%)
 delete mode 100644 sysdeps/s390/s390-64/Implies
 delete mode 100644 sysdeps/s390/s390-64/Makefile
 delete mode 100644 sysdeps/s390/s390-64/Versions
 delete mode 100644 sysdeps/s390/s390-64/configure
 delete mode 100644 sysdeps/s390/s390-64/configure.ac
 rename sysdeps/s390/{s390-64 => }/s390x-mcount.S (100%)
 rename sysdeps/s390/{s390-64 => }/s390x-mcount.h (100%)
 rename sysdeps/s390/{s390-64 => }/setjmp.S (100%)
 rename sysdeps/s390/{s390-64 => }/stackguard-macros.h (100%)
 rename sysdeps/s390/{s390-64 => }/start.S (100%)
 rename sysdeps/s390/{s390-64 => }/strncpy-z900.S (100%)
 rename sysdeps/s390/{s390-64 => }/sub_n.S (100%)
 rename sysdeps/s390/{s390-64 => }/sysdep.h (100%)
 rename sysdeps/s390/{s390-64 => }/tst-audit.h (100%)
 rename sysdeps/s390/{s390-64 => }/tst-glibc-hwcaps.c (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/____longjmp_chk.c (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/__makecontext_ret.S (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/arch-syscall.h (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/c++-types.data (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/clone.S (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/clone3.S (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/getcontext.S (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/ld.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libBrokenLocale.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libanl.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libc.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libc_malloc_debug.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libdl.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libm.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libnsl.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libpthread.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libresolv.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/librt.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libthread_db.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/libutil.abilist (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/makecontext.c (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/pointer_guard.h (100%)
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/Implies
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/Makefile
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/Versions
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/configure
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/configure.ac
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/dl-cache.h
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/setcontext.S (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/shlib-versions (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/single-thread.h (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/swapcontext.S (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/syscall.S (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/syscall_cancel.S (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/sysdep.S (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/timer_t_was_int_compat.h (100%)
 rename sysdeps/unix/sysv/linux/s390/{s390-64 => }/vfork.S (100%)

diff --git a/sysdeps/s390/Implies b/sysdeps/s390/Implies
index 1945b1f4bb..30800d54c3 100644
--- a/sysdeps/s390/Implies
+++ b/sysdeps/s390/Implies
@@ -1,3 +1,4 @@
+wordsize-64
 ieee754/ldbl-128
 ieee754/dbl-64
 ieee754/flt-32
diff --git a/sysdeps/s390/Makefile b/sysdeps/s390/Makefile
index 985b4f25ee..29d11dfdab 100644
--- a/sysdeps/s390/Makefile
+++ b/sysdeps/s390/Makefile
@@ -1,3 +1,7 @@
+ifeq ($(subdir),gmon)
+sysdep_routines += s390x-mcount
+endif
+
 ifeq ($(subdir),iconvdata)
 ISO-8859-1_CP037_Z900-routines := iso-8859-1_cp037_z900
 ISO-8859-1_CP037_Z900-map := gconv.map
@@ -43,6 +47,91 @@ $(modpfx)gconv-modules-s390.conf: ../sysdeps/s390/gconv-modules-s390.conf \
 endif
 
 ifeq ($(subdir),elf)
+CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused
+CFLAGS-dl-load.c += -Wno-unused
+CFLAGS-dl-reloc.c += -Wno-unused
+
+$(objpfx)tst-glibc-hwcaps: \
+  $(objpfx)libmarkermod2-1.so \
+  $(objpfx)libmarkermod3-1.so \
+  $(objpfx)libmarkermod4-1.so \
+  $(objpfx)libmarkermod5-1.so \
+  $(objpfx)libmarkermod6-1.so
+$(objpfx)tst-glibc-hwcaps.out: \
+  $(objpfx)libmarkermod2.so \
+    $(objpfx)glibc-hwcaps/z13/libmarkermod2.so \
+  $(objpfx)libmarkermod3.so \
+    $(objpfx)glibc-hwcaps/z13/libmarkermod3.so \
+    $(objpfx)glibc-hwcaps/z14/libmarkermod3.so \
+  $(objpfx)libmarkermod4.so \
+    $(objpfx)glibc-hwcaps/z13/libmarkermod4.so \
+    $(objpfx)glibc-hwcaps/z14/libmarkermod4.so \
+    $(objpfx)glibc-hwcaps/z15/libmarkermod4.so \
+  $(objpfx)libmarkermod5.so \
+    $(objpfx)glibc-hwcaps/z13/libmarkermod5.so \
+    $(objpfx)glibc-hwcaps/z14/libmarkermod5.so \
+    $(objpfx)glibc-hwcaps/z15/libmarkermod5.so \
+    $(objpfx)glibc-hwcaps/z16/libmarkermod5.so \
+  $(objpfx)libmarkermod6.so \
+    $(objpfx)glibc-hwcaps/z13/libmarkermod6.so \
+    $(objpfx)glibc-hwcaps/z14/libmarkermod6.so \
+    $(objpfx)glibc-hwcaps/z15/libmarkermod6.so \
+    $(objpfx)glibc-hwcaps/z16/libmarkermod6.so \
+    $(objpfx)glibc-hwcaps/z17/libmarkermod6.so
+
+
+$(objpfx)glibc-hwcaps/z13/libmarkermod2.so: $(objpfx)libmarkermod2-2.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z13/libmarkermod3.so: $(objpfx)libmarkermod3-2.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z14/libmarkermod3.so: $(objpfx)libmarkermod3-3.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z13/libmarkermod4.so: $(objpfx)libmarkermod4-2.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z14/libmarkermod4.so: $(objpfx)libmarkermod4-3.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z15/libmarkermod4.so: $(objpfx)libmarkermod4-4.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z13/libmarkermod5.so: $(objpfx)libmarkermod5-2.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z14/libmarkermod5.so: $(objpfx)libmarkermod5-3.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z15/libmarkermod5.so: $(objpfx)libmarkermod5-4.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z16/libmarkermod5.so: $(objpfx)libmarkermod5-5.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z13/libmarkermod6.so: $(objpfx)libmarkermod6-2.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z14/libmarkermod6.so: $(objpfx)libmarkermod6-3.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z15/libmarkermod6.so: $(objpfx)libmarkermod6-4.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z16/libmarkermod6.so: $(objpfx)libmarkermod6-5.so
+	$(make-target-directory)
+	cp $< $@
+$(objpfx)glibc-hwcaps/z17/libmarkermod6.so: $(objpfx)libmarkermod6-6.so
+	$(make-target-directory)
+	cp $< $@
+
+
+ifeq (no,$(build-hardcoded-path-in-tests))
+# This is an ld.so.cache test, and RPATH/RUNPATH in the executable
+# interferes with its test objectives.
+tests-container += tst-glibc-hwcaps-cache
+endif
 
 ifeq ($(build-shared),yes)
 tests += tst-dl-runtime-resolve-noaudit tst-dl-runtime-resolve-audit \
diff --git a/sysdeps/s390/Versions b/sysdeps/s390/Versions
index 8417623353..d80d691817 100644
--- a/sysdeps/s390/Versions
+++ b/sysdeps/s390/Versions
@@ -3,6 +3,9 @@ libc {
     setjmp; _setjmp; __sigsetjmp;
     longjmp; _longjmp; siglongjmp;
   }
+  GLIBC_2.29 {
+    __fentry__;
+  }
 }
 
 ld {
diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/__longjmp.c
similarity index 97%
rename from sysdeps/s390/s390-64/__longjmp.c
rename to sysdeps/s390/__longjmp.c
index fabd5e0a4e..7c207e44c6 100644
--- a/sysdeps/s390/s390-64/__longjmp.c
+++ b/sysdeps/s390/__longjmp.c
@@ -24,7 +24,7 @@
 #include <unistd.h>
 #include <stap-probe.h>
 
-/* See sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h.  */
+/* See sysdeps/unix/sysv/linux/s390/pointer_guard.h.  */
 #if IS_IN (rtld)
 # undef PTR_DEMANGLE
 #endif
diff --git a/sysdeps/s390/s390-64/add_n.S b/sysdeps/s390/add_n.S
similarity index 100%
rename from sysdeps/s390/s390-64/add_n.S
rename to sysdeps/s390/add_n.S
diff --git a/sysdeps/s390/s390-64/bsd-_setjmp.S b/sysdeps/s390/bsd-_setjmp.S
similarity index 100%
rename from sysdeps/s390/s390-64/bsd-_setjmp.S
rename to sysdeps/s390/bsd-_setjmp.S
diff --git a/sysdeps/s390/s390-64/bsd-setjmp.S b/sysdeps/s390/bsd-setjmp.S
similarity index 100%
rename from sysdeps/s390/s390-64/bsd-setjmp.S
rename to sysdeps/s390/bsd-setjmp.S
diff --git a/sysdeps/s390/configure b/sysdeps/s390/configure
index f4ec662610..e21a5ba3a7 100644
--- a/sysdeps/s390/configure
+++ b/sysdeps/s390/configure
@@ -269,6 +269,95 @@ then
 
 fi
 
-test -n "$critic_missing" && as_fn_error $? "
-*** $critic_missing" "$LINENO" 5
+# Minimal checking for static PIE support in ld.
+# Compare to ld testcase/bugzilla:
+# <binutils-source>/ld/testsuite/ld-elf/pr22263-1.rd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for s390-specific static PIE requirements" >&5
+printf %s "checking for s390-specific static PIE requirements... " >&6; }
+if { as_var=\
+libc_cv_s390x_staticpie_req_runtime; eval test \${$as_var+y}; }
+then :
+  printf %s "(cached) " >&6
+else case e in #(
+  e)   cat > conftest1.c <<EOF
+__thread int * foo;
+
+void
+bar (void)
+{
+  *foo = 1;
+}
+
+void bar2 (void);
+void* bar2_ifunc (void) __asm__ ("bar2");
+__asm__ (".type bar2, %gnu_indirect_function");
+void* bar2_ifunc (void) { return 0; }
+EOF
+  cat > conftest2.c <<EOF
+extern __thread int *foo;
+extern void bar (void);
+extern void bar2 (void);
+static int x;
+
+int
+main ()
+{
+  foo = &x;
+  bar2 ();
+  return 0;
+}
+EOF
+  libc_cv_s390x_staticpie_req_runtime=no
+  # Check if the static linker does not generate dynamic TLS relocs in PIE
+  # (binutils PR ld/22263), if it accepts --no-dynamic-linker
+  # (by using -static-pie), and if it adds a DT_JMPREL pointing to .rela.iplt
+  # with static pie.
+  if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest1.c -o conftest1.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } \
+     && { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest2.c -o conftest2.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } \
+     && { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostartfiles -nostdlib -fPIE -o conftest conftest1.o conftest2.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } \
+     && { ac_try='! LC_ALL=C $READELF -Wr conftest | grep R_390_TLS_TPOFF >&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } \
+     && { ac_try='LC_ALL=C $READELF -Wd conftest | grep JMPREL >&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+  then
+    libc_cv_s390x_staticpie_req_runtime=yes
+  fi
+  rm -rf conftest.* ;;
+esac
+fi
+eval ac_res=\$\
+libc_cv_s390x_staticpie_req_runtime
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+
+if test $libc_cv_s390x_staticpie_req_runtime = yes; then
+   # Some kernels might fail with /proc/sys/kernel/randomize_va_space set to 0
+   # due not enough space for a brk call.  However, there is no reliable way to
+   # test it.
+   printf "%s\n" "#define SUPPORT_STATIC_PIE 1" >>confdefs.h
+
+fi
 
diff --git a/sysdeps/s390/configure.ac b/sysdeps/s390/configure.ac
index 82e1a4445f..3c384f9670 100644
--- a/sysdeps/s390/configure.ac
+++ b/sysdeps/s390/configure.ac
@@ -133,5 +133,57 @@ then
   AC_DEFINE(HAVE_S390_MIN_ARCH13_ZARCH_ASM_SUPPORT)
 fi
 
-test -n "$critic_missing" && AC_MSG_ERROR([
-*** $critic_missing])
+# Minimal checking for static PIE support in ld.
+# Compare to ld testcase/bugzilla:
+# <binutils-source>/ld/testsuite/ld-elf/pr22263-1.rd
+AC_CACHE_CHECK([for s390-specific static PIE requirements], \
+[libc_cv_s390x_staticpie_req_runtime], [dnl
+  cat > conftest1.c <<EOF
+__thread int * foo;
+
+void
+bar (void)
+{
+  *foo = 1;
+}
+
+void bar2 (void);
+void* bar2_ifunc (void) __asm__ ("bar2");
+__asm__ (".type bar2, %gnu_indirect_function");
+void* bar2_ifunc (void) { return 0; }
+EOF
+  cat > conftest2.c <<EOF
+extern __thread int *foo;
+extern void bar (void);
+extern void bar2 (void);
+static int x;
+
+int
+main ()
+{
+  foo = &x;
+  bar2 ();
+  return 0;
+}
+EOF
+  libc_cv_s390x_staticpie_req_runtime=no
+  # Check if the static linker does not generate dynamic TLS relocs in PIE
+  # (binutils PR ld/22263), if it accepts --no-dynamic-linker
+  # (by using -static-pie), and if it adds a DT_JMPREL pointing to .rela.iplt
+  # with static pie.
+  if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest1.c -o conftest1.o]) \
+     && AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest2.c -o conftest2.o]) \
+     && AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostartfiles -nostdlib -fPIE -o conftest conftest1.o conftest2.o]) \
+     && AC_TRY_COMMAND([! LC_ALL=C $READELF -Wr conftest | grep R_390_TLS_TPOFF] >&AS_MESSAGE_LOG_FD) \
+     && AC_TRY_COMMAND([LC_ALL=C $READELF -Wd conftest | grep JMPREL >&AS_MESSAGE_LOG_FD])
+  then
+    libc_cv_s390x_staticpie_req_runtime=yes
+  fi
+  rm -rf conftest.*])
+
+if test $libc_cv_s390x_staticpie_req_runtime = yes; then
+   # Some kernels might fail with /proc/sys/kernel/randomize_va_space set to 0
+   # due not enough space for a brk call.  However, there is no reliable way to
+   # test it.
+   AC_DEFINE(SUPPORT_STATIC_PIE)
+fi
diff --git a/sysdeps/s390/s390-64/crti.S b/sysdeps/s390/crti.S
similarity index 100%
rename from sysdeps/s390/s390-64/crti.S
rename to sysdeps/s390/crti.S
diff --git a/sysdeps/s390/s390-64/crtn.S b/sysdeps/s390/crtn.S
similarity index 100%
rename from sysdeps/s390/s390-64/crtn.S
rename to sysdeps/s390/crtn.S
diff --git a/sysdeps/s390/s390-64/dl-hwcap-check.h b/sysdeps/s390/dl-hwcap-check.h
similarity index 100%
rename from sysdeps/s390/s390-64/dl-hwcap-check.h
rename to sysdeps/s390/dl-hwcap-check.h
diff --git a/sysdeps/s390/s390-64/dl-hwcaps-subdirs.c b/sysdeps/s390/dl-hwcaps-subdirs.c
similarity index 100%
rename from sysdeps/s390/s390-64/dl-hwcaps-subdirs.c
rename to sysdeps/s390/dl-hwcaps-subdirs.c
diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/dl-machine.h
similarity index 100%
rename from sysdeps/s390/s390-64/dl-machine.h
rename to sysdeps/s390/dl-machine.h
diff --git a/sysdeps/s390/s390-64/dl-trampoline.S b/sysdeps/s390/dl-trampoline.S
similarity index 100%
rename from sysdeps/s390/s390-64/dl-trampoline.S
rename to sysdeps/s390/dl-trampoline.S
diff --git a/sysdeps/s390/s390-64/dl-trampoline.h b/sysdeps/s390/dl-trampoline.h
similarity index 100%
rename from sysdeps/s390/s390-64/dl-trampoline.h
rename to sysdeps/s390/dl-trampoline.h
diff --git a/sysdeps/s390/preconfigure b/sysdeps/s390/preconfigure
index 0536f3eb80..39843cb365 100644
--- a/sysdeps/s390/preconfigure
+++ b/sysdeps/s390/preconfigure
@@ -4,7 +4,7 @@
 case "$machine" in
 s390x)
   base_machine=s390
-  machine=s390/s390-64
+  machine=s390
   ;;
 s390)
   as_fn_error $? "s390-32 is not supported anymore." "$LINENO" 5
diff --git a/sysdeps/s390/preconfigure.ac b/sysdeps/s390/preconfigure.ac
index aee9e4e0cc..b75ad3be00 100644
--- a/sysdeps/s390/preconfigure.ac
+++ b/sysdeps/s390/preconfigure.ac
@@ -4,7 +4,7 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
 case "$machine" in
 s390x)
   base_machine=s390
-  machine=s390/s390-64
+  machine=s390
   ;;
 s390)
   AC_MSG_ERROR(s390-32 is not supported anymore.)
diff --git a/sysdeps/s390/s390-64/Implies b/sysdeps/s390/s390-64/Implies
deleted file mode 100644
index a8cae95f9d..0000000000
--- a/sysdeps/s390/s390-64/Implies
+++ /dev/null
@@ -1 +0,0 @@
-wordsize-64
diff --git a/sysdeps/s390/s390-64/Makefile b/sysdeps/s390/s390-64/Makefile
deleted file mode 100644
index 991025cd2a..0000000000
--- a/sysdeps/s390/s390-64/Makefile
+++ /dev/null
@@ -1,92 +0,0 @@
-ifeq ($(subdir),gmon)
-sysdep_routines += s390x-mcount
-endif
-
-ifeq ($(subdir),elf)
-CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused
-CFLAGS-dl-load.c += -Wno-unused
-CFLAGS-dl-reloc.c += -Wno-unused
-
-$(objpfx)tst-glibc-hwcaps: \
-  $(objpfx)libmarkermod2-1.so \
-  $(objpfx)libmarkermod3-1.so \
-  $(objpfx)libmarkermod4-1.so \
-  $(objpfx)libmarkermod5-1.so \
-  $(objpfx)libmarkermod6-1.so
-$(objpfx)tst-glibc-hwcaps.out: \
-  $(objpfx)libmarkermod2.so \
-    $(objpfx)glibc-hwcaps/z13/libmarkermod2.so \
-  $(objpfx)libmarkermod3.so \
-    $(objpfx)glibc-hwcaps/z13/libmarkermod3.so \
-    $(objpfx)glibc-hwcaps/z14/libmarkermod3.so \
-  $(objpfx)libmarkermod4.so \
-    $(objpfx)glibc-hwcaps/z13/libmarkermod4.so \
-    $(objpfx)glibc-hwcaps/z14/libmarkermod4.so \
-    $(objpfx)glibc-hwcaps/z15/libmarkermod4.so \
-  $(objpfx)libmarkermod5.so \
-    $(objpfx)glibc-hwcaps/z13/libmarkermod5.so \
-    $(objpfx)glibc-hwcaps/z14/libmarkermod5.so \
-    $(objpfx)glibc-hwcaps/z15/libmarkermod5.so \
-    $(objpfx)glibc-hwcaps/z16/libmarkermod5.so \
-  $(objpfx)libmarkermod6.so \
-    $(objpfx)glibc-hwcaps/z13/libmarkermod6.so \
-    $(objpfx)glibc-hwcaps/z14/libmarkermod6.so \
-    $(objpfx)glibc-hwcaps/z15/libmarkermod6.so \
-    $(objpfx)glibc-hwcaps/z16/libmarkermod6.so \
-    $(objpfx)glibc-hwcaps/z17/libmarkermod6.so
-
-
-$(objpfx)glibc-hwcaps/z13/libmarkermod2.so: $(objpfx)libmarkermod2-2.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z13/libmarkermod3.so: $(objpfx)libmarkermod3-2.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z14/libmarkermod3.so: $(objpfx)libmarkermod3-3.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z13/libmarkermod4.so: $(objpfx)libmarkermod4-2.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z14/libmarkermod4.so: $(objpfx)libmarkermod4-3.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z15/libmarkermod4.so: $(objpfx)libmarkermod4-4.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z13/libmarkermod5.so: $(objpfx)libmarkermod5-2.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z14/libmarkermod5.so: $(objpfx)libmarkermod5-3.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z15/libmarkermod5.so: $(objpfx)libmarkermod5-4.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z16/libmarkermod5.so: $(objpfx)libmarkermod5-5.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z13/libmarkermod6.so: $(objpfx)libmarkermod6-2.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z14/libmarkermod6.so: $(objpfx)libmarkermod6-3.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z15/libmarkermod6.so: $(objpfx)libmarkermod6-4.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z16/libmarkermod6.so: $(objpfx)libmarkermod6-5.so
-	$(make-target-directory)
-	cp $< $@
-$(objpfx)glibc-hwcaps/z17/libmarkermod6.so: $(objpfx)libmarkermod6-6.so
-	$(make-target-directory)
-	cp $< $@
-
-
-ifeq (no,$(build-hardcoded-path-in-tests))
-# This is an ld.so.cache test, and RPATH/RUNPATH in the executable
-# interferes with its test objectives.
-tests-container += tst-glibc-hwcaps-cache
-endif
-
-endif # $(subdir) == elf
diff --git a/sysdeps/s390/s390-64/Versions b/sysdeps/s390/s390-64/Versions
deleted file mode 100644
index ec1d68313d..0000000000
--- a/sysdeps/s390/s390-64/Versions
+++ /dev/null
@@ -1,5 +0,0 @@
-libc {
-  GLIBC_2.29 {
-    __fentry__;
-  }
-}
diff --git a/sysdeps/s390/s390-64/configure b/sysdeps/s390/s390-64/configure
deleted file mode 100644
index 9ea6940c85..0000000000
--- a/sysdeps/s390/s390-64/configure
+++ /dev/null
@@ -1,95 +0,0 @@
-# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
- # Local configure fragment for sysdeps/s390/s390-64.
-
-# Minimal checking for static PIE support in ld.
-# Compare to ld testcase/bugzilla:
-# <binutils-source>/ld/testsuite/ld-elf/pr22263-1.rd
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for s390-specific static PIE requirements" >&5
-printf %s "checking for s390-specific static PIE requirements... " >&6; }
-if { as_var=\
-libc_cv_s390x_staticpie_req_runtime; eval test \${$as_var+y}; }
-then :
-  printf %s "(cached) " >&6
-else case e in #(
-  e)   cat > conftest1.c <<EOF
-__thread int * foo;
-
-void
-bar (void)
-{
-  *foo = 1;
-}
-
-void bar2 (void);
-void* bar2_ifunc (void) __asm__ ("bar2");
-__asm__ (".type bar2, %gnu_indirect_function");
-void* bar2_ifunc (void) { return 0; }
-EOF
-  cat > conftest2.c <<EOF
-extern __thread int *foo;
-extern void bar (void);
-extern void bar2 (void);
-static int x;
-
-int
-main ()
-{
-  foo = &x;
-  bar2 ();
-  return 0;
-}
-EOF
-  libc_cv_s390x_staticpie_req_runtime=no
-  # Check if the static linker does not generate dynamic TLS relocs in PIE
-  # (binutils PR ld/22263), if it accepts --no-dynamic-linker
-  # (by using -static-pie), and if it adds a DT_JMPREL pointing to .rela.iplt
-  # with static pie.
-  if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest1.c -o conftest1.o'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; } \
-     && { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest2.c -o conftest2.o'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; } \
-     && { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostartfiles -nostdlib -fPIE -o conftest conftest1.o conftest2.o'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; } \
-     && { ac_try='! LC_ALL=C $READELF -Wr conftest | grep R_390_TLS_TPOFF >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; } \
-     && { ac_try='LC_ALL=C $READELF -Wd conftest | grep JMPREL >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-  then
-    libc_cv_s390x_staticpie_req_runtime=yes
-  fi
-  rm -rf conftest.* ;;
-esac
-fi
-eval ac_res=\$\
-libc_cv_s390x_staticpie_req_runtime
-	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-printf "%s\n" "$ac_res" >&6; }
-
-if test $libc_cv_s390x_staticpie_req_runtime = yes; then
-   # Some kernels might fail with /proc/sys/kernel/randomize_va_space set to 0
-   # due not enough space for a brk call.  However, there is no reliable way to
-   # test it.
-   printf "%s\n" "#define SUPPORT_STATIC_PIE 1" >>confdefs.h
-
-fi
-
diff --git a/sysdeps/s390/s390-64/configure.ac b/sysdeps/s390/s390-64/configure.ac
deleted file mode 100644
index aaf71eabb1..0000000000
--- a/sysdeps/s390/s390-64/configure.ac
+++ /dev/null
@@ -1,57 +0,0 @@
-GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
-# Local configure fragment for sysdeps/s390/s390-64.
-
-# Minimal checking for static PIE support in ld.
-# Compare to ld testcase/bugzilla:
-# <binutils-source>/ld/testsuite/ld-elf/pr22263-1.rd
-AC_CACHE_CHECK([for s390-specific static PIE requirements], \
-[libc_cv_s390x_staticpie_req_runtime], [dnl
-  cat > conftest1.c <<EOF
-__thread int * foo;
-
-void
-bar (void)
-{
-  *foo = 1;
-}
-
-void bar2 (void);
-void* bar2_ifunc (void) __asm__ ("bar2");
-__asm__ (".type bar2, %gnu_indirect_function");
-void* bar2_ifunc (void) { return 0; }
-EOF
-  cat > conftest2.c <<EOF
-extern __thread int *foo;
-extern void bar (void);
-extern void bar2 (void);
-static int x;
-
-int
-main ()
-{
-  foo = &x;
-  bar2 ();
-  return 0;
-}
-EOF
-  libc_cv_s390x_staticpie_req_runtime=no
-  # Check if the static linker does not generate dynamic TLS relocs in PIE
-  # (binutils PR ld/22263), if it accepts --no-dynamic-linker
-  # (by using -static-pie), and if it adds a DT_JMPREL pointing to .rela.iplt
-  # with static pie.
-  if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest1.c -o conftest1.o]) \
-     && AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest2.c -o conftest2.o]) \
-     && AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostartfiles -nostdlib -fPIE -o conftest conftest1.o conftest2.o]) \
-     && AC_TRY_COMMAND([! LC_ALL=C $READELF -Wr conftest | grep R_390_TLS_TPOFF] >&AS_MESSAGE_LOG_FD) \
-     && AC_TRY_COMMAND([LC_ALL=C $READELF -Wd conftest | grep JMPREL >&AS_MESSAGE_LOG_FD])
-  then
-    libc_cv_s390x_staticpie_req_runtime=yes
-  fi
-  rm -rf conftest.*])
-
-if test $libc_cv_s390x_staticpie_req_runtime = yes; then
-   # Some kernels might fail with /proc/sys/kernel/randomize_va_space set to 0
-   # due not enough space for a brk call.  However, there is no reliable way to
-   # test it.
-   AC_DEFINE(SUPPORT_STATIC_PIE)
-fi
diff --git a/sysdeps/s390/s390-64/s390x-mcount.S b/sysdeps/s390/s390x-mcount.S
similarity index 100%
rename from sysdeps/s390/s390-64/s390x-mcount.S
rename to sysdeps/s390/s390x-mcount.S
diff --git a/sysdeps/s390/s390-64/s390x-mcount.h b/sysdeps/s390/s390x-mcount.h
similarity index 100%
rename from sysdeps/s390/s390-64/s390x-mcount.h
rename to sysdeps/s390/s390x-mcount.h
diff --git a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/setjmp.S
similarity index 100%
rename from sysdeps/s390/s390-64/setjmp.S
rename to sysdeps/s390/setjmp.S
diff --git a/sysdeps/s390/s390-64/stackguard-macros.h b/sysdeps/s390/stackguard-macros.h
similarity index 100%
rename from sysdeps/s390/s390-64/stackguard-macros.h
rename to sysdeps/s390/stackguard-macros.h
diff --git a/sysdeps/s390/s390-64/start.S b/sysdeps/s390/start.S
similarity index 100%
rename from sysdeps/s390/s390-64/start.S
rename to sysdeps/s390/start.S
diff --git a/sysdeps/s390/s390-64/strncpy-z900.S b/sysdeps/s390/strncpy-z900.S
similarity index 100%
rename from sysdeps/s390/s390-64/strncpy-z900.S
rename to sysdeps/s390/strncpy-z900.S
diff --git a/sysdeps/s390/s390-64/sub_n.S b/sysdeps/s390/sub_n.S
similarity index 100%
rename from sysdeps/s390/s390-64/sub_n.S
rename to sysdeps/s390/sub_n.S
diff --git a/sysdeps/s390/s390-64/sysdep.h b/sysdeps/s390/sysdep.h
similarity index 100%
rename from sysdeps/s390/s390-64/sysdep.h
rename to sysdeps/s390/sysdep.h
diff --git a/sysdeps/s390/s390-64/tst-audit.h b/sysdeps/s390/tst-audit.h
similarity index 100%
rename from sysdeps/s390/s390-64/tst-audit.h
rename to sysdeps/s390/tst-audit.h
diff --git a/sysdeps/s390/s390-64/tst-glibc-hwcaps.c b/sysdeps/s390/tst-glibc-hwcaps.c
similarity index 100%
rename from sysdeps/s390/s390-64/tst-glibc-hwcaps.c
rename to sysdeps/s390/tst-glibc-hwcaps.c
diff --git a/sysdeps/unix/sysv/linux/s390/Implies b/sysdeps/unix/sysv/linux/s390/Implies
index e6e51fa5a7..615f507831 100644
--- a/sysdeps/unix/sysv/linux/s390/Implies
+++ b/sysdeps/unix/sysv/linux/s390/Implies
@@ -1,4 +1,5 @@
 s390/nptl
+unix/sysv/linux/wordsize-64
 
 # These supply the ABI compatibility for when long double was double.
 ieee754/ldbl-64-128
diff --git a/sysdeps/unix/sysv/linux/s390/Makefile b/sysdeps/unix/sysv/linux/s390/Makefile
index 218aff1aee..e9ef5c51ac 100644
--- a/sysdeps/unix/sysv/linux/s390/Makefile
+++ b/sysdeps/unix/sysv/linux/s390/Makefile
@@ -1,3 +1,11 @@
+ifeq ($(subdir),elf)
+ifeq (yes,$(build-shared))
+# This is needed to support g++ v2 and v3.
+sysdep_routines += framestate
+shared-only-routines += framestate
+endif
+endif
+
 ifeq ($(subdir),rt)
 librt-routines += rt-sysdep
 librt-shared-only-routines += rt-sysdep
@@ -5,8 +13,10 @@ endif
 
 ifeq ($(subdir),stdlib)
 gen-as-const-headers += ucontext_i.sym
+sysdep_routines += __makecontext_ret
 endif
 
 ifeq ($(subdir),misc)
 tests += tst-ptrace-singleblock
+sysdep_headers += sys/elf.h
 endif
diff --git a/sysdeps/unix/sysv/linux/s390/Versions b/sysdeps/unix/sysv/linux/s390/Versions
index 548397fcff..d4b6a01950 100644
--- a/sysdeps/unix/sysv/linux/s390/Versions
+++ b/sysdeps/unix/sysv/linux/s390/Versions
@@ -1,4 +1,9 @@
 libc {
+  GLIBC_2.2 {
+    # Exception handling support functions from libgcc
+    __register_frame; __register_frame_table; __deregister_frame;
+    __frame_state_for; __register_frame_info_table;
+  }
   GLIBC_2.19 {
     __longjmp_chk;
     getcontext;
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c b/sysdeps/unix/sysv/linux/s390/____longjmp_chk.c
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c
rename to sysdeps/unix/sysv/linux/s390/____longjmp_chk.c
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S b/sysdeps/unix/sysv/linux/s390/__makecontext_ret.S
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S
rename to sysdeps/unix/sysv/linux/s390/__makecontext_ret.S
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/arch-syscall.h b/sysdeps/unix/sysv/linux/s390/arch-syscall.h
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/arch-syscall.h
rename to sysdeps/unix/sysv/linux/s390/arch-syscall.h
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/c++-types.data b/sysdeps/unix/sysv/linux/s390/c++-types.data
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/c++-types.data
rename to sysdeps/unix/sysv/linux/s390/c++-types.data
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S b/sysdeps/unix/sysv/linux/s390/clone.S
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/clone.S
rename to sysdeps/unix/sysv/linux/s390/clone.S
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/clone3.S b/sysdeps/unix/sysv/linux/s390/clone3.S
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/clone3.S
rename to sysdeps/unix/sysv/linux/s390/clone3.S
diff --git a/sysdeps/unix/sysv/linux/s390/configure b/sysdeps/unix/sysv/linux/s390/configure
index d8a14434c5..9b3a1c01d2 100644
--- a/sysdeps/unix/sysv/linux/s390/configure
+++ b/sysdeps/unix/sysv/linux/s390/configure
@@ -4,3 +4,16 @@
 libc_cv_gcc_unwind_find_fde=yes
 ldd_rewrite_script=sysdeps/unix/sysv/linux/s390/ldd-rewrite.sed
 
+test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib64'
+  libc_cv_rtlddir='/lib'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib64';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+
diff --git a/sysdeps/unix/sysv/linux/s390/configure.ac b/sysdeps/unix/sysv/linux/s390/configure.ac
index 978450c94b..28e1caff2f 100644
--- a/sysdeps/unix/sysv/linux/s390/configure.ac
+++ b/sysdeps/unix/sysv/linux/s390/configure.ac
@@ -3,3 +3,5 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
 
 libc_cv_gcc_unwind_find_fde=yes
 ldd_rewrite_script=sysdeps/unix/sysv/linux/s390/ldd-rewrite.sed
+
+LIBC_SLIBDIR_RTLDDIR([lib64], [lib])
diff --git a/sysdeps/unix/sysv/linux/s390/dl-cache.h b/sysdeps/unix/sysv/linux/s390/dl-cache.h
index 766bba4265..df1ef9155c 100644
--- a/sysdeps/unix/sysv/linux/s390/dl-cache.h
+++ b/sysdeps/unix/sysv/linux/s390/dl-cache.h
@@ -1 +1,24 @@
+/* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
+   Copyright (C) 2001-2026 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
+   <https://www.gnu.org/licenses/>.  */
+
+#define _DL_CACHE_DEFAULT_ID	0x403
+
+#define _dl_cache_check_flags(flags)			\
+  ((flags) == _DL_CACHE_DEFAULT_ID)
+
 #include <sysdeps/unix/sysv/linux/sparc/dl-cache.h>
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S b/sysdeps/unix/sysv/linux/s390/getcontext.S
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S
rename to sysdeps/unix/sysv/linux/s390/getcontext.S
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist b/sysdeps/unix/sysv/linux/s390/ld.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
rename to sysdeps/unix/sysv/linux/s390/ld.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libBrokenLocale.abilist b/sysdeps/unix/sysv/linux/s390/libBrokenLocale.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libBrokenLocale.abilist
rename to sysdeps/unix/sysv/linux/s390/libBrokenLocale.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libanl.abilist b/sysdeps/unix/sysv/linux/s390/libanl.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libanl.abilist
rename to sysdeps/unix/sysv/linux/s390/libanl.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/libc.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
rename to sysdeps/unix/sysv/linux/s390/libc.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/s390/libc_malloc_debug.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libc_malloc_debug.abilist
rename to sysdeps/unix/sysv/linux/s390/libc_malloc_debug.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libdl.abilist b/sysdeps/unix/sysv/linux/s390/libdl.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libdl.abilist
rename to sysdeps/unix/sysv/linux/s390/libdl.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/libm.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
rename to sysdeps/unix/sysv/linux/s390/libm.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libnsl.abilist b/sysdeps/unix/sysv/linux/s390/libnsl.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libnsl.abilist
rename to sysdeps/unix/sysv/linux/s390/libnsl.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/libpthread.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
rename to sysdeps/unix/sysv/linux/s390/libpthread.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libresolv.abilist b/sysdeps/unix/sysv/linux/s390/libresolv.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libresolv.abilist
rename to sysdeps/unix/sysv/linux/s390/libresolv.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/librt.abilist b/sysdeps/unix/sysv/linux/s390/librt.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/librt.abilist
rename to sysdeps/unix/sysv/linux/s390/librt.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libthread_db.abilist b/sysdeps/unix/sysv/linux/s390/libthread_db.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libthread_db.abilist
rename to sysdeps/unix/sysv/linux/s390/libthread_db.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libutil.abilist b/sysdeps/unix/sysv/linux/s390/libutil.abilist
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/libutil.abilist
rename to sysdeps/unix/sysv/linux/s390/libutil.abilist
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c b/sysdeps/unix/sysv/linux/s390/makecontext.c
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c
rename to sysdeps/unix/sysv/linux/s390/makecontext.c
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h b/sysdeps/unix/sysv/linux/s390/pointer_guard.h
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h
rename to sysdeps/unix/sysv/linux/s390/pointer_guard.h
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/Implies b/sysdeps/unix/sysv/linux/s390/s390-64/Implies
deleted file mode 100644
index 8d91c80097..0000000000
--- a/sysdeps/unix/sysv/linux/s390/s390-64/Implies
+++ /dev/null
@@ -1 +0,0 @@
-unix/sysv/linux/wordsize-64
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/Makefile b/sysdeps/unix/sysv/linux/s390/s390-64/Makefile
deleted file mode 100644
index 0c338cba36..0000000000
--- a/sysdeps/unix/sysv/linux/s390/s390-64/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-ifeq ($(subdir),misc)
-sysdep_headers += sys/elf.h
-endif
-
-ifeq ($(subdir),elf)
-ifeq (yes,$(build-shared))
-# This is needed to support g++ v2 and v3.
-sysdep_routines += framestate
-shared-only-routines += framestate
-endif
-endif
-
-ifeq ($(subdir),stdlib)
-sysdep_routines += __makecontext_ret
-endif
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/Versions b/sysdeps/unix/sysv/linux/s390/s390-64/Versions
deleted file mode 100644
index 83092db48e..0000000000
--- a/sysdeps/unix/sysv/linux/s390/s390-64/Versions
+++ /dev/null
@@ -1,7 +0,0 @@
-libc {
-  GLIBC_2.2 {
-    # Exception handling support functions from libgcc
-    __register_frame; __register_frame_table; __deregister_frame;
-    __frame_state_for; __register_frame_info_table;
-  }
-}
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/configure b/sysdeps/unix/sysv/linux/s390/s390-64/configure
deleted file mode 100644
index 5490bc669e..0000000000
--- a/sysdeps/unix/sysv/linux/s390/s390-64/configure
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
- # Local configure fragment for sysdeps/unix/sysv/linux/s390/s390-64.
-
-test -n "$libc_cv_slibdir" ||
-case "$prefix" in
-/usr | /usr/)
-  libc_cv_slibdir='/lib64'
-  libc_cv_rtlddir='/lib'
-  if test "$libdir" = '${exec_prefix}/lib'; then
-    libdir='${exec_prefix}/lib64';
-    # Locale data can be shared between 32-bit and 64-bit libraries.
-    libc_cv_complocaledir='${exec_prefix}/lib/locale'
-  fi
-  ;;
-esac
-
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/configure.ac b/sysdeps/unix/sysv/linux/s390/s390-64/configure.ac
deleted file mode 100644
index 8c75888b62..0000000000
--- a/sysdeps/unix/sysv/linux/s390/s390-64/configure.ac
+++ /dev/null
@@ -1,4 +0,0 @@
-GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
-# Local configure fragment for sysdeps/unix/sysv/linux/s390/s390-64.
-
-LIBC_SLIBDIR_RTLDDIR([lib64], [lib])
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/dl-cache.h b/sysdeps/unix/sysv/linux/s390/s390-64/dl-cache.h
deleted file mode 100644
index 0a334a9d9a..0000000000
--- a/sysdeps/unix/sysv/linux/s390/s390-64/dl-cache.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
-   Copyright (C) 2001-2026 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
-   <https://www.gnu.org/licenses/>.  */
-
-#define _DL_CACHE_DEFAULT_ID	0x403
-
-#define _dl_cache_check_flags(flags)			\
-  ((flags) == _DL_CACHE_DEFAULT_ID)
-
-#include_next <dl-cache.h>
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
deleted file mode 100644
index 9c9e2a271f..0000000000
--- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/* Assembler macros for 64 bit S/390.
-   Copyright (C) 2001-2026 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
-   <https://www.gnu.org/licenses/>.  */
-
-#ifndef _LINUX_S390_SYSDEP_H
-#define _LINUX_S390_SYSDEP_H
-
-#include <sysdeps/s390/s390-64/sysdep.h>
-#include <sysdeps/unix/sysdep.h>
-#include <sysdeps/unix/sysv/linux/s390/sysdep.h>
-#include <sysdeps/unix/sysv/linux/sysdep.h>
-#include <dl-sysdep.h>	/* For RTLD_PRIVATE_ERRNO.  */
-#include <tls.h>
-
-/* For Linux we can use the system call table in the header file
-	/usr/include/asm/unistd.h
-   of the kernel.  But these symbols do not follow the SYS_* syntax
-   so we have to redefine the `SYS_ify' macro here.  */
-/* In newer 2.1 kernels __NR_syscall is missing so we define it here.  */
-#define __NR_syscall 0
-
-#undef SYS_ify
-#define SYS_ify(syscall_name)	__NR_##syscall_name
-
-#ifdef __ASSEMBLER__
-
-/* Linux uses a negative return value to indicate syscall errors, unlike
-   most Unices, which use the condition codes' carry flag.
-
-   Since version 2.1 the return value of a system call might be negative
-   even if the call succeeded.	E.g., the `lseek' system call might return
-   a large offset.  Therefore we must not anymore test for < 0, but test
-   for a real error by making sure the value in gpr2 is a real error
-   number.  Linus said he will make sure that no syscall returns a value
-   in -1 .. -4095 as a valid result so we can safely test with -4095.  */
-
-#undef PSEUDO
-#define	PSEUDO(name, syscall_name, args)				      \
-  .text;								      \
-  ENTRY (name)								      \
-    DO_CALL (syscall_name, args);					      \
-    lghi %r4,-4095 ;							      \
-    clgr %r2,%r4 ;							      \
-    jgnl SYSCALL_ERROR_LABEL
-
-#undef PSEUDO_END
-#define PSEUDO_END(name)						      \
-  SYSCALL_ERROR_HANDLER;						      \
-  END (name)
-
-#undef PSEUDO_NOERRNO
-#define	PSEUDO_NOERRNO(name, syscall_name, args)			      \
-  .text;								      \
-  ENTRY (name)								      \
-    DO_CALL (syscall_name, args)
-
-#undef PSEUDO_END_NOERRNO
-#define PSEUDO_END_NOERRNO(name)					      \
-  SYSCALL_ERROR_HANDLER;						      \
-  END (name)
-
-#undef PSEUDO_ERRVAL
-#define	PSEUDO_ERRVAL(name, syscall_name, args)				      \
-  .text;								      \
-  ENTRY (name)								      \
-    DO_CALL (syscall_name, args);					      \
-    lcgr %r2,%r2
-
-#undef PSEUDO_END_ERRVAL
-#define PSEUDO_END_ERRVAL(name)						      \
-  SYSCALL_ERROR_HANDLER;						      \
-  END (name)
-
-#undef SYSCALL_ERROR_LABEL
-#ifndef PIC
-# undef SYSCALL_ERROR_LABEL
-# define SYSCALL_ERROR_LABEL syscall_error
-# define SYSCALL_ERROR_HANDLER
-#else
-# if RTLD_PRIVATE_ERRNO
-#  undef SYSCALL_ERROR_LABEL
-#  define SYSCALL_ERROR_LABEL 0f
-#  define SYSCALL_ERROR_HANDLER \
-0:  larl  %r1,rtld_errno;						      \
-    lcr   %r2,%r2;							      \
-    st    %r2,0(%r1);							      \
-    lghi  %r2,-1;							      \
-    br    %r14
-# elif defined _LIBC_REENTRANT
-#  if IS_IN (libc)
-#   define SYSCALL_ERROR_ERRNO __libc_errno
-#  else
-#   define SYSCALL_ERROR_ERRNO errno
-#  endif
-#  undef SYSCALL_ERROR_LABEL
-#  define SYSCALL_ERROR_LABEL 0f
-#  define SYSCALL_ERROR_HANDLER \
-0:  lcr   %r0,%r2;							      \
-    larl  %r1,SYSCALL_ERROR_ERRNO@indntpoff;				      \
-    lg    %r1,0(%r1);							      \
-    ear   %r2,%a0;							      \
-    sllg  %r2,%r2,32;							      \
-    ear   %r2,%a1;							      \
-    st    %r0,0(%r1,%r2);						      \
-    lghi   %r2,-1;							      \
-    br    %r14
-# else
-#  undef SYSCALL_ERROR_LABEL
-#  define SYSCALL_ERROR_LABEL 0f
-#  define SYSCALL_ERROR_HANDLER \
-0:  larl  %r1,_GLOBAL_OFFSET_TABLE_;					      \
-    lg    %r1,errno@GOT(%r1);						      \
-    lcr   %r2,%r2;							      \
-    st    %r2,0(%r1);							      \
-    lghi  %r2,-1;							      \
-    br    %r14
-# endif /* _LIBC_REENTRANT */
-#endif /* PIC */
-
-/* Linux takes system call arguments in registers:
-
-	syscall number	1	     call-clobbered
-	arg 1		2	     call-clobbered
-	arg 2		3	     call-clobbered
-	arg 3		4	     call-clobbered
-	arg 4		5	     call-clobbered
-	arg 5		6	     call-saved
-	arg 6		7	     call-saved
-
-   (Of course a function with say 3 arguments does not have entries for
-   arguments 4 and 5.)
-   For system calls with 6 parameters a stack operation is required
-   to load the 6th parameter to register 7. Call saved register 7 is
-   moved to register 0 and back to avoid an additional stack frame.
- */
-
-#define DO_CALL(syscall, args)						      \
-  .if args > 5;								      \
-    lgr %r0,%r7;							      \
-    lg %r7,160(%r15);							      \
-  .endif;								      \
-    lghi %r1,SYS_ify (syscall);						      \
-    svc 0;								      \
-  .if args > 5;								      \
-    lgr %r7,%r0;							      \
-  .endif
-
-#define ret								      \
-    br	    14
-
-#define ret_NOERRNO							      \
-    br	    14
-
-#define ret_ERRVAL							      \
-    br	    14
-
-#else
-
-# undef HAVE_INTERNAL_BRK_ADDR_SYMBOL
-# define HAVE_INTERNAL_BRK_ADDR_SYMBOL 1
-
-#endif /* __ASSEMBLER__ */
-
-#endif /* _LINUX_S390_SYSDEP_H */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S b/sysdeps/unix/sysv/linux/s390/setcontext.S
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S
rename to sysdeps/unix/sysv/linux/s390/setcontext.S
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/shlib-versions b/sysdeps/unix/sysv/linux/s390/shlib-versions
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/shlib-versions
rename to sysdeps/unix/sysv/linux/s390/shlib-versions
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/single-thread.h b/sysdeps/unix/sysv/linux/s390/single-thread.h
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/single-thread.h
rename to sysdeps/unix/sysv/linux/s390/single-thread.h
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S b/sysdeps/unix/sysv/linux/s390/swapcontext.S
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S
rename to sysdeps/unix/sysv/linux/s390/swapcontext.S
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S b/sysdeps/unix/sysv/linux/s390/syscall.S
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
rename to sysdeps/unix/sysv/linux/s390/syscall.S
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/syscall_cancel.S b/sysdeps/unix/sysv/linux/s390/syscall_cancel.S
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/syscall_cancel.S
rename to sysdeps/unix/sysv/linux/s390/syscall_cancel.S
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S b/sysdeps/unix/sysv/linux/s390/sysdep.S
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S
rename to sysdeps/unix/sysv/linux/s390/sysdep.S
diff --git a/sysdeps/unix/sysv/linux/s390/sysdep.h b/sysdeps/unix/sysv/linux/s390/sysdep.h
index 593e70dc1e..42fb8aa469 100644
--- a/sysdeps/unix/sysv/linux/s390/sysdep.h
+++ b/sysdeps/unix/sysv/linux/s390/sysdep.h
@@ -1,5 +1,5 @@
-/* Syscall definitions, Linux s390 version.
-   Copyright (C) 2019-2026 Free Software Foundation, Inc.
+/* Assembler macros for 64 bit S/390.
+   Copyright (C) 2001-2026 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
@@ -14,15 +14,163 @@
 
    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/>.  */
+   <https://www.gnu.org/licenses/>.  */
 
-#ifndef __ASSEMBLY__
+#ifndef _LINUX_S390_SYSDEP_H
+#define _LINUX_S390_SYSDEP_H
+
+#include <sysdeps/s390/sysdep.h>
+#include <sysdeps/unix/sysdep.h>
+#include <sysdeps/unix/sysv/linux/sysdep.h>
+#include <dl-sysdep.h>	/* For RTLD_PRIVATE_ERRNO.  */
+#include <tls.h>
+
+/* For Linux we can use the system call table in the header file
+	/usr/include/asm/unistd.h
+   of the kernel.  But these symbols do not follow the SYS_* syntax
+   so we have to redefine the `SYS_ify' macro here.  */
+/* In newer 2.1 kernels __NR_syscall is missing so we define it here.  */
+#define __NR_syscall 0
 
 #undef SYS_ify
 #define SYS_ify(syscall_name)	__NR_##syscall_name
 
-#undef INTERNAL_SYSCALL_NCS
-#define INTERNAL_SYSCALL_NCS(no, nr, args...)				      \
+#ifdef __ASSEMBLER__
+
+/* Linux uses a negative return value to indicate syscall errors, unlike
+   most Unices, which use the condition codes' carry flag.
+
+   Since version 2.1 the return value of a system call might be negative
+   even if the call succeeded.	E.g., the `lseek' system call might return
+   a large offset.  Therefore we must not anymore test for < 0, but test
+   for a real error by making sure the value in gpr2 is a real error
+   number.  Linus said he will make sure that no syscall returns a value
+   in -1 .. -4095 as a valid result so we can safely test with -4095.  */
+
+# undef PSEUDO
+# define PSEUDO(name, syscall_name, args)				      \
+  .text;								      \
+  ENTRY (name)								      \
+    DO_CALL (syscall_name, args);					      \
+    lghi %r4,-4095 ;							      \
+    clgr %r2,%r4 ;							      \
+    jgnl SYSCALL_ERROR_LABEL
+
+# undef PSEUDO_END
+# define PSEUDO_END(name)						      \
+  SYSCALL_ERROR_HANDLER;						      \
+  END (name)
+
+# undef PSEUDO_NOERRNO
+# define PSEUDO_NOERRNO(name, syscall_name, args)			      \
+  .text;								      \
+  ENTRY (name)								      \
+    DO_CALL (syscall_name, args)
+
+# undef PSEUDO_END_NOERRNO
+# define PSEUDO_END_NOERRNO(name)					      \
+  SYSCALL_ERROR_HANDLER;						      \
+  END (name)
+
+# undef PSEUDO_ERRVAL
+# define PSEUDO_ERRVAL(name, syscall_name, args)				      \
+  .text;								      \
+  ENTRY (name)								      \
+    DO_CALL (syscall_name, args);					      \
+    lcgr %r2,%r2
+
+# undef PSEUDO_END_ERRVAL
+# define PSEUDO_END_ERRVAL(name)						      \
+  SYSCALL_ERROR_HANDLER;						      \
+  END (name)
+
+# undef SYSCALL_ERROR_LABEL
+# ifndef PIC
+#  undef SYSCALL_ERROR_LABEL
+#  define SYSCALL_ERROR_LABEL syscall_error
+#  define SYSCALL_ERROR_HANDLER
+# else
+#  if RTLD_PRIVATE_ERRNO
+#   undef SYSCALL_ERROR_LABEL
+#   define SYSCALL_ERROR_LABEL 0f
+#   define SYSCALL_ERROR_HANDLER \
+0:  larl  %r1,rtld_errno;						      \
+    lcr   %r2,%r2;							      \
+    st    %r2,0(%r1);							      \
+    lghi  %r2,-1;							      \
+    br    %r14
+#  elif defined _LIBC_REENTRANT
+#   if IS_IN (libc)
+#    define SYSCALL_ERROR_ERRNO __libc_errno
+#   else
+#    define SYSCALL_ERROR_ERRNO errno
+#   endif
+#   undef SYSCALL_ERROR_LABEL
+#   define SYSCALL_ERROR_LABEL 0f
+#   define SYSCALL_ERROR_HANDLER \
+0:  lcr   %r0,%r2;							      \
+    larl  %r1,SYSCALL_ERROR_ERRNO@indntpoff;				      \
+    lg    %r1,0(%r1);							      \
+    ear   %r2,%a0;							      \
+    sllg  %r2,%r2,32;							      \
+    ear   %r2,%a1;							      \
+    st    %r0,0(%r1,%r2);						      \
+    lghi   %r2,-1;							      \
+    br    %r14
+#  else
+#   undef SYSCALL_ERROR_LABEL
+#   define SYSCALL_ERROR_LABEL 0f
+#   define SYSCALL_ERROR_HANDLER \
+0:  larl  %r1,_GLOBAL_OFFSET_TABLE_;					      \
+    lg    %r1,errno@GOT(%r1);						      \
+    lcr   %r2,%r2;							      \
+    st    %r2,0(%r1);							      \
+    lghi  %r2,-1;							      \
+    br    %r14
+#  endif /* _LIBC_REENTRANT */
+# endif /* PIC */
+
+/* Linux takes system call arguments in registers:
+
+	syscall number	1	     call-clobbered
+	arg 1		2	     call-clobbered
+	arg 2		3	     call-clobbered
+	arg 3		4	     call-clobbered
+	arg 4		5	     call-clobbered
+	arg 5		6	     call-saved
+	arg 6		7	     call-saved
+
+   (Of course a function with say 3 arguments does not have entries for
+   arguments 4 and 5.)
+   For system calls with 6 parameters a stack operation is required
+   to load the 6th parameter to register 7. Call saved register 7 is
+   moved to register 0 and back to avoid an additional stack frame.
+ */
+
+# define DO_CALL(syscall, args)						      \
+  .if args > 5;								      \
+    lgr %r0,%r7;							      \
+    lg %r7,160(%r15);							      \
+  .endif;								      \
+    lghi %r1,SYS_ify (syscall);						      \
+    svc 0;								      \
+  .if args > 5;								      \
+    lgr %r7,%r0;							      \
+  .endif
+
+# define ret								      \
+    br	    14
+
+# define ret_NOERRNO							      \
+    br	    14
+
+# define ret_ERRVAL							      \
+    br	    14
+
+#else /* not __ASSEMBLER__ */
+
+# undef INTERNAL_SYSCALL_NCS
+# define INTERNAL_SYSCALL_NCS(no, nr, args...)				      \
   ({									      \
     DECLARGS_##nr(args)							      \
     register unsigned long int _nr __asm__("1") = (unsigned long int)(no);    \
@@ -34,46 +182,52 @@
 			  : "memory" );					      \
     _ret; })
 
-#undef INTERNAL_SYSCALL
-#define INTERNAL_SYSCALL(name, nr, args...)				\
+# undef INTERNAL_SYSCALL
+# define INTERNAL_SYSCALL(name, nr, args...)				\
   INTERNAL_SYSCALL_NCS(__NR_##name, nr, args)
 
-#define DECLARGS_0()
-#define DECLARGS_1(arg1) \
+# define DECLARGS_0()
+# define DECLARGS_1(arg1) \
   register unsigned long int gpr2 __asm__ ("2") = (unsigned long int)(arg1);
-#define DECLARGS_2(arg1, arg2) \
+# define DECLARGS_2(arg1, arg2) \
   DECLARGS_1(arg1) \
   register unsigned long int gpr3 __asm__ ("3") = (unsigned long int)(arg2);
-#define DECLARGS_3(arg1, arg2, arg3) \
+# define DECLARGS_3(arg1, arg2, arg3) \
   DECLARGS_2(arg1, arg2) \
   register unsigned long int gpr4 __asm__ ("4") = (unsigned long int)(arg3);
-#define DECLARGS_4(arg1, arg2, arg3, arg4) \
+# define DECLARGS_4(arg1, arg2, arg3, arg4) \
   DECLARGS_3(arg1, arg2, arg3) \
   register unsigned long int gpr5 __asm__ ("5") = (unsigned long int)(arg4);
-#define DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \
+# define DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \
   DECLARGS_4(arg1, arg2, arg3, arg4) \
   register unsigned long int gpr6 __asm__ ("6") = (unsigned long int)(arg5);
-#define DECLARGS_6(arg1, arg2, arg3, arg4, arg5, arg6) \
+# define DECLARGS_6(arg1, arg2, arg3, arg4, arg5, arg6) \
   DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \
   register unsigned long int gpr7 __asm__ ("7") = (unsigned long int)(arg6);
 
-#define ASMFMT_0
-#define ASMFMT_1 , "0" (gpr2)
-#define ASMFMT_2 , "0" (gpr2), "d" (gpr3)
-#define ASMFMT_3 , "0" (gpr2), "d" (gpr3), "d" (gpr4)
-#define ASMFMT_4 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5)
-#define ASMFMT_5 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6)
-#define ASMFMT_6 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6), "d" (gpr7)
+# define ASMFMT_0
+# define ASMFMT_1 , "0" (gpr2)
+# define ASMFMT_2 , "0" (gpr2), "d" (gpr3)
+# define ASMFMT_3 , "0" (gpr2), "d" (gpr3), "d" (gpr4)
+# define ASMFMT_4 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5)
+# define ASMFMT_5 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6)
+# define ASMFMT_6 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6), "d" (gpr7)
 
-#define VDSO_NAME  "LINUX_2.6.29"
-#define VDSO_HASH  123718585
+# define VDSO_NAME  "LINUX_2.6.29"
+# define VDSO_HASH  123718585
 
 /* List of system calls which are supported as vsyscalls.  */
-#define HAVE_CLOCK_GETRES64_VSYSCALL	"__kernel_clock_getres"
-#define HAVE_CLOCK_GETTIME64_VSYSCALL	"__kernel_clock_gettime"
-#define HAVE_GETRANDOM_VSYSCALL		"__kernel_getrandom"
-#define HAVE_GETTIMEOFDAY_VSYSCALL	"__kernel_gettimeofday"
-#define HAVE_GETCPU_VSYSCALL		"__kernel_getcpu"
-
-#define HAVE_CLONE3_WRAPPER		1
-#endif
+# define HAVE_CLOCK_GETRES64_VSYSCALL	"__kernel_clock_getres"
+# define HAVE_CLOCK_GETTIME64_VSYSCALL	"__kernel_clock_gettime"
+# define HAVE_GETRANDOM_VSYSCALL		"__kernel_getrandom"
+# define HAVE_GETTIMEOFDAY_VSYSCALL	"__kernel_gettimeofday"
+# define HAVE_GETCPU_VSYSCALL		"__kernel_getcpu"
+
+# define HAVE_CLONE3_WRAPPER		1
+
+# undef HAVE_INTERNAL_BRK_ADDR_SYMBOL
+# define HAVE_INTERNAL_BRK_ADDR_SYMBOL 1
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* _LINUX_S390_SYSDEP_H */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/timer_t_was_int_compat.h b/sysdeps/unix/sysv/linux/s390/timer_t_was_int_compat.h
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/timer_t_was_int_compat.h
rename to sysdeps/unix/sysv/linux/s390/timer_t_was_int_compat.h
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S b/sysdeps/unix/sysv/linux/s390/vfork.S
similarity index 100%
rename from sysdeps/unix/sysv/linux/s390/s390-64/vfork.S
rename to sysdeps/unix/sysv/linux/s390/vfork.S
-- 
2.52.0



More information about the Libc-alpha mailing list