diff options
Diffstat (limited to '')
-rw-r--r-- | arch/x86/entry/thunk_64.S | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/arch/x86/entry/thunk_64.S b/arch/x86/entry/thunk_64.S new file mode 100644 index 000000000..14776163f --- /dev/null +++ b/arch/x86/entry/thunk_64.S @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Save registers before calling assembly functions. This avoids + * disturbance of register allocation in some inline assembly constructs. + * Copyright 2001,2002 by Andi Kleen, SuSE Labs. + */ +#include <linux/linkage.h> +#include "calling.h" +#include <asm/asm.h> +#include <asm/export.h> + + /* rdi: arg1 ... normal C conventions. rax is saved/restored. */ + .macro THUNK name, func, put_ret_addr_in_rdi=0 +SYM_FUNC_START_NOALIGN(\name) + pushq %rbp + movq %rsp, %rbp + + pushq %rdi + pushq %rsi + pushq %rdx + pushq %rcx + pushq %rax + pushq %r8 + pushq %r9 + pushq %r10 + pushq %r11 + + .if \put_ret_addr_in_rdi + /* 8(%rbp) is return addr on stack */ + movq 8(%rbp), %rdi + .endif + + call \func + jmp __thunk_restore +SYM_FUNC_END(\name) + _ASM_NOKPROBE(\name) + .endm + + THUNK preempt_schedule_thunk, preempt_schedule + THUNK preempt_schedule_notrace_thunk, preempt_schedule_notrace + EXPORT_SYMBOL(preempt_schedule_thunk) + EXPORT_SYMBOL(preempt_schedule_notrace_thunk) + +SYM_CODE_START_LOCAL_NOALIGN(__thunk_restore) + popq %r11 + popq %r10 + popq %r9 + popq %r8 + popq %rax + popq %rcx + popq %rdx + popq %rsi + popq %rdi + popq %rbp + RET + _ASM_NOKPROBE(__thunk_restore) +SYM_CODE_END(__thunk_restore) |