• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#------------------------------------------------------------------------------
2#
3# Copyright (c) 2014, 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
19#------------------------------------------------------------------------------
20# VOID
21# EFIAPI
22# SecSwitchStack (
23#   UINT32   TemporaryMemoryBase,
24#   UINT32   PermenentMemoryBase
25#   )#
26#------------------------------------------------------------------------------
27ASM_GLOBAL ASM_PFX (SecSwitchStack)
28ASM_PFX(SecSwitchStack):
29    #
30    # Save standard registers so they can be used to change stack
31    #
32    pushl %eax
33    pushl %ebx
34    pushl %ecx
35    pushl %edx
36
37    #
38    # !!CAUTION!! this function address's is pushed into stack after
39    # migration of whole temporary memory, so need save it to permenent
40    # memory at first!
41    #
42    movl  20(%esp), %ebx         # Save the first parameter
43    movl  24(%esp), %ecx         # Save the second parameter
44
45    #
46    # Save this function's return address into permenent memory at first.
47    # Then, Fixup the esp point to permenent memory
48    #
49    movl  %esp, %eax
50    subl  %ebx, %eax
51    addl  %ecx, %eax
52    movl  0(%esp), %edx          # copy pushed register's value to permenent memory
53    movl  %edx, 0(%eax)
54    movl  4(%esp), %edx
55    movl  %edx, 4(%eax)
56    movl  8(%esp), %edx
57    movl  %edx, 8(%eax)
58    movl  12(%esp), %edx
59    movl  %edx, 12(%eax)
60    movl  16(%esp), %edx        # Update this function's return address into permenent memory
61    movl  %edx, 16(%eax)
62    movl  %eax, %esp            # From now, esp is pointed to permenent memory
63
64    #
65    # Fixup the ebp point to permenent memory
66    #
67    movl  %ebp, %eax
68    subl  %ebx, %eax
69    addl  %ecx, %eax
70    movl  %eax, %ebp            # From now, ebp is pointed to permenent memory
71
72    popl  %edx
73    popl  %ecx
74    popl  %ebx
75    popl  %eax
76    ret
77
78