]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/PiSmmCpuDxeSmm/X64/MpFuncs.asm
MdePkg/BaseLib: add PatchInstructionX86()
[mirror_edk2.git] / UefiCpuPkg / PiSmmCpuDxeSmm / X64 / MpFuncs.asm
CommitLineData
427e3573
MK
1;------------------------------------------------------------------------------ ;\r
2; Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
3; This program and the accompanying materials\r
4; are licensed and made available under the terms and conditions of the BSD License\r
5; which accompanies this distribution. The full text of the license may be found at\r
6; http://opensource.org/licenses/bsd-license.php.\r
7;\r
8; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
9; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
10;\r
11; Module Name:\r
12;\r
13; MpFuncs.asm\r
14;\r
15; Abstract:\r
16;\r
17; This is the assembly code for Multi-processor S3 support\r
18;\r
19;-------------------------------------------------------------------------------\r
20\r
21EXTERN InitializeFloatingPointUnits:PROC\r
22\r
23VacantFlag Equ 00h\r
24NotVacantFlag Equ 0ffh\r
25\r
26LockLocation equ RendezvousFunnelProcEnd - RendezvousFunnelProcStart\r
27StackStartAddressLocation equ LockLocation + 08h\r
28StackSizeLocation equ LockLocation + 10h\r
29CProcedureLocation equ LockLocation + 18h\r
30GdtrLocation equ LockLocation + 20h\r
31IdtrLocation equ LockLocation + 2Ah\r
32BufferStartLocation equ LockLocation + 34h\r
33Cr3OffsetLocation equ LockLocation + 38h\r
34\r
35;-------------------------------------------------------------------------------------\r
36;RendezvousFunnelProc procedure follows. All APs execute their procedure. This\r
37;procedure serializes all the AP processors through an Init sequence. It must be\r
38;noted that APs arrive here very raw...ie: real mode, no stack.\r
39;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC\r
40;IS IN MACHINE CODE.\r
41;-------------------------------------------------------------------------------------\r
42;RendezvousFunnelProc (&WakeUpBuffer,MemAddress);\r
43\r
44;text SEGMENT\r
45.code\r
46\r
47RendezvousFunnelProc PROC\r
48RendezvousFunnelProcStart::\r
49\r
50; At this point CS = 0x(vv00) and ip= 0x0.\r
51\r
52 db 8ch, 0c8h ; mov ax, cs\r
53 db 8eh, 0d8h ; mov ds, ax\r
54 db 8eh, 0c0h ; mov es, ax\r
55 db 8eh, 0d0h ; mov ss, ax\r
56 db 33h, 0c0h ; xor ax, ax\r
57 db 8eh, 0e0h ; mov fs, ax\r
58 db 8eh, 0e8h ; mov gs, ax\r
59\r
60flat32Start::\r
61\r
62 db 0BEh\r
63 dw BufferStartLocation ; mov si, BufferStartLocation\r
64 db 66h, 8Bh, 14h ; mov edx,dword ptr [si] ; EDX is keeping the start address of wakeup buffer\r
65\r
66 db 0BEh\r
67 dw Cr3OffsetLocation ; mov si, Cr3Location\r
68 db 66h, 8Bh, 0Ch ; mov ecx,dword ptr [si] ; ECX is keeping the value of CR3\r
69\r
70 db 0BEh\r
71 dw GdtrLocation ; mov si, GdtrProfile\r
72 db 66h ; db 66h\r
73 db 2Eh, 0Fh, 01h, 14h ; lgdt fword ptr cs:[si]\r
74\r
75 db 0BEh\r
76 dw IdtrLocation ; mov si, IdtrProfile\r
77 db 66h ; db 66h\r
78 db 2Eh, 0Fh, 01h, 1Ch ; lidt fword ptr cs:[si]\r
79\r
80 db 33h, 0C0h ; xor ax, ax\r
81 db 8Eh, 0D8h ; mov ds, ax\r
82\r
83 db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Get control register 0\r
84 db 66h, 83h, 0C8h, 01h ; or eax, 000000001h ; Set PE bit (bit #0)\r
85 db 0Fh, 22h, 0C0h ; mov cr0, eax\r
86\r
87FLAT32_JUMP::\r
88\r
89 db 66h, 67h, 0EAh ; far jump\r
90 dd 0h ; 32-bit offset\r
91 dw 20h ; 16-bit selector\r
92\r
93PMODE_ENTRY:: ; protected mode entry point\r
94\r
95 db 66h, 0B8h, 18h, 00h ; mov ax, 18h\r
96 db 66h, 8Eh, 0D8h ; mov ds, ax\r
97 db 66h, 8Eh, 0C0h ; mov es, ax\r
98 db 66h, 8Eh, 0E0h ; mov fs, ax\r
99 db 66h, 8Eh, 0E8h ; mov gs, ax\r
100 db 66h, 8Eh, 0D0h ; mov ss, ax ; Flat mode setup.\r
101\r
102 db 0Fh, 20h, 0E0h ; mov eax, cr4\r
103 db 0Fh, 0BAh, 0E8h, 05h ; bts eax, 5\r
104 db 0Fh, 22h, 0E0h ; mov cr4, eax\r
105\r
106 db 0Fh, 22h, 0D9h ; mov cr3, ecx\r
107\r
108 db 8Bh, 0F2h ; mov esi, edx ; Save wakeup buffer address\r
109\r
110 db 0B9h\r
111 dd 0C0000080h ; mov ecx, 0c0000080h ; EFER MSR number.\r
112 db 0Fh, 32h ; rdmsr ; Read EFER.\r
113 db 0Fh, 0BAh, 0E8h, 08h ; bts eax, 8 ; Set LME=1.\r
114 db 0Fh, 30h ; wrmsr ; Write EFER.\r
115\r
116 db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Read CR0.\r
117 db 0Fh, 0BAh, 0E8h, 1Fh ; bts eax, 31 ; Set PG=1.\r
118 db 0Fh, 22h, 0C0h ; mov cr0, eax ; Write CR0.\r
119\r
120LONG_JUMP::\r
121\r
122 db 67h, 0EAh ; far jump\r
123 dd 0h ; 32-bit offset\r
124 dw 38h ; 16-bit selector\r
125\r
126LongModeStart::\r
127\r
128 mov ax, 30h\r
129 mov ds, ax\r
130 mov es, ax\r
131 mov ss, ax\r
132\r
133 mov edi, esi\r
134 add edi, LockLocation\r
135 mov al, NotVacantFlag\r
136TestLock::\r
137 xchg byte ptr [edi], al\r
138 cmp al, NotVacantFlag\r
139 jz TestLock\r
140\r
141ProgramStack::\r
142\r
143 mov edi, esi\r
144 add edi, StackSizeLocation\r
145 mov rax, qword ptr [edi]\r
146 mov edi, esi\r
147 add edi, StackStartAddressLocation\r
148 add rax, qword ptr [edi]\r
149 mov rsp, rax\r
150 mov qword ptr [edi], rax\r
151\r
152Releaselock::\r
153\r
154 mov al, VacantFlag\r
155 mov edi, esi\r
156 add edi, LockLocation\r
157 xchg byte ptr [edi], al\r
158\r
159 ;\r
160 ; Call assembly function to initialize FPU.\r
161 ;\r
162 mov rax, InitializeFloatingPointUnits\r
163 sub rsp, 20h\r
164 call rax\r
165 add rsp, 20h\r
166\r
167 ;\r
168 ; Call C Function\r
169 ;\r
170 mov edi, esi\r
171 add edi, CProcedureLocation\r
172 mov rax, qword ptr [edi]\r
173\r
174 test rax, rax\r
175 jz GoToSleep\r
176\r
177 sub rsp, 20h\r
178 call rax\r
179 add rsp, 20h\r
180\r
181GoToSleep::\r
182 cli\r
183 hlt\r
184 jmp $-2\r
185\r
186RendezvousFunnelProcEnd::\r
187RendezvousFunnelProc ENDP\r
188\r
189\r
190;-------------------------------------------------------------------------------------\r
191; AsmGetAddressMap (&AddressMap);\r
192;-------------------------------------------------------------------------------------\r
193; comments here for definition of address map\r
194AsmGetAddressMap PROC\r
195 mov rax, offset RendezvousFunnelProcStart\r
196 mov qword ptr [rcx], rax\r
197 mov qword ptr [rcx+8h], PMODE_ENTRY - RendezvousFunnelProcStart\r
198 mov qword ptr [rcx+10h], FLAT32_JUMP - RendezvousFunnelProcStart\r
199 mov qword ptr [rcx+18h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart\r
200 mov qword ptr [rcx+20h], LongModeStart - RendezvousFunnelProcStart\r
201 mov qword ptr [rcx+28h], LONG_JUMP - RendezvousFunnelProcStart\r
202 ret\r
203\r
204AsmGetAddressMap ENDP\r
205\r
206END\r