Home | History | Annotate | Download | only in Ia32
      1 #------------------------------------------------------------------------------
      2 #
      3 # Copyright (c) 2014 - 2015, 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 # Abstract:
     13 #
     14 #   Switch the stack from temporary memory to permenent memory.
     15 #
     16 #------------------------------------------------------------------------------
     17 
     18 ASM_GLOBAL ASM_PFX(SecSwitchStack)
     19 
     20 #------------------------------------------------------------------------------
     21 # VOID
     22 # EFIAPI
     23 # SecSwitchStack (
     24 #   UINT32   TemporaryMemoryBase,
     25 #   UINT32   PermenentMemoryBase
     26 #   )
     27 #------------------------------------------------------------------------------
     28 ASM_GLOBAL ASM_PFX(SecSwitchStack)
     29 ASM_PFX(SecSwitchStack):
     30 #
     31 # Save four registers: eax, ebx, ecx, edx
     32 #
     33     pushl  %eax
     34     pushl  %ebx
     35     pushl  %ecx
     36     pushl  %edx
     37 
     38 #
     39 # !!CAUTION!! this function address's is pushed into stack after
     40 # migration of whole temporary memory, so need save it to permenent
     41 # memory at first!
     42 #
     43 
     44     movl  20(%esp), %ebx            # Save the first parameter
     45     movl  24(%esp), %ecx            # Save the second parameter
     46 
     47 #
     48 # Save this function's return address into permenent memory at first.
     49 # Then, Fixup the esp point to permenent memory
     50 #
     51 
     52     movl  %esp, %eax
     53     subl  %ebx, %eax
     54     addl  %ecx, %eax
     55     movl  (%esp), %edx                 # copy pushed register's value to permenent memory
     56     movl  %edx, (%eax)
     57     movl  4(%esp), %edx
     58     movl  %edx, 4(%eax)
     59     movl  8(%esp), %edx
     60     movl  %edx, 8(%eax)
     61     movl  12(%esp), %edx
     62     movl  %edx, 12(%eax)
     63     movl  16(%esp), %edx               # Update this function's return address into permenent memory
     64     movl  %edx, 16(%eax)
     65     movl  %eax, %esp                   # From now, esp is pointed to permenent memory
     66 
     67 #
     68 # Fixup the ebp point to permenent memory
     69 #
     70     movl   %ebp, %eax
     71     subl   %ebx, %eax
     72     addl   %ecx, %eax
     73     movl   %eax, %ebp                  # From now, ebp is pointed to permenent memory
     74 
     75 #
     76 # Fixup callee's ebp point for PeiDispatch
     77 #
     78 #    movl   %ebp, %eax
     79 #    subl   %ebx, %eax
     80 #    addl   %ecx, %eax
     81 #    movl   %eax, %ebp                #  From now, ebp is pointed to permenent memory
     82     popl   %edx
     83     popl   %ecx
     84     popl   %ebx
     85     popl   %eax
     86     ret