1 ;------------------------------------------------------------------------------ ;
2 ; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
3 ; This program and the accompanying materials
4 ; are licensed and made available under the terms and conditions of the BSD License
5 ; which accompanies this distribution. The full text of the license may be found at
6 ; http://opensource.org/licenses/bsd-license.php.
8 ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9 ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 ; This is the assembly code for MP support
19 ;-------------------------------------------------------------------------------
25 InitializeFloatingPointUnits PROTO C
29 ;-------------------------------------------------------------------------------------
30 ;RendezvousFunnelProc procedure follows. All APs execute their procedure. This
31 ;procedure serializes all the AP processors through an Init sequence. It must be
32 ;noted that APs arrive here very raw...ie: real mode, no stack.
33 ;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
35 ;-------------------------------------------------------------------------------------
36 RendezvousFunnelProc PROC PUBLIC
37 RendezvousFunnelProcStart::
38 ; At this point CS = 0x(vv00) and ip= 0x0.
39 ; Save BIST information to ebp firstly
40 db 66h, 08bh, 0e8h ; mov ebp, eax ; save BIST information
42 db 8ch,0c8h ; mov ax,cs
43 db 8eh,0d8h ; mov ds,ax
44 db 8eh,0c0h ; mov es,ax
45 db 8eh,0d0h ; mov ss,ax
46 db 33h,0c0h ; xor ax,ax
47 db 8eh,0e0h ; mov fs,ax
48 db 8eh,0e8h ; mov gs,ax
50 db 0BEh ; opcode of mov si, mem16
51 dw BufferStartLocation ; mov si, BufferStartLocation
52 db 66h, 8Bh, 1Ch ; mov ebx,dword ptr [si]
54 db 0BFh ; opcode of mov di, mem16
55 dw PmodeOffsetLocation ; mov di, PmodeOffsetLocation
56 db 66h, 8Bh, 05h ; mov eax,dword ptr [di]
57 db 8Bh, 0F8h ; mov di, ax
58 db 83h, 0EFh,06h ; sub di, 06h
59 db 66h, 03h, 0C3h ; add eax, ebx
60 db 66h, 89h, 05h ; mov dword ptr [di],eax
62 db 0BEh ; opcode of mov si, mem16
63 dw GdtrLocation ; mov si, GdtrLocation
65 db 2Eh, 0Fh, 01h, 14h ; lgdt fword ptr cs:[si]
68 dw IdtrLocation ; mov si, IdtrLocation
70 db 2Eh,0Fh, 01h, 1Ch ; lidt fword ptr cs:[si]
72 db 33h, 0C0h ; xor ax, ax
73 db 8Eh, 0D8h ; mov ds, ax
75 db 0Fh, 20h, 0C0h ; mov eax, cr0 ;Get control register 0
76 db 66h, 83h, 0C8h, 03h ; or eax, 000000003h ;Set PE bit (bit #0) & MP
77 db 0Fh, 22h, 0C0h ; mov cr0, eax
79 db 66h, 67h, 0EAh ; far jump
81 dw PROTECT_MODE_CS ; 16-bit selector
83 Flat32Start:: ; protected mode entry point
84 mov ax, PROTECT_MODE_DS
94 mov eax, NotVacantFlag
97 xchg dword ptr [edi], eax
98 cmp eax, NotVacantFlag
102 add edi, NumApsExecutingLoction
104 mov ebx, dword ptr [edi]
108 add edi, StackSizeLocation
109 mov eax, dword ptr [edi]
111 add edi, StackStartAddressLocation
112 add eax, dword ptr [edi]
114 mov dword ptr [edi], eax
119 add edi, LockLocation
120 xchg dword ptr [edi], eax
123 push ebp ; push BIST data at top of AP stack
124 xor ebp, ebp ; clear ebp for call stack trace
128 mov eax, InitializeFloatingPointUnits
129 call eax ; Call assembly function to initialize FPU per UEFI spec
131 push ebx ; Push NumApsExecuting
133 add eax, LockLocation
134 push eax ; push address of exchange info data buffer
137 add edi, ApProcedureLocation
138 mov eax, dword ptr [edi]
140 call eax ; invoke C function
142 jmp $ ; never reach here
144 RendezvousFunnelProc ENDP
145 RendezvousFunnelProcEnd::
147 AsmCliHltLoop PROC near C PUBLIC
153 ;-------------------------------------------------------------------------------------
154 ; AsmGetAddressMap (&AddressMap);
155 ;-------------------------------------------------------------------------------------
156 AsmGetAddressMap PROC near C PUBLIC
160 mov ebx, dword ptr [ebp+24h]
161 mov dword ptr [ebx], RendezvousFunnelProcStart
162 mov dword ptr [ebx + 4h], Flat32Start - RendezvousFunnelProcStart
163 mov dword ptr [ebx + 8h], 0
164 mov dword ptr [ebx + 0ch], RendezvousFunnelProcEnd - RendezvousFunnelProcStart
168 AsmGetAddressMap ENDP
175 ;-------------------------------------------------------------------------------------
176 ;AsmExchangeRole procedure follows. This procedure executed by current BSP, that is
177 ;about to become an AP. It switches it'stack with the current AP.
178 ;AsmExchangeRole (IN CPU_EXCHANGE_INFO *MyInfo, IN CPU_EXCHANGE_INFO *OthersInfo);
179 ;-------------------------------------------------------------------------------------
180 AsmExchangeRole PROC near C PUBLIC
181 ; DO NOT call other functions in this function, since 2 CPU may use 1 stack
182 ; at the same time. If 1 CPU try to call a function, stack will be corrupted.
186 ; esi contains MyInfo pointer
187 mov esi, dword ptr [ebp+24h]
189 ; edi contains OthersInfo pointer
190 mov edi, dword ptr [ebp+28h]
192 ;Store EFLAGS, GDTR and IDTR register to stack
195 push eax ; push cr4 firstly
199 sgdt fword ptr [esi+8]
200 sidt fword ptr [esi+14]
202 ; Store the its StackPointer
203 mov dword ptr [esi+4],esp
205 ; update its switch state to STORED
206 mov byte ptr [esi], CPU_SWITCH_STATE_STORED
209 ; wait until the other CPU finish storing its state
210 cmp byte ptr [edi], CPU_SWITCH_STATE_STORED
213 jmp WaitForOtherStored
216 ; Since another CPU already stored its state, load them
218 lgdt fword ptr [edi+8]
221 lidt fword ptr [edi+14]
223 ; load its future StackPointer
224 mov esp, dword ptr [edi+4]
226 ; update the other CPU's switch state to LOADED
227 mov byte ptr [edi], CPU_SWITCH_STATE_LOADED
230 ; wait until the other CPU finish loading new state,
231 ; otherwise the data in stack may corrupt
232 cmp byte ptr [esi], CPU_SWITCH_STATE_LOADED
235 jmp WaitForOtherLoaded
238 ; since the other CPU already get the data it want, leave this procedure
249 AsmInitializeGdt PROC near C PUBLIC
253 mov edi, [ebp + 8] ; Load GDT register
255 mov ax,cs ; Get the selector data from our code image
257 lgdt FWORD PTR es:[edi] ; and update the GDTR
260 lea eax, SetCodeSelectorFarJump
263 SetCodeSelectorFarJump:
264 mov ax, PROTECT_MODE_DS ; Update the Base for the new selectors, too
274 AsmInitializeGdt ENDP