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    .586p
23    .model  flat,C
24    .code
25
26;------------------------------------------------------------------------------
27; VOID
28; EFIAPI
29; SecSwitchStack (
30;   UINT32   TemporaryMemoryBase,
31;   UINT32   PermenentMemoryBase
32;   );
33;------------------------------------------------------------------------------
34SecSwitchStack   PROC
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    mov   ebx, [esp + 20]          ; Save the first parameter
50    mov   ecx, [esp + 24]          ; 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    mov   eax, esp
57    sub   eax, ebx
58    add   eax, ecx
59    mov   edx, dword ptr [esp]         ; copy pushed register's value to permenent memory
60    mov   dword ptr [eax], edx
61    mov   edx, dword ptr [esp + 4]
62    mov   dword ptr [eax + 4], edx
63    mov   edx, dword ptr [esp + 8]
64    mov   dword ptr [eax + 8], edx
65    mov   edx, dword ptr [esp + 12]
66    mov   dword ptr [eax + 12], edx
67    mov   edx, dword ptr [esp + 16]    ; Update this function's return address into permenent memory
68    mov   dword ptr [eax + 16], edx
69    mov   esp, eax                     ; From now, esp is pointed to permenent memory
70
71    ;
72    ; Fixup the ebp point to permenent memory
73    ;
74    mov   eax, ebp
75    sub   eax, ebx
76    add   eax, ecx
77    mov   ebp, eax                ; From now, ebp is pointed to permenent memory
78
79    ;
80    ; Fixup callee's ebp point for PeiDispatch
81    ;
82    mov   eax, dword ptr [ebp]
83    sub   eax, ebx
84    add   eax, ecx
85    mov   dword ptr [ebp], eax    ; From now, Temporary's PPI caller's stack is in permenent memory
86
87    pop   edx
88    pop   ecx
89    pop   ebx
90    pop   eax
91    ret
92SecSwitchStack   ENDP
93
94    END
95