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 18ASM_GLOBAL ASM_PFX(SecSwitchStack) 19 20#------------------------------------------------------------------------------ 21# VOID 22# EFIAPI 23# SecSwitchStack ( 24# UINT32 TemporaryMemoryBase, 25# UINT32 PermenentMemoryBase 26# ) 27#------------------------------------------------------------------------------ 28ASM_GLOBAL ASM_PFX(SecSwitchStack) 29ASM_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