All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@elte.hu>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Nick Piggin <npiggin@kernel.dk>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Subject: [PATCH 16/18] x86: report xchg/cmpxchg/xadd usage errors consistently
Date: Wed, 24 Aug 2011 10:53:10 -0700	[thread overview]
Message-ID: <1dabde8c20c8014327abb8d2e6b1b2fdb1c2d19c.1314207974.git.jeremy.fitzhardinge@citrix.com> (raw)
In-Reply-To: <cover.1314207974.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1314207974.git.jeremy.fitzhardinge@citrix.com>

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Make sure that passing a variable of an unusable size causes a consistent
link-time failure.  Previously, using a 64-bit value on a 32-bit system
would cause an assember error, which isn't easy to correlate with a line
of code.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/cmpxchg.h |   44 +++++++++++++++++++++++++++++----------
 1 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/arch/x86/include/asm/cmpxchg.h b/arch/x86/include/asm/cmpxchg.h
index 57d6706..c99ce79 100644
--- a/arch/x86/include/asm/cmpxchg.h
+++ b/arch/x86/include/asm/cmpxchg.h
@@ -3,8 +3,26 @@
 
 #include <asm/alternative.h> /* Provides LOCK_PREFIX */
 
+/* Non-existant functions to indicate usage errors at link time. */
 extern void __xchg_wrong_size(void);
 extern void __cmpxchg_wrong_size(void);
