public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P in asm templates
@ 2024-03-19 10:40 Uros Bizjak
  2024-03-19 10:40 ` [PATCH -tip 1/3] x86/asm: Remove %P operand modifier from altinstr " Uros Bizjak
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Uros Bizjak @ 2024-03-19 10:40 UTC (permalink / raw)
  To: x86, linux-kernel
  Cc: Uros Bizjak, Andy Lutomirski, Brian Gerst, Denys Vlasenko,
	H . Peter Anvin, Linus Torvalds, Ingo Molnar, Josh Poimboeuf,
	Sean Christopherson

The "P" asm operand modifier is a x86 target-specific modifier.

For x86_64, when used with a symbol reference, the "P" modifier
emits "sym" instead of "sym(%rip)". When used with a constant, the
"P" modifier emits "cst" instead of "$cst". This property is used to
emit bare symbol references and bare constants without all
syntax-specific prefixes.

The generic "c", "n" and "a" operand modifiers should be used instead.
The following table shows the modifiers supported by all targets and
their effects:

Modifier    Description
-----------------------------------------------------------
'c'         Require a constant operand and print the
            constant expression with no punctuation.
'n'         Like '%c' except that the value of the constant
            is negated before printing.
'a'         Substitute a memory reference, with the actual
            operand treated as the address.  This may be
            useful when outputting a "load address"
            instruction, because often the assembler syntax
            for such an instruction requires you to write
            the operand as if it were a memory reference.

Also note that unlike GCC, clang emits %rip-relative symbol
reference with "P" asm operand modifier, so the patch also unifies
symbol handling with both compilers.

No functional changes intended.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Sean Christopherson <seanjc@google.com>

Uros Bizjak (3):
  x86/asm: Remove %P operand modifier from altinstr asm templates
  x86/asm: Use %c/%n instead of %P operand modifier in asm templates
  x86/asm: Use %a instead of %P operand modifier in asm templates

 arch/x86/boot/main.c                 |  4 ++--
 arch/x86/include/asm/alternative.h   | 22 +++++++++++-----------
 arch/x86/include/asm/apic.h          |  2 +-
 arch/x86/include/asm/atomic64_32.h   |  2 +-
 arch/x86/include/asm/cpufeature.h    |  4 ++--
 arch/x86/include/asm/irq_stack.h     |  2 +-
 arch/x86/include/asm/processor.h     |  6 +++---
 arch/x86/include/asm/special_insns.h |  4 ++--
 arch/x86/include/asm/uaccess.h       |  4 ++--
 9 files changed, 25 insertions(+), 25 deletions(-)

-- 
2.44.0


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH -tip 1/3] x86/asm: Remove %P operand modifier from altinstr asm templates
  2024-03-19 10:40 [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P in asm templates Uros Bizjak
@ 2024-03-19 10:40 ` Uros Bizjak
  2024-03-19 12:31   ` [tip: x86/asm] " tip-bot2 for Uros Bizjak
  2024-03-19 10:40 ` [PATCH -tip 2/3] x86/asm: Use %c/%n instead of %P operand modifier in " Uros Bizjak
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: Uros Bizjak @ 2024-03-19 10:40 UTC (permalink / raw)
  To: x86, linux-kernel
  Cc: Uros Bizjak, Andy Lutomirski, Brian Gerst, Denys Vlasenko,
	H . Peter Anvin, Linus Torvalds, Ingo Molnar, Josh Poimboeuf,
	Sean Christopherson

The "P" asm operand modifier is a x86 target-specific modifier.

For x86_64, when used with a symbol reference, the "%P" modifier
emits "sym" instead of "sym(%rip)". This property is currently
used to prevent %RIP-relative addressing in .altinstr sections.

%RIP-relative addresses are nowadays correctly handled in .altinstr
sections, so remove %P operand modifier from altinstr asm templates.

Also note that unlike GCC, clang emits %rip-relative symbol
reference with "P" asm operand modifier, so the patch also unifies
symbol handling with both compilers.

