x86/asm: Remove %P operand modifier from altinstr asm templates
authorUros Bizjak <ubizjak@gmail.com>
Tue, 19 Mar 2024 10:40:12 +0000 (11:40 +0100)
committerIngo Molnar <mingo@kernel.org>
Tue, 19 Mar 2024 12:15:34 +0000 (13:15 +0100)
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
arch/x86/include/asm/processor.h
arch/x86/include/asm/special_insns.h

index 94ce0f7c9d3a26cd2b766a60042a0b941b3fe0d2..fa2e4244654ec5f39c8387bee2e45485f29bcbe2 100644 (file)
@@ -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)));
 }
index 811548f131f4e30418bedfdf98f1f302fc06723d..438c0c8f596af594609c4c08025639d9c8e19681 100644 (file)
@@ -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));
 }
index 2e9fc5c400cdc364a306f5d0f3c7dda305070627..0ee2ba589492b9b3ebf85e75b70d9a74ae279a1a 100644 (file)
@@ -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));
 }