[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#462112: libc6 mips needs LL SC WAR for R10k < rev 3.0



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


Reply to: