Message ID | 20230228193459.15365-1-jiaxun.yang@flygoat.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 1a2c73f4834dd79e4f2c590ac75358fb44137650 |
Headers | show |
Series | [v3] MIPS: Workaround clang inline compat branch issue | expand |
On Tue, Feb 28, 2023 at 11:35 AM Jiaxun Yang <jiaxun.yang@flygoat.com> wrote: > > 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> Thanks for the patch! Acked-by: Nick Desaulniers <ndesaulniers@google.com> > --- > v2: Add Link tag to LLVM bug > v3: Docuement issue link in Kconfig as well > --- > arch/mips/Kconfig | 4 ++++ > arch/mips/include/asm/asm.h | 2 +- > 2 files changed, 5 insertions(+), 1 deletion(-) > > diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig > index 37072e15b263..c8b878aa690f 100644 > --- a/arch/mips/Kconfig > +++ b/arch/mips/Kconfig > @@ -3206,6 +3206,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 > diff --git a/arch/mips/include/asm/asm.h b/arch/mips/include/asm/asm.h > index 336ac9b65235..2e99450f4228 100644 > --- a/arch/mips/include/asm/asm.h > +++ b/arch/mips/include/asm/asm.h > @@ -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 > -- > 2.37.1 (Apple Git-137.1) > >
On Tue, Feb 28, 2023 at 07:34:59PM +0000, Jiaxun Yang wrote: > 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> > --- > v2: Add Link tag to LLVM bug > v3: Docuement issue link in Kconfig as well > --- > arch/mips/Kconfig | 4 ++++ > arch/mips/include/asm/asm.h | 2 +- > 2 files changed, 5 insertions(+), 1 deletion(-) applied to mips-next. Thomas.
On 28/2/23 20:34, Jiaxun Yang wrote: > 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> > --- > v2: Add Link tag to LLVM bug > v3: Docuement issue link in Kconfig as well > --- > arch/mips/Kconfig | 4 ++++ > arch/mips/include/asm/asm.h | 2 +- > 2 files changed, 5 insertions(+), 1 deletion(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 37072e15b263..c8b878aa690f 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -3206,6 +3206,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 diff --git a/arch/mips/include/asm/asm.h b/arch/mips/include/asm/asm.h index 336ac9b65235..2e99450f4228 100644 --- a/arch/mips/include/asm/asm.h +++ b/arch/mips/include/asm/asm.h @@ -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