UefiCpuPkg: Add PiSmmCpuDxeSmm module IA32 files
[mirror_edk2.git] / UefiCpuPkg / PiSmmCpuDxeSmm / Ia32 / MpFuncs.asm
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
25 EXTERN InitializeFloatingPointUnits:PROC
26
27 VacantFlag Equ 00h
28 NotVacantFlag Equ 0ffh
29
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
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
47 RendezvousFunnelProc PROC near C PUBLIC
48 RendezvousFunnelProcStart::
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
60 flat32Start::
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
83 FLAT32_JUMP::
84
85 db 66h, 67h, 0EAh ; far jump
86 dd 0h ; 32-bit offset
87 dw 20h ; 16-bit selector
88
89 PMODE_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
103 TestLock::
104 xchg byte ptr [edi], al
105 cmp al, NotVacantFlag
106 jz TestLock
107
108 ProgramStack::
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
119 Releaselock::
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
142 GoToSleep::
143 cli
144 hlt
145 jmp $-2
146
147 RendezvousFunnelProc ENDP
148 RendezvousFunnelProcEnd::
149 ;-------------------------------------------------------------------------------------
150 ; AsmGetAddressMap (&AddressMap);
151 ;-------------------------------------------------------------------------------------
152 AsmGetAddressMap 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
166 AsmGetAddressMap ENDP
167
168 END