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.
7;
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.
10;
11; Module Name:
12;
13;   MpFuncs.asm
14;
15; Abstract:
16;
17;   This is the assembly code for Multi-processor S3 support
18;
19;-------------------------------------------------------------------------------
20
21.686p
22.model  flat,C
23.code
24
25EXTERN  InitializeFloatingPointUnits:PROC
26
27VacantFlag             Equ   00h
28NotVacantFlag          Equ   0ffh
29
30LockLocation        equ        RendezvousFunnelProcEnd - RendezvousFunnelProcStart
31StackStart          equ        LockLocation + 4h
32StackSize           equ        LockLocation + 8h
33RendezvousProc      equ        LockLocation + 0Ch
34GdtrProfile         equ        LockLocation + 10h
35IdtrProfile         equ        LockLocation + 16h
36BufferStart         equ        LockLocation + 1Ch
37
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
43;IS IN MACHINE CODE.
44;-------------------------------------------------------------------------------------
45;RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
46
47RendezvousFunnelProc   PROC  near C  PUBLIC
48RendezvousFunnelProcStart::
49
50; At this point CS = 0x(vv00) and ip= 0x0.
51
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
59
60flat32Start::
61
62        db 0BEh
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
65
66        db 0BEh
67        dw GdtrProfile                ; mov        si, GdtrProfile
68        db 66h                        ; db         66h
69        db 2Eh,  0Fh, 01h, 14h        ; lgdt       fword ptr cs:[si]
70
71        db 0BEh
72        dw IdtrProfile                ; mov        si, IdtrProfile
73        db 66h                        ; db         66h
74        db 2Eh,  0Fh, 01h, 1Ch        ; lidt       fword ptr cs:[si]
75
76        db 33h,  0C0h                 ; xor        ax,  ax
77        db 8Eh,  0D8h                 ; mov        ds,  ax
78
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
82
83FLAT32_JUMP::
84
85        db 66h,  67h, 0EAh            ; far jump
86        dd 0h                         ; 32-bit offset
87        dw 20h                        ; 16-bit selector
88
89PMODE_ENTRY::                         ; protected mode entry point
90
91        mov         ax,  8h
92        mov         ds,  ax
93        mov         es,  ax
94        mov         fs,  ax
95        mov         gs,  ax
96        mov         ss,  ax           ; Flat mode setup.
97
98        mov         esi, edx
99
100        mov         edi, esi
101        add         edi, LockLocation
102        mov         al,  NotVacantFlag
103TestLock::
104        xchg        byte ptr [edi], al
105        cmp         al, NotVacantFlag
106        jz          TestLock
107
108ProgramStack::
109
110        mov         edi, esi
111        add         edi, StackSize
112        mov         eax, dword ptr [edi]
113        mov         edi, esi
114        add         edi, StackStart
115        add         eax, dword ptr [edi]
116        mov         esp, eax
117        mov         dword ptr [edi], eax
118
119Releaselock::
120
121        mov         al,  VacantFlag
122        mov         edi, esi
123        add         edi, LockLocation
124        xchg        byte ptr [edi], al
125
126        ;
127        ; Call assembly function to initialize FPU.
128        ;
129        mov         ebx, InitializeFloatingPointUnits
130        call        ebx
131        ;
132        ; Call C Function
133        ;
134        mov         edi, esi
135        add         edi, RendezvousProc
136        mov         eax, dword ptr [edi]
137
138        test        eax, eax
139        jz          GoToSleep
140        call        eax                           ; Call C function
141
142GoToSleep::
143        cli
144        hlt
145        jmp         $-2
146
147RendezvousFunnelProc   ENDP
148RendezvousFunnelProcEnd::
149;-------------------------------------------------------------------------------------
150;  AsmGetAddressMap (&AddressMap);
151;-------------------------------------------------------------------------------------
152AsmGetAddressMap   PROC  near C  PUBLIC
153
154        pushad
155        mov         ebp,esp
156
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
162
163        popad
164        ret
165
166AsmGetAddressMap   ENDP
167
168END
169