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