/** * 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