Home | History | Annotate | Download | only in X64
      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