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 ;-------------------------------------------------------------------------------
21 EXTERN InitializeFloatingPointUnits:PROC
24 NotVacantFlag Equ 0ffh
26 LockLocation equ RendezvousFunnelProcEnd - RendezvousFunnelProcStart
27 StackStartAddressLocation equ LockLocation + 08h
28 StackSizeLocation equ LockLocation + 10h
29 CProcedureLocation equ LockLocation + 18h
30 GdtrLocation equ LockLocation + 20h
31 IdtrLocation equ LockLocation + 2Ah
32 BufferStartLocation equ LockLocation + 34h
33 Cr3OffsetLocation equ LockLocation + 38h
35 ;-------------------------------------------------------------------------------------
36 ;RendezvousFunnelProc procedure follows. All APs execute their procedure. This
37 ;procedure serializes all the AP processors through an Init sequence. It must be
38 ;noted that APs arrive here very raw...ie: real mode, no stack.
39 ;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
41 ;-------------------------------------------------------------------------------------
42 ;RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
47 RendezvousFunnelProc PROC
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 BufferStartLocation ; mov si, BufferStartLocation
64 db 66h, 8Bh, 14h ; mov edx,dword ptr [si] ; EDX is keeping the start address of wakeup buffer
67 dw Cr3OffsetLocation ; mov si, Cr3Location
68 db 66h, 8Bh, 0Ch ; mov ecx,dword ptr [si] ; ECX is keeping the value of CR3
71 dw GdtrLocation ; mov si, GdtrProfile
73 db 2Eh, 0Fh, 01h, 14h ; lgdt fword ptr cs:[si]
76 dw IdtrLocation ; mov si, IdtrProfile
78 db 2Eh, 0Fh, 01h, 1Ch ; lidt fword ptr cs:[si]
80 db 33h, 0C0h ; xor ax, ax
81 db 8Eh, 0D8h ; mov ds, ax
83 db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Get control register 0
84 db 66h, 83h, 0C8h, 01h ; or eax, 000000001h ; Set PE bit (bit #0)
85 db 0Fh, 22h, 0C0h ; mov cr0, eax
89 db 66h, 67h, 0EAh ; far jump
91 dw 20h ; 16-bit selector
93 PMODE_ENTRY:: ; protected mode entry point
95 db 66h, 0B8h, 18h, 00h ; mov ax, 18h
96 db 66h, 8Eh, 0D8h ; mov ds, ax
97 db 66h, 8Eh, 0C0h ; mov es, ax
98 db 66h, 8Eh, 0E0h ; mov fs, ax
99 db 66h, 8Eh, 0E8h ; mov gs, ax
100 db 66h, 8Eh, 0D0h ; mov ss, ax ; Flat mode setup.
102 db 0Fh, 20h, 0E0h ; mov eax, cr4
103 db 0Fh, 0BAh, 0E8h, 05h ; bts eax, 5
104 db 0Fh, 22h, 0E0h ; mov cr4, eax
106 db 0Fh, 22h, 0D9h ; mov cr3, ecx
108 db 8Bh, 0F2h ; mov esi, edx ; Save wakeup buffer address
111 dd 0C0000080h ; mov ecx, 0c0000080h ; EFER MSR number.
112 db 0Fh, 32h ; rdmsr ; Read EFER.
113 db 0Fh, 0BAh, 0E8h, 08h ; bts eax, 8 ; Set LME=1.
114 db 0Fh, 30h ; wrmsr ; Write EFER.
116 db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Read CR0.
117 db 0Fh, 0BAh, 0E8h, 1Fh ; bts eax, 31 ; Set PG=1.
118 db 0Fh, 22h, 0C0h ; mov cr0, eax ; Write CR0.
122 db 67h, 0EAh ; far jump
123 dd 0h ; 32-bit offset
124 dw 38h ; 16-bit selector
134 add edi, LockLocation
135 mov al, NotVacantFlag
137 xchg byte ptr [edi], al
138 cmp al, NotVacantFlag
144 add edi, StackSizeLocation
145 mov rax, qword ptr [edi]
147 add edi, StackStartAddressLocation
148 add rax, qword ptr [edi]
150 mov qword ptr [edi], rax
156 add edi, LockLocation
157 xchg byte ptr [edi], al
160 ; Call assembly function to initialize FPU.
162 mov rax, InitializeFloatingPointUnits
171 add edi, CProcedureLocation
172 mov rax, qword ptr [edi]
186 RendezvousFunnelProcEnd::
187 RendezvousFunnelProc ENDP
190 ;-------------------------------------------------------------------------------------
191 ; AsmGetAddressMap (&AddressMap);
192 ;-------------------------------------------------------------------------------------
193 ; comments here for definition of address map
194 AsmGetAddressMap PROC
195 mov rax, offset RendezvousFunnelProcStart
196 mov qword ptr [rcx], rax
197 mov qword ptr [rcx+8h], PMODE_ENTRY - RendezvousFunnelProcStart
198 mov qword ptr [rcx+10h], FLAT32_JUMP - RendezvousFunnelProcStart
199 mov qword ptr [rcx+18h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart
200 mov qword ptr [rcx+20h], LongModeStart - RendezvousFunnelProcStart
201 mov qword ptr [rcx+28h], LONG_JUMP - RendezvousFunnelProcStart
204 AsmGetAddressMap ENDP