]> git.pld-linux.org Git - packages/glibc.git/commitdiff
- fixes from upstream
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Sun, 3 Apr 2016 07:54:10 +0000 (09:54 +0200)
committerArkadiusz Miśkiewicz <arekm@maven.pl>
Sun, 3 Apr 2016 07:54:10 +0000 (09:54 +0200)
glibc-git.patch

index 12f94b77576c975459c87ca79581fb6e7b7aa658..1d5ad4b97face03d4f76bf8df495dbb35bfb1b35 100644 (file)
@@ -1,8 +1,114 @@
 diff --git a/ChangeLog b/ChangeLog
-index 2e4afb7..7895446 100644
+index 2e4afb7..64a2746 100644
 --- a/ChangeLog
 +++ b/ChangeLog
-@@ -1,5 +1,57 @@
+@@ -1,5 +1,163 @@
++2016-04-01  Stefan Liebler  <stli@linux.vnet.ibm.com>
++
++      * sysdeps/s390/bits/link.h: (La_s390_vr) New typedef.
++      (La_s390_32_regs): Append vector register lr_v24-lr_v31.
++      (La_s390_64_regs): Likewise.
++      (La_s390_32_retval): Append vector register lrv_v24.
++      (La_s390_64_retval): Likeweise.
++      * sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_profile):
++      Handle extended structs La_s390_32_regs and La_s390_32_retval.
++      * sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_profile):
++      Handle extended structs La_s390_64_regs and La_s390_64_retval.
++
++2016-04-01  Stefan Liebler  <stli@linux.vnet.ibm.com>
++
++      * sysdeps/s390/s390-32/dl-trampoline.S: Include dl-trampoline.h twice
++      to create a non-vector/vector version for _dl_runtime_resolve and
++      _dl_runtime_profile. Move implementation to ...
++      * sysdeps/s390/s390-32/dl-trampoline.h: ... here.
++      (_dl_runtime_resolve) Save and restore fpr/vrs.
++      (_dl_runtime_profile) Save and restore vrs and fix some issues
++      if _dl_call_pltexit is called.
++      * sysdeps/s390/s390-32/dl-machine.h (elf_machine_runtime_setup):
++      Choose the correct resolver function if running on a machine with vx.
++      * sysdeps/s390/s390-64/dl-trampoline.S: Include dl-trampoline.h twice
++      to create a non-vector/vector version for _dl_runtime_resolve and
++      _dl_runtime_profile. Move implementation to ...
++      * sysdeps/s390/s390-64/dl-trampoline.h: ... here.
++      (_dl_runtime_resolve) Save and restore fpr/vrs.
++      (_dl_runtime_profile) Save and restore vrs and fix some issues
++      * sysdeps/s390/s390-64/dl-machine.h: (elf_machine_runtime_setup):
++      Choose the correct resolver function if running on a machine with vx.
++
++2016-03-25  Florian Weimer  <fweimer@redhat.com>
++
++      [BZ #19791]
++      * resolv/res_send.c (close_and_return_error): New function.
++      (send_dg): Initialize *resplen2 after reopen failure.  Call
++      close_and_return_error for error returns.  On error paths without
++      __res_iclose, initialze *resplen2 explicitly.  Update comment for
++      successful return.
++
++2016-03-21  Dylan Alex Simon  <dylan-sourceware@dylex.net>
++
++      [BZ #19822]
++      * math/Makefile ($(inst_libdir)/libm.so): Write output to $@.tmp and
++      move it to the final $@ location.
++
++2016-03-15  Andreas Schwab  <schwab@suse.de>
++
++      [BZ #19257]
++      * resolv/res_init.c (__res_iclose): Use statp->nscount instead of
++      statp->_u._ext.nscount as loop count.
++
++2016-03-11  H.J. Lu  <hongjiu.lu@intel.com>
++
++      [BZ #19758]
++      * sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h
++      (EXTRA_LD_ENVVARS): Or bit_Prefer_MAP_32BIT_EXEC.
++
++2016-03-11  H.J. Lu  <hongjiu.lu@intel.com>
++
++      [BZ #19759]
++      * sysdeps/x86/bits/string.h (_HAVE_STRING_ARCH_mempcpy): New.
++
++2016-03-10  H.J. Lu  <hongjiu.lu@intel.com>
++
++      [BZ #19762]
++      * sysdeps/i386/i686/multiarch/bcopy.S (bcopy): Use
++      HAS_ARCH_FEATURE with Fast_Rep_String.
++      * sysdeps/i386/i686/multiarch/bzero.S (__bzero): Likewise.
++      * sysdeps/i386/i686/multiarch/memcpy.S (memcpy): Likewise.
++      * sysdeps/i386/i686/multiarch/memcpy_chk.S (__memcpy_chk):
++      Likewise.
++      * sysdeps/i386/i686/multiarch/memmove_chk.S (__memmove_chk):
++      Likewise.
++      * sysdeps/i386/i686/multiarch/mempcpy.S (__mempcpy): Likewise.
++      * sysdeps/i386/i686/multiarch/mempcpy_chk.S (__mempcpy_chk):
++      Likewise.
++      * sysdeps/i386/i686/multiarch/memset.S (memset): Likewise.
++      * sysdeps/i386/i686/multiarch/memset_chk.S (__memset_chk):
++      Likewise.
++
++2016-03-09  Aurelien Jarno  <aurelien@aurel32.net>
++
++      [BZ #19792]
++      * sysdeps/unix/sysv/linux/mips/makecontext.S (__makecontext):
++      Terminate FDE before return label.
++
++2016-03-08  Aurelien Jarno  <aurelien@aurel32.net>
++
++      * include/sys/auxv.h: New file.
++
++2016-03-07  Hongjiu Zhang  <noctuorare@gmail.com>
++
++      * elf/sln.c (makesymlink): Change struct stat to stat64, and lstat
++      to lstat64.
++
++2016-02-24  Marko Myllynen  <myllynen@redhat.com>
++
++      * NEWS (2.23): Fix typo in bug 19048 text.
++
++2016-02-24  Andreas Schwab  <schwab@suse.de>
++
++      * math/test-math-isinff.cc (do_test): Only call isinfl and isnanl
++      if !NO_LONG_DOUBLE.
++
 +2016-02-22  Roland McGrath  <roland@hack.frob.com>
 +
 +      * sysdeps/arm/nacl/libc.abilist (GLIBC_2.23): Add GLIBC_2.23,
@@ -60,6 +166,43 @@ index 2e4afb7..7895446 100644
        * version.h (RELEASE): Set to "stable".
        (VERSION): Set to 2.23.
        * include/feature.h (__GLIBC_MINOR__): Set to 23.
+diff --git a/NEWS b/NEWS
+index c0276cf..674d217 100644
+--- a/NEWS
++++ b/NEWS
+@@ -5,6 +5,23 @@ See the end for copying conditions.
+ Please send GNU C library bug reports via <http://sourceware.org/bugzilla/>
+ using `glibc' in the "product" field.
\f
++Version 2.23.1
++
++Security related changes:
++
++  [Add security related changes here]
++
++The following bugs are resolved with this release:
++
++  [19679] gcc-4.9.3 C++ exception handling broken due to unaligned stack
++  [19758] Or bit_Prefer_MAP_32BIT_EXEC in EXTRA_LD_ENVVARS
++  [19759] Don't inline mempcpy for x86
++  [19762] Use HAS_ARCH_FEATURE with Fast_Rep_String
++  [19791] Assertion failure in res_query.c with un-connectable name server addresses
++  [19792] MIPS: backtrace yields infinite backtrace with makecontext
++  [19822] libm.so install clobbers old version
++
++\f
+ Version 2.23
+ * Unicode 8.0.0 Support: Character encoding, character type info, and
+@@ -38,7 +55,7 @@ Version 2.23
+   unnecessary serialization of memory allocation requests across threads.
+   The defect is now corrected.  Users should see a substantial increase in
+   the concurent throughput of allocation requests for applications which
+-  trigger this bug.  Affected applications typically create create and
++  trigger this bug.  Affected applications typically create and
+   destroy threads frequently.  (Bug 19048 was reported and analyzed by
+   Ericsson.)
 diff --git a/configure b/configure
 index 06ea87e..8fe5937 100755
 --- a/configure
@@ -73,6 +216,68 @@ index 06ea87e..8fe5937 100755
  *** and join the community!" "$LINENO" 5
      ;;
    esac
+diff --git a/elf/sln.c b/elf/sln.c
+index 9d57be2..f52cb9f 100644
+--- a/elf/sln.c
++++ b/elf/sln.c
+@@ -164,11 +164,11 @@ makesymlinks (const char *file)
+ static int
+ makesymlink (const char *src, const char *dest)
+ {
+-  struct stat stats;
++  struct stat64 stats;
+   const char *error;
+   /* Destination must not be a directory. */
+-  if (lstat (dest, &stats) == 0)
++  if (lstat64 (dest, &stats) == 0)
+     {
+       if (S_ISDIR (stats.st_mode))
+       {
+diff --git a/include/sys/auxv.h b/include/sys/auxv.h
+new file mode 100644
+index 0000000..dede2c3
+--- /dev/null
++++ b/include/sys/auxv.h
+@@ -0,0 +1 @@
++#include <misc/sys/auxv.h>
+diff --git a/math/Makefile b/math/Makefile
+index 7d573a0..6aa87f9 100644
+--- a/math/Makefile
++++ b/math/Makefile
+@@ -100,7 +100,8 @@ $(inst_libdir)/libm.so: $(common-objpfx)format.lds \
+        cat $<; \
+        echo 'GROUP ( $(slibdir)/libm.so$(libm.so-version) ' \
+             'AS_NEEDED ( $(libdir)/libmvec_nonshared.a $(slibdir)/libmvec.so$(libmvec.so-version) ) )' \
+-      ) > $@
++      ) > $@.new
++      mv -f $@.new $@
+ endif
+ # Rules for the test suite.
+diff --git a/math/test-math-isinff.cc b/math/test-math-isinff.cc
+index 195d753..ecff1dc 100644
+--- a/math/test-math-isinff.cc
++++ b/math/test-math-isinff.cc
+@@ -30,12 +30,17 @@ do_test (void)
+      header fix this test will not compile.  */
+   if (isinff (1.0f)
+       || !isinff (INFINITY)
++#ifndef NO_LONG_DOUBLE
+       || isinfl (1.0L)
+       || !isinfl (INFINITY)
++#endif
+       || isnanf (2.0f)
+       || !isnanf (NAN)
++#ifndef NO_LONG_DOUBLE
+       || isnanl (2.0L)
+-      || !isnanl (NAN))
++      || !isnanl (NAN)
++#endif
++      )
+     {
+       printf ("FAIL: Failed to call is* functions.\n");
+       exit (1);
 diff --git a/po/be.po b/po/be.po
 index 66d1235..ffb39b4 100644
 --- a/po/be.po
@@ -55065,6 +55270,185 @@ index 90c47e4..9ca8cb1 100644
  #~ msgid "compile-time support for database policy missing"
  #~ msgstr "compile-time 支援用於資料庫策略缺少"
  
+diff --git a/resolv/res_init.c b/resolv/res_init.c
+index e0b6a80..6c951f5 100644
+--- a/resolv/res_init.c
++++ b/resolv/res_init.c
+@@ -594,7 +594,7 @@ __res_iclose(res_state statp, bool free_addr) {
+               statp->_vcsock = -1;
+               statp->_flags &= ~(RES_F_VC | RES_F_CONN);
+       }
+-      for (ns = 0; ns < statp->_u._ext.nscount; ns++)
++      for (ns = 0; ns < statp->nscount; ns++)
+               if (statp->_u._ext.nsaddrs[ns]) {
+                       if (statp->_u._ext.nssocks[ns] != -1) {
+                               close_not_cancel_no_status(statp->_u._ext.nssocks[ns]);
+diff --git a/resolv/res_send.c b/resolv/res_send.c
+index 25c19f1..b4efcb6 100644
+--- a/resolv/res_send.c
++++ b/resolv/res_send.c
+@@ -649,6 +649,18 @@ get_nsaddr (res_state statp, int n)
+     return (struct sockaddr *) (void *) &statp->nsaddr_list[n];
+ }
++/* Close the resolver structure, assign zero to *RESPLEN2 if RESPLEN2
++   is not NULL, and return zero.  */
++static int
++__attribute__ ((warn_unused_result))
++close_and_return_error (res_state statp, int *resplen2)
++{
++  __res_iclose(statp, false);
++  if (resplen2 != NULL)
++    *resplen2 = 0;
++  return 0;
++}
++
+ /* The send_vc function is responsible for sending a DNS query over TCP
+    to the nameserver numbered NS from the res_state STATP i.e.
+    EXT(statp).nssocks[ns].  The function supports sending both IPv4 and
+@@ -1114,7 +1126,11 @@ send_dg(res_state statp,
+  retry_reopen:
+       retval = reopen (statp, terrno, ns);
+       if (retval <= 0)
+-              return retval;
++        {
++          if (resplen2 != NULL)
++            *resplen2 = 0;
++          return retval;
++        }
+  retry:
+       evNowTime(&now);
+       evConsTime(&timeout, seconds, 0);
+@@ -1127,8 +1143,6 @@ send_dg(res_state statp,
+       int recvresp2 = buf2 == NULL;
+       pfd[0].fd = EXT(statp).nssocks[ns];
+       pfd[0].events = POLLOUT;
+-      if (resplen2 != NULL)
+-        *resplen2 = 0;
+  wait:
+       if (need_recompute) {
+       recompute_resend:
+@@ -1136,9 +1150,7 @@ send_dg(res_state statp,
+               if (evCmpTime(finish, now) <= 0) {
+               poll_err_out:
+                       Perror(statp, stderr, "poll", errno);
+-              err_out:
+-                      __res_iclose(statp, false);
+-                      return (0);
++                      return close_and_return_error (statp, resplen2);
+               }
+               evSubTime(&timeout, &finish, &now);
+               need_recompute = 0;
+@@ -1185,7 +1197,9 @@ send_dg(res_state statp,
+                 }
+               *gotsomewhere = 1;
+-              return (0);
++              if (resplen2 != NULL)
++                *resplen2 = 0;
++              return 0;
+       }
+       if (n < 0) {
+               if (errno == EINTR)
+@@ -1253,7 +1267,7 @@ send_dg(res_state statp,
+                     fail_sendmmsg:
+                       Perror(statp, stderr, "sendmmsg", errno);
+-                      goto err_out;
++                      return close_and_return_error (statp, resplen2);
+                     }
+                 }
+               else
+@@ -1271,7 +1285,7 @@ send_dg(res_state statp,
+                     if (errno == EINTR || errno == EAGAIN)
+                       goto recompute_resend;
+                     Perror(statp, stderr, "send", errno);
+-                    goto err_out;
++                    return close_and_return_error (statp, resplen2);
+                   }
+                 just_one:
+                   if (nwritten != 0 || buf2 == NULL || single_request)
+@@ -1349,7 +1363,7 @@ send_dg(res_state statp,
+                               goto wait;
+                       }
+                       Perror(statp, stderr, "recvfrom", errno);
+-                      goto err_out;
++                      return close_and_return_error (statp, resplen2);
+               }
+               *gotsomewhere = 1;
+               if (__glibc_unlikely (*thisresplenp < HFIXEDSZ))       {
+@@ -1360,7 +1374,7 @@ send_dg(res_state statp,
+                              (stdout, ";; undersized: %d\n",
+                               *thisresplenp));
+                       *terrno = EMSGSIZE;
+-                      goto err_out;
++                      return close_and_return_error (statp, resplen2);
+               }
+               if ((recvresp1 || hp->id != anhp->id)
+                   && (recvresp2 || hp2->id != anhp->id)) {
+@@ -1409,7 +1423,7 @@ send_dg(res_state statp,
+                               ? *thisanssizp : *thisresplenp);
+                       /* record the error */
+                       statp->_flags |= RES_F_EDNS0ERR;
+-                      goto err_out;
++                      return close_and_return_error (statp, resplen2);
+       }
+ #endif
+               if (!(statp->options & RES_INSECURE2)
+@@ -1461,10 +1475,10 @@ send_dg(res_state statp,
+                           goto wait;
+                         }
+-                      __res_iclose(statp, false);
+                       /* don't retry if called from dig */
+                       if (!statp->pfcode)
+-                              return (0);
++                        return close_and_return_error (statp, resplen2);
++                      __res_iclose(statp, false);
+               }
+               if (anhp->rcode == NOERROR && anhp->ancount == 0
+                   && anhp->aa == 0 && anhp->ra == 0 && anhp->arcount == 0) {
+@@ -1486,6 +1500,8 @@ send_dg(res_state statp,
+                       __res_iclose(statp, false);
+                       // XXX if we have received one reply we could
+                       // XXX use it and not repeat it over TCP...
++                      if (resplen2 != NULL)
++                        *resplen2 = 0;
+                       return (1);
+               }
+               /* Mark which reply we received.  */
+@@ -1501,21 +1517,22 @@ send_dg(res_state statp,
+                                       __res_iclose (statp, false);
+                                       retval = reopen (statp, terrno, ns);
+                                       if (retval <= 0)
+-                                              return retval;
++                                        {
++                                          if (resplen2 != NULL)
++                                            *resplen2 = 0;
++                                          return retval;
++                                        }
+                                       pfd[0].fd = EXT(statp).nssocks[ns];
+                               }
+                       }
+                       goto wait;
+               }
+-              /*
+-               * All is well, or the error is fatal.  Signal that the
+-               * next nameserver ought not be tried.
+-               */
++              /* All is well.  We have received both responses (if
++                 two responses were requested).  */
+               return (resplen);
+-      } else if (pfd[0].revents & (POLLERR | POLLHUP | POLLNVAL)) {
+-              /* Something went wrong.  We can stop trying.  */
+-              goto err_out;
+-      }
++      } else if (pfd[0].revents & (POLLERR | POLLHUP | POLLNVAL))
++        /* Something went wrong.  We can stop trying.  */
++        return close_and_return_error (statp, resplen2);
+       else {
+               /* poll should not have returned > 0 in this case.  */
+               abort ();
 diff --git a/sysdeps/arm/nacl/libc.abilist b/sysdeps/arm/nacl/libc.abilist
 index 561441e..0560510 100644
 --- a/sysdeps/arm/nacl/libc.abilist
@@ -55079,6 +55463,1112 @@ index 561441e..0560510 100644
 +GLIBC_2.23 fts64_open F
 +GLIBC_2.23 fts64_read F
 +GLIBC_2.23 fts64_set F
+diff --git a/sysdeps/i386/i686/multiarch/bcopy.S b/sysdeps/i386/i686/multiarch/bcopy.S
+index d5b408d..ce6661b 100644
+--- a/sysdeps/i386/i686/multiarch/bcopy.S
++++ b/sysdeps/i386/i686/multiarch/bcopy.S
+@@ -36,7 +36,7 @@ ENTRY(bcopy)
+       HAS_CPU_FEATURE (SSSE3)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__bcopy_ssse3)
+-      HAS_CPU_FEATURE (Fast_Rep_String)
++      HAS_ARCH_FEATURE (Fast_Rep_String)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__bcopy_ssse3_rep)
+ 2:    ret
+diff --git a/sysdeps/i386/i686/multiarch/bzero.S b/sysdeps/i386/i686/multiarch/bzero.S
+index 3bad417..738ca69 100644
+--- a/sysdeps/i386/i686/multiarch/bzero.S
++++ b/sysdeps/i386/i686/multiarch/bzero.S
+@@ -31,7 +31,7 @@ ENTRY(__bzero)
+       HAS_CPU_FEATURE (SSE2)
+       jz      2f
+       LOAD_FUNC_GOT_EAX ( __bzero_sse2)
+-      HAS_CPU_FEATURE (Fast_Rep_String)
++      HAS_ARCH_FEATURE (Fast_Rep_String)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__bzero_sse2_rep)
+ 2:    ret
+diff --git a/sysdeps/i386/i686/multiarch/memcpy.S b/sysdeps/i386/i686/multiarch/memcpy.S
+index 27913ea..652b5a2 100644
+--- a/sysdeps/i386/i686/multiarch/memcpy.S
++++ b/sysdeps/i386/i686/multiarch/memcpy.S
+@@ -38,7 +38,7 @@ ENTRY(memcpy)
+       HAS_CPU_FEATURE (SSSE3)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__memcpy_ssse3)
+-      HAS_CPU_FEATURE (Fast_Rep_String)
++      HAS_ARCH_FEATURE (Fast_Rep_String)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__memcpy_ssse3_rep)
+ 2:    ret
+diff --git a/sysdeps/i386/i686/multiarch/memcpy_chk.S b/sysdeps/i386/i686/multiarch/memcpy_chk.S
+index 39bc3c2..0eee32c 100644
+--- a/sysdeps/i386/i686/multiarch/memcpy_chk.S
++++ b/sysdeps/i386/i686/multiarch/memcpy_chk.S
+@@ -39,7 +39,7 @@ ENTRY(__memcpy_chk)
+       HAS_CPU_FEATURE (SSSE3)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__memcpy_chk_ssse3)
+-      HAS_CPU_FEATURE (Fast_Rep_String)
++      HAS_ARCH_FEATURE (Fast_Rep_String)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__memcpy_chk_ssse3_rep)
+ 2:    ret
+diff --git a/sysdeps/i386/i686/multiarch/memmove_chk.S b/sysdeps/i386/i686/multiarch/memmove_chk.S
+index c27892d..a29bbc9 100644
+--- a/sysdeps/i386/i686/multiarch/memmove_chk.S
++++ b/sysdeps/i386/i686/multiarch/memmove_chk.S
+@@ -36,7 +36,7 @@ ENTRY(__memmove_chk)
+       HAS_CPU_FEATURE (SSSE3)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__memmove_chk_ssse3)
+-      HAS_CPU_FEATURE (Fast_Rep_String)
++      HAS_ARCH_FEATURE (Fast_Rep_String)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__memmove_chk_ssse3_rep)
+ 2:    ret
+diff --git a/sysdeps/i386/i686/multiarch/mempcpy.S b/sysdeps/i386/i686/multiarch/mempcpy.S
+index 141ff2e..b46f3fc 100644
+--- a/sysdeps/i386/i686/multiarch/mempcpy.S
++++ b/sysdeps/i386/i686/multiarch/mempcpy.S
+@@ -38,7 +38,7 @@ ENTRY(__mempcpy)
+       HAS_CPU_FEATURE (SSSE3)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__mempcpy_ssse3)
+-      HAS_CPU_FEATURE (Fast_Rep_String)
++      HAS_ARCH_FEATURE (Fast_Rep_String)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__mempcpy_ssse3_rep)
+ 2:    ret
+diff --git a/sysdeps/i386/i686/multiarch/mempcpy_chk.S b/sysdeps/i386/i686/multiarch/mempcpy_chk.S
+index 2788b66..30f3629 100644
+--- a/sysdeps/i386/i686/multiarch/mempcpy_chk.S
++++ b/sysdeps/i386/i686/multiarch/mempcpy_chk.S
+@@ -39,7 +39,7 @@ ENTRY(__mempcpy_chk)
+       HAS_CPU_FEATURE (SSSE3)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__mempcpy_chk_ssse3)
+-      HAS_CPU_FEATURE (Fast_Rep_String)
++      HAS_ARCH_FEATURE (Fast_Rep_String)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__mempcpy_chk_ssse3_rep)
+ 2:    ret
+diff --git a/sysdeps/i386/i686/multiarch/memset.S b/sysdeps/i386/i686/multiarch/memset.S
+index 268df0c..14180e4 100644
+--- a/sysdeps/i386/i686/multiarch/memset.S
++++ b/sysdeps/i386/i686/multiarch/memset.S
+@@ -31,7 +31,7 @@ ENTRY(memset)
+       HAS_CPU_FEATURE (SSE2)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__memset_sse2)
+-      HAS_CPU_FEATURE (Fast_Rep_String)
++      HAS_ARCH_FEATURE (Fast_Rep_String)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__memset_sse2_rep)
+ 2:    ret
+diff --git a/sysdeps/i386/i686/multiarch/memset_chk.S b/sysdeps/i386/i686/multiarch/memset_chk.S
+index d18b53f..d73f202 100644
+--- a/sysdeps/i386/i686/multiarch/memset_chk.S
++++ b/sysdeps/i386/i686/multiarch/memset_chk.S
+@@ -31,7 +31,7 @@ ENTRY(__memset_chk)
+       HAS_CPU_FEATURE (SSE2)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__memset_chk_sse2)
+-      HAS_CPU_FEATURE (Fast_Rep_String)
++      HAS_ARCH_FEATURE (Fast_Rep_String)
+       jz      2f
+       LOAD_FUNC_GOT_EAX (__memset_chk_sse2_rep)
+ 2:    ret
+diff --git a/sysdeps/s390/bits/link.h b/sysdeps/s390/bits/link.h
+index 2ef7f44..e27ed67 100644
+--- a/sysdeps/s390/bits/link.h
++++ b/sysdeps/s390/bits/link.h
+@@ -19,6 +19,9 @@
+ # error "Never include <bits/link.h> directly; use <link.h> instead."
+ #endif
++#if defined HAVE_S390_VX_ASM_SUPPORT
++typedef char La_s390_vr[16];
++#endif
+ #if __ELF_NATIVE_CLASS == 32
+@@ -32,6 +35,16 @@ typedef struct La_s390_32_regs
+   uint32_t lr_r6;
+   double lr_fp0;
+   double lr_fp2;
++# if defined HAVE_S390_VX_ASM_SUPPORT
++  La_s390_vr lr_v24;
++  La_s390_vr lr_v25;
++  La_s390_vr lr_v26;
++  La_s390_vr lr_v27;
++  La_s390_vr lr_v28;
++  La_s390_vr lr_v29;
++  La_s390_vr lr_v30;
++  La_s390_vr lr_v31;
++# endif
+ } La_s390_32_regs;
+ /* Return values for calls from PLT on s390-32.  */
+@@ -40,6 +53,9 @@ typedef struct La_s390_32_retval
+   uint32_t lrv_r2;
+   uint32_t lrv_r3;
+   double lrv_fp0;
++# if defined HAVE_S390_VX_ASM_SUPPORT
++  La_s390_vr lrv_v24;
++# endif
+ } La_s390_32_retval;
+@@ -77,6 +93,16 @@ typedef struct La_s390_64_regs
+   double lr_fp2;
+   double lr_fp4;
+   double lr_fp6;
++# if defined HAVE_S390_VX_ASM_SUPPORT
++  La_s390_vr lr_v24;
++  La_s390_vr lr_v25;
++  La_s390_vr lr_v26;
++  La_s390_vr lr_v27;
++  La_s390_vr lr_v28;
++  La_s390_vr lr_v29;
++  La_s390_vr lr_v30;
++  La_s390_vr lr_v31;
++# endif
+ } La_s390_64_regs;
+ /* Return values for calls from PLT on s390-64.  */
+@@ -84,6 +110,9 @@ typedef struct La_s390_64_retval
+ {
+   uint64_t lrv_r2;
+   double lrv_fp0;
++# if defined HAVE_S390_VX_ASM_SUPPORT
++  La_s390_vr lrv_v24;
++# endif
+ } La_s390_64_retval;
+diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
+index 14bde3b..ec0ae4a 100644
+--- a/sysdeps/s390/s390-32/dl-machine.h
++++ b/sysdeps/s390/s390-32/dl-machine.h
+@@ -89,6 +89,11 @@ 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)
+     {
+@@ -116,7 +121,14 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+        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))
+@@ -125,9 +137,18 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+           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.  */
+-      got[2] = (Elf32_Addr) &_dl_runtime_resolve;
++      {
++        /* 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;
+diff --git a/sysdeps/s390/s390-32/dl-trampoline.S b/sysdeps/s390/s390-32/dl-trampoline.S
+index 1645610..859183c 100644
+--- a/sysdeps/s390/s390-32/dl-trampoline.S
++++ b/sysdeps/s390/s390-32/dl-trampoline.S
+@@ -16,130 +16,18 @@
+    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
+- *   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
+- */
+-
+ #include <sysdep.h>
+       .text
+-      .globl _dl_runtime_resolve
+-      .type _dl_runtime_resolve, @function
+-      cfi_startproc
+-      .align 16
+-_dl_runtime_resolve:
+-      stm    %r2,%r5,32(%r15)         # save registers
+-      st     %r14,8(%r15)
+-      cfi_offset (r14, -88)
+-      lr     %r0,%r15                 # create stack frame
+-      ahi    %r15,-96
+-      cfi_adjust_cfa_offset (96)
+-      st     0,0(%r15)
+-      lm     %r2,%r3,120(%r15)        # load args saved by PLT
+-      basr   %r1,0
+-0:    l      %r14,1f-0b(%r1)
+-      bas    %r14,0(%r14,%r1)         # call resolver
+-      lr     %r1,%r2                  # function addr returned in r2
+-      ahi    %r15,96                  # remove stack frame
+-      cfi_adjust_cfa_offset (-96)
+-      l      %r14,8(15)               # restore registers
+-      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:
+-      stm    %r2,%r6,32(%r15)         # save registers
+-      std    %f0,56(%r15)
+-      std    %f2,64(%r15)
+-      st     %r6,8(%r15)
+-      st     %r12,12(%r15)
+-      st     %r14,16(%r15)
+-      cfi_offset (r6, -64)
+-      cfi_offset (f0, -40)
+-      cfi_offset (f2, -32)
+-      cfi_offset (r12, -84)
+-      cfi_offset (r14, -80)
+-      lr     %r12,%r15                # create stack frame
+-      cfi_def_cfa_register (12)
+-      ahi    %r15,-96
+-      st     %r12,0(%r15)
+-      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,32(%r12)             # 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
+-      icm    %r0,15,20(%r12)          # load & test framesize
+-      jnm    2f
+-
+-      lm     %r2,%r6,32(%r12)
+-      ld     %f0,56(%r12)
+-      ld     %f2,64(%r12)
+-      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:    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)
+-      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,32(%r12)         # load register parameters
+-      ld     %f0,56(%r12)
+-      ld     %f2,64(%r12)
+-      basr   %r14,%r1                 # call resolved function
+-      stm    %r2,%r3,72(%r12)
+-      std    %f0,80(%r12)
+-      lm     %r2,%r3,24(%r12)         # load arguments saved by PLT
+-      basr   %r1,0
+-5:    l      %r14,7f-5b(%r1)
+-      la     %r4,32(%r12)             # pointer to struct La_s390_32_regs
+-      la     %r5,72(%r12)             # pointer to struct La_s390_32_retval
+-      basr   %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)
+-      br     %r14
+-
+-6:    .long  _dl_profile_fixup - 0b
+-7:    .long  _dl_call_pltexit - 5b
+-      cfi_endproc
+-      .size _dl_runtime_profile, .-_dl_runtime_profile
++/* 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/sysdeps/s390/s390-32/dl-trampoline.h b/sysdeps/s390/s390-32/dl-trampoline.h
+new file mode 100644
+index 0000000..086449f
+--- /dev/null
++++ b/sysdeps/s390/s390-32/dl-trampoline.h
+@@ -0,0 +1,231 @@
++/* PLT trampolines.  s390 version.
++   Copyright (C) 2016 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/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h
+index cb81aaf..9ee7c92 100644
+--- a/sysdeps/s390/s390-64/dl-machine.h
++++ b/sysdeps/s390/s390-64/dl-machine.h
+@@ -26,6 +26,7 @@
+ #include <sys/param.h>
+ #include <string.h>
+ #include <link.h>
++#include <sysdeps/s390/dl-procinfo.h>
+ #include <dl-irel.h>
+ #define ELF_MACHINE_IRELATIVE       R_390_IRELATIVE
+@@ -78,6 +79,10 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+ {
+   extern void _dl_runtime_resolve (Elf64_Word);
+   extern void _dl_runtime_profile (Elf64_Word);
++#if defined HAVE_S390_VX_ASM_SUPPORT
++  extern void _dl_runtime_resolve_vx (Elf64_Word);
++  extern void _dl_runtime_profile_vx (Elf64_Word);
++#endif
+   if (l->l_info[DT_JMPREL] && lazy)
+     {
+@@ -105,7 +110,14 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+        end in this function.  */
+       if (__glibc_unlikely (profile))
+       {
++#if defined HAVE_S390_VX_ASM_SUPPORT
++        if (GLRO(dl_hwcap) & HWCAP_S390_VX)
++          got[2] = (Elf64_Addr) &_dl_runtime_profile_vx;
++        else
++          got[2] = (Elf64_Addr) &_dl_runtime_profile;
++#else
+         got[2] = (Elf64_Addr) &_dl_runtime_profile;
++#endif
+         if (GLRO(dl_profile) != NULL
+             && _dl_name_match_p (GLRO(dl_profile), l))
+@@ -114,9 +126,18 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+           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.  */
+-      got[2] = (Elf64_Addr) &_dl_runtime_resolve;
++      {
++        /* 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] = (Elf64_Addr) &_dl_runtime_resolve_vx;
++        else
++          got[2] = (Elf64_Addr) &_dl_runtime_resolve;
++#else
++        got[2] = (Elf64_Addr) &_dl_runtime_resolve;
++#endif
++      }
+     }
+   return lazy;
+diff --git a/sysdeps/s390/s390-64/dl-trampoline.S b/sysdeps/s390/s390-64/dl-trampoline.S
+index 6919ed0..1b0c9e2 100644
+--- a/sysdeps/s390/s390-64/dl-trampoline.S
++++ b/sysdeps/s390/s390-64/dl-trampoline.S
+@@ -16,126 +16,18 @@
+    License along with the GNU C Library; if not, see
+    <http://www.gnu.org/licenses/>.  */
+-/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile
+- * with the following linkage:
+- *   r2 - r6 : parameter registers
+- *   f0, f2, f4, f6 : floating point parameter registers
+- *   48(r15), 56(r15) : PLT arguments PLT1, PLT2
+- *   160(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)
+- *   f1, f3, f5, f7 : call saved
+- *   f0 - f3, f5, f7 - f15 : call clobbered
+- */
+-
+ #include <sysdep.h>
+       .text
+-      .globl _dl_runtime_resolve
+-      .type _dl_runtime_resolve, @function
+-      cfi_startproc
+-      .align 16
+-_dl_runtime_resolve:
+-      stmg   %r2,%r5,64(15)   # save call-clobbered argument registers
+-      stg    %r14,96(15)
+-      cfi_offset (r14, -64)
+-      lgr    %r0,%r15
+-      aghi   %r15,-160        # create stack frame
+-      cfi_adjust_cfa_offset (160)
+-      stg    %r0,0(%r15)      # write backchain
+-      lmg    %r2,%r3,208(%r15)# load args saved by PLT
+-      brasl  %r14,_dl_fixup   # call fixup
+-      lgr    %r1,%r2          # function addr returned in r2
+-      aghi   %r15,160         # remove stack frame
+-      cfi_adjust_cfa_offset (-160)
+-      lg     %r14,96(15)      # restore registers
+-      lmg    %r2,%r5,64(15)
+-      br     %r1
+-      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:
+-      stmg   %r2,%r6,64(%r15)         # save call-clobbered arg regs
+-      std    %f0,104(%r15)            # + r6 needed as arg for
+-      std    %f2,112(%r15)            #  _dl_profile_fixup
+-      std    %f4,120(%r15)
+-      std    %f6,128(%r15)
+-      stg    %r12,24(%r15)            # r12 is used as backup of r15
+-      stg    %r14,32(%r15)
+-      cfi_offset (r6, -96)
+-      cfi_offset (f0, -56)
+-      cfi_offset (f2, -48)
+-      cfi_offset (f4, -40)
+-      cfi_offset (f6, -32)
+-      cfi_offset (r12, -136)
+-      cfi_offset (r14, -128)
+-      lgr    %r12,%r15                # backup stack pointer
+-      cfi_def_cfa_register (12)
+-      aghi   %r15,-160                # create stack frame
+-      stg    %r12,0(%r15)             # save backchain
+-      lmg    %r2,%r3,48(%r12)         # load arguments saved by PLT
+-      lgr    %r4,%r14                 # return address as third parameter
+-      la     %r5,64(%r12)             # pointer to struct La_s390_32_regs
+-      la     %r6,40(%r12)             # long int * framesize
+-      brasl  %r14,_dl_profile_fixup   # call resolver
+-      lgr    %r1,%r2                  # function addr returned in r2
+-      lg     %r0,40(%r12)             # load framesize
+-      ltgr   %r0,%r0
+-      jnm    1f
+-
+-      lmg    %r2,%r6,64(%r12)         # framesize < 0 means no pltexit call
+-      ld     %f0,104(%r12)            # so we can do a tail call without
+-      ld     %f2,112(%r12)            # copying the arg overflow area
+-      ld     %f4,120(%r12)
+-      ld     %f6,128(%r12)
+-
+-      lgr    %r15,%r12                # remove stack frame
+-      cfi_def_cfa_register (15)
+-      lg     %r14,32(%r15)            # restore registers
+-      lg     %r12,24(%r15)
+-      br     %r1                      # tail-call to resolved function
+-
+-      cfi_def_cfa_register (12)
+-1:    jz     4f                       # framesize == 0 ?
+-      aghi   %r0,7                    # align framesize to 8
+-      nill   %r0,0xfff8
+-      slgr   %r15,%r0                 # make room for framesize bytes
+-      stg    %r12,0(%r15)
+-      la     %r2,160(%r15)
+-      la     %r3,160(%r12)
+-      srlg   %r0,%r0,3
+-3:    mvc    0(8,%r2),0(%r3)          # copy additional parameters
+-      la     %r2,8(%r2)
+-      la     %r3,8(%r3)
+-      brctg  %r0,3b
+-4:    lmg    %r2,%r6,64(%r12)         # load register parameters
+-      ld     %f0,104(%r12)            # restore call-clobbered arg regs
+-      ld     %f2,112(%r12)
+-      ld     %f4,120(%r12)
+-      ld     %f6,128(%r12)
+-      basr   %r14,%r1                 # call resolved function
+-      stg    %r2,136(%r12)
+-      std    %f0,144(%r12)
+-      lmg    %r2,%r3,48(%r12)         # load arguments saved by PLT
+-      la     %r4,32(%r12)             # pointer to struct La_s390_32_regs
+-      la     %r5,72(%r12)             # pointer to struct La_s390_32_retval
+-      brasl  %r14,_dl_call_pltexit
+-
+-      lgr    %r15,%r12                # remove stack frame
+-      cfi_def_cfa_register (15)
+-      lg     %r14,32(%r15)            # restore registers
+-      lg     %r12,24(%r15)
+-      br     %r14
+-
+-      cfi_endproc
+-      .size _dl_runtime_profile, .-_dl_runtime_profile
++/* 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/sysdeps/s390/s390-64/dl-trampoline.h b/sysdeps/s390/s390-64/dl-trampoline.h
+new file mode 100644
+index 0000000..33ea3de
+--- /dev/null
++++ b/sysdeps/s390/s390-64/dl-trampoline.h
+@@ -0,0 +1,225 @@
++/* PLT trampolines.  s390x version.
++   Copyright (C) 2016 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/>.  */
++
++/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile
++ * with the following linkage:
++ *   r2 - r6 : parameter registers
++ *   f0, f2, f4, f6 : floating point parameter registers
++ *   v24, v26, v28, v30, v25, v27, v29, v31 : vector parameter registers
++ *   48(r15), 56(r15) : PLT arguments PLT1, PLT2
++ *   160(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)
++ *   f0 - f7 : call clobbered
++ *   f8 - f15 : call saved
++ *   v0 - v7 : bytes 0-7 overlap with f0-f7: call clobbered
++               bytes 8-15: call clobbered
++ *   v8 - v15 : bytes 0-7 overlap with f8-f15: 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:
++      stmg   %r2,%r5,64(%r15) # save call-clobbered argument registers
++      cfi_offset (r2, -96)
++      cfi_offset (r3, -88)
++      cfi_offset (r4, -80)
++      cfi_offset (r5, -72)
++      std    %f0,104(%r15)
++      cfi_offset (f0, -56)
++      std    %f2,112(%r15)
++      cfi_offset (f2, -48)
++      std    %f4,120(%r15)
++      cfi_offset (f4, -40)
++      std    %f6,128(%r15)
++      cfi_offset (f6, -32)
++      stg    %r14,96(15)
++      cfi_offset (r14, -64)
++      lmg    %r2,%r3,48(%r15) # load args for fixup saved by PLT
++      lgr    %r0,%r15
++#ifdef RESTORE_VRS
++      aghi   %r15,-288        # create stack frame
++      cfi_adjust_cfa_offset (288)
++      .machine push
++      .machine "z13"
++      vstm   %v24,%v31,160(%r15)# store call-clobbered vector argument registers
++      cfi_offset (v24, -288)
++      cfi_offset (v25, -272)
++      cfi_offset (v26, -256)
++      cfi_offset (v27, -240)
++      cfi_offset (v28, -224)
++      cfi_offset (v29, -208)
++      cfi_offset (v30, -192)
++      cfi_offset (v31, -176)
++      .machine pop
++#else
++      aghi   %r15,-160        # create stack frame
++      cfi_adjust_cfa_offset (160)
++#endif
++      stg    %r0,0(%r15)      # write backchain
++      brasl  %r14,_dl_fixup   # call _dl_fixup
++      lgr    %r1,%r2          # function addr returned in r2
++#ifdef RESTORE_VRS
++      .machine push
++      .machine "z13"
++      vlm    %v24,%v31,160(%r15)# restore vector registers
++      .machine pop
++      aghi   %r15,288         # remove stack frame
++      cfi_adjust_cfa_offset (-288)
++#else
++      aghi   %r15,160         # remove stack frame
++      cfi_adjust_cfa_offset (-160)
++#endif
++      lg     %r14,96(%r15)    # restore registers
++      ld     %f0,104(%r15)
++      ld     %f2,112(%r15)
++      ld     %f4,120(%r15)
++      ld     %f6,128(%r15)
++      lmg    %r2,%r5,64(%r15)
++      br     %r1
++      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:
++      stg    %r12,24(%r15)            # r12 is used as backup of r15
++      cfi_offset (r12, -136)
++      stg    %r14,32(%r15)
++      cfi_offset (r14, -128)
++      lgr    %r12,%r15                # backup stack pointer
++      cfi_def_cfa_register (12)
++      aghi   %r15,-360                # create stack frame:
++                                      # 160 + sizeof(La_s390_64_regs)
++      stg    %r12,0(%r15)             # save backchain
++
++      stmg   %r2,%r6,160(%r15)        # save call-clobbered arg regs
++      cfi_offset (r2, -360)           # + r6 needed as arg for
++      cfi_offset (r3, -352)           #  _dl_profile_fixup
++      cfi_offset (r4, -344)
++      cfi_offset (r5, -336)
++      cfi_offset (r6, -328)
++      std    %f0,200(%r15)
++      cfi_offset (f0, -320)
++      std    %f2,208(%r15)
++      cfi_offset (f2, -312)
++      std    %f4,216(%r15)
++      cfi_offset (f4, -304)
++      std    %f6,224(%r15)
++      cfi_offset (f6, -296)
++#ifdef RESTORE_VRS
++      .machine push
++      .machine "z13"
++      vstm   %v24,%v31,232(%r15)      # store call-clobbered vector arguments
++      cfi_offset (v24, -288)
++      cfi_offset (v25, -272)
++      cfi_offset (v26, -256)
++      cfi_offset (v27, -240)
++      cfi_offset (v28, -224)
++      cfi_offset (v29, -208)
++      cfi_offset (v30, -192)
++      cfi_offset (v31, -176)
++      .machine pop
++#endif
++      lmg    %r2,%r3,48(%r12)         # load arguments saved by PLT
++      lgr    %r4,%r14                 # return address as third parameter
++      la     %r5,160(%r15)            # pointer to struct La_s390_64_regs
++      la     %r6,40(%r12)             # long int * framesize
++      brasl  %r14,_dl_profile_fixup   # call resolver
++      lgr    %r1,%r2                  # function addr returned in r2
++      ld     %f0,200(%r15)            # restore call-clobbered arg fprs
++      ld     %f2,208(%r15)
++      ld     %f4,216(%r15)
++      ld     %f6,224(%r15)
++#ifdef RESTORE_VRS
++      .machine push
++      .machine "z13"
++      vlm    %v24,%v31,232(%r15)      # restore call-clobbered arg vrs
++      .machine pop
++#endif
++      lg     %r0,40(%r12)             # load framesize
++      ltgr   %r0,%r0
++      jnm    1f
++
++      lmg    %r2,%r6,160(%r15)        # framesize < 0 means no pltexit call
++                                      # so we can do a tail call without
++                                      # copying the arg overflow area
++      lgr    %r15,%r12                # remove stack frame
++      cfi_def_cfa_register (15)
++      lg     %r14,32(%r15)            # restore registers
++      lg     %r12,24(%r15)
++      br     %r1                      # tail-call to resolved function
++
++      cfi_def_cfa_register (12)
++1:    la     %r4,160(%r15)            # pointer to struct La_s390_64_regs
++      stg    %r4,64(%r12)
++      jz     4f                       # framesize == 0 ?
++      aghi   %r0,7                    # align framesize to 8
++      nill   %r0,0xfff8
++      slgr   %r15,%r0                 # make room for framesize bytes
++      stg    %r12,0(%r15)             # save backchain
++      la     %r2,160(%r15)
++      la     %r3,160(%r12)
++      srlg   %r0,%r0,3
++3:    mvc    0(8,%r2),0(%r3)          # copy additional parameters
++      la     %r2,8(%r2)               # depending on framesize
++      la     %r3,8(%r3)
++      brctg  %r0,3b
++4:    lmg    %r2,%r6,0(%r4)           # restore call-clobbered arg gprs
++      basr   %r14,%r1                 # call resolved function
++      stg    %r2,72(%r12)             # store return values r2, f0
++      std    %f0,80(%r12)             # to struct La_s390_64_retval
++#ifdef RESTORE_VRS
++      .machine push
++      .machine "z13"
++      vst    %v24,88(%r12)            # store return value v24
++      .machine pop
++#endif
++      lmg    %r2,%r4,48(%r12)         # r2, r3: load arguments saved by PLT
++                                      # r4: pointer to struct La_s390_64_regs
++      la     %r5,72(%r12)             # pointer to struct La_s390_64_retval
++      brasl  %r14,_dl_call_pltexit
++
++      lgr    %r15,%r12                # remove stack frame
++      cfi_def_cfa_register (15)
++      lg     %r14,32(%r15)            # restore registers
++      lg     %r12,24(%r15)
++      lg     %r2,72(%r15)             # restore return values
++      ld     %f0,80(%r15)
++#ifdef RESTORE_VRS
++      .machine push
++      .machine "z13"
++      vl    %v24,88(%r15)             # restore return value v24
++      .machine pop
++#endif
++      br     %r14                     # Jump back to caller
++
++      cfi_endproc
++      .size _dl_runtime_profile, .-_dl_runtime_profile
++#endif
+diff --git a/sysdeps/unix/sysv/linux/mips/makecontext.S b/sysdeps/unix/sysv/linux/mips/makecontext.S
+index 66600c7..3196554 100644
+--- a/sysdeps/unix/sysv/linux/mips/makecontext.S
++++ b/sysdeps/unix/sysv/linux/mips/makecontext.S
+@@ -153,6 +153,11 @@ NESTED (__makecontext, FRAMESZ, ra)
+ #endif
+       jr      ra
++      /* We need to terminate the FDE to stop unwinding if backtrace was
++         called within a context created by makecontext.  */
++      cfi_endproc
++      nop
++
+ 99:
+ #ifdef __PIC__
+       move    gp, s1
+@@ -186,6 +191,8 @@ NESTED (__makecontext, FRAMESZ, ra)
+ 1:
+       lb      zero, (zero)
+       b       1b
++
++      cfi_startproc
+ PSEUDO_END (__makecontext)
+ weak_alias (__makecontext, makecontext)
+diff --git a/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h b/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h
+index c9db5ea..a759934 100644
+--- a/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h
++++ b/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h
+@@ -33,7 +33,7 @@
+   case 21:                                                          \
+     if (memcmp (envline, "PREFER_MAP_32BIT_EXEC", 21) == 0)         \
+       GLRO(dl_x86_cpu_features).feature[index_Prefer_MAP_32BIT_EXEC]  \
+-      = bit_Prefer_MAP_32BIT_EXEC;                                  \
++      |= bit_Prefer_MAP_32BIT_EXEC;                                 \
+     break;
+ /* Extra unsecure variables.  The names are all stuffed in a single
+diff --git a/sysdeps/x86/bits/string.h b/sysdeps/x86/bits/string.h
+index e4e019f..8dfce05 100644
+--- a/sysdeps/x86/bits/string.h
++++ b/sysdeps/x86/bits/string.h
+@@ -23,6 +23,9 @@
+ /* Use the unaligned string inline ABI.  */
+ #define _STRING_INLINE_unaligned 1
++/* Don't inline mempcpy into memcpy as x86 has an optimized mempcpy.  */
++#define _HAVE_STRING_ARCH_mempcpy 1
++
+ /* Enable inline functions only for i486 or better when compiling for
+    ia32.  */
+ #if !defined __x86_64__ && (defined __i486__ || defined __pentium__         \
 diff --git a/sysdeps/x86_64/dl-trampoline.S b/sysdeps/x86_64/dl-trampoline.S
 index 9fb6b13..39b8771 100644
 --- a/sysdeps/x86_64/dl-trampoline.S
This page took 0.517392 seconds and 4 git commands to generate.