From owner-svn-src-all@FreeBSD.ORG  Sat Feb 20 16:13:44 2010
Return-Path: <owner-svn-src-all@FreeBSD.ORG>
Delivered-To: svn-src-all@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 44F791065676;
	Sat, 20 Feb 2010 16:13:44 +0000 (UTC)
	(envelope-from nwhitehorn@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 330108FC17;
	Sat, 20 Feb 2010 16:13:44 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o1KGDipB053067;
	Sat, 20 Feb 2010 16:13:44 GMT
	(envelope-from nwhitehorn@svn.freebsd.org)
Received: (from nwhitehorn@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o1KGDiiK053065;
	Sat, 20 Feb 2010 16:13:44 GMT
	(envelope-from nwhitehorn@svn.freebsd.org)
Message-Id: <201002201613.o1KGDiiK053065@svn.freebsd.org>
From: Nathan Whitehorn <nwhitehorn@FreeBSD.org>
Date: Sat, 20 Feb 2010 16:13:44 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-all@freebsd.org,
	svn-src-head@freebsd.org
X-SVN-Group: head
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r204126 - head/sys/powerpc/booke
X-BeenThere: svn-src-all@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the entire src tree \(except for &quot;
	user&quot; and &quot; projects&quot; \)" <svn-src-all.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-all>,
	<mailto:svn-src-all-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-all>
List-Post: <mailto:svn-src-all@freebsd.org>
List-Help: <mailto:svn-src-all-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-all>,
	<mailto:svn-src-all-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 20 Feb 2010 16:13:44 -0000

Author: nwhitehorn
Date: Sat Feb 20 16:13:43 2010
New Revision: 204126
URL: http://svn.freebsd.org/changeset/base/204126

Log:
  Merge r198724 to Book-E. casuword() non-atomically read the current value
  of its argument before atomically replacing it, which could occasionally
  return the wrong value on an SMP system. This resulted in user mutex
  operations hanging when using threaded applications.

Modified:
  head/sys/powerpc/booke/copyinout.c

Modified: head/sys/powerpc/booke/copyinout.c
==============================================================================
--- head/sys/powerpc/booke/copyinout.c	Sat Feb 20 16:12:37 2010	(r204125)
+++ head/sys/powerpc/booke/copyinout.c	Sat Feb 20 16:13:43 2010	(r204126)
@@ -295,8 +295,19 @@ casuword(volatile u_long *addr, u_long o
 		return (EFAULT);
 	}
 
-	val = *addr;
-	(void) atomic_cmpset_32((volatile uint32_t *)addr, old, new);
+	__asm __volatile (
+		"1:\tlwarx %0, 0, %2\n\t"	/* load old value */
+		"cmplw %3, %0\n\t"		/* compare */
+		"bne 2f\n\t"			/* exit if not equal */
+		"stwcx. %4, 0, %2\n\t"      	/* attempt to store */
+		"bne- 1b\n\t"			/* spin if failed */
+		"b 3f\n\t"			/* we've succeeded */
+		"2:\n\t"
+		"stwcx. %0, 0, %2\n\t"       	/* clear reservation (74xx) */
+		"3:\n\t"
+		: "=&r" (val), "=m" (*addr)
+		: "r" (addr), "r" (old), "r" (new), "m" (*addr)
+		: "cc", "memory");
 
 	td->td_pcb->pcb_onfault = NULL;