about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--nptl/ChangeLog5
-rw-r--r--nptl/allocatestack.c2
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h118
3 files changed, 69 insertions, 56 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index b341ecb759..a6c5a2f35b 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,8 @@
+2002-12-04  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/unix/sysv/linux/i386/lowlevellock.h: Mark asms as
+	volatile and add memory clobbers to lock operations.
+
 2002-12-03  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/i386/i686/bits/atomic.h: Use i486 version.
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
index 9f12f2b940..00ce920f8a 100644
--- a/nptl/allocatestack.c
+++ b/nptl/allocatestack.c
@@ -105,7 +105,7 @@ get_cached_stack (size_t *sizep, void **memp)
     {
       struct pthread *curr;
 
-      curr = list_entry(entry, struct pthread, header.data.list);
+      curr = list_entry (entry, struct pthread, header.data.list);
       if (FREE_P (curr) && curr->stackblock_size >= size)
 	{
 	  if (curr->stackblock_size == size)
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h
index 71babd5c93..a3c02498f4 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h
@@ -56,54 +56,59 @@ extern int __lll_mutex_unlock_wait (int *__futex)
   ({ unsigned char ret;							      \
      __asm __volatile (LOCK_INSTR "cmpxchgl %2, %1; setne %0"		      \
 		       : "=a" (ret), "=m" (futex)			      \
-		       : "r" (1), "1" (futex), "0" (0));		      \
+		       : "r" (1), "1" (futex), "0" (0)			      \
+		       : "memory");					      \
      ret; })
 
 
 #define lll_mutex_lock(futex) \
   (void) ({ int ignore1, ignore2;					      \
-	    __asm (LOCK_INSTR "xaddl %0, %2\n\t"			      \
-		   "testl %0, %0\n\t"					      \
-		   "jne 1f\n\t"						      \
-		   ".subsection 1\n"					      \
-		   "1:\tleal %2, %%ecx\n\t"				      \
-		   "call __lll_mutex_lock_wait\n\t"			      \
-		   "jmp 2f\n\t"						      \
-		   ".previous\n"					      \
-		   "2:"							      \
-		   : "=a" (ignore1), "=&c" (ignore2), "=m" (futex)	      \
-		   : "0" (1), "2" (futex)); })
+	    __asm __volatile (LOCK_INSTR "xaddl %0, %2\n\t"		      \
+			      "testl %0, %0\n\t"			      \
+			      "jne 1f\n\t"				      \
+			      ".subsection 1\n"				      \
+			      "1:\tleal %2, %%ecx\n\t"			      \
+			      "call __lll_mutex_lock_wait\n\t"		      \
+			      "jmp 2f\n\t"				      \
+			      ".previous\n"				      \
+			      "2:"					      \
+			      : "=a" (ignore1), "=&c" (ignore2), "=m" (futex) \
+			      : "0" (1), "2" (futex)			      \
+			      : "memory"); })
 
 
 #define lll_mutex_timedlock(futex, timeout) \
   ({ int result, ignore1, ignore2;					      \
-     __asm (LOCK_INSTR "xaddl %0, %3\n\t"				      \
-	    "testl %0, %0\n\t"						      \
-	    "jne 1f\n\t"						      \
-	    ".subsection 1\n"						      \
-	    "1:\tleal %3, %%ecx\n\t"					      \
-	    "movl %6, %%edx\n\t"					      \
-	    "call __lll_mutex_timedlock_wait\n\t"			      \
-	    "jmp 2f\n\t"						      \
-	    ".previous\n"						      \
-	    "2:"							      \
-	    : "=a" (result), "=&c" (ignore1), "=&d" (ignore2), "=m" (futex)   \
-	    : "0" (1), "3" (futex), "m" (timeout));			      \
+     __asm __volatile (LOCK_INSTR "xaddl %0, %3\n\t"			      \
+		       "testl %0, %0\n\t"				      \
+		       "jne 1f\n\t"					      \
+		       ".subsection 1\n"				      \
+		       "1:\tleal %3, %%ecx\n\t"				      \
+		       "movl %6, %%edx\n\t"				      \
+		       "call __lll_mutex_timedlock_wait\n\t"		      \
+		       "jmp 2f\n\t"					      \
+		       ".previous\n"					      \
+		       "2:"						      \
+		       : "=a" (result), "=&c" (ignore1), "=&d" (ignore2),     \
+			 "=m" (futex)					      \
+		       : "0" (1), "3" (futex), "m" (timeout)		      \
+		       : "memory");					      \
      result; })
 
 
 #define lll_mutex_unlock(futex) \
   (void) ({ int ignore;							      \
-            __asm (LOCK_INSTR "decl %0\n\t"				      \
-		   "jne 1f\n\t"						      \
-		   ".subsection 1\n"					      \
-		   "1:\tleal %0, %%eax\n\t"				      \
-		   "call __lll_mutex_unlock_wake\n\t"			      \
-		   "jmp 2f\n\t"						      \
-		   ".previous\n"					      \
-		   "2:"							      \
-		   : "=m" (futex), "=&a" (ignore)			      \
-		   : "0" (futex)); })
+            __asm __volatile (LOCK_INSTR "decl %0\n\t"			      \
+			      "jne 1f\n\t"				      \
+			      ".subsection 1\n"				      \
+			      "1:\tleal %0, %%eax\n\t"			      \
+			      "call __lll_mutex_unlock_wake\n\t"	      \
+			      "jmp 2f\n\t"				      \
+			      ".previous\n"				      \
+			      "2:"					      \
+			      : "=m" (futex), "=&a" (ignore)		      \
+			      : "0" (futex)				      \
+			      : "memory"); })
 
 
 #define lll_mutex_islocked(futex) \
