This is the mail archive of the libc-alpha@sourceware.cygnus.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: [Various] libc/1161: Unable to get nscd to work on alpha


>>>>> Geoff Keating writes:

>> Mailing-List: contact libc-alpha-help@sourceware.cygnus.com; run by ezmlm
>> cc: Andreas Jaeger <aj@arthur.rhein-neckar.de>,
>> libc-alpha Mailinglist <libc-alpha@sourceware.cygnus.com>,
>> sba@srl.caltech.edu
>> Date: Sat, 12 Jun 1999 21:01:35 -0400
>> From: Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
>> 
>> Thorsten Kukuk <kukuk@suse.de> said:
>> > On Sat, Jun 12, Andreas Jaeger wrote:
>> > > Is there anything we can do to fix nscd on alpha?  I fear this is a
>> > > compiler bug:-(.  Richard, can you help?
>> 
>> > It's an older bug which I have already send twice to the egcs people
>> > without getting an reaction.
>> > 
>> > egcs miscompiles the following lines from nscd/cache.c:
>> > 
>> >   /* Put the new entry in the first position.  */
>> >   do
>> >     newp->next = table->array[hash];
>> >   while (! compare_and_swap ((volatile long int *) &table->array[hash],
>> 
>> Have you tried adding -fno-strict-aliases? Without it late egcs snapshots
>> at least assume data can't be accessed through a pointer to a different
>> type, unless it is a char pointer (this is what the standard says, and egcs
>> follows). Bit me hard.

Geoff> I notice that the ppc version of this has a bug; the assembler isn't
Geoff> clobbering "memory".  It's always necessary for compare_and_swap to
Geoff> have a clobber of "memory" somewhere, otherwise egcs may delay a store
Geoff> until after the compare-and-swap.  I attach a patch.

Geoff> The alpha version of this is different, in that it uses a "m"
Geoff> constraint instead of taking the address like the ppc one does.
Geoff> However, it _still_ needs a 'memory' clobber, because otherwise code
Geoff> like:

Geoff> {
Geoff>   static long lock;
Geoff>   static uint32_t lfsr;

Geoff>   /* Acquire a lock, spinning until we get it.  */
Geoff>   while (!compare_and_swap (&lock, 0, 1)) ;

Geoff>   /* Change some memory location, protected by the lock.  */
Geoff>   lfsr = lfsr >> 1 ^ ((lfsr & 1) ? 0x80003000 : 0);

Geoff>   /* Release the lock.  */
Geoff>   compare_and_swap(&lock, 1, 0);
Geoff> }

Geoff> may be rescheduled by gcc so that the assignment happens before the
Geoff> acquisition of the lock, or after the release, or even some
Geoff> combination of the two.

Geoff> Then you don't need to use -fno-strict-aliases.

Does this patch look ok ? It's just for compare_and_swap, the others
have to be fixed the same way if this is the right way to do it.

Could others please check this?

I'm not suggesting to add it to glibc, yet - I'd like to discuss this
first.

Andreas

1999-06-16  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* sysdeps/alpha/atomicity.h (compare_and_swap): Remove `volatile'
 	and add `memory' clobber.

--- sysdeps/alpha/atomicity.h.~1~	Fri Jan 29 17:57:43 1999
+++ sysdeps/alpha/atomicity.h	Wed Jun 16 08:31:47 1999
@@ -77,7 +77,7 @@
 {
   long int ret;
 
-  __asm__ __volatile__ (
+  __asm__ (
 	"/* Inline compare & swap */\n"
 	"1:\t"
 	"ldq_l	%0,%4\n\t"
@@ -94,7 +94,8 @@
 	"mb\n\t"
 	"/* End compare & swap */"
 	: "=&r"(ret), "=m"(*p)
-	: "r"(oldval), "r"(newval), "m"(*p));
+	: "r"(oldval), "r"(newval), "m"(*p)
+	: "memory");
 
   return ret;
 }

-- 
 Andreas Jaeger   aj@arthur.rhein-neckar.de    jaeger@informatik.uni-kl.de
  for pgp-key finger ajaeger@aixd1.rhrk.uni-kl.de

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]