]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] Re: rwsem update
authorDavid Howells <dhowells@redhat.com>
Thu, 23 May 2002 03:33:37 +0000 (20:33 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Thu, 23 May 2002 03:33:37 +0000 (20:33 -0700)
The attached patch fixes the compilation problems Andrew Morton has been
seeing with the rw-semaphores in the kernel when using gcc 2.95.3 with
-O1.

include/asm-i386/rwsem.h

index 9caff19cfd2e260ae721fd412f6dd1ae3eec9060..5d994a46f9d7c2c2e8023e7350240fc0c02a71e2 100644 (file)
@@ -111,8 +111,8 @@ LOCK_PREFIX "  incl      (%%eax)\n\t" /* adds 0x00000001, returns the old value
                "  jmp       1b\n"
                LOCK_SECTION_END
                "# ending down_read\n\t"
-               : "+m"(sem->count)
-               : "a"(sem)
+               : "=m"(sem->count)
+               : "a"(sem), "m"(sem->count)
                : "memory", "cc");
 }
 
@@ -126,8 +126,8 @@ static inline void __down_write(struct rw_semaphore *sem)
        tmp = RWSEM_ACTIVE_WRITE_BIAS;
        __asm__ __volatile__(
                "# beginning down_write\n\t"
-LOCK_PREFIX    "  xadd      %0,(%%eax)\n\t" /* subtract 0x0000ffff, returns the old value */
-               "  testl     %0,%0\n\t" /* was the count 0 before? */
+LOCK_PREFIX    "  xadd      %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns the old value */
+               "  testl     %%edx,%%edx\n\t" /* was the count 0 before? */
                "  jnz       2f\n\t" /* jump if we weren't granted the lock */
                "1:\n\t"
                LOCK_SECTION_START("")
@@ -138,8 +138,8 @@ LOCK_PREFIX "  xadd      %0,(%%eax)\n\t" /* subtract 0x0000ffff, returns the old
                "  jmp       1b\n"
                LOCK_SECTION_END
                "# ending down_write"
-               : "+d"(tmp), "+m"(sem->count)
-               : "a"(sem)
+               : "=m"(sem->count), "=d"(tmp)
+               : "a"(sem), "1"(tmp), "m"(sem->count)
                : "memory", "cc");
 }
 
@@ -164,8 +164,8 @@ LOCK_PREFIX "  xadd      %%edx,(%%eax)\n\t" /* subtracts 1, returns the old valu
                "  jmp       1b\n"
                LOCK_SECTION_END
                "# ending __up_read\n"
-               : /*"+m"(sem->count),*/ "+d"(tmp)
-               : "a"(sem)
+               : "=m"(sem->count), "=d"(tmp)
+               : "a"(sem), "1"(tmp), "m"(sem->count)
                : "memory", "cc");
 }
 
@@ -190,8 +190,8 @@ LOCK_PREFIX "  xaddl     %%edx,(%%eax)\n\t" /* tries to transition 0xffff0001 ->
                "  jmp       1b\n"
                LOCK_SECTION_END
                "# ending __up_write\n"
-               : "+m"(sem->count)
-               : "a"(sem), "i"(-RWSEM_ACTIVE_WRITE_BIAS)
+               : "=m"(sem->count)
+               : "a"(sem), "i"(-RWSEM_ACTIVE_WRITE_BIAS), "m"(sem->count)
                : "memory", "cc", "edx");
 }
 
@@ -202,8 +202,8 @@ static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
 {
        __asm__ __volatile__(
 LOCK_PREFIX    "addl %1,%0"
-               :"=m"(sem->count)
-               :"ir"(delta), "m"(sem->count));
+               : "=m"(sem->count)
+               : "ir"(delta), "m"(sem->count));
 }
 
 /*