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 ;-------------------------------------------------------------------------------------
26 ;RendezvousFunnelProc procedure follows. All APs execute their procedure. This
27 ;procedure serializes all the AP processors through an Init sequence. It must be
28 ;noted that APs arrive here very raw...ie: real mode, no stack.
29 ;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
31 ;-------------------------------------------------------------------------------------
32 global ASM_PFX(RendezvousFunnelProc)
33 ASM_PFX(RendezvousFunnelProc):
34 RendezvousFunnelProcStart:
35 ; At this point CS = 0x(vv00) and ip= 0x0.
37 mov ebp, eax ; save BIST information
47 mov si, BufferStartLocation
50 mov di, PmodeOffsetLocation
66 mov eax, cr0 ;Get control register 0
67 or eax, 000000003h ;Set PE bit (bit #0) & MP
70 jmp PROTECT_MODE_CS:strict dword 0 ; far jump to protected mode
72 Flat32Start: ; protected mode entry point
73 mov ax, PROTECT_MODE_DS
83 mov eax, NotVacantFlag
87 cmp eax, NotVacantFlag
91 add edi, NumApsExecutingLoction
97 add edi, StackSizeLocation
100 add edi, StackStartAddressLocation
108 add edi, LockLocation
112 push ebp ; push BIST data at top of AP stack
113 xor ebp, ebp ; clear ebp for call stack trace
118 push ebx ; Push NumApsExecuting
120 add eax, LockLocation
121 push eax ; push address of exchange info data buffer
124 add edi, ApProcedureLocation
127 call eax ; invoke C function
129 jmp $ ; never reach here
130 RendezvousFunnelProcEnd:
133 global ASM_PFX(AsmInitializeGdt)
134 ASM_PFX(AsmInitializeGdt):
138 mov edi, [ebp + 8] ; Load GDT register
140 lgdt [edi] ; and update the GDTR
143 mov eax, ASM_PFX(SetCodeSelectorFarJump)
146 ASM_PFX(SetCodeSelectorFarJump):
147 mov ax, PROTECT_MODE_DS ; Update the Base for the new selectors, too