[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