Re: [PATCH v2] MIPS: Workaround clang inline compat branch issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Feb 28, 2023 at 11:19:17AM +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@xxxxxxxxxxx>

Thanks for filing that bug and debugging this. I came across a post from
the (now former) MIPS code owner and I am not sure anyone else has
stepped up, the vast majority of commits to llvm/lib/Targets/Mips have
been either NFC commits or treewide refactorings, so it will be
interesting to see if we can get that fixed.

https://discourse.llvm.org/t/mips-backend-code-owner/60737
https://github.com/llvm/llvm-project/commit/7daed359111f6d151fef447f520f85ef1dabedf6

For now:

Acked-by: Nathan Chancellor <nathan@xxxxxxxxxx>

If a v3 is necessary for some reason, a link to that issue in the source
itself would be useful, as we can easily grep for 'llvm/llvm-project' to
audit issues; I am not sure it is worth sending a v3 just for that alone
though.

> ---
> v2: Add Link tag to LLVM bug
> ---
>  arch/mips/Kconfig           | 3 +++
>  arch/mips/include/asm/asm.h | 2 +-
>  2 files changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index 37072e15b263..adf2c5a0bdba 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -3206,6 +3206,9 @@ config CC_HAS_MNO_BRANCH_LIKELY
>  	def_bool y
>  	depends on $(cc-option,-mno-branch-likely)
>  
> +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)
> 



[Index of Archives]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux