Package: libc6
Version: 2.7-6
Tags: patch
Hi,
the R10000 needs an LL/SC Workaround. If not applied all R10k before
rev 3.0 misbehave on atomic ops and rev 2.6 and lower (e.g. SGI IP28)
die after very few seconds with a deadlock due to even more erratas.
To quote the CPU Erratas workaround:
Workaround: The basic idea is to inhibit the four instructions
from simultaneously becoming active in R10000. Padding all
ll/sc sequences with nops or changing the looping branch in the
routines to a branch likely (which is always predicted taken
by R10000) will work. The nops should go after the loop, and the
number of them should be 28. This number could be decremented for
each additional instruction in the ll/sc loop such as the lock
modifier(s) between the ll and sc, the looping branch and its
delay slot. For typical short routines with one ll/sc loop, any
instructions after the loop could also count as a decrement. The
nop workaround pollutes the cache more but would be a few cycles
faster if all the code is in the cache and the looping branch
is predicted not taken.
The kernels way in e.g. arch/mips/kernel/scall32-o32.S
204 #ifdef CONFIG_CPU_HAS_LLSC
205 /* Ok, this is the ll/sc case. World is sane :-) */
206 1: ll v0, (a1)
207 move a0, a2
208 2: sc a0, (a1)
209 #if R10000_LLSC_WAR
210 beqzl a0, 1b
211 #else
212 beqz a0, 1b
213 #endif
This is the patch i successfully build a working libc6 for my SGI IP28 with:
diff -Nur glibc-2.7.orig/ports/sysdeps/mips/bits/atomic.h glibc-2.7/ports/sysdeps/mips/bits/atomic.h
--- ports/sysdeps/mips/bits/atomic.h.orig 2005-03-28 09:14:59.000000000 +0000
+++ ports/sysdeps/mips/bits/atomic.h 2008-01-18 11:17:14.000000000 +0000
@@ -74,7 +74,7 @@
"bne %0,%2,2f\n\t" \
"move %1,%3\n\t" \
"sc %1,%4\n\t" \
- "beqz %1,1b\n" \
+ "beqzl %1,1b\n" \
acq "\n\t" \
".set pop\n" \
"2:\n\t" \
@@ -98,7 +98,7 @@
"bne %0,%2,2f\n\t" \
"move %1,%3\n\t" \
"scd %1,%4\n\t" \
- "beqz %1,1b\n" \
+ "beqzl %1,1b\n" \
acq "\n\t" \
".set pop\n" \
"2:\n\t" \
@@ -192,7 +192,7 @@
"ll %0,%3\n\t" \
"move %1,%2\n\t" \
"sc %1,%3\n\t" \
- "beqz %1,1b\n" \
+ "beqzl %1,1b\n" \
acq "\n\t" \
".set pop\n" \
"2:\n\t" \
@@ -216,7 +216,7 @@
"lld %0,%3\n\t" \
"move %1,%2\n\t" \
"scd %1,%3\n\t" \
- "beqz %1,1b\n" \
+ "beqzl %1,1b\n" \
acq "\n\t" \
".set pop\n" \
"2:\n\t" \
@@ -251,7 +251,7 @@
"ll %0,%3\n\t" \
"addu %1,%0,%2\n\t" \
"sc %1,%3\n\t" \
- "beqz %1,1b\n" \
+ "beqzl %1,1b\n" \
acq "\n\t" \
".set pop\n" \
"2:\n\t" \
@@ -275,7 +275,7 @@
"lld %0,%3\n\t" \
"daddu %1,%0,%2\n\t" \
"scd %1,%3\n\t" \
- "beqz %1,1b\n" \
+ "beqzl %1,1b\n" \
acq "\n\t" \
".set pop\n" \
"2:\n\t" \
Flo
--
Florian Lohoff flo@rfc822.org +49-171-2280134
Those who would give up a little freedom to get a little
security shall soon have neither - Benjamin Franklin
Attachment:
signature.asc
Description: Digital signature