]> git.proxmox.com Git - mirror_edk2.git/blob - CorebootModulePkg/SecCore/Ia32/Stack.S
CorebootPayloadPkg: Use extra braces to prevent gcc compile fail
[mirror_edk2.git] / CorebootModulePkg / SecCore / Ia32 / Stack.S
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 # 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 #------------------------------------------------------------------------------
27 ASM_GLOBAL ASM_PFX (SecSwitchStack)
28 ASM_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