Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Jul 2019 03:55:27 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r350023 - head/sys/powerpc/powerpc
Message-ID:  <201907160355.x6G3tRbK088746@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhibbits
Date: Tue Jul 16 03:55:27 2019
New Revision: 350023
URL: https://svnweb.freebsd.org/changeset/base/350023

Log:
  powerpc: Fix casueword(9) post-r349951
  
  '=' asm constraint marks a variable as write-only.  Because of this, gcc
  throws away the initialization of 'res', causing garbage to be returned if
  the CAS was successful.  Use '+' to mark res as read/write, so that the
  initialization stays in the generated asm.  Also, fix the reservation
  clearing stwcx store index register in casueword32, and only do the dummy
  store when needed, skip it if the real store has already succeeded.

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

Modified: head/sys/powerpc/powerpc/copyinout.c
==============================================================================
--- head/sys/powerpc/powerpc/copyinout.c	Tue Jul 16 03:32:21 2019	(r350022)
+++ head/sys/powerpc/powerpc/copyinout.c	Tue Jul 16 03:55:27 2019	(r350023)
@@ -456,13 +456,13 @@ casueword32(volatile uint32_t *addr, uint32_t old, uin
 		"cmplw %4, %0\n\t"		/* compare */
 		"bne 1f\n\t"			/* exit if not equal */
 		"stwcx. %5, 0, %3\n\t"      	/* attempt to store */
-		"bne- 1f\n\t"			/* if failed */
-		"b 2f\n\t"			/* we've succeeded */
+		"bne- 2f\n\t"			/* if failed */
+		"b 3f\n\t"			/* we've succeeded */
 		"1:\n\t"
-		"stwcx. %0, 0, %4\n\t"       	/* clear reservation (74xx) */
-		"li %2, 1\n\t"
-		"2:\n\t"
-		: "=&r" (val), "=m" (*p), "=&r" (res)
+		"stwcx. %0, 0, %3\n\t"       	/* clear reservation (74xx) */
+		"2:li %2, 1\n\t"
+		"3:\n\t"
+		: "=&r" (val), "=m" (*p), "+&r" (res)
 		: "r" (p), "r" (old), "r" (new), "m" (*p)
 		: "cr0", "memory");
 
@@ -511,13 +511,13 @@ casueword(volatile u_long *addr, u_long old, u_long *o
 		"cmpld %4, %0\n\t"		/* compare */
 		"bne 1f\n\t"			/* exit if not equal */
 		"stdcx. %5, 0, %3\n\t"      	/* attempt to store */
-		"bne- 1f\n\t"			/* if failed */
-		"b 2f\n\t"			/* we've succeeded */
+		"bne- 2f\n\t"			/* if failed */
+		"b 3f\n\t"			/* we've succeeded */
 		"1:\n\t"
 		"stdcx. %0, 0, %3\n\t"       	/* clear reservation (74xx) */
-		"li %2, 1\n\t"
-		"2:\n\t"
-		: "=&r" (val), "=m" (*p), "=&r" (res)
+		"2:li %2, 1\n\t"
+		"3:\n\t"
+		: "=&r" (val), "=m" (*p), "+&r" (res)
 		: "r" (p), "r" (old), "r" (new), "m" (*p)
 		: "cr0", "memory");
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201907160355.x6G3tRbK088746>