]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/Sec/StackX64.asm
UefiCpuPkg: Remove double \r
[mirror_edk2.git] / Nt32Pkg / Sec / StackX64.asm
CommitLineData
f66a43b2
JM
1;------------------------------------------------------------------------------\r
2;\r
3; Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
9d2eedba 4; SPDX-License-Identifier: BSD-2-Clause-Patent\r
f66a43b2
JM
5;\r
6; Module Name:\r
7;\r
8; Stack.asm\r
9;\r
10; Abstract:\r
11;\r
12; Switch the stack from temporary memory to permenent memory.\r
13;\r
14;------------------------------------------------------------------------------\r
15\r
16 .code\r
17 \r
18;------------------------------------------------------------------------------\r
19; VOID\r
20; EFIAPI\r
21; SecSwitchStack (\r
22; UINT32 TemporaryMemoryBase,\r
23; UINT32 PermenentMemoryBase\r
24; );\r
25;------------------------------------------------------------------------------ \r
26SecSwitchStack PROC\r
27 mov [rsp + 08h], rcx\r
28 mov [rsp + 10h], rdx\r
29\r
30 ;\r
31 ; Save three register: eax, ebx, ecx\r
32 ;\r
33 push rax\r
34 push rbx\r
35 push rcx\r
36 push rdx\r
37 \r
38 ;\r
39 ; !!CAUTION!! this function address's is pushed into stack after\r
40 ; migration of whole temporary memory, so need save it to permenent\r
41 ; memory at first!\r
42 ;\r
43 \r
44 mov rbx, [rsp + 28h] ; Save the first parameter\r
45 mov rcx, [rsp + 30h] ; Save the second parameter\r
46 \r
47 ;\r
48 ; Save this function's return address into permenent memory at first.\r
49 ; Then, Fixup the esp point to permenent memory\r
50 ;\r
51 mov rax, rsp\r
52 sub rax, rbx\r
53 add rax, rcx\r
54 mov rdx, qword ptr [rsp] ; copy pushed register's value to permenent memory\r
55 mov qword ptr [rax], rdx \r
56 mov rdx, qword ptr [rsp + 8]\r
57 mov qword ptr [rax + 8], rdx \r
58 mov rdx, qword ptr [rsp + 10h]\r
59 mov qword ptr [rax + 10h], rdx \r
60 mov rdx, qword ptr [rsp + 18h]\r
61 mov qword ptr [rax + 18h], rdx \r
62 mov rdx, qword ptr [rsp + 20h] ; Update this function's return address into permenent memory\r
63 mov qword ptr [rax + 20h], rdx \r
64 mov rsp, rax ; From now, esp is pointed to permenent memory\r
65 \r
66 ;\r
67 ; Fixup the ebp point to permenent memory\r
68 ;\r
69 mov rax, rbp\r
70 sub rax, rbx\r
71 add rax, rcx\r
72 mov rbp, rax ; From now, ebp is pointed to permenent memory\r
73 \r
74 pop rdx\r
75 pop rcx\r
76 pop rbx\r
77 pop rax\r
78 ret\r
79SecSwitchStack ENDP\r
80\r
81;------------------------------------------------------------------------------\r
82; VOID\r
83; EFIAPI\r
84; PeiSwitchStacks (\r
85; IN SWITCH_STACK_ENTRY_POINT EntryPoint,\r
86; IN VOID *Context1, OPTIONAL\r
87; IN VOID *Context2, OPTIONAL\r
88; IN VOID *Context3, OPTIONAL\r
89; IN VOID *NewStack\r
90; )\r
91;------------------------------------------------------------------------------\r
92PeiSwitchStacks PROC\r
93 mov rax, rcx\r
94 mov rcx, rdx\r
95 mov rdx, r8\r
96 mov r8, r9\r
97 mov rsp, [rsp + 28h]\r
98 sub rsp, 20h\r
99 call rax\r
100 jmp $\r
101 ret\r
102PeiSwitchStacks ENDP\r
103\r
104 END\r