Home | History | Annotate | Download | only in Ia32
      1 #------------------------------------------------------------------------------
      2 #
      3 # Copyright (c) 2007, 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  .text
     23 
     24 
     25 //------------------------------------------------------------------------------
     26 // VOID
     27 // EFIAPI
     28 // SecSwitchStack (
     29 //   UINT32   TemporaryMemoryBase,
     30 //   UINT32   PermenentMemoryBase
     31 //   )//
     32 //------------------------------------------------------------------------------
     33 ASM_GLOBAL ASM_PFX(SecSwitchStack)
     34 ASM_PFX(SecSwitchStack):
     35 #
     36 # Save three register: eax, ebx, ecx
     37 #
     38     push  %eax
     39     push  %ebx
     40     push  %ecx
     41     push  %edx
     42 
     43 #
     44 # !!CAUTION!! this function address's is pushed into stack after
     45 # migration of whole temporary memory, so need save it to permenent
     46 # memory at first!
     47 #
     48 
     49     movl  20(%esp), %ebx            # Save the first parameter
     50     movl  24(%esp), %ecx            # Save the second parameter
     51 
     52 #
     53 # Save this function's return address into permenent memory at first.
     54 # Then, Fixup the esp point to permenent memory
     55 #
     56 
     57     movl  %esp, %eax
     58     subl  %ebx, %eax
     59     addl  %ecx, %eax
     60     movl  (%esp), %edx                 # copy pushed register's value to permenent memory
     61     movl  %edx, (%eax)
     62     movl  4(%esp), %edx
     63     movl  %edx, 4(%eax)
     64     movl  8(%esp), %edx
     65     movl  %edx, 8(%eax)
     66     movl  12(%esp), %edx
     67     movl  %edx, 12(%eax)
     68     movl  16(%esp), %edx
     69     movl  %edx, 16(%eax)
     70     movl  %eax, %esp                   # From now, esp is pointed to permenent memory
     71 
     72 #
     73 # Fixup the ebp point to permenent memory
     74 #
     75 #ifndef __APPLE__
     76     movl   %ebp, %eax
     77     subl   %ebx, %eax
     78     addl   %ecx, %eax
     79     movl   %eax, %ebp                  # From now, ebp is pointed to permenent memory
     80 
     81 #
     82 # Fixup callee's ebp point for PeiDispatch
     83 #
     84     movl   (%ebp), %eax
     85     subl   %ebx, %eax
     86     addl   %ecx, %eax
     87     movl   %eax, (%ebp)                # From now, Temporary's PPI caller's stack is in permenent memory
     88 #endif
     89 
     90     pop   %edx
     91     pop   %ecx
     92     pop   %ebx
     93     pop   %eax
     94     ret
     95 
     96