lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 009/667] riscv: Move alternative length validation into subsection
    Date
    From: Nathan Chancellor <nathan@kernel.org>

    commit 61114e734ccb804bc12561ab4020745e02c468c2 upstream.

    After commit 49b290e430d3 ("riscv: prevent compressed instructions in
    alternatives"), builds with LLVM's integrated assembler fail:

    In file included from arch/riscv/mm/init.c:10:
    In file included from ./include/linux/mm.h:29:
    In file included from ./include/linux/pgtable.h:6:
    In file included from ./arch/riscv/include/asm/pgtable.h:108:
    ./arch/riscv/include/asm/tlbflush.h:23:2: error: expected assembly-time absolute expression
    ALT_FLUSH_TLB_PAGE(__asm__ __volatile__ ("sfence.vma %0" : : "r" (addr) : "memory"));
    ^
    ./arch/riscv/include/asm/errata_list.h:33:5: note: expanded from macro 'ALT_FLUSH_TLB_PAGE'
    asm(ALTERNATIVE("sfence.vma %0", "sfence.vma", SIFIVE_VENDOR_ID, \
    ^
    ./arch/riscv/include/asm/alternative-macros.h:187:2: note: expanded from macro 'ALTERNATIVE'
    _ALTERNATIVE_CFG(old_content, new_content, vendor_id, errata_id, CONFIG_k)
    ^
    ./arch/riscv/include/asm/alternative-macros.h:113:2: note: expanded from macro '_ALTERNATIVE_CFG'
    __ALTERNATIVE_CFG(old_c, new_c, vendor_id, errata_id, IS_ENABLED(CONFIG_k))
    ^
    ./arch/riscv/include/asm/alternative-macros.h:110:2: note: expanded from macro '__ALTERNATIVE_CFG'
    ALT_NEW_CONTENT(vendor_id, errata_id, enable, new_c)
    ^
    ./arch/riscv/include/asm/alternative-macros.h:99:3: note: expanded from macro 'ALT_NEW_CONTENT'
    ".org . - (889b - 888b) + (887b - 886b)\n" \
    ^
    <inline asm>:26:6: note: instantiated into assembly here
    .org . - (889b - 888b) + (887b - 886b)
    ^

    This error happens because LLVM's integrated assembler has a one-pass
    design, which means it cannot figure out the instruction lengths when
    the .org directive is outside of the subsection that contains the
    instructions, which was changed by the .option directives added by the
    above change.

    Move the .org directives before the .previous directive so that these
    directives are always within the same subsection, which resolves the
    failures and does not introduce any new issues with GNU as. This was
    done for arm64 in commit 966a0acce2fc ("arm64/alternatives: move length
    validation inside the subsection") and commit 22315a2296f4 ("arm64:
    alternatives: Move length validation in alternative_{insn, endif}").

    While there is no error from the assembly versions of the macro, they
    appear to have the same problem so just make the same change there as
    well so that there are no problems in the future.

    Link: https://github.com/ClangBuiltLinux/linux/issues/1640
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Heiko Stuebner <heiko@sntech.de>
    Tested-by: Heiko Stuebner <heiko@sntech.de>
    Link: https://lore.kernel.org/r/20220516214520.3252074-1-nathan@kernel.org
    Cc: stable@vger.kernel.org
    Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/riscv/include/asm/alternative-macros.h | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/arch/riscv/include/asm/alternative-macros.h
    +++ b/arch/riscv/include/asm/alternative-macros.h
    @@ -23,9 +23,9 @@
    888 :
    \new_c
    889 :
    - .previous
    .org . - (889b - 888b) + (887b - 886b)
    .org . - (887b - 886b) + (889b - 888b)
    + .previous
    .endif
    .endm

    @@ -60,9 +60,9 @@
    "888 :\n" \
    new_c "\n" \
    "889 :\n" \
    - ".previous\n" \
    ".org . - (887b - 886b) + (889b - 888b)\n" \
    ".org . - (889b - 888b) + (887b - 886b)\n" \
    + ".previous\n" \
    ".endif\n"

    #define __ALTERNATIVE_CFG(old_c, new_c, vendor_id, errata_id, enable) \

    \
     
     \ /
      Last update: 2022-06-07 20:19    [W:4.159 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site