176b04384SDavid Woodhouse/* SPDX-License-Identifier: GPL-2.0 */ 276b04384SDavid Woodhouse 376b04384SDavid Woodhouse#include <linux/stringify.h> 476b04384SDavid Woodhouse#include <linux/linkage.h> 576b04384SDavid Woodhouse#include <asm/dwarf2.h> 676b04384SDavid Woodhouse#include <asm/cpufeatures.h> 776b04384SDavid Woodhouse#include <asm/alternative-asm.h> 876b04384SDavid Woodhouse#include <asm/export.h> 976b04384SDavid Woodhouse#include <asm/nospec-branch.h> 1076b04384SDavid Woodhouse 1176b04384SDavid Woodhouse.macro THUNK reg 12736e80a4SMasami Hiramatsu .section .text.__x86.indirect_thunk 1376b04384SDavid Woodhouse 1476b04384SDavid WoodhouseENTRY(__x86_indirect_thunk_\reg) 1576b04384SDavid Woodhouse CFI_STARTPROC 1676b04384SDavid Woodhouse JMP_NOSPEC %\reg 1776b04384SDavid Woodhouse CFI_ENDPROC 1876b04384SDavid WoodhouseENDPROC(__x86_indirect_thunk_\reg) 1976b04384SDavid Woodhouse.endm 2076b04384SDavid Woodhouse 2176b04384SDavid Woodhouse/* 2276b04384SDavid Woodhouse * Despite being an assembler file we can't just use .irp here 2376b04384SDavid Woodhouse * because __KSYM_DEPS__ only uses the C preprocessor and would 2476b04384SDavid Woodhouse * only see one instance of "__x86_indirect_thunk_\reg" rather 2576b04384SDavid Woodhouse * than one per register with the correct names. So we do it 2676b04384SDavid Woodhouse * the simple and nasty way... 2776b04384SDavid Woodhouse */ 28c1804a23SMasami Hiramatsu#define __EXPORT_THUNK(sym) _ASM_NOKPROBE(sym); EXPORT_SYMBOL(sym) 29c1804a23SMasami Hiramatsu#define EXPORT_THUNK(reg) __EXPORT_THUNK(__x86_indirect_thunk_ ## reg) 3076b04384SDavid Woodhouse#define GENERATE_THUNK(reg) THUNK reg ; EXPORT_THUNK(reg) 3176b04384SDavid Woodhouse 3276b04384SDavid WoodhouseGENERATE_THUNK(_ASM_AX) 3376b04384SDavid WoodhouseGENERATE_THUNK(_ASM_BX) 3476b04384SDavid WoodhouseGENERATE_THUNK(_ASM_CX) 3576b04384SDavid WoodhouseGENERATE_THUNK(_ASM_DX) 3676b04384SDavid WoodhouseGENERATE_THUNK(_ASM_SI) 3776b04384SDavid WoodhouseGENERATE_THUNK(_ASM_DI) 3876b04384SDavid WoodhouseGENERATE_THUNK(_ASM_BP) 3976b04384SDavid WoodhouseGENERATE_THUNK(_ASM_SP) 4076b04384SDavid Woodhouse#ifdef CONFIG_64BIT 4176b04384SDavid WoodhouseGENERATE_THUNK(r8) 4276b04384SDavid WoodhouseGENERATE_THUNK(r9) 4376b04384SDavid WoodhouseGENERATE_THUNK(r10) 4476b04384SDavid WoodhouseGENERATE_THUNK(r11) 4576b04384SDavid WoodhouseGENERATE_THUNK(r12) 4676b04384SDavid WoodhouseGENERATE_THUNK(r13) 4776b04384SDavid WoodhouseGENERATE_THUNK(r14) 4876b04384SDavid WoodhouseGENERATE_THUNK(r15) 4976b04384SDavid Woodhouse#endif 50