[packages/glibc] - fixes from upstream

arekm arekm at pld-linux.org
Sun Apr 3 09:54:16 CEST 2016


commit 070ad5b34164ca3ab1754087f9a2aa2b1d08b602
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Sun Apr 3 09:54:10 2016 +0200

    - fixes from upstream

 glibc-git.patch | 1494 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 1492 insertions(+), 2 deletions(-)
---
diff --git a/glibc-git.patch b/glibc-git.patch
index 12f94b7..1d5ad4b 100644
--- a/glibc-git.patch
+++ b/glibc-git.patch
@@ -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 at 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 at 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 at 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 at 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 at 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 at 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 at intel.com>
++
++	[BZ #19759]
++	* sysdeps/x86/bits/string.h (_HAVE_STRING_ARCH_mempcpy): New.
++
++2016-03-10  H.J. Lu  <hongjiu.lu at 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 at aurel32.net>
++
++	[BZ #19792]
++	* sysdeps/unix/sysv/linux/mips/makecontext.S (__makecontext):
++	Terminate FDE before return label.
++
++2016-03-08  Aurelien Jarno  <aurelien at aurel32.net>
++
++	* include/sys/auxv.h: New file.
++
++2016-03-07  Hongjiu Zhang  <noctuorare at gmail.com>
++
++	* elf/sln.c (makesymlink): Change struct stat to stat64, and lstat
++	to lstat64.
++
++2016-02-24  Marko Myllynen  <myllynen at redhat.com>
++
++	* NEWS (2.23): Fix typo in bug 19048 text.
++
++2016-02-24  Andreas Schwab  <schwab at suse.de>
++
++	* math/test-math-isinff.cc (do_test): Only call isinfl and isnanl
++	if !NO_LONG_DOUBLE.
++
 +2016-02-22  Roland McGrath  <roland at 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.
+ 

++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
++
++

+ 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
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/glibc.git/commitdiff/070ad5b34164ca3ab1754087f9a2aa2b1d08b602



More information about the pld-cvs-commit mailing list