All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4] bitops: Fix shift overflow in GENMASK macros
@ 2014-11-06  9:54 Maxime COQUELIN
  2014-11-13 22:09 ` Andrew Morton
  2014-11-16  9:49 ` [tip:core/urgent] " tip-bot for Maxime COQUELIN
  0 siblings, 2 replies; 5+ messages in thread
From: Maxime COQUELIN @ 2014-11-06  9:54 UTC (permalink / raw)
  To: linux, gong.chen, Peter Zijlstra, Ingo Molnar,  Paul E. McKenney,
	tytso, linux-kernel, stable
  Cc: kernel, maxime.coquelin, eric.paire

On some 32 bits architectures, including x86, GENMASK(31, 0) returns 0
instead of the expected ~0UL.

This is the same on some 64 bits architectures with GENMASK_ULL(63, 0).

This is due to an overflow in the shift operand, 1 << 32 for GENMASK,
1 << 64 for GENMASK_ULL.

Fixes: 10ef6b0dffe404bcc54e94cb2ca1a5b18445a66b
Cc: <stable@vger.kernel.org> #v3.13+
Reported-by: Eric Paire <eric.paire@st.com>
Suggested-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Signed-off-by: Maxime Coquelin <maxime.coquelin@st.com>
---
 include/linux/bitops.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/include/linux/bitops.h b/include/linux/bitops.h
index be5fd38..5d858e0 100644
--- a/include/linux/bitops.h
+++ b/include/linux/bitops.h
@@ -18,8 +18,11 @@
  * position @h. For example
  * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
  */
-#define GENMASK(h, l)		(((U32_C(1) << ((h) - (l) + 1)) - 1) << (l))
-#define GENMASK_ULL(h, l)	(((U64_C(1) << ((h) - (l) + 1)) - 1) << (l))
+#define GENMASK(h, l) \
+	(((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
+
+#define GENMASK_ULL(h, l) \
+	(((~0ULL) << (l)) & (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h))))
 
 extern unsigned int __sw_hweight8(unsigned int w);
 extern unsigned int __sw_hweight16(unsigned int w);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-11-16  9:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-06  9:54 [PATCH v4] bitops: Fix shift overflow in GENMASK macros Maxime COQUELIN
2014-11-13 22:09 ` Andrew Morton
2014-11-14 14:07   ` Maxime Coquelin
2014-11-14 20:03     ` Max Filippov
2014-11-16  9:49 ` [tip:core/urgent] " tip-bot for Maxime COQUELIN

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.