diff --git a/arch/x86/include/asm/compiler.h b/arch/x86/include/asm/compiler.h new file mode 100644 index 000000000000..37c9dea50be6 --- /dev/null +++ b/arch/x86/include/asm/compiler.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __ASM_X86_COMPILER_H +#define __ASM_X86_COMPILER_H + +/* + * Substitute a memory reference, with the actual + * operand treated as the address. + */ + +#ifdef __clang__ +#define __memref(x) "%P" #x +#else +#define __memref(x) "%a" #x +#endif + +#endif /* __ASM_X86_COMPILER_H */ diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index 60ea7755c0fe..92b8d60a3bf5 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h @@ -26,6 +26,7 @@ #include #include +#include #ifdef CONFIG_SMP @@ -71,7 +72,7 @@ #define __my_cpu_ptr(ptr) (__my_cpu_type(*ptr) *)(uintptr_t)(ptr) #define __my_cpu_var(var) (*__my_cpu_ptr(&var)) #define __percpu_arg(x) __percpu_prefix "%" #x -#define __force_percpu_arg(x) __force_percpu_prefix "%" #x +#define __force_percpu_memref(x) __force_percpu_prefix __memref(x) /* * Initialized pointers to per-cpu variables needed for the boot @@ -175,7 +176,7 @@ do { \ #define percpu_stable_op(size, op, _var) \ ({ \ __pcpu_type_##size pfo_val__; \ - asm(__pcpu_op2_##size(op, __force_percpu_arg(P[var]), "%[val]") \ + asm(__pcpu_op2_##size(op, __force_percpu_memref([var]), "%[val]") \ : [val] __pcpu_reg_##size("=", pfo_val__) \ : [var] "p" (&(_var))); \ (typeof(_var))(unsigned long) pfo_val__; \ diff --git a/arch/x86/mm/mem_encrypt_identity.c b/arch/x86/mm/mem_encrypt_identity.c index d73aeb16417f..6768f586ab51 100644 --- a/arch/x86/mm/mem_encrypt_identity.c +++ b/arch/x86/mm/mem_encrypt_identity.c @@ -43,6 +43,7 @@ #include #include +#include #include #include #include @@ -582,13 +583,13 @@ void __init sme_enable(struct boot_params *bp) * identity mapped, so we must obtain the address to the SME command * line argument data using rip-relative addressing. */ - asm ("lea sme_cmdline_arg(%%rip), %0" + asm ("lea " __memref(1) ", %0" : "=r" (cmdline_arg) : "p" (sme_cmdline_arg)); - asm ("lea sme_cmdline_on(%%rip), %0" + asm ("lea " __memref(1) ", %0" : "=r" (cmdline_on) : "p" (sme_cmdline_on)); - asm ("lea sme_cmdline_off(%%rip), %0" + asm ("lea " __memref(1) ", %0" : "=r" (cmdline_off) : "p" (sme_cmdline_off));