mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.8 KiB
47 lines
1.8 KiB
/* 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_INLINE, this is a temporary trampoline which |
|
* uses the current value of the key->func pointer to do an indirect jump to |
|
* the function. This trampoline is only used during boot, before the call |
|
* sites get patched by static_call_update(). The name of this trampoline has |
|
* a magical aspect: objtool uses it to find static call sites so it can create |
|
* the .static_call_sites section. |
|
* |
|
* 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(). |
|
* |
|
* Having the trampoline in a special section forces GCC to emit a JMP.d32 when |
|
* it does tail-call optimization on the call; since you cannot compute the |
|
* relative displacement across sections. |
|
*/ |
|
|
|
#define __ARCH_DEFINE_STATIC_CALL_TRAMP(name, insns) \ |
|
asm(".pushsection .static_call.text, \"ax\" \n" \ |
|
".align 4 \n" \ |
|
".globl " STATIC_CALL_TRAMP_STR(name) " \n" \ |
|
STATIC_CALL_TRAMP_STR(name) ": \n" \ |
|
insns " \n" \ |
|
".type " STATIC_CALL_TRAMP_STR(name) ", @function \n" \ |
|
".size " STATIC_CALL_TRAMP_STR(name) ", . - " STATIC_CALL_TRAMP_STR(name) " \n" \ |
|
".popsection \n") |
|
|
|
#define ARCH_DEFINE_STATIC_CALL_TRAMP(name, func) \ |
|
__ARCH_DEFINE_STATIC_CALL_TRAMP(name, ".byte 0xe9; .long " #func " - (. + 4)") |
|
|
|
#define ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name) \ |
|
__ARCH_DEFINE_STATIC_CALL_TRAMP(name, "ret; nop; nop; nop; nop") |
|
|
|
|
|
#define ARCH_ADD_TRAMP_KEY(name) \ |
|
asm(".pushsection .static_call_tramp_key, \"a\" \n" \ |
|
".long " STATIC_CALL_TRAMP_STR(name) " - . \n" \ |
|
".long " STATIC_CALL_KEY_STR(name) " - . \n" \ |
|
".popsection \n") |
|
|
|
#endif /* _ASM_STATIC_CALL_H */
|
|
|