Fangrui Song
unread,Apr 5, 2020, 9:09:04 PM4/5/20Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to Peter Zijlstra, x...@kernel.org, linux-...@vger.kernel.org, ros...@goodmis.org, mhir...@kernel.org, bri...@redhat.com, jba...@akamai.com, torv...@linux-foundation.org, tg...@linutronix.de, mi...@kernel.org, na...@vmware.com, h...@zytor.com, lu...@kernel.org, ard.bie...@linaro.org, jpoi...@redhat.com, clang-bu...@googlegroups.com
On 2020-03-24, Peter Zijlstra wrote:
>Add the x86 out-of-line static call implementation. For each key, a
>permanent trampoline is created which is the destination for all static
>calls for the given key. The trampoline has a direct jump which gets
>patched by static_call_update() when the destination function changes.
>
>Signed-off-by: Josh Poimboeuf <
jpoi...@redhat.com>
>[peterz: fixed trampoline, rewrote patching code]
>Signed-off-by: Peter Zijlstra (Intel) <
pet...@infradead.org>
>---
> arch/x86/Kconfig | 1 +
> arch/x86/include/asm/static_call.h | 22 ++++++++++++++++++++++
> arch/x86/kernel/Makefile | 1 +
> arch/x86/kernel/static_call.c | 31 +++++++++++++++++++++++++++++++
> 4 files changed, 55 insertions(+)
> create mode 100644 arch/x86/include/asm/static_call.h
> create mode 100644 arch/x86/kernel/static_call.c
>
>--- a/arch/x86/Kconfig
>+++ b/arch/x86/Kconfig
>@@ -205,6 +205,7 @@ config X86
> select HAVE_FUNCTION_ARG_ACCESS_API
> select HAVE_STACKPROTECTOR if CC_HAS_SANE_STACKPROTECTOR
> select HAVE_STACK_VALIDATION if X86_64
>+ select HAVE_STATIC_CALL
> select HAVE_RSEQ
> select HAVE_SYSCALL_TRACEPOINTS
> select HAVE_UNSTABLE_SCHED_CLOCK
>--- /dev/null
>+++ b/arch/x86/include/asm/static_call.h
>@@ -0,0 +1,22 @@
>+/* SPDX-License-Identifier: GPL-2.0 */
>+#ifndef _ASM_STATIC_CALL_H
>+#define _ASM_STATIC_CALL_H
>+
>+#include <asm/text-patching.h>
>+
>+/*
>+ * For CONFIG_HAVE_STATIC_CALL, this is a permanent trampoline which
>+ * does a direct jump to the function. The direct jump gets patched by
>+ * static_call_update().
>+ */
>+#define ARCH_DEFINE_STATIC_CALL_TRAMP(name, func) \
>+ asm(".pushsection .text, \"ax\" \n" \
>+ ".align 4 \n" \
>+ ".globl " STATIC_CALL_TRAMP_STR(name) " \n" \
>+ STATIC_CALL_TRAMP_STR(name) ": \n" \
>+ " jmp.d32 " #func " \n" \
>+ ".type " STATIC_CALL_TRAMP_STR(name) ", @function \n" \
>+ ".size " STATIC_CALL_TRAMP_STR(name) ", . - " STATIC_CALL_TRAMP_STR(name) " \n" \
>+ ".popsection \n")
>+
>+#endif /* _ASM_STATIC_CALL_H */
Hi Peter,
Coming here from
https://github.com/ClangBuiltLinux/linux/issues/974
jmp.d32 is not recognized by clang integrated assembler.
The syntax appears to be very rarely used. According to Debian Code Search,
u-boot is the only project using this syntax.
In March 2017, gas added the pseudo prefix {disp32}
https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=86fa6981e7487e2c2df4337aa75ed2d93c32eaf2
which generalizes jmp.d32 ({disp32} jmp foo)
I wonder whether the instruction jmp.d32 can be replaced with the trick in
arch/x86/include/asm/jump_label.h for clang portability.
% grep -A2 'jmp.d32' arch/x86/include/asm/jump_label.h
/* Equivalent to "jmp.d32 \target" */
.byte 0xe9
.long \target - .Lstatic_jump_after_\@
...
+
clang-bu...@googlegroups.com