]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/X64/ProcessorAsms.Asm
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Pei / PeiLib / X64 / ProcessorAsms.Asm
CommitLineData
3eb9473e 1;------------------------------------------------------------------------------\r
2;\r
3e99020d 3; Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>\r
4ea9375a 4; This program and the accompanying materials \r
3eb9473e 5; are licensed and made available under the terms and conditions of the BSD License \r
6; which accompanies this distribution. The full text of the license may be found at \r
7; http://opensource.org/licenses/bsd-license.php \r
8; \r
9; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11; \r
12; Module Name:\r
13; ProcessorAsms.Asm\r
14;\r
15; Abstract:\r
16; This is separated from processor.c to allow this functions to be built with /O1\r
17;\r
18;\r
19;------------------------------------------------------------------------------\r
20\r
21text SEGMENT\r
22\r
23\r
24;\r
25; Routine Description:\r
26; This allows the caller to switch the stack and goes to the new entry point\r
27;\r
28; Arguments:\r
29; EntryPoint - Pointer to the location to enter // rcx\r
30; Parameter - Parameter to pass in // rdx\r
31; NewStack - New Location of the stack // r8\r
32; NewBsp - New BSP // r9 - not used\r
33;\r
34; Returns:\r
35; Nothing. Goes to the Entry Point passing in the new parameters\r
36;\r
37SwitchStacks PROC PUBLIC\r
38\r
39 ; Adjust stack for\r
40 ; 1) leave 4 registers space\r
41 ; 2) let it 16 bytes aligned after call\r
42 sub r8, 20h\r
43 and r8w, 0fff0h ; do not assume 16 bytes aligned\r
44\r
45 mov rsp, r8 ; rsp = NewStack\r
46 mov r10, rcx ; save EntryPoint\r
47 mov rcx, rdx ; Arg1 = Parameter\r
48 call r10 ; r10 = copy of EntryPoint\r
49 ;\r
50 ; no ret as we have a new stack and we jumped to the new location\r
51 ; \r
52 ret\r
53 \r
54SwitchStacks ENDP\r
55\r
56\r
57EFI_SUCCESS equ 0\r
58EFI_WARN_RETURN_FROM_LONG_JUMP equ 5\r
59\r
60;\r
61; Generated by h2inc run manually\r
62;\r
63_EFI_JUMP_BUFFER STRUCT 2t\r
64_rbx QWORD ?\r
65_rsp QWORD ?\r
66_rbp QWORD ?\r
67_rdi QWORD ?\r
68_rsi QWORD ?\r
69_r10 QWORD ?\r
70_r11 QWORD ?\r
71_r12 QWORD ?\r
72_r13 QWORD ?\r
73_r14 QWORD ?\r
74_r15 QWORD ?\r
75_rip QWORD ?\r
3e99020d
LG
76_MxCsr DWORD ?\r
77_XmmBuffer DB 160 DUP (?)\r
3eb9473e 78_EFI_JUMP_BUFFER ENDS\r
79\r
80EFI_JUMP_BUFFER TYPEDEF _EFI_JUMP_BUFFER\r
81\r
82\r
83;\r
84;Routine Description:\r
85;\r
86; This routine implements the x64 variant of the SetJump call. Its\r
87; responsibility is to store system state information for a possible\r
88; subsequent LongJump.\r
89;\r
90;Arguments:\r
91;\r
92; Pointer to CPU context save buffer.\r
93;\r
94;Returns:\r
95;\r
96; EFI_SUCCESS\r
97;\r
98; EFI_STATUS\r
99; EFIAPI\r
100; TransferControlLongJump (\r
101; IN EFI_PEI_TRANSFER_CONTROL_PROTOCOL *This,\r
102; IN EFI_JUMP_BUFFER *Jump\r
103; );\r
104;\r
105; rcx - *This\r
106; rdx - JumpBuffer\r
107;\r
108PUBLIC TransferControlSetJump\r
109TransferControlSetJump PROC \r
110 mov (EFI_JUMP_BUFFER PTR [rdx])._rbx, rbx\r
111 mov (EFI_JUMP_BUFFER PTR [rdx])._rsp, rsp\r
112 mov (EFI_JUMP_BUFFER PTR [rdx])._rbp, rbp\r
113 mov (EFI_JUMP_BUFFER PTR [rdx])._rdi, rdi\r
114 mov (EFI_JUMP_BUFFER PTR [rdx])._rsi, rsi\r
115 mov (EFI_JUMP_BUFFER PTR [rdx])._r10, r10\r
116 mov (EFI_JUMP_BUFFER PTR [rdx])._r11, r11\r
117 mov (EFI_JUMP_BUFFER PTR [rdx])._r12, r12\r
118 mov (EFI_JUMP_BUFFER PTR [rdx])._r13, r13\r
119 mov (EFI_JUMP_BUFFER PTR [rdx])._r14, r14\r
120 mov (EFI_JUMP_BUFFER PTR [rdx])._r15, r15\r
3e99020d
LG
121 ; save non-volatile fp registers\r
122 stmxcsr (EFI_JUMP_BUFFER PTR [rdx])._MxCsr\r
123 lea rax, (EFI_JUMP_BUFFER PTR [rdx])._XmmBuffer\r
124 movdqu [rax], xmm6\r
125 movdqu [rax + 10h], xmm7\r
126 movdqu [rax + 20h], xmm8\r
127 movdqu [rax + 30h], xmm9\r
128 movdqu [rax + 40h], xmm10\r
129 movdqu [rax + 50h], xmm11\r
130 movdqu [rax + 60h], xmm12\r
131 movdqu [rax + 70h], xmm13\r
132 movdqu [rax + 80h], xmm14\r
133 movdqu [rax + 90h], xmm15\r
3eb9473e 134 mov rax, QWORD PTR [rsp+0]\r
135 mov (EFI_JUMP_BUFFER PTR [rdx])._rip, rax\r
136 mov rax, EFI_SUCCESS \r
137 ret\r
138 \r
139TransferControlSetJump ENDP\r
140\r
141;\r
142; EFI_STATUS\r
143; EFIAPI\r
144; TransferControlLongJump (\r
145; IN EFI_PEI_TRANSFER_CONTROL_PROTOCOL *This, // rcx\r
146; IN EFI_JUMP_BUFFER *Jump // rdx\r
147; );\r
148;\r
149;\r
150PUBLIC TransferControlLongJump\r
151TransferControlLongJump PROC \r
3e99020d
LG
152 ; load non-volatile fp registers\r
153 ldmxcsr (EFI_JUMP_BUFFER PTR [rdx])._MxCsr\r
154 lea rax, (EFI_JUMP_BUFFER PTR [rdx])._XmmBuffer\r
155 movdqu xmm6, [rax]\r
156 movdqu xmm7, [rax + 10h]\r
157 movdqu xmm8, [rax + 20h]\r
158 movdqu xmm9, [rax + 30h]\r
159 movdqu xmm10, [rax + 40h]\r
160 movdqu xmm11, [rax + 50h]\r
161 movdqu xmm12, [rax + 60h]\r
162 movdqu xmm13, [rax + 70h]\r
163 movdqu xmm14, [rax + 80h]\r
164 movdqu xmm15, [rax + 90h]\r
3eb9473e 165 ; set return from SetJump to EFI_WARN_RETURN_FROM_LONG_JUMP\r
166 mov rax, EFI_WARN_RETURN_FROM_LONG_JUMP \r
167 mov rbx, (EFI_JUMP_BUFFER PTR [rdx])._rbx\r
168 mov rsp, (EFI_JUMP_BUFFER PTR [rdx])._rsp\r
169 mov rbp, (EFI_JUMP_BUFFER PTR [rdx])._rbp\r
170 mov rdi, (EFI_JUMP_BUFFER PTR [rdx])._rdi\r
171 mov rsi, (EFI_JUMP_BUFFER PTR [rdx])._rsi\r
172 mov r10, (EFI_JUMP_BUFFER PTR [rdx])._r10\r
173 mov r11, (EFI_JUMP_BUFFER PTR [rdx])._r11\r
174 mov r12, (EFI_JUMP_BUFFER PTR [rdx])._r12\r
175 mov r13, (EFI_JUMP_BUFFER PTR [rdx])._r13\r
176 mov r14, (EFI_JUMP_BUFFER PTR [rdx])._r14\r
177 mov r15, (EFI_JUMP_BUFFER PTR [rdx])._r15\r
178 add rsp, 8 ;pop the eip\r
179 jmp QWORD PTR (EFI_JUMP_BUFFER PTR [rdx])._rip\r
180 ; set return from SetJump to EFI_WARN_RETURN_FROM_LONG_JUMP\r
181 mov rax, EFI_WARN_RETURN_FROM_LONG_JUMP\r
182 ret\r
183TransferControlLongJump ENDP\r
184\r
185text ENDS\r
186END\r