arm64: insn: Add BUILD_BUG_ON() for invalid masks [Linux 5.2]

arm64: insn: Add BUILD_BUG_ON() for invalid masks [Linux 5.2]

This Linux kernel change "arm64: insn: Add BUILD_BUG_ON() for invalid masks" is included in the Linux 5.2 release. This change is authored by Jean-Philippe Brucker <jean-philippe.brucker [at] arm.com> on Fri May 24 13:52:20 2019 +0100. The commit for this change in Linux stable tree is edbcf50 (patch).

arm64: insn: Add BUILD_BUG_ON() for invalid masks

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>

There are 16 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 arch/arm64/include/asm/insn.h | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/arch/arm64/include/asm/insn.h b/arch/arm64/include/asm/insn.h
index f71b84d..87fdfba 100644
--- a/arch/arm64/include/asm/insn.h
+++ b/arch/arm64/include/asm/insn.h
@@ -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)

Leave a Reply

Your email address will not be published. Required fields are marked *