x86/asm: Add _ASM_RIP() macro for x86-64 (%rip) suffix
authorH. Peter Anvin (Intel) <hpa@zytor.com>
Fri, 10 Sep 2021 19:59:09 +0000 (12:59 -0700)
committerBorislav Petkov <bp@suse.de>
Mon, 13 Sep 2021 17:38:40 +0000 (19:38 +0200)
Add a macro _ASM_RIP() to add a (%rip) suffix on 64 bits only. This is
useful for immediate memory references where one doesn't want gcc
to possibly use a register indirection as it may in the case of an "m"
constraint.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20210910195910.2542662-3-hpa@zytor.com
arch/x86/include/asm/asm.h

index 3ad3da9a7d97451a42cf7b83aecfd9618483ce2f..c5a19ccda0fe77e29bb8a78421fecf1eb7cd2ee7 100644 (file)
@@ -6,11 +6,13 @@
 # define __ASM_FORM(x, ...)            x,## __VA_ARGS__
 # define __ASM_FORM_RAW(x, ...)                x,## __VA_ARGS__
 # define __ASM_FORM_COMMA(x, ...)      x,## __VA_ARGS__,
+# define __ASM_REGPFX                  %
 #else
 #include <linux/stringify.h>
 # define __ASM_FORM(x, ...)            " " __stringify(x,##__VA_ARGS__) " "
 # define __ASM_FORM_RAW(x, ...)                    __stringify(x,##__VA_ARGS__)
 # define __ASM_FORM_COMMA(x, ...)      " " __stringify(x,##__VA_ARGS__) ","
+# define __ASM_REGPFX                  %%
 #endif
 
 #define _ASM_BYTES(x, ...)     __ASM_FORM(.byte x,##__VA_ARGS__ ;)
@@ -49,6 +51,9 @@
 #define _ASM_SI                __ASM_REG(si)
 #define _ASM_DI                __ASM_REG(di)
 
+/* Adds a (%rip) suffix on 64 bits only; for immediate memory references */
+#define _ASM_RIP(x)    __ASM_SEL_RAW(x, x (__ASM_REGPFX rip))
+
 #ifndef __x86_64__
 /* 32 bit */