@@ -138,36 +143,39 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
   ({ unsigned char ret;							      \
      __asm __volatile (LOCK_INSTR "cmpxchgl %2, %1; setne %0"		      \
 		       : "=a" (ret), "=m" (futex)			      \
-		       : "r" (0), "1" (futex), "0" (1));		      \
+		       : "r" (0), "1" (futex), "0" (1)			      \
+		       : "memory");					      \
      ret; })
 
 
 #define lll_lock(futex) \
   (void) ({ int ignore1, ignore2;					      \
-	    __asm (LOCK_INSTR "xaddl %0, %2\n\t"			      \
-		   "jne 1f\n\t"						      \
-		   ".subsection 1\n"					      \
-		   "1:\tleal %2, %%ecx\n\t"				      \
-		   "call __lll_lock_wait\n\t"				      \
-		   "jmp 2f\n\t"						      \
-		   ".previous\n"					      \
-		   "2:"							      \
-		   : "=a" (ignore1), "=&c" (ignore2), "=m" (futex)	      \
-		   : "0" (-1), "2" (futex)); })
+	    __asm __volatile (LOCK_INSTR "xaddl %0, %2\n\t"		      \
+			      "jne 1f\n\t"				      \
+			      ".subsection 1\n"				      \
+			      "1:\tleal %2, %%ecx\n\t"			      \
+			      "call __lll_lock_wait\n\t"		      \
+			      "jmp 2f\n\t"				      \
+			      ".previous\n"				      \
+			      "2:"					      \
+			      : "=a" (ignore1), "=&c" (ignore2), "=m" (futex) \
+			      : "0" (-1), "2" (futex)			      \
+			      : "memory"); })
 
 
 #define lll_unlock(futex) \
   (void) ({ int ignore;							      \
-            __asm (LOCK_INSTR "incl %0\n\t"				      \
-		   "jng 1f\n\t"						      \
-		   ".subsection 1\n"					      \
-		   "1:\tleal %0, %%eax\n\t"				      \
-		   "call __lll_unlock_wake\n\t"				      \
-		   "jmp 2f\n\t"						      \
-		   ".previous\n"					      \
-		   "2:"							      \
-		   : "=m" (futex), "=&a" (ignore)			      \
-		   : "0" (futex)); })
+            __asm __volatile (LOCK_INSTR "incl %0\n\t"			      \
+			      "jng 1f\n\t"				      \
+			      ".subsection 1\n"				      \
+			      "1:\tleal %0, %%eax\n\t"			      \
+			      "call __lll_unlock_wake\n\t"		      \
+			      "jmp 2f\n\t"				      \
+			      ".previous\n"				      \
+			      "2:"					      \
+			      : "=m" (futex), "=&a" (ignore)		      \
+			      : "0" (futex)				      \
+			      : "memory"); })
 
 
 #define lll_islocked(futex) \