linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: samitolvanen@google.com (Sami Tolvanen)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 11/15] arm64: fix mrs_s/msr_s macros for clang LTO
Date: Fri,  3 Nov 2017 10:11:57 -0700	[thread overview]
Message-ID: <20171103171203.107569-14-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

  parent reply	other threads:[~2017-11-03 17:11 UTC|newest]

Thread overview: 63+ 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 ` [PATCH 01/15] kbuild: add ld-name macro and support for GNU gold Sami Tolvanen
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 ` [PATCH 03/15] kbuild: add support for clang LTO Sami Tolvanen
2017-11-03 17:11 ` [PATCH 04/15] kbuild: fix dynamic ftrace with " Sami Tolvanen
2017-11-03 17:11 ` [PATCH 05/15] scripts/mod: disable LTO for empty.c Sami Tolvanen
2017-11-03 17:11 ` [PATCH 06/15] efi/libstub: disable clang LTO Sami Tolvanen
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 ` [PATCH 07/15] arm64: use -mno-implicit-float instead of -mgeneral-regs-only Sami Tolvanen
2017-11-03 17:50   ` Nick Desaulniers
2017-11-03 18:02   ` Mark Rutland
2017-11-03 18:20     ` Nick Desaulniers
2017-11-03 18:31   ` Mark Rutland
2017-11-03 18:52     ` Mark Rutland
2017-11-03 19:06       ` Kees Cook
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 20:41   ` Yury Norov
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 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 20:13   ` Ard Biesheuvel
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 [this message]
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 ` [PATCH 12/15] arm64: explicitly pass --no-fix-cortex-a53-843419 to GNU gold 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 20:09   ` Ard Biesheuvel
2017-11-03 20:29     ` Sami Tolvanen
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 18:06     ` Mark Rutland
2017-11-03 18:15       ` Nick Desaulniers
2017-11-03 18:38   ` Mark Rutland
2017-11-08  9:25   ` Yury Norov
2017-11-09  0:02     ` Andi Kleen
2017-11-09  4:48       ` Maxim Kuvyrkov
2017-11-09 16:51         ` Sami Tolvanen
2017-11-09 16:50       ` 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 20:10   ` Ard Biesheuvel
2017-11-03 17:12 ` [PATCH 15/15] arm64: select ARCH_SUPPORTS_CLANG_LTO Sami Tolvanen
2017-11-03 17:51 ` [PATCH 00/15] Add support for clang LTO Mark Rutland
2017-11-03 18:07   ` Nick Desaulniers
2017-11-03 18:29     ` Mark Rutland
2017-11-03 18:36       ` Nick Desaulniers
2017-11-03 18:49         ` Mark Rutland
2017-11-03 18:07   ` Matthias Kaehlcke
2017-11-03 18:09   ` Mark Rutland
2017-11-03 18:11     ` Nick Desaulniers
2017-11-03 19:26       ` Mark Rutland
2017-11-03 19:56         ` Sami Tolvanen
2017-11-04  2:13           ` Mark Rutland
2017-11-09 10:54             ` AKASHI Takahiro
2017-11-09 11:03               ` Marc Zyngier
2017-11-09 16:31               ` Sami Tolvanen
2017-11-03 20:23         ` Ard Biesheuvel
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-14-samitolvanen@google.com \
    --to=samitolvanen@google.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).