svn commit: r316031 - head/sys/i386/include

Mark Johnston markj at FreeBSD.org
Mon Mar 27 16:18:21 UTC 2017


Author: markj
Date: Mon Mar 27 16:18:19 2017
New Revision: 316031
URL: https://svnweb.freebsd.org/changeset/base/316031

Log:
  Adjust the constraint for "src" in atomic_(f)cmpset_8.
  
  "r" is not sufficient to prevent the use of invalid byte-width registers
  with at least gcc.
  
  Reported and reviewed by:	bde
  X-MFC-With:	r315718

Modified:
  head/sys/i386/include/atomic.h

Modified: head/sys/i386/include/atomic.h
==============================================================================
--- head/sys/i386/include/atomic.h	Mon Mar 27 16:01:44 2017	(r316030)
+++ head/sys/i386/include/atomic.h	Mon Mar 27 16:18:19 2017	(r316031)
@@ -182,7 +182,7 @@ struct __hack
  *
  * Returns 0 on failure, non-zero on success.
  */
-#define	ATOMIC_CMPSET(TYPE)				\
+#define	ATOMIC_CMPSET(TYPE, CONS)			\
 static __inline int					\
 atomic_cmpset_##TYPE(volatile u_##TYPE *dst, u_##TYPE expect, u_##TYPE src) \
 {							\
@@ -196,7 +196,7 @@ atomic_cmpset_##TYPE(volatile u_##TYPE *
 	: "=q" (res),			/* 0 */		\
 	  "+m" (*dst),			/* 1 */		\
 	  "+a" (expect)			/* 2 */		\
-	: "r" (src)			/* 3 */		\
+	: CONS (src)			/* 3 */		\
 	: "memory", "cc");				\
 	return (res);					\
 }							\
@@ -214,14 +214,14 @@ atomic_fcmpset_##TYPE(volatile u_##TYPE 
 	: "=q" (res),			/* 0 */		\
 	  "+m" (*dst),			/* 1 */		\
 	  "+a" (*expect)		/* 2 */		\
-	: "r" (src)			/* 3 */		\
+	: CONS (src)			/* 3 */		\
 	: "memory", "cc");				\
 	return (res);					\
 }
 
-ATOMIC_CMPSET(char);
-ATOMIC_CMPSET(short);
-ATOMIC_CMPSET(int);
+ATOMIC_CMPSET(char, "q");
+ATOMIC_CMPSET(short, "r");
+ATOMIC_CMPSET(int, "r");
 
 /*
  * Atomically add the value of v to the integer pointed to by p and return


More information about the svn-src-head mailing list