Home | History | Annotate | Download | only in Sec
      1 ;------------------------------------------------------------------------------
      2 ;
      3 ; Copyright (c) 2013, 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 ; Module Name:
     13 ;
     14 ;   Stack.asm
     15 ;
     16 ; Abstract:
     17 ;
     18 ;   Switch the stack from temporary memory to permenent memory.
     19 ;
     20 ;------------------------------------------------------------------------------
     21 
     22     .code
     23     
     24 ;------------------------------------------------------------------------------
     25 ; VOID
     26 ; EFIAPI
     27 ; SecSwitchStack (
     28 ;   UINT32   TemporaryMemoryBase,
     29 ;   UINT32   PermenentMemoryBase
     30 ;   );
     31 ;------------------------------------------------------------------------------    
     32 SecSwitchStack   PROC
     33     mov [rsp + 08h], rcx
     34     mov [rsp + 10h], rdx
     35 
     36     ;
     37     ; Save three register: eax, ebx, ecx
     38     ;
     39     push  rax
     40     push  rbx
     41     push  rcx
     42     push  rdx
     43     
     44     ;
     45     ; !!CAUTION!! this function address's is pushed into stack after
     46     ; migration of whole temporary memory, so need save it to permenent
     47     ; memory at first!
     48     ;
     49     
     50     mov   rbx, [rsp + 28h]          ; Save the first parameter
     51     mov   rcx, [rsp + 30h]          ; Save the second parameter
     52     
     53     ;
     54     ; Save this function's return address into permenent memory at first.
     55     ; Then, Fixup the esp point to permenent memory
     56     ;
     57     mov   rax, rsp
     58     sub   rax, rbx
     59     add   rax, rcx
     60     mov   rdx, qword ptr [rsp]         ; copy pushed register's value to permenent memory
     61     mov   qword ptr [rax], rdx    
     62     mov   rdx, qword ptr [rsp + 8]
     63     mov   qword ptr [rax + 8], rdx    
     64     mov   rdx, qword ptr [rsp + 10h]
     65     mov   qword ptr [rax + 10h], rdx    
     66     mov   rdx, qword ptr [rsp + 18h]
     67     mov   qword ptr [rax + 18h], rdx    
     68     mov   rdx, qword ptr [rsp + 20h]    ; Update this function's return address into permenent memory
     69     mov   qword ptr [rax + 20h], rdx    
     70     mov   rsp, rax                     ; From now, esp is pointed to permenent memory
     71         
     72     ;
     73     ; Fixup the ebp point to permenent memory
     74     ;
     75     mov   rax, rbp
     76     sub   rax, rbx
     77     add   rax, rcx
     78     mov   rbp, rax                ; From now, ebp is pointed to permenent memory
     79     
     80     pop   rdx
     81     pop   rcx
     82     pop   rbx
     83     pop   rax
     84     ret
     85 SecSwitchStack   ENDP
     86 
     87 ;------------------------------------------------------------------------------
     88 ; VOID
     89 ; EFIAPI
     90 ; PeiSwitchStacks (
     91 ;   IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
     92 ;   IN      VOID                      *Context1,  OPTIONAL
     93 ;   IN      VOID                      *Context2,  OPTIONAL
     94 ;   IN      VOID                      *Context3,  OPTIONAL
     95 ;   IN      VOID                      *NewStack
     96 ;   )
     97 ;------------------------------------------------------------------------------
     98 PeiSwitchStacks   PROC
     99     mov  rax, rcx
    100     mov  rcx, rdx
    101     mov  rdx, r8
    102     mov  r8, r9
    103     mov  rsp, [rsp + 28h]
    104     sub  rsp, 20h
    105     call rax
    106     jmp $
    107     ret
    108 PeiSwitchStacks   ENDP
    109 
    110     END
    111