1 ;------------------------------------------------------------------------------ ;
2 ; Copyright (c) 2006 - 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 Multi-processor S3 support
19 ;-------------------------------------------------------------------------------
25 EXTERN InitializeFloatingPointUnits:PROC
28 NotVacantFlag Equ 0ffh
30 LockLocation equ RendezvousFunnelProcEnd - RendezvousFunnelProcStart
31 StackStart equ LockLocation + 4h
32 StackSize equ LockLocation + 8h
33 RendezvousProc equ LockLocation + 0Ch
34 GdtrProfile equ LockLocation + 10h
35 IdtrProfile equ LockLocation + 16h
36 BufferStart equ LockLocation + 1Ch
38 ;-------------------------------------------------------------------------------------
39 ;RendezvousFunnelProc procedure follows. All APs execute their procedure. This
40 ;procedure serializes all the AP processors through an Init sequence. It must be
41 ;noted that APs arrive here very raw...ie: real mode, no stack.
42 ;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
44 ;-------------------------------------------------------------------------------------
45 ;RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
47 RendezvousFunnelProc PROC near C PUBLIC
48 RendezvousFunnelProcStart::
50 ; At this point CS = 0x(vv00) and ip= 0x0.
52 db 8ch, 0c8h ; mov ax, cs
53 db 8eh, 0d8h ; mov ds, ax
54 db 8eh, 0c0h ; mov es, ax
55 db 8eh, 0d0h ; mov ss, ax
56 db 33h, 0c0h ; xor ax, ax
57 db 8eh, 0e0h ; mov fs, ax
58 db 8eh, 0e8h ; mov gs, ax
63 dw BufferStart ; mov si, BufferStart
64 db 66h, 8Bh, 14h ; mov edx,dword ptr [si] ; EDX is keeping the start address of wakeup buffer
67 dw GdtrProfile ; mov si, GdtrProfile
69 db 2Eh, 0Fh, 01h, 14h ; lgdt fword ptr cs:[si]
72 dw IdtrProfile ; mov si, IdtrProfile
74 db 2Eh, 0Fh, 01h, 1Ch ; lidt fword ptr cs:[si]
76 db 33h, 0C0h ; xor ax, ax
77 db 8Eh, 0D8h ; mov ds, ax
79 db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Get control register 0
80 db 66h, 83h, 0C8h, 01h ; or eax, 000000001h ; Set PE bit (bit #0)
81 db 0Fh, 22h, 0C0h ; mov cr0, eax
85 db 66h, 67h, 0EAh ; far jump
87 dw 20h ; 16-bit selector
89 PMODE_ENTRY:: ; protected mode entry point
96 mov ss, ax ; Flat mode setup.
101 add edi, LockLocation
102 mov al, NotVacantFlag
104 xchg byte ptr [edi], al
105 cmp al, NotVacantFlag
112 mov eax, dword ptr [edi]
115 add eax, dword ptr [edi]
117 mov dword ptr [edi], eax
123 add edi, LockLocation
124 xchg byte ptr [edi], al
127 ; Call assembly function to initialize FPU.
129 mov ebx, InitializeFloatingPointUnits
135 add edi, RendezvousProc
136 mov eax, dword ptr [edi]
140 call eax ; Call C function
147 RendezvousFunnelProc ENDP
148 RendezvousFunnelProcEnd::
149 ;-------------------------------------------------------------------------------------
150 ; AsmGetAddressMap (&AddressMap);
151 ;-------------------------------------------------------------------------------------
152 AsmGetAddressMap PROC near C PUBLIC
157 mov ebx, dword ptr [ebp+24h]
158 mov dword ptr [ebx], RendezvousFunnelProcStart
159 mov dword ptr [ebx+4h], PMODE_ENTRY - RendezvousFunnelProcStart
160 mov dword ptr [ebx+8h], FLAT32_JUMP - RendezvousFunnelProcStart
161 mov dword ptr [ebx+0ch], RendezvousFunnelProcEnd - RendezvousFunnelProcStart
166 AsmGetAddressMap ENDP