1 #------------------------------------------------------------------------------ 2 # 3 # Copyright (c) 2014 - 2015, 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 ASM_GLOBAL ASM_PFX(SecSwitchStack) 19 20 #------------------------------------------------------------------------------ 21 # VOID 22 # EFIAPI 23 # SecSwitchStack ( 24 # UINT32 TemporaryMemoryBase, 25 # UINT32 PermenentMemoryBase 26 # ) 27 #------------------------------------------------------------------------------ 28 ASM_GLOBAL ASM_PFX(SecSwitchStack) 29 ASM_PFX(SecSwitchStack): 30 # 31 # Save four registers: eax, ebx, ecx, edx 32 # 33 pushl %eax 34 pushl %ebx 35 pushl %ecx 36 pushl %edx 37 38 # 39 # !!CAUTION!! this function address's is pushed into stack after 40 # migration of whole temporary memory, so need save it to permenent 41 # memory at first! 42 # 43 44 movl 20(%esp), %ebx # Save the first parameter 45 movl 24(%esp), %ecx # Save the second parameter 46 47 # 48 # Save this function's return address into permenent memory at first. 49 # Then, Fixup the esp point to permenent memory 50 # 51 52 movl %esp, %eax 53 subl %ebx, %eax 54 addl %ecx, %eax 55 movl (%esp), %edx # copy pushed register's value to permenent memory 56 movl %edx, (%eax) 57 movl 4(%esp), %edx 58 movl %edx, 4(%eax) 59 movl 8(%esp), %edx 60 movl %edx, 8(%eax) 61 movl 12(%esp), %edx 62 movl %edx, 12(%eax) 63 movl 16(%esp), %edx # Update this function's return address into permenent memory 64 movl %edx, 16(%eax) 65 movl %eax, %esp # From now, esp is pointed to permenent memory 66 67 # 68 # Fixup the ebp point to permenent memory 69 # 70 movl %ebp, %eax 71 subl %ebx, %eax 72 addl %ecx, %eax 73 movl %eax, %ebp # From now, ebp is pointed to permenent memory 74 75 # 76 # Fixup callee's ebp point for PeiDispatch 77 # 78 # movl %ebp, %eax 79 # subl %ebx, %eax 80 # addl %ecx, %eax 81 # movl %eax, %ebp # From now, ebp is pointed to permenent memory 82 popl %edx 83 popl %ecx 84 popl %ebx 85 popl %eax 86 ret