No functional changes intended.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Sean Christopherson <seanjc@google.com>
---
 arch/x86/include/asm/apic.h          | 2 +-
 arch/x86/include/asm/processor.h     | 6 +++---
 arch/x86/include/asm/special_insns.h | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index 94ce0f7c9d3a..fa2e4244654e 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -91,7 +91,7 @@ static inline void native_apic_mem_write(u32 reg, u32 v)
 {
 	volatile u32 *addr = (volatile u32 *)(APIC_BASE + reg);
 
-	alternative_io("movl %0, %P1", "xchgl %0, %P1", X86_BUG_11AP,
+	alternative_io("movl %0, %1", "xchgl %0, %1", X86_BUG_11AP,
 		       ASM_OUTPUT2("=r" (v), "=m" (*addr)),
 		       ASM_OUTPUT2("0" (v), "m" (*addr)));
 }
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 811548f131f4..438c0c8f596a 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -587,7 +587,7 @@ extern char			ignore_fpu_irq;
 # define BASE_PREFETCH		""
 # define ARCH_HAS_PREFETCH
 #else
-# define BASE_PREFETCH		"prefetcht0 %P1"
+# define BASE_PREFETCH		"prefetcht0 %1"
 #endif
 
 /*
@@ -598,7 +598,7 @@ extern char			ignore_fpu_irq;
  */
 static inline void prefetch(const void *x)
 {
-	alternative_input(BASE_PREFETCH, "prefetchnta %P1",
+	alternative_input(BASE_PREFETCH, "prefetchnta %1",
 			  X86_FEATURE_XMM,
 			  "m" (*(const char *)x));
 }
@@ -610,7 +610,7 @@ static inline void prefetch(const void *x)
  */
 static __always_inline void prefetchw(const void *x)
 {
-	alternative_input(BASE_PREFETCH, "prefetchw %P1",
+	alternative_input(BASE_PREFETCH, "prefetchw %1",
 			  X86_FEATURE_3DNOWPREFETCH,
 			  "m" (*(const char *)x));
 }
diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
index 2e9fc5c400cd..0ee2ba589492 100644
--- a/arch/x86/include/asm/special_insns.h
+++ b/arch/x86/include/asm/special_insns.h
@@ -182,8 +182,8 @@ static __always_inline void clflush(volatile void *__p)
 
 static inline void clflushopt(volatile void *__p)
 {
-	alternative_io(".byte 0x3e; clflush %P0",
-		       ".byte 0x66; clflush %P0",
+	alternative_io(".byte 0x3e; clflush %0",
+		       ".byte 0x66; clflush %0",
 		       X86_FEATURE_CLFLUSHOPT,
 		       "+m" (*(volatile char __force *)__p));
 }
-- 
2.44.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH -tip 2/3] x86/asm: Use %c/%n instead of %P operand modifier in asm templates
  2024-03-19 10:40 [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P in asm templates Uros Bizjak
  2024-03-19 10:40 ` [PATCH -tip 1/3] x86/asm: Remove %P operand modifier from altinstr " Uros Bizjak
@ 2024-03-19 10:40 ` Uros Bizjak
  2024-03-19 12:31   ` [tip: x86/asm] " tip-bot2 for Uros Bizjak
  2024-03-19 10:40 ` [PATCH -tip 3/3] x86/asm: Use %a " Uros Bizjak
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: Uros Bizjak @ 2024-03-19 10:40 UTC (permalink / raw)
  To: x86, linux-kernel
  Cc: Uros Bizjak, Andy Lutomirski, Brian Gerst, Denys Vlasenko,
	H . Peter Anvin, Linus Torvalds, Ingo Molnar, Josh Poimboeuf,
	Sean Christopherson

The "P" asm operand modifier is a x86 target-specific modifier.

When used with a constant, the "P" modifier emits "cst" instead of
"$cst". This property is currently used to emit the bare constant
without all syntax-specific prefixes.

The generic "c" resp. "n" operand modifier should be used instead.

No functional changes intended.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Sean Christopherson <seanjc@google.com>
---
 arch/x86/boot/main.c               |  4 ++--
 arch/x86/include/asm/alternative.h | 22 +++++++++++-----------
 arch/x86/include/asm/atomic64_32.h |  2 +-
 arch/x86/include/asm/cpufeature.h  |  2 +-
 arch/x86/include/asm/irq_stack.h   |  2 +-
 arch/x86/include/asm/uaccess.h     |  4 ++--
 6 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/arch/x86/boot/main.c b/arch/x86/boot/main.c
index c4ea5258ab55..9049f390d834 100644
--- a/arch/x86/boot/main.c
+++ b/arch/x86/boot/main.c
@@ -119,8 +119,8 @@ static void init_heap(void)
 	char *stack_end;
 
 	if (boot_params.hdr.loadflags & CAN_USE_HEAP) {
-		asm("leal %P1(%%esp),%0"
-		    : "=r" (stack_end) : "i" (-STACK_SIZE));
+		asm("leal %n1(%%esp),%0"
+		    : "=r" (stack_end) : "i" (STACK_SIZE));
 
 		heap_end = (char *)
 			((size_t)boot_params.hdr.heap_end_ptr + 0x200);
diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h
index fcd20c6dc7f9..99432696b181 100644
--- a/arch/x86/include/asm/alternative.h
+++ b/arch/x86/include/asm/alternative.h
@@ -294,10 +294,10 @@ static inline int alternatives_text_reserved(void *start, void *end)
  * Otherwise, if CPU has feature1, newinstr1 is used.
  * Otherwise, oldinstr is used.
  */
-#define alternative_input_2(oldinstr, newinstr1, ft_flags1, newinstr2,	     \
-			   ft_flags2, input...)				     \
-	asm_inline volatile(ALTERNATIVE_2(oldinstr, newinstr1, ft_flags1,     \
-		newinstr2, ft_flags2)					     \
+#define alternative_input_2(oldinstr, newinstr1, ft_flags1, newinstr2,	\
+			   ft_flags2, input...)				\
+	asm_inline volatile(ALTERNATIVE_2(oldinstr, newinstr1, ft_flags1, \
+		newinstr2, ft_flags2)					\
 		: : "i" (0), ## input)
 
 /* Like alternative_input, but with a single output argument */
@@ -307,7 +307,7 @@ static inline int alternatives_text_reserved(void *start, void *end)
 
 /* Like alternative_io, but for replacing a direct call with another one. */
 #define alternative_call(oldfunc, newfunc, ft_flags, output, input...)	\
-	asm_inline volatile (ALTERNATIVE("call %P[old]", "call %P[new]", ft_flags) \
+	asm_inline volatile (ALTERNATIVE("call %c[old]", "call %c[new]", ft_flags) \
 		: output : [old] "i" (oldfunc), [new] "i" (newfunc), ## input)
 
 /*
@@ -316,12 +316,12 @@ static inline int alternatives_text_reserved(void *start, void *end)
  * Otherwise, if CPU has feature1, function1 is used.
  * Otherwise, old function is used.
  */
-#define alternative_call_2(oldfunc, newfunc1, ft_flags1, newfunc2, ft_flags2,   \
-			   output, input...)				      \
-	asm_inline volatile (ALTERNATIVE_2("call %P[old]", "call %P[new1]", ft_flags1,\
-		"call %P[new2]", ft_flags2)				      \
-		: output, ASM_CALL_CONSTRAINT				      \
-		: [old] "i" (oldfunc), [new1] "i" (newfunc1),		      \
+#define alternative_call_2(oldfunc, newfunc1, ft_flags1, newfunc2, ft_flags2, \
+			   output, input...)				\
+	asm_inline volatile (ALTERNATIVE_2("call %c[old]", "call %c[new1]", ft_flags1, \
+		"call %c[new2]", ft_flags2)				\
+		: output, ASM_CALL_CONSTRAINT				\
+		: [old] "i" (oldfunc), [new1] "i" (newfunc1),		\
 		  [new2] "i" (newfunc2), ## input)
 
 /*
diff --git a/arch/x86/include/asm/atomic64_32.h b/arch/x86/include/asm/atomic64_32.h
index 3486d91b8595..d510405e4e1d 100644
--- a/arch/x86/include/asm/atomic64_32.h
+++ b/arch/x86/include/asm/atomic64_32.h
@@ -24,7 +24,7 @@ typedef struct {
 
 #ifdef CONFIG_X86_CMPXCHG64
 #define __alternative_atomic64(f, g, out, in...) \
-	asm volatile("call %P[func]" \
+	asm volatile("call %c[func]" \
 		     : out : [func] "i" (atomic64_##g##_cx8), ## in)
 
 #define ATOMIC64_DECL(sym) ATOMIC64_DECL_ONE(sym##_cx8)
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index a1273698fc43..fa938ed96506 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -169,7 +169,7 @@ extern void clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int bit);
 static __always_inline bool _static_cpu_has(u16 bit)
 {
 	asm goto(
-		ALTERNATIVE_TERNARY("jmp 6f", %P[feature], "", "jmp %l[t_no]")
+		ALTERNATIVE_TERNARY("jmp 6f", %c[feature], "", "jmp %l[t_no]")
 		".pushsection .altinstr_aux,\"ax\"\n"
 		"6:\n"
 		" testb %[bitnum]," _ASM_RIP(%P[cap_byte]) "\n"
diff --git a/arch/x86/include/asm/irq_stack.h b/arch/x86/include/asm/irq_stack.h
index 798183867d78..b71ad173f877 100644
--- a/arch/x86/include/asm/irq_stack.h
+++ b/arch/x86/include/asm/irq_stack.h
@@ -100,7 +100,7 @@
 }
 
 #define ASM_CALL_ARG0							\
-	"call %P[__func]				\n"		\
+	"call %c[__func]				\n"		\
 	ASM_REACHABLE
 
 #define ASM_CALL_ARG1							\
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
index 237dc8cdd12b..0f9bab92a43d 100644
--- a/arch/x86/include/asm/uaccess.h
+++ b/arch/x86/include/asm/uaccess.h
@@ -78,7 +78,7 @@ extern int __get_user_bad(void);
 	int __ret_gu;							\
 	register __inttype(*(ptr)) __val_gu asm("%"_ASM_DX);		\
 	__chk_user_ptr(ptr);						\
-	asm volatile("call __" #fn "_%P4"				\
+	asm volatile("call __" #fn "_%c4"				\
 		     : "=a" (__ret_gu), "=r" (__val_gu),		\
 			ASM_CALL_CONSTRAINT				\
 		     : "0" (ptr), "i" (sizeof(*(ptr))));		\
@@ -177,7 +177,7 @@ extern void __put_user_nocheck_8(void);
 	__chk_user_ptr(__ptr);						\
 	__ptr_pu = __ptr;						\
 	__val_pu = __x;							\
-	asm volatile("call __" #fn "_%P[size]"				\
+	asm volatile("call __" #fn "_%c[size]"				\
 		     : "=c" (__ret_pu),					\
 			ASM_CALL_CONSTRAINT				\
 		     : "0" (__ptr_pu),					\
-- 
2.44.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH -tip 3/3] x86/asm: Use %a instead of %P operand modifier in asm templates
  2024-03-19 10:40 [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P in asm templates Uros Bizjak
  2024-03-19 10:40 ` [PATCH -tip 1/3] x86/asm: Remove %P operand modifier from altinstr " Uros Bizjak
  2024-03-19 10:40 ` [PATCH -tip 2/3] x86/asm: Use %c/%n instead of %P operand modifier in " Uros Bizjak
@ 2024-03-19 10:40 ` Uros Bizjak
  2024-03-19 12:31   ` [tip: x86/asm] " tip-bot2 for Uros Bizjak
  2024-03-19 12:45 ` [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P " Borislav Petkov
  2024-03-19 13:09 ` Brian Gerst
  4 siblings, 1 reply; 10+ messages in thread
From: Uros Bizjak @ 2024-03-19 10:40 UTC (permalink / raw)
  To: x86, linux-kernel
  Cc: Uros Bizjak, Andy Lutomirski, Brian Gerst, Denys Vlasenko,
	H . Peter Anvin, Linus Torvalds, Ingo Molnar, Josh Poimboeuf,
	Sean Christopherson

The "P" asm operand modifier is a x86 target-specific modifier.

For x86_64, when used with a symbol reference, the "%P" modifier
emits "sym" instead of "sym(%rip)". This property is currently
used to issue bare symbol reference.

The generic "a" operand modifier should be used instead. The "a"
asm operand modifier substitutes a memory reference, with the
actual operand treated as address.  For x86_64, when a symbol is
provided, the "a" modifier emits "sym(%rip)" instead of "sym",
enabling shorter %rip-relative addressing.

Also note that unlike GCC, clang emits %rip-relative symbol
reference with "P" asm operand modifier, so the patch also unifies
symbol handling with both compilers.

No functional changes intended.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Sean Christopherson <seanjc@google.com>
---
 arch/x86/include/asm/cpufeature.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index fa938ed96506..daae5c6e7d0e 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -172,7 +172,7 @@ static __always_inline bool _static_cpu_has(u16 bit)
 		ALTERNATIVE_TERNARY("jmp 6f", %c[feature], "", "jmp %l[t_no]")
 		".pushsection .altinstr_aux,\"ax\"\n"
 		"6:\n"
-		" testb %[bitnum]," _ASM_RIP(%P[cap_byte]) "\n"
+		" testb %[bitnum], %a[cap_byte]\n"
 		" jnz %l[t_yes]\n"
 		" jmp %l[t_no]\n"
 		".popsection\n"
-- 
2.44.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [tip: x86/asm] x86/asm: Use %a instead of %P operand modifier in asm templates
  2024-03-19 10:40 ` [PATCH -tip 3/3] x86/asm: Use %a " Uros Bizjak
@ 2024-03-19 12:31   ` tip-bot2 for Uros Bizjak
  0 siblings, 0 replies; 10+ messages in thread
From: tip-bot2 for Uros Bizjak @ 2024-03-19 12:31 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Uros Bizjak, Ingo Molnar, Linus Torvalds, Josh Poimboeuf,
	Ard Biesheuvel, H. Peter Anvin, x86, linux-kernel

The following commit has been merged into the x86/asm branch of tip:

Commit-ID:     d689863c1a60b9936b47a34fa5c3330de374f4fc
Gitweb:        https://git.kernel.org/tip/d689863c1a60b9936b47a34fa5c3330de374f4fc
Author:        Uros Bizjak <ubizjak@gmail.com>
AuthorDate:    Tue, 19 Mar 2024 11:40:14 +01:00
Committer:     Ingo Molnar <mingo@kernel.org>
CommitterDate: Tue, 19 Mar 2024 13:15:35 +01:00

x86/asm: Use %a instead of %P operand modifier in asm templates

The "P" asm operand modifier is a x86 target-specific modifier.

For x86_64, when used with a symbol reference, the "%P" modifier
emits "sym" instead of "sym(%rip)". This property is currently
used to issue bare symbol reference.

The generic "a" operand modifier should be used instead. The "a"
asm operand modifier substitutes a memory reference, with the
actual operand treated as address.  For x86_64, when a symbol is
provided, the "a" modifier emits "sym(%rip)" instead of "sym",
enabling shorter %rip-relative addressing.

Also note that unlike GCC, clang emits %rip-relative symbol
reference with "P" asm operand modifier, so the patch also unifies
symbol handling with both compilers.

No functional changes intended.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Link: https://lore.kernel.org/r/20240319104418.284519-4-ubizjak@gmail.com
---
 arch/x86/include/asm/cpufeature.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index fa938ed..daae5c6 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -172,7 +172,7 @@ static __always_inline bool _static_cpu_has(u16 bit)
 		ALTERNATIVE_TERNARY("jmp 6f", %c[feature], "", "jmp %l[t_no]")
 		".pushsection .altinstr_aux,\"ax\"\n"
 		"6:\n"
-		" testb %[bitnum]," _ASM_RIP(%P[cap_byte]) "\n"
+		" testb %[bitnum], %a[cap_byte]\n"
 		" jnz %l[t_yes]\n"
 		" jmp %l[t_no]\n"
 		".popsection\n"

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [tip: x86/asm] x86/asm: Use %c/%n instead of %P operand modifier in asm templates
  2024-03-19 10:40 ` [PATCH -tip 2/3] x86/asm: Use %c/%n instead of %P operand modifier in " Uros Bizjak
@ 2024-03-19 12:31   ` tip-bot2 for Uros Bizjak
  0 siblings, 0 replies; 10+ messages in thread
From: tip-bot2 for Uros Bizjak @ 2024-03-19 12:31 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Uros Bizjak, Ingo Molnar, Linus Torvalds, Josh Poimboeuf,
	Ard Biesheuvel, H. Peter Anvin, x86, linux-kernel

The following commit has been merged into the x86/asm branch of tip:

Commit-ID:     41cd2e1ee96e56401a18dbce6f42f0bdaebcbf3b
Gitweb:        https://git.kernel.org/tip/41cd2e1ee96e56401a18dbce6f42f0bdaebcbf3b
Author:        Uros Bizjak <ubizjak@gmail.com>
AuthorDate:    Tue, 19 Mar 2024 11:40:13 +01:00
Committer:     Ingo Molnar <mingo@kernel.org>
CommitterDate: Tue, 19 Mar 2024 13:15:35 +01:00

x86/asm: Use %c/%n instead of %P operand modifier in asm templates

The "P" asm operand modifier is a x86 target-specific modifier.

When used with a constant, the "P" modifier emits "cst" instead of
"$cst". This property is currently used to emit the bare constant
without all syntax-specific prefixes.

The generic "c" resp. "n" operand modifier should be used instead.

No functional changes intended.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Link: https://lore.kernel.org/r/20240319104418.284519-3-ubizjak@gmail.com
---
 arch/x86/boot/main.c               |  4 ++--
 arch/x86/include/asm/alternative.h | 22 +++++++++++-----------
 arch/x86/include/asm/atomic64_32.h |  2 +-
 arch/x86/include/asm/cpufeature.h  |  2 +-
 arch/x86/include/asm/irq_stack.h   |  2 +-
 arch/x86/include/asm/uaccess.h     |  4 ++--
 6 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/arch/x86/boot/main.c b/arch/x86/boot/main.c
index c4ea525..9049f39 100644
--- a/arch/x86/boot/main.c
+++ b/arch/x86/boot/main.c
@@ -119,8 +119,8 @@ static void init_heap(void)
 	char *stack_end;
 
 	if (boot_params.hdr.loadflags & CAN_USE_HEAP) {
-		asm("leal %P1(%%esp),%0"
-		    : "=r" (stack_end) : "i" (-STACK_SIZE));
+		asm("leal %n1(%%esp),%0"
+		    : "=r" (stack_end) : "i" (STACK_SIZE));
 
 		heap_end = (char *)
 			((size_t)boot_params.hdr.heap_end_ptr + 0x200);
diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h
index fcd20c6..9943269 100644
--- a/arch/x86/include/asm/alternative.h
+++ b/arch/x86/include/asm/alternative.h
@@ -294,10 +294,10 @@ static inline int alternatives_text_reserved(void *start, void *end)
  * Otherwise, if CPU has feature1, newinstr1 is used.
  * Otherwise, oldinstr is used.
  */
-#define alternative_input_2(oldinstr, newinstr1, ft_flags1, newinstr2,	     \
-			   ft_flags2, input...)				     \
-	asm_inline volatile(ALTERNATIVE_2(oldinstr, newinstr1, ft_flags1,     \
-		newinstr2, ft_flags2)					     \
+#define alternative_input_2(oldinstr, newinstr1, ft_flags1, newinstr2,	\
+			   ft_flags2, input...)				\
+	asm_inline volatile(ALTERNATIVE_2(oldinstr, newinstr1, ft_flags1, \
+		newinstr2, ft_flags2)					\
 		: : "i" (0), ## input)
 
 /* Like alternative_input, but with a single output argument */
@@ -307,7 +307,7 @@ static inline int alternatives_text_reserved(void *start, void *end)
 
 /* Like alternative_io, but for replacing a direct call with another one. */
 #define alternative_call(oldfunc, newfunc, ft_flags, output, input...)	\
-	asm_inline volatile (ALTERNATIVE("call %P[old]", "call %P[new]", ft_flags) \
+	asm_inline volatile (ALTERNATIVE("call %c[old]", "call %c[new]", ft_flags) \
 		: output : [old] "i" (oldfunc), [new] "i" (newfunc), ## input)
 
 /*
@@ -316,12 +316,12 @@ static inline int alternatives_text_reserved(void *start, void *end)
  * Otherwise, if CPU has feature1, function1 is used.
  * Otherwise, old function is used.
  */
-#define alternative_call_2(oldfunc, newfunc1, ft_flags1, newfunc2, ft_flags2,   \
-			   output, input...)				      \
-	asm_inline volatile (ALTERNATIVE_2("call %P[old]", "call %P[new1]", ft_flags1,\
-		"call %P[new2]", ft_flags2)				      \
-		: output, ASM_CALL_CONSTRAINT				      \
-		: [old] "i" (oldfunc), [new1] "i" (newfunc1),		      \
+#define alternative_call_2(oldfunc, newfunc1, ft_flags1, newfunc2, ft_flags2, \
+			   output, input...)				\
+	asm_inline volatile (ALTERNATIVE_2("call %c[old]", "call %c[new1]", ft_flags1, \
+		"call %c[new2]", ft_flags2)				\
+		: output, ASM_CALL_CONSTRAINT				\
+		: [old] "i" (oldfunc), [new1] "i" (newfunc1),		\
 		  [new2] "i" (newfunc2), ## input)
 
 /*
diff --git a/arch/x86/include/asm/atomic64_32.h b/arch/x86/include/asm/atomic64_32.h
index 3486d91..d510405 100644
--- a/arch/x86/include/asm/atomic64_32.h
+++ b/arch/x86/include/asm/atomic64_32.h
@@ -24,7 +24,7 @@ typedef struct {
 
 #ifdef CONFIG_X86_CMPXCHG64
 #define __alternative_atomic64(f, g, out, in...) \
-	asm volatile("call %P[func]" \
+	asm volatile("call %c[func]" \
 		     : out : [func] "i" (atomic64_##g##_cx8), ## in)
 
 #define ATOMIC64_DECL(sym) ATOMIC64_DECL_ONE(sym##_cx8)
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index a127369..fa938ed 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -169,7 +169,7 @@ extern void clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int bit);
 static __always_inline bool _static_cpu_has(u16 bit)
 {
 	asm goto(
-		ALTERNATIVE_TERNARY("jmp 6f", %P[feature], "", "jmp %l[t_no]")
+		ALTERNATIVE_TERNARY("jmp 6f", %c[feature], "", "jmp %l[t_no]")
 		".pushsection .altinstr_aux,\"ax\"\n"
 		"6:\n"
 		" testb %[bitnum]," _ASM_RIP(%P[cap_byte]) "\n"
diff --git a/arch/x86/include/asm/irq_stack.h b/arch/x86/include/asm/irq_stack.h
index 7981838..b71ad17 100644
--- a/arch/x86/include/asm/irq_stack.h
+++ b/arch/x86/include/asm/irq_stack.h
@@ -100,7 +100,7 @@
 }
 
 #define ASM_CALL_ARG0							\
-	"call %P[__func]				\n"		\
+	"call %c[__func]				\n"		\
 	ASM_REACHABLE
 
 #define ASM_CALL_ARG1							\
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
index 237dc8c..0f9bab9 100644
--- a/arch/x86/include/asm/uaccess.h
+++ b/arch/x86/include/asm/uaccess.h
@@ -78,7 +78,7 @@ extern int __get_user_bad(void);
 	int __ret_gu;							\
 	register __inttype(*(ptr)) __val_gu asm("%"_ASM_DX);		\
 	__chk_user_ptr(ptr);						\
-	asm volatile("call __" #fn "_%P4"				\
+	asm volatile("call __" #fn "_%c4"				\
 		     : "=a" (__ret_gu), "=r" (__val_gu),		\
 			ASM_CALL_CONSTRAINT				\
 		     : "0" (ptr), "i" (sizeof(*(ptr))));		\
@@ -177,7 +177,7 @@ extern void __put_user_nocheck_8(void);
 	__chk_user_ptr(__ptr);						\
 	__ptr_pu = __ptr;						\
 	__val_pu = __x;							\
-	asm volatile("call __" #fn "_%P[size]"				\
+	asm volatile("call __" #fn "_%c[size]"				\
 		     : "=c" (__ret_pu),					\
 			ASM_CALL_CONSTRAINT				\
 		     : "0" (__ptr_pu),					\

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [tip: x86/asm] x86/asm: Remove %P operand modifier from altinstr asm templates
  2024-03-19 10:40 ` [PATCH -tip 1/3] x86/asm: Remove %P operand modifier from altinstr " Uros Bizjak
@ 2024-03-19 12:31   ` tip-bot2 for Uros Bizjak
  0 siblings, 0 replies; 10+ messages in thread
From: tip-bot2 for Uros Bizjak @ 2024-03-19 12:31 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Uros Bizjak, Ingo Molnar, Linus Torvalds, Josh Poimboeuf,
	Ard Biesheuvel, H. Peter Anvin, x86, linux-kernel

The following commit has been merged into the x86/asm branch of tip:

Commit-ID:     a3ff53167cef2b5c6c8948246172d6f9279f037f
Gitweb:        https://git.kernel.org/tip/a3ff53167cef2b5c6c8948246172d6f9279f037f
Author:        Uros Bizjak <ubizjak@gmail.com>
AuthorDate:    Tue, 19 Mar 2024 11:40:12 +01:00
Committer:     Ingo Molnar <mingo@kernel.org>
CommitterDate: Tue, 19 Mar 2024 13:15:34 +01:00

x86/asm: Remove %P operand modifier from altinstr asm templates

The "P" asm operand modifier is a x86 target-specific modifier.

For x86_64, when used with a symbol reference, the "%P" modifier
emits "sym" instead of "sym(%rip)". This property is currently
used to prevent %RIP-relative addressing in .altinstr sections.

%RIP-relative addresses are nowadays correctly handled in .altinstr
sections, so remove %P operand modifier from altinstr asm templates.

Also note that unlike GCC, clang emits %rip-relative symbol
reference with "P" asm operand modifier, so the patch also unifies
symbol handling with both compilers.

No functional changes intended.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Link: https://lore.kernel.org/r/20240319104418.284519-2-ubizjak@gmail.com
---
 arch/x86/include/asm/apic.h          | 2 +-
 arch/x86/include/asm/processor.h     | 6 +++---
 arch/x86/include/asm/special_insns.h | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index 94ce0f7..fa2e424 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -91,7 +91,7 @@ static inline void native_apic_mem_write(u32 reg, u32 v)
 {
 	volatile u32 *addr = (volatile u32 *)(APIC_BASE + reg);
 
-	alternative_io("movl %0, %P1", "xchgl %0, %P1", X86_BUG_11AP,
+	alternative_io("movl %0, %1", "xchgl %0, %1", X86_BUG_11AP,
 		       ASM_OUTPUT2("=r" (v), "=m" (*addr)),
 		       ASM_OUTPUT2("0" (v), "m" (*addr)));
 }
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 811548f..438c0c8 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -587,7 +587,7 @@ extern char			ignore_fpu_irq;
 # define BASE_PREFETCH		""
 # define ARCH_HAS_PREFETCH
 #else
-# define BASE_PREFETCH		"prefetcht0 %P1"
+# define BASE_PREFETCH		"prefetcht0 %1"
 #endif
 
 /*
@@ -598,7 +598,7 @@ extern char			ignore_fpu_irq;
  */
 static inline void prefetch(const void *x)
 {
-	alternative_input(BASE_PREFETCH, "prefetchnta %P1",
+	alternative_input(BASE_PREFETCH, "prefetchnta %1",
 			  X86_FEATURE_XMM,
 			  "m" (*(const char *)x));
 }
@@ -610,7 +610,7 @@ static inline void prefetch(const void *x)
  */
 static __always_inline void prefetchw(const void *x)
 {
-	alternative_input(BASE_PREFETCH, "prefetchw %P1",
+	alternative_input(BASE_PREFETCH, "prefetchw %1",
 			  X86_FEATURE_3DNOWPREFETCH,
 			  "m" (*(const char *)x));
 }
diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
index 2e9fc5c..0ee2ba5 100644
--- a/arch/x86/include/asm/special_insns.h
+++ b/arch/x86/include/asm/special_insns.h
@@ -182,8 +182,8 @@ static __always_inline void clflush(volatile void *__p)
 
 static inline void clflushopt(volatile void *__p)
 {
-	alternative_io(".byte 0x3e; clflush %P0",
-		       ".byte 0x66; clflush %P0",
+	alternative_io(".byte 0x3e; clflush %0",
+		       ".byte 0x66; clflush %0",
 		       X86_FEATURE_CLFLUSHOPT,
 		       "+m" (*(volatile char __force *)__p));
 }

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P in asm templates
  2024-03-19 10:40 [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P in asm templates Uros Bizjak
                   ` (2 preceding siblings ...)
  2024-03-19 10:40 ` [PATCH -tip 3/3] x86/asm: Use %a " Uros Bizjak
@ 2024-03-19 12:45 ` Borislav Petkov
  2024-03-19 13:09 ` Brian Gerst
  4 siblings, 0 replies; 10+ messages in thread
From: Borislav Petkov @ 2024-03-19 12:45 UTC (permalink / raw)
  To: Uros Bizjak
  Cc: x86, linux-kernel, Andy Lutomirski, Brian Gerst, Denys Vlasenko,
	H . Peter Anvin, Linus Torvalds, Ingo Molnar, Josh Poimboeuf,
	Sean Christopherson

On Tue, Mar 19, 2024 at 11:40:11AM +0100, Uros Bizjak wrote:
> The "P" asm operand modifier is a x86 target-specific modifier.
> 
> For x86_64, when used with a symbol reference, the "P" modifier
> emits "sym" instead of "sym(%rip)". When used with a constant, the
> "P" modifier emits "cst" instead of "$cst". This property is used to
> emit bare symbol references and bare constants without all
> syntax-specific prefixes.
> 
> The generic "c", "n" and "a" operand modifiers should be used instead.
> The following table shows the modifiers supported by all targets and
> their effects:
> 
> Modifier    Description
> -----------------------------------------------------------
> 'c'         Require a constant operand and print the
>             constant expression with no punctuation.
> 'n'         Like '%c' except that the value of the constant
>             is negated before printing.
> 'a'         Substitute a memory reference, with the actual
>             operand treated as the address.  This may be
>             useful when outputting a "load address"
>             instruction, because often the assembler syntax
>             for such an instruction requires you to write
>             the operand as if it were a memory reference.
> 
> Also note that unlike GCC, clang emits %rip-relative symbol
> reference with "P" asm operand modifier, so the patch also unifies
> symbol handling with both compilers.

FTR, I really appreciate the clear explanations of the operand modifiers
along with an example in the commit messages. What they really do and
what they mean have caused some serious head-scratching in the past, up
to the point where I went through gcc sources with Matz' help to figure
out what some of them do.

So thanks!

:-)

-- 
Regards/Gruss,
    Boris.

https://people.kernel.org/tglx/notes-about-netiquette

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P in asm templates
  2024-03-19 10:40 [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P in asm templates Uros Bizjak
                   ` (3 preceding siblings ...)
  2024-03-19 12:45 ` [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P " Borislav Petkov
@ 2024-03-19 13:09 ` Brian Gerst
  2024-03-19 13:24   ` Uros Bizjak
  4 siblings, 1 reply; 10+ messages in thread
From: Brian Gerst @ 2024-03-19 13:09 UTC (permalink / raw)
  To: Uros Bizjak
  Cc: x86, linux-kernel, Andy Lutomirski, Denys Vlasenko,
	H . Peter Anvin, Linus Torvalds, Ingo Molnar, Josh Poimboeuf,
	Sean Christopherson

On Tue, Mar 19, 2024 at 6:44 AM Uros Bizjak <ubizjak@gmail.com> wrote:
>
> The "P" asm operand modifier is a x86 target-specific modifier.
>
> For x86_64, when used with a symbol reference, the "P" modifier
> emits "sym" instead of "sym(%rip)". When used with a constant, the
> "P" modifier emits "cst" instead of "$cst". This property is used to
> emit bare symbol references and bare constants without all
> syntax-specific prefixes.
>
> The generic "c", "n" and "a" operand modifiers should be used instead.
> The following table shows the modifiers supported by all targets and
> their effects:
>
> Modifier    Description
> -----------------------------------------------------------
> 'c'         Require a constant operand and print the
>             constant expression with no punctuation.
> 'n'         Like '%c' except that the value of the constant
>             is negated before printing.
> 'a'         Substitute a memory reference, with the actual
>             operand treated as the address.  This may be
>             useful when outputting a "load address"
>             instruction, because often the assembler syntax
>             for such an instruction requires you to write
>             the operand as if it were a memory reference.
>
> Also note that unlike GCC, clang emits %rip-relative symbol
> reference with "P" asm operand modifier, so the patch also unifies
> symbol handling with both compilers.
>
> No functional changes intended.
>
> Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
> Cc: Andy Lutomirski <luto@kernel.org>
> Cc: Brian Gerst <brgerst@gmail.com>
> Cc: Denys Vlasenko <dvlasenk@redhat.com>
> Cc: H. Peter Anvin <hpa@zytor.com>
> Cc: Linus Torvalds <torvalds@linux-foundation.org>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: Josh Poimboeuf <jpoimboe@redhat.com>
> Cc: Sean Christopherson <seanjc@google.com>
>
> Uros Bizjak (3):
>   x86/asm: Remove %P operand modifier from altinstr asm templates
>   x86/asm: Use %c/%n instead of %P operand modifier in asm templates
>   x86/asm: Use %a instead of %P operand modifier in asm templates
>
>  arch/x86/boot/main.c                 |  4 ++--
>  arch/x86/include/asm/alternative.h   | 22 +++++++++++-----------
>  arch/x86/include/asm/apic.h          |  2 +-
>  arch/x86/include/asm/atomic64_32.h   |  2 +-
>  arch/x86/include/asm/cpufeature.h    |  4 ++--
>  arch/x86/include/asm/irq_stack.h     |  2 +-
>  arch/x86/include/asm/processor.h     |  6 +++---
>  arch/x86/include/asm/special_insns.h |  4 ++--
>  arch/x86/include/asm/uaccess.h       |  4 ++--
>  9 files changed, 25 insertions(+), 25 deletions(-)
>
> --
> 2.44.0
>

My one concern is does this work with older compilers?  Technically,
GCC 5.1 is still supported.  I seem to recall some issues around these
modifiers in the past, but don't remember any details.  Otherwise,
it's a nice cleanup.


Brian Gerst

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P in asm templates
  2024-03-19 13:09 ` Brian Gerst
@ 2024-03-19 13:24   ` Uros Bizjak
  0 siblings, 0 replies; 10+ messages in thread
From: Uros Bizjak @ 2024-03-19 13:24 UTC (permalink / raw)
  To: Brian Gerst
  Cc: x86, linux-kernel, Andy Lutomirski, Denys Vlasenko,
	H . Peter Anvin, Linus Torvalds, Ingo Molnar, Josh Poimboeuf,
	Sean Christopherson

On Tue, Mar 19, 2024 at 2:10 PM Brian Gerst <brgerst@gmail.com> wrote:
>
> On Tue, Mar 19, 2024 at 6:44 AM Uros Bizjak <ubizjak@gmail.com> wrote:
> >
> > The "P" asm operand modifier is a x86 target-specific modifier.
> >
> > For x86_64, when used with a symbol reference, the "P" modifier
> > emits "sym" instead of "sym(%rip)". When used with a constant, the
> > "P" modifier emits "cst" instead of "$cst". This property is used to
> > emit bare symbol references and bare constants without all
> > syntax-specific prefixes.
> >
> > The generic "c", "n" and "a" operand modifiers should be used instead.
> > The following table shows the modifiers supported by all targets and
> > their effects:
> >
> > Modifier    Description
> > -----------------------------------------------------------
> > 'c'         Require a constant operand and print the
> >             constant expression with no punctuation.
> > 'n'         Like '%c' except that the value of the constant
> >             is negated before printing.
> > 'a'         Substitute a memory reference, with the actual
> >             operand treated as the address.  This may be
> >             useful when outputting a "load address"
> >             instruction, because often the assembler syntax
> >             for such an instruction requires you to write
> >             the operand as if it were a memory reference.
> >
> > Also note that unlike GCC, clang emits %rip-relative symbol
> > reference with "P" asm operand modifier, so the patch also unifies
> > symbol handling with both compilers.
> >
> > No functional changes intended.
> >
> > Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
> > Cc: Andy Lutomirski <luto@kernel.org>
> > Cc: Brian Gerst <brgerst@gmail.com>
> > Cc: Denys Vlasenko <dvlasenk@redhat.com>
> > Cc: H. Peter Anvin <hpa@zytor.com>
> > Cc: Linus Torvalds <torvalds@linux-foundation.org>
> > Cc: Ingo Molnar <mingo@kernel.org>
> > Cc: Josh Poimboeuf <jpoimboe@redhat.com>
> > Cc: Sean Christopherson <seanjc@google.com>
> >
> > Uros Bizjak (3):
> >   x86/asm: Remove %P operand modifier from altinstr asm templates
> >   x86/asm: Use %c/%n instead of %P operand modifier in asm templates
> >   x86/asm: Use %a instead of %P operand modifier in asm templates
> >
> >  arch/x86/boot/main.c                 |  4 ++--
> >  arch/x86/include/asm/alternative.h   | 22 +++++++++++-----------
> >  arch/x86/include/asm/apic.h          |  2 +-
> >  arch/x86/include/asm/atomic64_32.h   |  2 +-
> >  arch/x86/include/asm/cpufeature.h    |  4 ++--
> >  arch/x86/include/asm/irq_stack.h     |  2 +-
> >  arch/x86/include/asm/processor.h     |  6 +++---
> >  arch/x86/include/asm/special_insns.h |  4 ++--
> >  arch/x86/include/asm/uaccess.h       |  4 ++--
> >  9 files changed, 25 insertions(+), 25 deletions(-)
> >
> > --
> > 2.44.0
> >
>
> My one concern is does this work with older compilers?  Technically,
> GCC 5.1 is still supported.  I seem to recall some issues around these
> modifiers in the past, but don't remember any details.  Otherwise,
> it's a nice cleanup.

It will work. Please see [1] for a testcase.

[1] https://godbolt.org/z/eb6rcz8YW

Uros.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-03-19 13:24 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-19 10:40 [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P in asm templates Uros Bizjak
2024-03-19 10:40 ` [PATCH -tip 1/3] x86/asm: Remove %P operand modifier from altinstr " Uros Bizjak
2024-03-19 12:31   ` [tip: x86/asm] " tip-bot2 for Uros Bizjak
2024-03-19 10:40 ` [PATCH -tip 2/3] x86/asm: Use %c/%n instead of %P operand modifier in " Uros Bizjak
2024-03-19 12:31   ` [tip: x86/asm] " tip-bot2 for Uros Bizjak
2024-03-19 10:40 ` [PATCH -tip 3/3] x86/asm: Use %a " Uros Bizjak
2024-03-19 12:31   ` [tip: x86/asm] " tip-bot2 for Uros Bizjak
2024-03-19 12:45 ` [PATCH -tip 0/3] x86/asm: Use generic asm operand modifiers instead of %P " Borislav Petkov
2024-03-19 13:09 ` Brian Gerst
2024-03-19 13:24   ` Uros Bizjak

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox