xref: /f-stack/app/micro_thread/arch_ctx.S (revision a9643ea8)
1*a9643ea8Slogwang
2*a9643ea8Slogwang/**
3*a9643ea8Slogwang * Tencent is pleased to support the open source community by making MSEC available.
4*a9643ea8Slogwang *
5*a9643ea8Slogwang * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
6*a9643ea8Slogwang *
7*a9643ea8Slogwang * Licensed under the GNU General Public License, Version 2.0 (the "License");
8*a9643ea8Slogwang * you may not use this file except in compliance with the License. You may
9*a9643ea8Slogwang * obtain a copy of the License at
10*a9643ea8Slogwang *
11*a9643ea8Slogwang *     https://opensource.org/licenses/GPL-2.0
12*a9643ea8Slogwang *
13*a9643ea8Slogwang * Unless required by applicable law or agreed to in writing, software distributed under the
14*a9643ea8Slogwang * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
15*a9643ea8Slogwang * either express or implied. See the License for the specific language governing permissions
16*a9643ea8Slogwang * and limitations under the License.
17*a9643ea8Slogwang */
18*a9643ea8Slogwang
19*a9643ea8Slogwang
20*a9643ea8Slogwang#
21*a9643ea8Slogwang#  context  x86 or x86_64 save and restore
22*a9643ea8Slogwang#
23*a9643ea8Slogwang#  x86_64    x86
24*a9643ea8Slogwang# 0	%rbx    %ebx
25*a9643ea8Slogwang# 1	%rsp    %esp
26*a9643ea8Slogwang# 2	%rbp    %ebp
27*a9643ea8Slogwang# 3	%r12    %esi
28*a9643ea8Slogwang# 4	%r13    %edi
29*a9643ea8Slogwang# 5	%r14    %eip
30*a9643ea8Slogwang# 6	%r15
31*a9643ea8Slogwang# 7	%rip
32*a9643ea8Slogwang
33*a9643ea8Slogwang
34*a9643ea8Slogwang
35*a9643ea8Slogwang#if  defined(__amd64__) || defined(__x86_64__)
36*a9643ea8Slogwang
37*a9643ea8Slogwang##
38*a9643ea8Slogwang#  @brief save_context
39*a9643ea8Slogwang##
40*a9643ea8Slogwang	.text
41*a9643ea8Slogwang	.align 4
42*a9643ea8Slogwang	.globl save_context
43*a9643ea8Slogwang	.type save_context, @function
44*a9643ea8Slogwangsave_context:
45*a9643ea8Slogwang	pop  %rsi
46*a9643ea8Slogwang	xorl %eax,%eax
47*a9643ea8Slogwang	movq %rbx,(%rdi)
48*a9643ea8Slogwang	movq %rsp,8(%rdi)
49*a9643ea8Slogwang	push %rsi
50*a9643ea8Slogwang	movq %rbp,16(%rdi)
51*a9643ea8Slogwang	movq %r12,24(%rdi)
52*a9643ea8Slogwang	movq %r13,32(%rdi)
53*a9643ea8Slogwang	movq %r14,40(%rdi)
54*a9643ea8Slogwang	movq %r15,48(%rdi)
55*a9643ea8Slogwang	movq %rsi,56(%rdi)
56*a9643ea8Slogwang	ret
57*a9643ea8Slogwang
58*a9643ea8Slogwang	.size save_context,.-save_context
59*a9643ea8Slogwang
60*a9643ea8Slogwang##
61*a9643ea8Slogwang#  @brief restore_context
62*a9643ea8Slogwang##
63*a9643ea8Slogwang	.text
64*a9643ea8Slogwang	.align 4
65*a9643ea8Slogwang	.globl restore_context
66*a9643ea8Slogwang	.type restore_context, @function
67*a9643ea8Slogwangrestore_context:
68*a9643ea8Slogwang	movl %esi,%eax
69*a9643ea8Slogwang	movq (%rdi),%rbx
70*a9643ea8Slogwang	movq 8(%rdi),%rsp
71*a9643ea8Slogwang	movq 16(%rdi),%rbp
72*a9643ea8Slogwang	movq 24(%rdi),%r12
73*a9643ea8Slogwang	movq 32(%rdi),%r13
74*a9643ea8Slogwang	movq 40(%rdi),%r14
75*a9643ea8Slogwang	movq 48(%rdi),%r15
76*a9643ea8Slogwang	jmp *56(%rdi)
77*a9643ea8Slogwang
78*a9643ea8Slogwang	.size restore_context,.-restore_context
79*a9643ea8Slogwang
80*a9643ea8Slogwang##
81*a9643ea8Slogwang#  @brief replace_esp
82*a9643ea8Slogwang##
83*a9643ea8Slogwang	.text
84*a9643ea8Slogwang	.align 4
85*a9643ea8Slogwang	.globl replace_esp
86*a9643ea8Slogwang	.type replace_esp, @function
87*a9643ea8Slogwangreplace_esp:
88*a9643ea8Slogwang	movq %rsi,8(%rdi)
89*a9643ea8Slogwang	ret
90*a9643ea8Slogwang
91*a9643ea8Slogwang	.size replace_esp,.-replace_esp
92*a9643ea8Slogwang
93*a9643ea8Slogwang
94*a9643ea8Slogwang#elif defined(__i386__)
95*a9643ea8Slogwang
96*a9643ea8Slogwang##
97*a9643ea8Slogwang#  @brief save_context
98*a9643ea8Slogwang##
99*a9643ea8Slogwang	.text
100*a9643ea8Slogwang	.align 4
101*a9643ea8Slogwang	.globl save_context
102*a9643ea8Slogwang	.type save_context, @function
103*a9643ea8Slogwangsave_context:
104*a9643ea8Slogwang	movl 4(%esp),%edx
105*a9643ea8Slogwang	popl %ecx
106*a9643ea8Slogwang	xorl %eax,%eax
107*a9643ea8Slogwang	movl %ebx,(%edx)
108*a9643ea8Slogwang	movl %esp,4(%edx)
109*a9643ea8Slogwang	pushl %ecx
110*a9643ea8Slogwang	movl %ebp,8(%edx)
111*a9643ea8Slogwang	movl %esi,12(%edx)
112*a9643ea8Slogwang	movl %edi,16(%edx)
113*a9643ea8Slogwang	movl %ecx,20(%edx)
114*a9643ea8Slogwang	ret
115*a9643ea8Slogwang
116*a9643ea8Slogwang	.size save_context,.-save_context
117*a9643ea8Slogwang
118*a9643ea8Slogwang
119*a9643ea8Slogwang##
120*a9643ea8Slogwang#  @brief restore_context
121*a9643ea8Slogwang##
122*a9643ea8Slogwang	.text
123*a9643ea8Slogwang	.align 4
124*a9643ea8Slogwang	.globl restore_context
125*a9643ea8Slogwang	.type restore_context, @function
126*a9643ea8Slogwangrestore_context:
127*a9643ea8Slogwang	movl 4(%esp),%edx
128*a9643ea8Slogwang	movl 8(%esp),%eax
129*a9643ea8Slogwang	movl (%edx),%ebx
130*a9643ea8Slogwang	movl 4(%edx),%esp
131*a9643ea8Slogwang	movl 8(%edx),%ebp
132*a9643ea8Slogwang	movl 12(%edx),%esi
133*a9643ea8Slogwang	movl 16(%edx),%edi
134*a9643ea8Slogwang	jmp *20(%edx)
135*a9643ea8Slogwang
136*a9643ea8Slogwang	.size restore_context,.-restore_context
137*a9643ea8Slogwang
138*a9643ea8Slogwang##
139*a9643ea8Slogwang#  @brief replace_esp
140*a9643ea8Slogwang##
141*a9643ea8Slogwang    .text
142*a9643ea8Slogwang    .align 4
143*a9643ea8Slogwang    .globl replace_esp
144*a9643ea8Slogwang    .type replace_esp, @function
145*a9643ea8Slogwangreplace_esp:
146*a9643ea8Slogwang	movl 4(%esp),%edx
147*a9643ea8Slogwang	movl 8(%esp),%eax
148*a9643ea8Slogwang    movl %eax,4(%edx)
149*a9643ea8Slogwang    ret
150*a9643ea8Slogwang
151*a9643ea8Slogwang    .size replace_esp,.-replace_esp
152*a9643ea8Slogwang
153*a9643ea8Slogwang
154*a9643ea8Slogwang#else
155*a9643ea8Slogwang#error "Linux cpu arch not supported"
156*a9643ea8Slogwang#endif
157*a9643ea8Slogwang
158