cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

static_call.h (2058B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASM_STATIC_CALL_H
      3#define _ASM_STATIC_CALL_H
      4
      5#include <asm/text-patching.h>
      6
      7/*
      8 * For CONFIG_HAVE_STATIC_CALL_INLINE, this is a temporary trampoline which
      9 * uses the current value of the key->func pointer to do an indirect jump to
     10 * the function.  This trampoline is only used during boot, before the call
     11 * sites get patched by static_call_update().  The name of this trampoline has
     12 * a magical aspect: objtool uses it to find static call sites so it can create
     13 * the .static_call_sites section.
     14 *
     15 * For CONFIG_HAVE_STATIC_CALL, this is a permanent trampoline which
     16 * does a direct jump to the function.  The direct jump gets patched by
     17 * static_call_update().
     18 *
     19 * Having the trampoline in a special section forces GCC to emit a JMP.d32 when
     20 * it does tail-call optimization on the call; since you cannot compute the
     21 * relative displacement across sections.
     22 */
     23
     24#define __ARCH_DEFINE_STATIC_CALL_TRAMP(name, insns)			\
     25	asm(".pushsection .static_call.text, \"ax\"		\n"	\
     26	    ".align 4						\n"	\
     27	    ".globl " STATIC_CALL_TRAMP_STR(name) "		\n"	\
     28	    STATIC_CALL_TRAMP_STR(name) ":			\n"	\
     29	    ANNOTATE_NOENDBR						\
     30	    insns "						\n"	\
     31	    ".byte 0x53, 0x43, 0x54				\n"	\
     32	    ".type " STATIC_CALL_TRAMP_STR(name) ", @function	\n"	\
     33	    ".size " STATIC_CALL_TRAMP_STR(name) ", . - " STATIC_CALL_TRAMP_STR(name) " \n" \
     34	    ".popsection					\n")
     35
     36#define ARCH_DEFINE_STATIC_CALL_TRAMP(name, func)			\
     37	__ARCH_DEFINE_STATIC_CALL_TRAMP(name, ".byte 0xe9; .long " #func " - (. + 4)")
     38
     39#define ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name)			\
     40	__ARCH_DEFINE_STATIC_CALL_TRAMP(name, "ret; int3; nop; nop; nop")
     41
     42#define ARCH_DEFINE_STATIC_CALL_RET0_TRAMP(name)			\
     43	ARCH_DEFINE_STATIC_CALL_TRAMP(name, __static_call_return0)
     44
     45#define ARCH_ADD_TRAMP_KEY(name)					\
     46	asm(".pushsection .static_call_tramp_key, \"a\"		\n"	\
     47	    ".long " STATIC_CALL_TRAMP_STR(name) " - .		\n"	\
     48	    ".long " STATIC_CALL_KEY_STR(name) " - .		\n"	\
     49	    ".popsection					\n")
     50
     51#endif /* _ASM_STATIC_CALL_H */