REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3893 1.Added EFIAPI to FspNotifyPhasePeimEntryPoint, SwapStack and PEI_CORE_ENTRY. 2.Treat both MAX_ADDRESS and MAX_UINT32 as invalid address for FSP global data in FspApiCallingCheck(). 3.Changed AsmReadEsp to AsmReadStackPointer. 4.Changed the type of the return value of AsmReadStackPointer from UINT32 to UINTN. 5.Changed the type of TemporaryMemoryBase, PermenentMemoryBase and BootLoaderStack from UINT32 to UINTN. 6.Some type casting to pointers are UINT32. Changed them to UINTN to accommodate both IA32 and X64. 7.Corrected some typos. Cc: Chasel Chiu <chasel.chiu@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Ashraf Ali S <ashraf.ali.s@intel.com> Signed-off-by: Ted Kuo <ted.kuo@intel.com> Reviewed-by: Chasel Chiu <chasel.chiu@intel.com> Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
73 lines
2.1 KiB
NASM
73 lines
2.1 KiB
NASM
;------------------------------------------------------------------------------
|
|
;
|
|
; Copyright (c) 2015 - 2022, Intel Corporation. All rights reserved.<BR>
|
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
;
|
|
; Abstract:
|
|
;
|
|
; Switch the stack from temporary memory to permanent memory.
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
SECTION .text
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; EFIAPI
|
|
; SecSwitchStack (
|
|
; UINT32 TemporaryMemoryBase,
|
|
; UINT32 PermanentMemoryBase
|
|
; );
|
|
;------------------------------------------------------------------------------
|
|
global ASM_PFX(SecSwitchStack)
|
|
ASM_PFX(SecSwitchStack):
|
|
;
|
|
; Save four register: eax, ebx, ecx, edx
|
|
;
|
|
push eax
|
|
push ebx
|
|
push ecx
|
|
push edx
|
|
|
|
;
|
|
; !!CAUTION!! this function address's is pushed into stack after
|
|
; migration of whole temporary memory, so need save it to permanent
|
|
; memory at first!
|
|
;
|
|
|
|
mov ebx, [esp + 20] ; Save the first parameter
|
|
mov ecx, [esp + 24] ; Save the second parameter
|
|
|
|
;
|
|
; Save this function's return address into permanent memory at first.
|
|
; Then, Fixup the esp point to permanent memory
|
|
;
|
|
mov eax, esp
|
|
sub eax, ebx
|
|
add eax, ecx
|
|
mov edx, dword [esp] ; copy pushed register's value to permanent memory
|
|
mov dword [eax], edx
|
|
mov edx, dword [esp + 4]
|
|
mov dword [eax + 4], edx
|
|
mov edx, dword [esp + 8]
|
|
mov dword [eax + 8], edx
|
|
mov edx, dword [esp + 12]
|
|
mov dword [eax + 12], edx
|
|
mov edx, dword [esp + 16] ; Update this function's return address into permanent memory
|
|
mov dword [eax + 16], edx
|
|
mov esp, eax ; From now, esp is pointed to permanent memory
|
|
|
|
;
|
|
; Fixup the ebp point to permanent memory
|
|
;
|
|
mov eax, ebp
|
|
sub eax, ebx
|
|
add eax, ecx
|
|
mov ebp, eax ; From now, ebp is pointed to permanent memory
|
|
|
|
pop edx
|
|
pop ecx
|
|
pop ebx
|
|
pop eax
|
|
ret
|