1#------------------------------------------------------------------------------ 2# 3# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR> 4# This program and the accompanying materials 5# are licensed and made available under the terms and conditions of the BSD License 6# which accompanies this distribution. The full text of the license may be found at 7# http://opensource.org/licenses/bsd-license.php. 8# 9# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11# 12# Abstract: 13# 14# Switch the stack from temporary memory to permenent memory. 15# 16#------------------------------------------------------------------------------ 17 18 19#------------------------------------------------------------------------------ 20# VOID 21# EFIAPI 22# SecSwitchStack ( 23# UINT32 TemporaryMemoryBase, 24# UINT32 PermenentMemoryBase 25# )# 26#------------------------------------------------------------------------------ 27ASM_GLOBAL ASM_PFX (SecSwitchStack) 28ASM_PFX(SecSwitchStack): 29 # 30 # Save standard registers so they can be used to change stack 31 # 32 pushl %eax 33 pushl %ebx 34 pushl %ecx 35 pushl %edx 36 37 # 38 # !!CAUTION!! this function address's is pushed into stack after 39 # migration of whole temporary memory, so need save it to permenent 40 # memory at first! 41 # 42 movl 20(%esp), %ebx # Save the first parameter 43 movl 24(%esp), %ecx # Save the second parameter 44 45 # 46 # Save this function's return address into permenent memory at first. 47 # Then, Fixup the esp point to permenent memory 48 # 49 movl %esp, %eax 50 subl %ebx, %eax 51 addl %ecx, %eax 52 movl 0(%esp), %edx # copy pushed register's value to permenent memory 53 movl %edx, 0(%eax) 54 movl 4(%esp), %edx 55 movl %edx, 4(%eax) 56 movl 8(%esp), %edx 57 movl %edx, 8(%eax) 58 movl 12(%esp), %edx 59 movl %edx, 12(%eax) 60 movl 16(%esp), %edx # Update this function's return address into permenent memory 61 movl %edx, 16(%eax) 62 movl %eax, %esp # From now, esp is pointed to permenent memory 63 64 # 65 # Fixup the ebp point to permenent memory 66 # 67 movl %ebp, %eax 68 subl %ebx, %eax 69 addl %ecx, %eax 70 movl %eax, %ebp # From now, ebp is pointed to permenent memory 71 72 popl %edx 73 popl %ecx 74 popl %ebx 75 popl %eax 76 ret 77 78