arm64: insn: Add BUILD_BUG_ON() for invalid masks
authorJean-Philippe Brucker <jean-philippe.brucker@arm.com>
Fri, 24 May 2019 12:52:20 +0000 (13:52 +0100)
committerWill Deacon <will.deacon@arm.com>
Fri, 24 May 2019 13:58:30 +0000 (14:58 +0100)
Detect invalid instruction masks at build time. Some versions of GCC can
warn about the situation, but not all of them, it seems.

Suggested-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/include/asm/insn.h

index f71b84d9f2941b0d9527ad9a8a25d72adc515676..87fdfba13a305f3836d199b016b458f177dc01f6 100644 (file)
@@ -18,6 +18,7 @@
  */
 #ifndef        __ASM_INSN_H
 #define        __ASM_INSN_H
+#include <linux/build_bug.h>
 #include <linux/types.h>
 
 /* A64 instructions are always 32 bits. */
@@ -266,11 +267,16 @@ enum aarch64_insn_adr_type {
        AARCH64_INSN_ADR_TYPE_ADR,
 };
 
-#define        __AARCH64_INSN_FUNCS(abbr, mask, val)   \
-static __always_inline bool aarch64_insn_is_##abbr(u32 code) \
-{ return (code & (mask)) == (val); } \
-static __always_inline u32 aarch64_insn_get_##abbr##_value(void) \
-{ return (val); }
+#define        __AARCH64_INSN_FUNCS(abbr, mask, val)                           \
+static __always_inline bool aarch64_insn_is_##abbr(u32 code)           \
+{                                                                      \
+       BUILD_BUG_ON(~(mask) & (val));                                  \
+       return (code & (mask)) == (val);                                \
+}                                                                      \
+static __always_inline u32 aarch64_insn_get_##abbr##_value(void)       \
+{                                                                      \
+       return (val);                                                   \
+}
 
 __AARCH64_INSN_FUNCS(adr,      0x9F000000, 0x10000000)
 __AARCH64_INSN_FUNCS(adrp,     0x9F000000, 0x90000000)