• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
21EXTERN  InitializeFloatingPointUnits:PROC
22
23VacantFlag             Equ   00h
24NotVacantFlag          Equ   0ffh
25
26LockLocation                  equ        RendezvousFunnelProcEnd - RendezvousFunnelProcStart
27StackStartAddressLocation     equ        LockLocation + 08h
28StackSizeLocation             equ        LockLocation + 10h
29CProcedureLocation            equ        LockLocation + 18h
30GdtrLocation                  equ        LockLocation + 20h
31IdtrLocation                  equ        LockLocation + 2Ah
32BufferStartLocation           equ        LockLocation + 34h
33Cr3OffsetLocation             equ        LockLocation + 38h
34
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
40;IS IN MACHINE CODE.
41;-------------------------------------------------------------------------------------
42;RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
43
44;text      SEGMENT
45.code
46
47RendezvousFunnelProc   PROC
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 BufferStartLocation        ; mov        si, BufferStartLocation
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 Cr3OffsetLocation          ; mov        si, Cr3Location
68        db 66h,  8Bh, 0Ch             ; mov        ecx,dword ptr [si]          ; ECX is keeping the value of CR3
69
70        db 0BEh
71        dw GdtrLocation               ; mov        si, GdtrProfile
72        db 66h                        ; db         66h
73        db 2Eh,  0Fh, 01h, 14h        ; lgdt       fword ptr cs:[si]
74
75        db 0BEh
76        dw IdtrLocation               ; mov        si, IdtrProfile
77        db 66h                        ; db         66h
78        db 2Eh,  0Fh, 01h, 1Ch        ; lidt       fword ptr cs:[si]
79
80        db 33h,  0C0h                 ; xor        ax,  ax
81        db 8Eh,  0D8h                 ; mov        ds,  ax
82
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
86
87FLAT32_JUMP::
88
89        db 66h,  67h, 0EAh            ; far jump
90        dd 0h                         ; 32-bit offset
91        dw 20h                        ; 16-bit selector
92
93PMODE_ENTRY::                         ; protected mode entry point
94
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.
101
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
105
106        db 0Fh,  22h,  0D9h           ; mov        cr3, ecx
107
108        db 8Bh,  0F2h                 ; mov        esi, edx                    ; Save wakeup buffer address
109
110        db 0B9h
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.
115
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.
119
120LONG_JUMP::
121
122        db 67h,  0EAh                 ; far jump
123        dd 0h                         ; 32-bit offset
124        dw 38h                        ; 16-bit selector
125
126LongModeStart::
127
128        mov         ax,  30h
129        mov         ds,  ax
130        mov         es,  ax
131        mov         ss,  ax
132
133        mov  edi, esi
134        add  edi, LockLocation
135        mov  al,  NotVacantFlag
136TestLock::
137        xchg byte ptr [edi], al
138        cmp  al, NotVacantFlag
139        jz   TestLock
140
141ProgramStack::
142
143        mov  edi, esi
144        add  edi, StackSizeLocation
145        mov  rax, qword ptr [edi]
146        mov  edi, esi
147        add  edi, StackStartAddressLocation
148        add  rax, qword ptr [edi]
149        mov  rsp, rax
150        mov  qword ptr [edi], rax
151
152Releaselock::
153
154        mov  al,  VacantFlag
155        mov  edi, esi
156        add  edi, LockLocation
157        xchg byte ptr [edi], al
158
159        ;
160        ; Call assembly function to initialize FPU.
161        ;
162        mov         rax, InitializeFloatingPointUnits
163        sub         rsp, 20h
164        call        rax
165        add         rsp, 20h
166
167        ;
168        ; Call C Function
169        ;
170        mov         edi, esi
171        add         edi, CProcedureLocation
172        mov         rax, qword ptr [edi]
173
174        test        rax, rax
175        jz          GoToSleep
176
177        sub         rsp, 20h
178        call        rax
179        add         rsp, 20h
180
181GoToSleep::
182        cli
183        hlt
184        jmp         $-2
185
186RendezvousFunnelProcEnd::
187RendezvousFunnelProc   ENDP
188
189
190;-------------------------------------------------------------------------------------
191;  AsmGetAddressMap (&AddressMap);
192;-------------------------------------------------------------------------------------
193; comments here for definition of address map
194AsmGetAddressMap   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
202        ret
203
204AsmGetAddressMap   ENDP
205
206END
207