| From 22315a2296f4c251fa92aec45fbbae37e9301b6c Mon Sep 17 00:00:00 2001 |
| From: Nathan Chancellor <nathan@kernel.org> |
| Date: Tue, 13 Apr 2021 17:08:04 -0700 |
| Subject: arm64: alternatives: Move length validation in alternative_{insn, endif} |
| |
| From: Nathan Chancellor <nathan@kernel.org> |
| |
| commit 22315a2296f4c251fa92aec45fbbae37e9301b6c upstream. |
| |
| After commit 2decad92f473 ("arm64: mte: Ensure TIF_MTE_ASYNC_FAULT is |
| set atomically"), LLVM's integrated assembler fails to build entry.S: |
| |
| <instantiation>:5:7: error: expected assembly-time absolute expression |
| .org . - (664b-663b) + (662b-661b) |
| ^ |
| <instantiation>:6:7: error: expected assembly-time absolute expression |
| .org . - (662b-661b) + (664b-663b) |
| ^ |
| |
| The root cause is LLVM's assembler has a one-pass design, meaning it |
| cannot figure out these instruction lengths when the .org directive is |
| outside of the subsection that they are in, which was changed by the |
| .arch_extension directive added in the above commit. |
| |
| Apply the same fix from commit 966a0acce2fc ("arm64/alternatives: move |
| length validation inside the subsection") to the alternative_endif |
| macro, shuffling the .org directives so that the length validation |
| happen will always happen in the same subsections. alternative_insn has |
| not shown any issue yet but it appears that it could have the same issue |
| in the future so just preemptively change it. |
| |
| Fixes: f7b93d42945c ("arm64/alternatives: use subsections for replacement sequences") |
| Cc: <stable@vger.kernel.org> # 5.8.x |
| Link: https://github.com/ClangBuiltLinux/linux/issues/1347 |
| Signed-off-by: Nathan Chancellor <nathan@kernel.org> |
| Reviewed-by: Sami Tolvanen <samitolvanen@google.com> |
| Tested-by: Sami Tolvanen <samitolvanen@google.com> |
| Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> |
| Tested-by: Nick Desaulniers <ndesaulniers@google.com> |
| Link: https://lore.kernel.org/r/20210414000803.662534-1-nathan@kernel.org |
| Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/arm64/include/asm/alternative-macros.h | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/arch/arm64/include/asm/alternative-macros.h |
| +++ b/arch/arm64/include/asm/alternative-macros.h |
| @@ -97,9 +97,9 @@ |
| .popsection |
| .subsection 1 |
| 663: \insn2 |
| -664: .previous |
| - .org . - (664b-663b) + (662b-661b) |
| +664: .org . - (664b-663b) + (662b-661b) |
| .org . - (662b-661b) + (664b-663b) |
| + .previous |
| .endif |
| .endm |
| |
| @@ -169,11 +169,11 @@ |
| */ |
| .macro alternative_endif |
| 664: |
| + .org . - (664b-663b) + (662b-661b) |
| + .org . - (662b-661b) + (664b-663b) |
| .if .Lasm_alt_mode==0 |
| .previous |
| .endif |
| - .org . - (664b-663b) + (662b-661b) |
| - .org . - (662b-661b) + (664b-663b) |
| .endm |
| |
| /* |