xref: /OK3568_Linux_fs/kernel/arch/x86/entry/thunk_64.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun * Save registers before calling assembly functions. This avoids
4*4882a593Smuzhiyun * disturbance of register allocation in some inline assembly constructs.
5*4882a593Smuzhiyun * Copyright 2001,2002 by Andi Kleen, SuSE Labs.
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun#include <linux/linkage.h>
8*4882a593Smuzhiyun#include "calling.h"
9*4882a593Smuzhiyun#include <asm/asm.h>
10*4882a593Smuzhiyun#include <asm/export.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun	/* rdi:	arg1 ... normal C conventions. rax is saved/restored. */
13*4882a593Smuzhiyun	.macro THUNK name, func, put_ret_addr_in_rdi=0
14*4882a593SmuzhiyunSYM_FUNC_START_NOALIGN(\name)
15*4882a593Smuzhiyun	pushq %rbp
16*4882a593Smuzhiyun	movq %rsp, %rbp
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun	pushq %rdi
19*4882a593Smuzhiyun	pushq %rsi
20*4882a593Smuzhiyun	pushq %rdx
21*4882a593Smuzhiyun	pushq %rcx
22*4882a593Smuzhiyun	pushq %rax
23*4882a593Smuzhiyun	pushq %r8
24*4882a593Smuzhiyun	pushq %r9
25*4882a593Smuzhiyun	pushq %r10
26*4882a593Smuzhiyun	pushq %r11
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun	.if \put_ret_addr_in_rdi
29*4882a593Smuzhiyun	/* 8(%rbp) is return addr on stack */
30*4882a593Smuzhiyun	movq 8(%rbp), %rdi
31*4882a593Smuzhiyun	.endif
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun	call \func
34*4882a593Smuzhiyun	jmp  __thunk_restore
35*4882a593SmuzhiyunSYM_FUNC_END(\name)
36*4882a593Smuzhiyun	_ASM_NOKPROBE(\name)
37*4882a593Smuzhiyun	.endm
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	THUNK preempt_schedule_thunk, preempt_schedule
40*4882a593Smuzhiyun	THUNK preempt_schedule_notrace_thunk, preempt_schedule_notrace
41*4882a593Smuzhiyun	EXPORT_SYMBOL(preempt_schedule_thunk)
42*4882a593Smuzhiyun	EXPORT_SYMBOL(preempt_schedule_notrace_thunk)
43*4882a593Smuzhiyun
44*4882a593SmuzhiyunSYM_CODE_START_LOCAL_NOALIGN(__thunk_restore)
45*4882a593Smuzhiyun	popq %r11
46*4882a593Smuzhiyun	popq %r10
47*4882a593Smuzhiyun	popq %r9
48*4882a593Smuzhiyun	popq %r8
49*4882a593Smuzhiyun	popq %rax
50*4882a593Smuzhiyun	popq %rcx
51*4882a593Smuzhiyun	popq %rdx
52*4882a593Smuzhiyun	popq %rsi
53*4882a593Smuzhiyun	popq %rdi
54*4882a593Smuzhiyun	popq %rbp
55*4882a593Smuzhiyun	RET
56*4882a593Smuzhiyun	_ASM_NOKPROBE(__thunk_restore)
57*4882a593SmuzhiyunSYM_CODE_END(__thunk_restore)
58