aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/mips
diff options
context:
space:
mode:
authorSteve Ellcey <sellcey@imgtec.com>2016-01-28 01:52:05 +0000
committerJoseph Myers <joseph@codesourcery.com>2016-01-28 01:52:05 +0000
commit8a71d2e27fd067a85059aefb93c9ce83142b03e9 (patch)
tree6bc2c457a8db4952039386fc489b3e5827424412 /sysdeps/mips
parent4fb66fac3a7bfe152651610a498c988a75fc316d (diff)
downloadglibc-8a71d2e27fd067a85059aefb93c9ce83142b03e9.tar
glibc-8a71d2e27fd067a85059aefb93c9ce83142b03e9.tar.gz
glibc-8a71d2e27fd067a85059aefb93c9ce83142b03e9.tar.bz2
glibc-8a71d2e27fd067a85059aefb93c9ce83142b03e9.zip
Fix MIPS64 memcpy regression.
The MIPS memcpy optimizations at <https://sourceware.org/ml/libc-alpha/2015-10/msg00597.html> introduced a bug causing many string function tests to fail with segfaults for n32 and n64: FAIL: string/stratcliff FAIL: string/test-bcopy FAIL: string/test-memccpy FAIL: string/test-memcmp FAIL: string/test-memcpy FAIL: string/test-memmove FAIL: string/test-mempcpy FAIL: string/test-stpncpy FAIL: string/test-strncmp FAIL: string/test-strncpy (Some failures in other directories could also be caused by this bug.) The problem is that after the check for whether a word of input is left that can be copied as a word before moving to byte copies, a load can occur in the branch delay slot, resulting in a segfault if we are at the end of a page and the following page is unmapped. I don't see how this would have passed the tests as reported in the original patch posting (different kernel configurations affecting the code setting up unmapped pages, maybe?), since the tests in question don't appear to have changed recently. This patch moves a later instruction into the delay slot, as suggested at <https://sourceware.org/ml/libc-alpha/2016-01/msg00584.html>. Tested for n32 and n64. 2016-01-28 Steve Ellcey <sellcey@imgtec.com> Joseph Myers <joseph@codesourcery.com> * sysdeps/mips/memcpy.S (MEMCPY_NAME) [USE_DOUBLE]: Avoid word load in branch delay slot when less than a word of input left.
Diffstat (limited to 'sysdeps/mips')
-rw-r--r--sysdeps/mips/memcpy.S2
1 files changed, 1 insertions, 1 deletions
diff --git a/sysdeps/mips/memcpy.S b/sysdeps/mips/memcpy.S
index d79e144731..9b072d7420 100644
--- a/sysdeps/mips/memcpy.S
+++ b/sysdeps/mips/memcpy.S
@@ -565,11 +565,11 @@ L(lastw):
#ifdef USE_DOUBLE
andi t8,a2,3 /* a2 is the remainder past 4 byte chunks. */
beq t8,a2,L(lastb)
+ move a2,t8
lw REG3,0(a1)
sw REG3,0(a0)
PTR_ADDIU a0,a0,4
PTR_ADDIU a1,a1,4
- move a2,t8
#endif
/* Copy the last 8 (or 16) bytes */