[RFC PATCH 0/4] x86/asm: Add ASM_CALL() macro for inline asms with call instructions

From: Josh Poimboeuf
Date: Thu Aug 31 2017 - 10:13:33 EST


Making this RFC because I'm not sure if there's a better solution (like
maybe trying to convince the clang folks to support the undocumented GCC
syntax for this). Opinions and better ideas welcome.


For inline asm statements which have a "call" instruction, we have to
set the stack pointer as a constraint to convince GCC to ensure the
frame pointer is set up first:

register void *__sp asm(_ASM_SP);
asm("call foo" : "+r" (__sp))

Clang doesn't have a known way to do the same thing. Doing the sp
constraint thing causes it to corrupt the stack pointer.

Patch 4/4 adds a wrapper around such inline asm statements.

Before:
register void *__sp asm(_ASM_SP);
asm("call foo" : outputs, "+r" (__sp) : inputs : clobbers);

After:
ASM_CALL("call foo", outputs, inputs, clobbers);


A limitation of the wrapper is that it doesn't support positional
operand names ("%0") and constraints ("0" (foo)).


The benefits of the wrapper are:

- Allows clang-built kernels to boot.

- Removes the stack pointer constraint with CONFIG_FRAME_POINTER=n
(which may soon become the default).

- Will make it easy to handle if we ever get a documented way to do
this.


NOTE: Patch 4/4 triggers a bug in the sparse preprocessor which causes
the kbuild robot to complain. I've reported the bug to the sparse
mailing list.


Josh Poimboeuf (4):
x86/paravirt: Fix output constraint macro names
x86/asm: Convert some inline asm positional operands to named operands
x86/asm: Make alternative macro interfaces more clear and consistent
x86/asm: Use ASM_CALL() macro for inline asm statements with call
instructions

arch/x86/include/asm/alternative.h | 72 ++++-------
arch/x86/include/asm/apic.h | 7 +-
arch/x86/include/asm/arch_hweight.h | 14 +-
arch/x86/include/asm/atomic64_32.h | 101 +++++++++------
arch/x86/include/asm/cmpxchg_32.h | 20 +--
arch/x86/include/asm/mshyperv.h | 51 ++++----
arch/x86/include/asm/page_64.h | 6 +-
arch/x86/include/asm/paravirt_types.h | 86 ++++++-------
arch/x86/include/asm/percpu.h | 13 +-
arch/x86/include/asm/preempt.h | 15 +--
arch/x86/include/asm/processor.h | 41 +++---
arch/x86/include/asm/rwsem.h | 155 ++++++++++++-----------
arch/x86/include/asm/special_insns.h | 7 +-
arch/x86/include/asm/uaccess.h | 24 ++--
arch/x86/include/asm/uaccess_64.h | 16 +--
arch/x86/include/asm/xen/hypercall.h | 59 +++++----
arch/x86/kvm/emulate.c | 9 +-
arch/x86/kvm/vmx.c | 17 +--
arch/x86/mm/fault.c | 13 +-
include/linux/compiler-clang.h | 2 +
include/linux/compiler-gcc.h | 19 +++
include/linux/compiler.h | 34 +++++
tools/objtool/Documentation/stack-validation.txt | 19 +--
23 files changed, 427 insertions(+), 373 deletions(-)

--
2.13.5