MIPS: Workaround clang inline compat branch issue
authorJiaxun Yang <jiaxun.yang@flygoat.com>
Tue, 28 Feb 2023 19:34:59 +0000 (19:34 +0000)
committerThomas Bogendoerfer <tsbogend@alpha.franken.de>
Tue, 28 Feb 2023 22:09:49 +0000 (23:09 +0100)
Clang is unable to handle the situation that a chunk of inline
assembly ends with a compat branch instruction and then compiler
generates another control transfer instruction immediately after
this compat branch. The later instruction will end up in forbidden
slot and cause exception.

Workaround by add a option to control the use of compact branch.
Currently it's selected by CC_IS_CLANG and hopefully we can change
it to a version check in future if clang manages to fix it.

Fix boot on boston board.

Link: https://github.com/llvm/llvm-project/issues/61045
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
Acked-by: Nathan Chancellor <nathan@kernel.org>
Acked-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
arch/mips/Kconfig
arch/mips/include/asm/asm.h

index 875c292..e2f3ca7 100644 (file)
@@ -3200,6 +3200,10 @@ config CC_HAS_MNO_BRANCH_LIKELY
        def_bool y
        depends on $(cc-option,-mno-branch-likely)
 
+# https://github.com/llvm/llvm-project/issues/61045
+config CC_HAS_BROKEN_INLINE_COMPAT_BRANCH
+       def_bool y if CC_IS_CLANG
+
 menu "Power management options"
 
 config ARCH_HIBERNATION_POSSIBLE
index 336ac9b..2e99450 100644 (file)
@@ -336,7 +336,7 @@ symbol              =       value
  */
 #ifdef CONFIG_WAR_R10000_LLSC
 # define SC_BEQZ       beqzl
-#elif MIPS_ISA_REV >= 6
+#elif !defined(CONFIG_CC_HAS_BROKEN_INLINE_COMPAT_BRANCH) && MIPS_ISA_REV >= 6
 # define SC_BEQZ       beqzc
 #else
 # define SC_BEQZ       beqz