1 ;------------------------------------------------------------------------------ 2 ; 3 ; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> 4 ; Portitions copyright (c) 2011, Apple Inc. All rights reserved. 5 ; This program and the accompanying materials 6 ; are licensed and made available under the terms and conditions of the BSD License 7 ; which accompanies this distribution. The full text of the license may be found at 8 ; http://opensource.org/licenses/bsd-license.php. 9 ; 10 ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 ; 13 ;------------------------------------------------------------------------------ 14 15 EXTERN CopyMem:PROC 16 EXTERN ZeroMem:PROC 17 18 .code 19 20 ;------------------------------------------------------------------------------ 21 ; EFI_STATUS 22 ; EFIAPI 23 ; SecTemporaryRamSupport ( 24 ; IN CONST EFI_PEI_SERVICES **PeiServices, // %rcx 25 ; IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, // %rdx 26 ; IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, // %r8 27 ; IN UINTN CopySize // %r9 28 ; ) 29 ;------------------------------------------------------------------------------ 30 SecTemporaryRamSupport PROC 31 ; Adjust callers %rbp to account for stack move 32 sub rbp, rdx ; Calc offset of %rbp in Temp Memory 33 add rbp, r8 ; add in permanent base to offset 34 35 push rbp ; stack frame is for the debugger 36 mov rbp, rsp 37 38 push rdx ; Save TemporaryMemoryBase 39 push r8 ; Save PermanentMemoryBase 40 push r9 ; Save CopySize 41 42 ; 43 ; Copy all of temp RAM to permanent memory, including stack 44 ; 45 ; CopyMem (PermanentMemoryBase, TemporaryMemoryBase, CopySize); 46 ; %rcx, %rdx, %r8 47 mov rcx, r8 ; Shift arguments 48 mov r8, r9 49 sub rsp, 028h ; Allocate register spill area & 16-byte align stack 50 call CopyMem 51 ; Temp mem stack now copied to permanent location. %esp still in temp memory 52 add rsp, 028h 53 54 pop r9 ; CopySize (old stack) 55 pop r8 ; PermanentMemoryBase (old stack) 56 pop rdx ; TemporaryMemoryBase (old stack) 57 58 mov rcx, rsp ; Move to new stack 59 sub rcx, rdx ; Calc offset of stack in Temp Memory 60 add rcx, r8 ; Calc PermanentMemoryBase address 61 mov rsp, rcx ; Update stack 62 ; Stack now points to permanent memory 63 64 ; ZeroMem (TemporaryMemoryBase /* rcx */, CopySize /* rdx */); 65 mov rcx, rdx 66 mov rdx, r9 67 sub rsp, 028h ; Allocate register spill area & 16-byte align stack 68 call ZeroMem 69 add rsp, 028h 70 71 ; This data comes off the NEW stack 72 pop rbp 73 ret 74 SecTemporaryRamSupport ENDP 75 76 END 77