mirror of https://github.com/F-Stack/f-stack.git
158 lines
2.7 KiB
ArmAsm
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
|
|
|