From: Sami Tolvanen <samitolvanen@google.com> To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Greg Hackmann <ghackmann@google.com>, Kees Cook <keescook@chromium.org>, Matthias Kaehlcke <mka@chromium.org>, Nick Desaulniers <ndesaulniers@google.com>, Sami Tolvanen <samitolvanen@google.com> Subject: [PATCH 13/15] arm64: fix mrs_s/msr_s macros for clang LTO Date: Fri, 3 Nov 2017 10:12:01 -0700 [thread overview] Message-ID: <20171103171203.107569-18-samitolvanen@google.com> (raw) In-Reply-To: <20171103171203.107569-1-samitolvanen@google.com> Clang's integrated assembler does not allow assembly macros defined in one inline asm block using the .macro directive to be used across separate asm blocks. LLVM developers consider this a feature and not a bug, recommending code refactoring: https://bugs.llvm.org/show_bug.cgi?id=19749 As binutils doesn't allow macros to be redefined, this change adds C preprocessor macros that define the assembly macros globally for binutils and locally for clang's integrated assembler. Suggested-by: Greg Hackmann <ghackmann@google.com> Suggested-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Sami Tolvanen <samitolvanen@google.com> --- arch/arm64/include/asm/kvm_hyp.h | 2 ++ arch/arm64/include/asm/sysreg.h | 71 ++++++++++++++++++++++++++++++---------- 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h index 4572a9b560fa..6840704ea894 100644 --- a/arch/arm64/include/asm/kvm_hyp.h +++ b/arch/arm64/include/asm/kvm_hyp.h @@ -29,6 +29,7 @@ ({ \ u64 reg; \ asm volatile(ALTERNATIVE("mrs %0, " __stringify(r##nvh),\ + DEFINE_MRS_S \ "mrs_s %0, " __stringify(r##vh),\ ARM64_HAS_VIRT_HOST_EXTN) \ : "=r" (reg)); \ @@ -39,6 +40,7 @@ do { \ u64 __val = (u64)(v); \ asm volatile(ALTERNATIVE("msr " __stringify(r##nvh) ", %x0",\ + DEFINE_MSR_S \ "msr_s " __stringify(r##vh) ", %x0",\ ARM64_HAS_VIRT_HOST_EXTN) \ : : "rZ" (__val)); \ diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h index f707fed5886f..1588ac3f3690 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -463,21 +463,58 @@ #include <linux/types.h> -asm( -" .irp num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30\n" -" .equ .L__reg_num_x\\num, \\num\n" -" .endr\n" +#define ___MRS_MSR_S_REGNUM \ +" .irp num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30\n" \ +" .equ .L__reg_num_x\\num, \\num\n" \ +" .endr\n" \ " .equ .L__reg_num_xzr, 31\n" -"\n" -" .macro mrs_s, rt, sreg\n" - __emit_inst(0xd5200000|(\\sreg)|(.L__reg_num_\\rt)) + +#define ___MRS_S \ +" .macro mrs_s, rt, sreg\n" \ + __emit_inst(0xd5200000|(\\sreg)|(.L__reg_num_\\rt)) \ " .endm\n" -"\n" -" .macro msr_s, sreg, rt\n" - __emit_inst(0xd5000000|(\\sreg)|(.L__reg_num_\\rt)) + +#define ___MSR_S \ +" .macro msr_s, sreg, rt\n" \ + __emit_inst(0xd5000000|(\\sreg)|(.L__reg_num_\\rt)) \ " .endm\n" + +/* + * llvm-as doesn't allow macros defined in an asm block to be used in other + * asm blocks, which means we cannot define them globally. + */ +#if !defined(CONFIG_CLANG_LTO) +asm( + ___MRS_MSR_S_REGNUM + ___MRS_S + ___MSR_S ); +#undef ___MRS_MSR_S_REGNUM +#define ___MRS_MSR_S_REGNUM +#undef ___MRS_S +#define ___MRS_S +#undef ___MSR_S +#define ___MSR_S +#endif + +#define DEFINE_MRS_S \ + ___MRS_MSR_S_REGNUM \ + ___MRS_S + +#define DEFINE_MSR_S \ + ___MRS_MSR_S_REGNUM \ + ___MSR_S + + +#define __mrs_s(r, v) \ + DEFINE_MRS_S \ +" mrs_s %0, " __stringify(r) : "=r" (v) + +#define __msr_s(r, v) \ + DEFINE_MSR_S \ +" msr_s " __stringify(r) ", %0" : : "r" (v) + /* * Unlike read_cpuid, calls to read_sysreg are never expected to be * optimized away or replaced with synthetic values. @@ -502,15 +539,15 @@ asm( * For registers without architectural names, or simply unsupported by * GAS. */ -#define read_sysreg_s(r) ({ \ - u64 __val; \ - asm volatile("mrs_s %0, " __stringify(r) : "=r" (__val)); \ - __val; \ +#define read_sysreg_s(r) ({ \ + u64 __val; \ + asm volatile(__mrs_s(r, __val)); \ + __val; \ }) -#define write_sysreg_s(v, r) do { \ - u64 __val = (u64)(v); \ - asm volatile("msr_s " __stringify(r) ", %x0" : : "rZ" (__val)); \ +#define write_sysreg_s(v, r) do { \ + u64 __val = (u64)(v); \ + asm volatile(__msr_s(r, __val)); \ } while (0) static inline void config_sctlr_el1(u32 clear, u32 set) -- 2.15.0.403.gc27cc4dac6-goog
WARNING: multiple messages have this Message-ID (diff)
From: samitolvanen@google.com (Sami Tolvanen) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 13/15] arm64: fix mrs_s/msr_s macros for clang LTO Date: Fri, 3 Nov 2017 10:12:01 -0700 [thread overview] Message-ID: <20171103171203.107569-18-samitolvanen@google.com> (raw) In-Reply-To: <20171103171203.107569-1-samitolvanen@google.com> Clang's integrated assembler does not allow assembly macros defined in one inline asm block using the .macro directive to be used across separate asm blocks. LLVM developers consider this a feature and not a bug, recommending code refactoring: https://bugs.llvm.org/show_bug.cgi?id=19749 As binutils doesn't allow macros to be redefined, this change adds C preprocessor macros that define the assembly macros globally for binutils and locally for clang's integrated assembler. Suggested-by: Greg Hackmann <ghackmann@google.com> Suggested-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Sami Tolvanen <samitolvanen@google.com> --- arch/arm64/include/asm/kvm_hyp.h | 2 ++ arch/arm64/include/asm/sysreg.h | 71 ++++++++++++++++++++++++++++++---------- 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h index 4572a9b560fa..6840704ea894 100644 --- a/arch/arm64/include/asm/kvm_hyp.h +++ b/arch/arm64/include/asm/kvm_hyp.h @@ -29,6 +29,7 @@ ({ \ u64 reg; \ asm volatile(ALTERNATIVE("mrs %0, " __stringify(r##nvh),\ + DEFINE_MRS_S \ "mrs_s %0, " __stringify(r##vh),\ ARM64_HAS_VIRT_HOST_EXTN) \ : "=r" (reg)); \ @@ -39,6 +40,7 @@ do { \ u64 __val = (u64)(v); \ asm volatile(ALTERNATIVE("msr " __stringify(r##nvh) ", %x0",\ + DEFINE_MSR_S \ "msr_s " __stringify(r##vh) ", %x0",\ ARM64_HAS_VIRT_HOST_EXTN) \ : : "rZ" (__val)); \ diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h index f707fed5886f..1588ac3f3690 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -463,21 +463,58 @@ #include <linux/types.h> -asm( -" .irp num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30\n" -" .equ .L__reg_num_x\\num, \\num\n" -" .endr\n" +#define ___MRS_MSR_S_REGNUM \ +" .irp num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30\n" \ +" .equ .L__reg_num_x\\num, \\num\n" \ +" .endr\n" \ " .equ .L__reg_num_xzr, 31\n" -"\n" -" .macro mrs_s, rt, sreg\n" - __emit_inst(0xd5200000|(\\sreg)|(.L__reg_num_\\rt)) + +#define ___MRS_S \ +" .macro mrs_s, rt, sreg\n" \ + __emit_inst(0xd5200000|(\\sreg)|(.L__reg_num_\\rt)) \ " .endm\n" -"\n" -" .macro msr_s, sreg, rt\n" - __emit_inst(0xd5000000|(\\sreg)|(.L__reg_num_\\rt)) + +#define ___MSR_S \ +" .macro msr_s, sreg, rt\n" \ + __emit_inst(0xd5000000|(\\sreg)|(.L__reg_num_\\rt)) \ " .endm\n" + +/* + * llvm-as doesn't allow macros defined in an asm block to be used in other + * asm blocks, which means we cannot define them globally. + */ +#if !defined(CONFIG_CLANG_LTO) +asm( + ___MRS_MSR_S_REGNUM + ___MRS_S + ___MSR_S ); +#undef ___MRS_MSR_S_REGNUM +#define ___MRS_MSR_S_REGNUM +#undef ___MRS_S +#define ___MRS_S +#undef ___MSR_S +#define ___MSR_S +#endif + +#define DEFINE_MRS_S \ + ___MRS_MSR_S_REGNUM \ + ___MRS_S + +#define DEFINE_MSR_S \ + ___MRS_MSR_S_REGNUM \ + ___MSR_S + + +#define __mrs_s(r, v) \ + DEFINE_MRS_S \ +" mrs_s %0, " __stringify(r) : "=r" (v) + +#define __msr_s(r, v) \ + DEFINE_MSR_S \ +" msr_s " __stringify(r) ", %0" : : "r" (v) + /* * Unlike read_cpuid, calls to read_sysreg are never expected to be * optimized away or replaced with synthetic values. @@ -502,15 +539,15 @@ asm( * For registers without architectural names, or simply unsupported by * GAS. */ -#define read_sysreg_s(r) ({ \ - u64 __val; \ - asm volatile("mrs_s %0, " __stringify(r) : "=r" (__val)); \ - __val; \ +#define read_sysreg_s(r) ({ \ + u64 __val; \ + asm volatile(__mrs_s(r, __val)); \ + __val; \ }) -#define write_sysreg_s(v, r) do { \ - u64 __val = (u64)(v); \ - asm volatile("msr_s " __stringify(r) ", %x0" : : "rZ" (__val)); \ +#define write_sysreg_s(v, r) do { \ + u64 __val = (u64)(v); \ + asm volatile(__msr_s(r, __val)); \ } while (0) static inline void config_sctlr_el1(u32 clear, u32 set) -- 2.15.0.403.gc27cc4dac6-goog
next prev parent reply other threads:[~2017-11-03 17:14 UTC|newest] Thread overview: 126+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-11-03 17:11 [PATCH 00/15] Add support for clang LTO Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 01/15] kbuild: add ld-name macro and support for GNU gold Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 18:24 ` Nick Desaulniers 2017-11-03 18:24 ` Nick Desaulniers 2017-11-03 17:11 ` [PATCH 02/15] kbuild: fix LD_DEAD_CODE_DATA_ELIMINATION with " Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 03/15] kbuild: add support for clang LTO Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 04/15] kbuild: fix dynamic ftrace with " Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 05/15] scripts/mod: disable LTO for empty.c Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 06/15] efi/libstub: disable clang LTO Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 20:10 ` Ard Biesheuvel 2017-11-03 20:10 ` Ard Biesheuvel 2017-11-03 17:11 ` [PATCH 06/15] efi/libstub: disable LTO Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 07/15] arm64: use -mno-implicit-float instead of -mgeneral-regs-only Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:50 ` Nick Desaulniers 2017-11-03 17:50 ` Nick Desaulniers 2017-11-03 18:02 ` Mark Rutland 2017-11-03 18:02 ` Mark Rutland 2017-11-03 18:20 ` Nick Desaulniers 2017-11-03 18:20 ` Nick Desaulniers 2017-11-03 18:31 ` Mark Rutland 2017-11-03 18:31 ` Mark Rutland 2017-11-03 18:52 ` Mark Rutland 2017-11-03 18:52 ` Mark Rutland 2017-11-03 19:06 ` Kees Cook 2017-11-03 19:06 ` Kees Cook 2017-11-03 20:18 ` Sami Tolvanen 2017-11-03 20:18 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 08/15] arm64: don't pass -maarch64linux to GNU gold Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 20:41 ` Yury Norov 2017-11-03 20:41 ` Yury Norov 2017-11-06 16:56 ` Sami Tolvanen 2017-11-06 16:56 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 09/15] arm64: keep .altinstructions and .altinstr_replacement Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 18:40 ` Nick Desaulniers 2017-11-03 18:40 ` Nick Desaulniers 2017-11-03 17:11 ` [PATCH 10/15] arm64: disable ARM64_ERRATUM_843419 for clang LTO Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 20:13 ` Ard Biesheuvel 2017-11-03 20:13 ` Ard Biesheuvel 2017-11-09 18:54 ` Sami Tolvanen 2017-11-09 18:54 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 11/15] arm64: explicitly pass --no-fix-cortex-a53-843419 to GNU gold Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 11/15] arm64: fix mrs_s/msr_s macros for clang LTO Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 12/15] arm64: add a workaround for GNU gold with ARM64_MODULE_PLTS Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:11 ` [PATCH 12/15] arm64: explicitly pass --no-fix-cortex-a53-843419 to GNU gold Sami Tolvanen 2017-11-03 17:11 ` Sami Tolvanen 2017-11-03 17:12 ` [PATCH 13/15] arm64: add a workaround for GNU gold with ARM64_MODULE_PLTS Sami Tolvanen 2017-11-03 17:12 ` Sami Tolvanen 2017-11-03 20:09 ` Ard Biesheuvel 2017-11-03 20:09 ` Ard Biesheuvel 2017-11-03 20:29 ` Sami Tolvanen 2017-11-03 20:29 ` Sami Tolvanen 2017-11-03 17:12 ` Sami Tolvanen [this message] 2017-11-03 17:12 ` [PATCH 13/15] arm64: fix mrs_s/msr_s macros for clang LTO Sami Tolvanen 2017-11-03 17:53 ` Nick Desaulniers 2017-11-03 17:53 ` Nick Desaulniers 2017-11-03 18:06 ` Mark Rutland 2017-11-03 18:06 ` Mark Rutland 2017-11-03 18:15 ` Nick Desaulniers 2017-11-03 18:15 ` Nick Desaulniers 2017-11-03 18:38 ` Mark Rutland 2017-11-03 18:38 ` Mark Rutland 2017-11-08 9:25 ` Yury Norov 2017-11-08 9:25 ` Yury Norov 2017-11-09 0:02 ` Andi Kleen 2017-11-09 0:02 ` Andi Kleen 2017-11-09 4:48 ` Maxim Kuvyrkov 2017-11-09 4:48 ` Maxim Kuvyrkov 2017-11-09 16:51 ` Sami Tolvanen 2017-11-09 16:51 ` Sami Tolvanen 2017-11-09 16:50 ` Sami Tolvanen 2017-11-09 16:50 ` Sami Tolvanen 2017-11-09 16:45 ` Sami Tolvanen 2017-11-09 16:45 ` Sami Tolvanen 2017-11-03 17:12 ` [PATCH 14/15] arm64: crypto: disable LTO for aes-ce-cipher.c Sami Tolvanen 2017-11-03 17:12 ` Sami Tolvanen 2017-11-03 20:10 ` Ard Biesheuvel 2017-11-03 20:10 ` Ard Biesheuvel 2017-11-03 17:12 ` [PATCH 15/15] arm64: select ARCH_SUPPORTS_CLANG_LTO Sami Tolvanen 2017-11-03 17:12 ` Sami Tolvanen 2017-11-03 17:51 ` [PATCH 00/15] Add support for clang LTO Mark Rutland 2017-11-03 17:51 ` Mark Rutland 2017-11-03 18:07 ` Nick Desaulniers 2017-11-03 18:07 ` Nick Desaulniers 2017-11-03 18:29 ` Mark Rutland 2017-11-03 18:29 ` Mark Rutland 2017-11-03 18:36 ` Nick Desaulniers 2017-11-03 18:36 ` Nick Desaulniers 2017-11-03 18:49 ` Mark Rutland 2017-11-03 18:49 ` Mark Rutland 2017-11-03 18:07 ` Matthias Kaehlcke 2017-11-03 18:07 ` Matthias Kaehlcke 2017-11-03 18:09 ` Mark Rutland 2017-11-03 18:09 ` Mark Rutland 2017-11-03 18:11 ` Nick Desaulniers 2017-11-03 18:11 ` Nick Desaulniers 2017-11-03 19:26 ` Mark Rutland 2017-11-03 19:26 ` Mark Rutland 2017-11-03 19:56 ` Sami Tolvanen 2017-11-03 19:56 ` Sami Tolvanen 2017-11-04 2:13 ` Mark Rutland 2017-11-04 2:13 ` Mark Rutland 2017-11-09 10:54 ` AKASHI Takahiro 2017-11-09 10:54 ` AKASHI Takahiro 2017-11-09 11:03 ` Marc Zyngier 2017-11-09 11:03 ` Marc Zyngier 2017-11-09 16:31 ` Sami Tolvanen 2017-11-09 16:31 ` Sami Tolvanen 2017-11-03 20:23 ` Ard Biesheuvel 2017-11-03 20:23 ` Ard Biesheuvel 2017-11-03 18:22 ` Sami Tolvanen 2017-11-03 18:22 ` Sami Tolvanen
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20171103171203.107569-18-samitolvanen@google.com \ --to=samitolvanen@google.com \ --cc=ghackmann@google.com \ --cc=keescook@chromium.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mka@chromium.org \ --cc=ndesaulniers@google.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.