Wrote IA-32 (align stack to 16-bytes) gaskets for emulator and got it to compile for IA-32. TempRam switch code is not ported to IA-32 in Sec. Code crashes in Sec. Signed-off-by: andrewfish git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11849 6f19259b-4bc3-4df7-8a09-765794883524
104 lines
3.2 KiB
ArmAsm
104 lines
3.2 KiB
ArmAsm
#------------------------------------------------------------------------------
|
|
#
|
|
# Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
|
|
# This program and the accompanying materials
|
|
# are licensed and made available under the terms and conditions of the BSD License
|
|
# which accompanies this distribution. The full text of the license may be found at
|
|
# http:#opensource.org/licenses/bsd-license.php
|
|
#
|
|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
#
|
|
# Module Name:
|
|
#
|
|
# Stack.asm
|
|
#
|
|
# Abstract:
|
|
#
|
|
# Switch the stack from temporary memory to permenent memory.
|
|
#
|
|
#------------------------------------------------------------------------------
|
|
|
|
.text
|
|
|
|
|
|
// EFI_STATUS
|
|
// EFIAPI
|
|
// SecTemporaryRamSupport (
|
|
// IN CONST EFI_PEI_SERVICES **PeiServices, // %rcx
|
|
// IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, // %rdx
|
|
// IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, // %r8
|
|
// IN UINTN CopySize // %r9
|
|
// )
|
|
//
|
|
ASM_GLOBAL ASM_PFX(SecTemporaryRamSupport)
|
|
ASM_PFX(SecTemporaryRamSupport):
|
|
//------------------------------------------------------------------------------
|
|
// VOID
|
|
// EFIAPI
|
|
// SecSwitchStack (
|
|
// UINT32 TemporaryMemoryBase,
|
|
// UINT32 PermenentMemoryBase
|
|
// )//
|
|
//------------------------------------------------------------------------------
|
|
|
|
//
|
|
// Save three register: eax, ebx, ecx
|
|
//
|
|
push %eax
|
|
push %ebx
|
|
push %ecx
|
|
push %edx
|
|
|
|
#if 0
|
|
// Port me to GAS syntax
|
|
//
|
|
// !!CAUTION!! this function addresss is pushed into stack after
|
|
// migration of whole temporary memory, so need save it to permenent
|
|
// memory at first!
|
|
//
|
|
|
|
mov ebx, [esp + 20] // Save the first parameter
|
|
mov ecx, [esp + 24] // Save the second parameter
|
|
|
|
//
|
|
// Save this functions return address into permenent memory at first.
|
|
// Then, Fixup the esp point to permenent memory
|
|
//
|
|
mov eax, esp
|
|
sub eax, ebx
|
|
add eax, ecx
|
|
mov edx, dword ptr [esp] // copy pushed registers value to permenent memory
|
|
mov dword ptr [eax], edx
|
|
mov edx, dword ptr [esp + 4]
|
|
mov dword ptr [eax + 4], edx
|
|
mov edx, dword ptr [esp + 8]
|
|
mov dword ptr [eax + 8], edx
|
|
mov edx, dword ptr [esp + 12]
|
|
mov dword ptr [eax + 12], edx
|
|
mov edx, dword ptr [esp + 16] // Update this functions return address into permenent memory
|
|
mov dword ptr [eax + 16], edx
|
|
mov esp, eax // From now, esp is pointed to permenent memory
|
|
|
|
//
|
|
// Fixup the ebp point to permenent memory
|
|
//
|
|
mov eax, ebp
|
|
sub eax, ebx
|
|
add eax, ecx
|
|
mov ebp, eax // From now, ebp is pointed to permenent memory
|
|
|
|
//
|
|
// Fixup callees ebp point for PeiDispatch
|
|
//
|
|
mov eax, dword ptr [ebp]
|
|
sub eax, ebx
|
|
add eax, ecx
|
|
mov dword ptr [ebp], eax // From now, Temporarys PPI callers stack is in permenent memory
|
|
#endif
|
|
pop %edx
|
|
pop %ecx
|
|
pop %ebx
|
|
pop %eax
|
|
ret
|