+extern void __xadd_wrong_size(void);
+
+/*
+ * Constants for operation sizes. On 32-bit, the 64-bit size it set to
+ * -1 because sizeof will never return -1, thereby making those switch
+ * case statements guaranteeed dead code which the compiler will
+ * eliminate, and allowing the "missing symbol in the default case" to
+ * indicate a usage error.
+ */
+#define __X86_CASE_B	1
+#define __X86_CASE_W	2
+#define __X86_CASE_L	4
+#ifdef CONFIG_64BIT
+#define __X86_CASE_Q	8
+#else
+#define	__X86_CASE_Q	-1		/* sizeof will never return -1 */
+#endif
 
 /*
  * Note: no "lock" prefix even on SMP: xchg always implies lock anyway.
@@ -16,7 +34,7 @@ extern void __cmpxchg_wrong_size(void);
 ({									\
 	__typeof(*(ptr)) __x = (x);					\
 	switch (size) {							\
-	case 1:								\
+	case __X86_CASE_B:						\
 	{								\
 		volatile u8 *__ptr = (volatile u8 *)(ptr);		\
 		asm volatile("xchgb %0,%1"				\
@@ -25,7 +43,7 @@ extern void __cmpxchg_wrong_size(void);
 			     : "memory");				\
 		break;							\
 	}								\
-	case 2:								\
+	case __X86_CASE_W:						\
 	{								\
 		volatile u16 *__ptr = (volatile u16 *)(ptr);		\
 		asm volatile("xchgw %0,%1"				\
@@ -34,7 +52,7 @@ extern void __cmpxchg_wrong_size(void);
 			     : "memory");				\
 		break;							\
 	}								\
-	case 4:								\
+	case __X86_CASE_L:						\
 	{								\
 		volatile u32 *__ptr = (volatile u32 *)(ptr);		\
 		asm volatile("xchgl %0,%1"				\
@@ -43,7 +61,7 @@ extern void __cmpxchg_wrong_size(void);
 			     : "memory");				\
 		break;							\
 	}								\
-	case 8:								\
+	case __X86_CASE_Q:						\
 	{								\
 		volatile u64 *__ptr = (volatile u64 *)(ptr);		\
 		asm volatile("xchgq %0,%1"				\
@@ -72,7 +90,7 @@ extern void __cmpxchg_wrong_size(void);
 	__typeof__(*(ptr)) __old = (old);				\
 	__typeof__(*(ptr)) __new = (new);				\
 	switch (size) {							\
-	case 1:								\
+	case __X86_CASE_B:						\
 	{								\
 		volatile u8 *__ptr = (volatile u8 *)(ptr);		\
 		asm volatile(lock "cmpxchgb %2,%1; " compare		\
@@ -81,7 +99,7 @@ extern void __cmpxchg_wrong_size(void);
 			     : "memory");				\
 		break;							\
 	}								\
-	case 2:								\
+	case __X86_CASE_W:						\
 	{								\
 		volatile u16 *__ptr = (volatile u16 *)(ptr);		\
 		asm volatile(lock "cmpxchgw %2,%1; " compare		\
@@ -90,7 +108,7 @@ extern void __cmpxchg_wrong_size(void);
 			     : "memory");				\
 		break;							\
 	}								\
-	case 4:								\
+	case __X86_CASE_L:						\
 	{								\
 		volatile u32 *__ptr = (volatile u32 *)(ptr);		\
 		asm volatile(lock "cmpxchgl %2,%1; " compare		\
@@ -99,7 +117,7 @@ extern void __cmpxchg_wrong_size(void);
 			     : "memory");				\
 		break;							\
 	}								\
-	case 8:								\
+	case __X86_CASE_Q:						\
 	{								\
 		volatile u64 *__ptr = (volatile u64 *)(ptr);		\
 		asm volatile(lock "cmpxchgq %2,%1; " compare		\
@@ -178,26 +196,28 @@ extern void __cmpxchg_wrong_size(void);
 #define xadd(ptr, inc)							\
 	do {								\
 		switch (sizeof(*(ptr))) {				\
-		case 1:							\
+		case __X86_CASE_B:					\
 			asm volatile (LOCK_PREFIX "xaddb %b0, %1\n"	\
 				      : "+r" (inc), "+m" (*(ptr))	\
 				      : : "memory", "cc");		\
 			break;						\
-		case 2:							\
+		case __X86_CASE_W:					\
 			asm volatile (LOCK_PREFIX "xaddw %w0, %1\n"	\
 				      : "+r" (inc), "+m" (*(ptr))	\
 				      : : "memory", "cc");		\
 			break;						\
-		case 4:							\
+		case __X86_CASE_L:					\
 			asm volatile (LOCK_PREFIX "xaddl %0, %1\n"	\
 				      : "+r" (inc), "+m" (*(ptr))	\
 				      : : "memory", "cc");		\
 			break;						\
-		case 8:							\
+		case __X86_CASE_Q:					\
 			asm volatile (LOCK_PREFIX "xaddq %q0, %1\n"	\
 				      : "+r" (inc), "+m" (*(ptr))	\
 				      : : "memory", "cc");		\
 			break;						\
+		default:						\
+			__xadd_wrong_size();				\
 		}							\
 	} while(0)
 
-- 
1.7.6


  parent reply	other threads:[~2011-08-24 17:54 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-24 17:52 [PATCH 00/18] x86: Ticket lock + cmpxchg cleanup Jeremy Fitzhardinge
2011-08-24 17:52 ` [PATCH 01/18] x86/ticketlock: clean up types and accessors Jeremy Fitzhardinge
2011-08-24 17:52 ` [PATCH 02/18] x86/ticketlock: convert spin loop to C Jeremy Fitzhardinge
2011-08-24 20:02   ` Andi Kleen
2011-08-24 17:52 ` [PATCH 03/18] x86/ticketlock: Use C for __ticket_spin_unlock Jeremy Fitzhardinge
2011-08-24 18:01   ` Linus Torvalds
2011-08-24 17:52 ` [PATCH 04/18] x86/ticketlock: make large and small ticket versions of spin_lock the same Jeremy Fitzhardinge
2011-08-24 17:52 ` [PATCH 05/18] x86/ticketlock: make __ticket_spin_lock common Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 06/18] x86/ticketlock: make __ticket_spin_trylock common Jeremy Fitzhardinge
2011-08-24 20:00   ` Andi Kleen
2011-08-24 21:38     ` Linus Torvalds
2011-08-24 21:43       ` Jeremy Fitzhardinge
2011-08-24 21:43       ` Andi Kleen
2011-08-24 21:48         ` Jeremy Fitzhardinge
2011-08-24 21:53           ` Andi Kleen
2011-08-24 17:53 ` [PATCH 07/18] x86: add xadd helper macro Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 08/18] x86/ticketlock: use xadd helper Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 09/18] x86/cmpxchg: linux/alternative.h has LOCK_PREFIX Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 10/18] x86/cmpxchg: move 32-bit __cmpxchg_wrong_size to match 64 bit Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 11/18] x86/cmpxchg: move 64-bit set64_bit() to match 32-bit Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 12/18] x86/cmpxchg: unify cmpxchg into cmpxchg.h Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 13/18] x86: add cmpxchg_flag() variant Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 14/18] x86/ticketlocks: use cmpxchg_flag for trylock Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 15/18] x86: use cmpxchg_flag() where applicable Jeremy Fitzhardinge
2011-08-24 17:53 ` Jeremy Fitzhardinge [this message]
2011-08-24 17:53 ` [PATCH 17/18] x86: add local and sync variants of xadd Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 18/18] x86: use xadd helper more widely Jeremy Fitzhardinge
2011-08-24 18:03 ` [PATCH 00/18] x86: Ticket lock + cmpxchg cleanup Peter Zijlstra
2011-08-24 18:24   ` Linus Torvalds
2011-08-24 20:10     ` Jeremy Fitzhardinge
2011-08-24 22:53       ` Linus Torvalds
2011-08-24 22:59         ` Jeremy Fitzhardinge
2011-08-24 23:05           ` H. Peter Anvin
2011-08-24 23:09             ` Linus Torvalds
2011-08-24 23:21               ` Linus Torvalds
2011-08-24 23:30                 ` Jeremy Fitzhardinge
2011-08-24 23:10             ` Jeremy Fitzhardinge
2011-08-24 21:36 ` [PATCH 01/12] x86/cmpxchg: linux/alternative.h has LOCK_PREFIX Jeremy Fitzhardinge
2011-08-24 21:36   ` [PATCH 02/12] x86/cmpxchg: move 32-bit __cmpxchg_wrong_size to match 64 bit Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 03/12] x86/cmpxchg: move 64-bit set64_bit() to match 32-bit Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 04/12] x86/cmpxchg: unify cmpxchg into cmpxchg.h Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 05/12] x86: add xadd helper macro Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 06/12] x86: add cmpxchg_flag() variant Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 07/12] x86: use cmpxchg_flag() where applicable Jeremy Fitzhardinge
2011-08-24 21:56     ` Linus Torvalds
2011-08-24 22:01       ` H. Peter Anvin
2011-08-24 22:03         ` Jeremy Fitzhardinge
2011-08-24 22:05           ` H. Peter Anvin
2011-08-24 22:02       ` Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 08/12] x86: use xadd helper more widely Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 09/12] x86/ticketlock: clean up types and accessors Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 10/12] x86/ticketlock: convert spin loop to C Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 11/12] x86/ticketlock: convert __ticket_spin_lock to use xadd() Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 12/12] x86/ticketlock: make __ticket_spin_trylock common Jeremy Fitzhardinge
2011-08-24 21:46 ` [PATCH 00/18] x86: Ticket lock + cmpxchg cleanup Jeremy Fitzhardinge

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1dabde8c20c8014327abb8d2e6b1b2fdb1c2d19c.1314207974.git.jeremy.fitzhardinge@citrix.com \
    --to=jeremy@goop.org \
    --cc=hpa@zytor.com \
    --cc=jeremy.fitzhardinge@citrix.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=npiggin@kernel.dk \
    --cc=peterz@infradead.org \
    --cc=torvalds@linux-foundation.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.