xref: /openbmc/linux/arch/x86/lib/retpoline.S (revision c1804a23)
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