f-stack/app/micro_thread/arch_ctx.S

158 lines
2.7 KiB
ArmAsm

/**
* Tencent is pleased to support the open source community by making MSEC available.
*
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the GNU General Public License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* https://opensource.org/licenses/GPL-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
#
# context x86 or x86_64 save and restore
#
# x86_64 x86
# 0 %rbx %ebx
# 1 %rsp %esp
# 2 %rbp %ebp
# 3 %r12 %esi
# 4 %r13 %edi
# 5 %r14 %eip
# 6 %r15
# 7 %rip
#if defined(__amd64__) || defined(__x86_64__)
##
# @brief save_context
##
.text
.align 4
.globl save_context
.type save_context, @function
save_context:
pop %rsi
xorl %eax,%eax
movq %rbx,(%rdi)
movq %rsp,8(%rdi)
push %rsi
movq %rbp,16(%rdi)
movq %r12,24(%rdi)
movq %r13,32(%rdi)
movq %r14,40(%rdi)
movq %r15,48(%rdi)
movq %rsi,56(%rdi)
ret
.size save_context,.-save_context
##
# @brief restore_context
##
.text
.align 4
.globl restore_context
.type restore_context, @function
restore_context:
movl %esi,%eax
movq (%rdi),%rbx
movq 8(%rdi),%rsp
movq 16(%rdi),%rbp
movq 24(%rdi),%r12
movq 32(%rdi),%r13
movq 40(%rdi),%r14
movq 48(%rdi),%r15
jmp *56(%rdi)
.size restore_context,.-restore_context
##
# @brief replace_esp
##
.text
.align 4
.globl replace_esp
.type replace_esp, @function
replace_esp:
movq %rsi,8(%rdi)
ret
.size replace_esp,.-replace_esp
#elif defined(__i386__)
##
# @brief save_context
##
.text
.align 4
.globl save_context
.type save_context, @function
save_context:
movl 4(%esp),%edx
popl %ecx
xorl %eax,%eax
movl %ebx,(%edx)
movl %esp,4(%edx)
pushl %ecx
movl %ebp,8(%edx)
movl %esi,12(%edx)
movl %edi,16(%edx)
movl %ecx,20(%edx)
ret
.size save_context,.-save_context
##
# @brief restore_context
##
.text
.align 4
.globl restore_context
.type restore_context, @function
restore_context:
movl 4(%esp),%edx
movl 8(%esp),%eax
movl (%edx),%ebx
movl 4(%edx),%esp
movl 8(%edx),%ebp
movl 12(%edx),%esi
movl 16(%edx),%edi
jmp *20(%edx)
.size restore_context,.-restore_context
##
# @brief replace_esp
##
.text
.align 4
.globl replace_esp
.type replace_esp, @function
replace_esp:
movl 4(%esp),%edx
movl 8(%esp),%eax
movl %eax,4(%edx)
ret
.size replace_esp,.-replace_esp
#else
#error "Linux cpu arch not supported"
#endif