lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:   Fri, 10 Dec 2021 15:58:10 -0800
From:   Nick Desaulniers <ndesaulniers@...gle.com>
To:     Nathan Chancellor <nathan@...nel.org>,
        Peter Zijlstra <peterz@...radead.org>
Cc:     x86@...nel.org, Josh Poimboeuf <jpoimboe@...hat.com>,
        linux-kernel@...r.kernel.org, llvm@...ts.linux.dev
Subject: Re: [PATCH] x86/extable: Fix extable_type_reg macro with Clang LTO

On Fri, Dec 10, 2021 at 3:51 PM Nathan Chancellor <nathan@...nel.org> wrote:
>
> When building x86_64_defconfig + CONFIG_LTO_CLANG_FULL=y after
> commit a90a845d94b4 ("x86/extable: Extend extable functionality"), the
> build fails during linking:
>
> ld.lld: error: <inline asm>:64:2: macro 'extable_type_reg' is already defined
>         .macro extable_type_reg type:req reg:req
>         ^
>
> The build failures happens because the definition of extable_type_reg
> happens in every source file that includes asm.h, which all get combined
> together during LTO.
>
> Commit be604c616ca7 ("arm64: sysreg: Make mrs_s and msr_s macros work
> with Clang and LTO") ran into a similar issue and the solution was to
> define, use, then undefine the macro within each inline asm block it was
> needed in.
>
> Break apart the inline asm macro definition into two macros
> ({,UN}DEFINE_EXTABLE_TYPE_REG) and use them in _ASM_EXTABLE_TYPE so
> there is no more error with LTO.
>
> Link: https://github.com/ClangBuiltLinux/linux/issues/1513
> Signed-off-by: Nathan Chancellor <nathan@...nel.org>

Thanks for coming up with a fix.

Reviewed-by: Nick Desaulniers <ndesaulniers@...gle.com>
Tested-by: Nick Desaulniers <ndesaulniers@...gle.com>

> ---
>
> I expect this to be squashed into commit a90a845d94b4 ("x86/extable:
> Extend extable functionality") in Peter's x86/wip.extable branch to
> avoid bisect issues. The description and link are there for archaeology.

SGTM; feel free to carry over my tested by tag in that case.

>
>  arch/x86/include/asm/asm.h | 52 ++++++++++++++++++++------------------
>  1 file changed, 28 insertions(+), 24 deletions(-)
>
> diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h
> index 95bb23082b87..c878fed3056f 100644
> --- a/arch/x86/include/asm/asm.h
> +++ b/arch/x86/include/asm/asm.h
> @@ -152,30 +152,32 @@
>
>  #else /* ! __ASSEMBLY__ */
>
> -asm(
> -"      .macro extable_type_reg type:req reg:req\n"
> -"      .set found, 0\n"
> -"      .set regnr, 0\n"
> -"      .irp rs,rax,rcx,rdx,rbx,rsp,rbp,rsi,rdi,r8,r9,r10,r11,r12,r13,r14,r15\n"
> -"      .ifc \\reg, %\\rs\n"
> -"      .set found, found+1\n"
> -"      .long \\type + (regnr << 8)\n"
> -"      .endif\n"
> -"      .set regnr, regnr+1\n"
> -"      .endr\n"
> -"      .set regnr, 0\n"
> -"      .irp rs,eax,ecx,edx,ebx,esp,ebp,esi,edi,r8d,r9d,r10d,r11d,r12d,r13d,r14d,r15d\n"
> -"      .ifc \\reg, %\\rs\n"
> -"      .set found, found+1\n"
> -"      .long \\type + (regnr << 8)\n"
> -"      .endif\n"
> -"      .set regnr, regnr+1\n"
> -"      .endr\n"
> -"      .if (found != 1)\n"
> -"      .error \"extable_type_reg: bad register argument\"\n"
> -"      .endif\n"
> -"      .endm\n"
> -);
> +# define DEFINE_EXTABLE_TYPE_REG \
> +       ".macro extable_type_reg type:req reg:req\n"                                            \
> +       ".set found, 0\n"                                                                       \
> +       ".set regnr, 0\n"                                                                       \
> +       ".irp rs,rax,rcx,rdx,rbx,rsp,rbp,rsi,rdi,r8,r9,r10,r11,r12,r13,r14,r15\n"               \
> +       ".ifc \\reg, %%\\rs\n"                                                                  \
> +       ".set found, found+1\n"                                                                 \
> +       ".long \\type + (regnr << 8)\n"                                                         \
> +       ".endif\n"                                                                              \
> +       ".set regnr, regnr+1\n"                                                                 \
> +       ".endr\n"                                                                               \
> +       ".set regnr, 0\n"                                                                       \
> +       ".irp rs,eax,ecx,edx,ebx,esp,ebp,esi,edi,r8d,r9d,r10d,r11d,r12d,r13d,r14d,r15d\n"       \
> +       ".ifc \\reg, %%\\rs\n"                                                                  \
> +       ".set found, found+1\n"                                                                 \
> +       ".long \\type + (regnr << 8)\n"                                                         \
> +       ".endif\n"                                                                              \
> +       ".set regnr, regnr+1\n"                                                                 \
> +       ".endr\n"                                                                               \
> +       ".if (found != 1)\n"                                                                    \
> +       ".error \"extable_type_reg: bad register argument\"\n"                                  \
> +       ".endif\n"                                                                              \
> +       ".endm\n"
> +
> +# define UNDEFINE_EXTABLE_TYPE_REG \
> +       ".purgem extable_type_reg\n"
>
>  # define _ASM_EXTABLE_TYPE(from, to, type)                     \
>         " .pushsection \"__ex_table\",\"a\"\n"                  \
> @@ -190,7 +192,9 @@ asm(
>         " .balign 4\n"                                                          \
>         " .long (" #from ") - .\n"                                              \
>         " .long (" #to ") - .\n"                                                \
> +       DEFINE_EXTABLE_TYPE_REG                                                 \
>         "extable_type_reg reg=" __stringify(reg) ", type=" __stringify(type) " \n"\
> +       UNDEFINE_EXTABLE_TYPE_REG                                               \
>         " .popsection\n"
>
>  /* For C file, we already have NOKPROBE_SYMBOL macro */
>
> base-commit: fa04e38818aeac177f730cfeadfbdb6f7c25f5b4
> --
> 2.34.1
>
>


-- 
Thanks,
~Nick Desaulniers

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