]> git.proxmox.com Git - mirror_edk2.git/blob - UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm
UefiCpuPkg/CpuMpPei: Initialize FPU per UEFI specification
[mirror_edk2.git] / UefiCpuPkg / CpuMpPei / Ia32 / MpFuncs.asm
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.
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 ; MpFuncs32.asm
14 ;
15 ; Abstract:
16 ;
17 ; This is the assembly code for MP support
18 ;
19 ;-------------------------------------------------------------------------------
20
21 .686p
22 .model flat
23
24 include MpEqu.inc
25 InitializeFloatingPointUnits PROTO C
26
27 .code
28
29 ;-------------------------------------------------------------------------------------
30 ;RendezvousFunnelProc procedure follows. All APs execute their procedure. This
31 ;procedure serializes all the AP processors through an Init sequence. It must be
32 ;noted that APs arrive here very raw...ie: real mode, no stack.
33 ;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
34 ;IS IN MACHINE CODE.
35 ;-------------------------------------------------------------------------------------
36 RendezvousFunnelProc PROC PUBLIC
37 RendezvousFunnelProcStart::
38 ; At this point CS = 0x(vv00) and ip= 0x0.
39 ; Save BIST information to ebp firstly
40 db 66h, 08bh, 0e8h ; mov ebp, eax ; save BIST information
41
42 db 8ch,0c8h ; mov ax,cs
43 db 8eh,0d8h ; mov ds,ax
44 db 8eh,0c0h ; mov es,ax
45 db 8eh,0d0h ; mov ss,ax
46 db 33h,0c0h ; xor ax,ax
47 db 8eh,0e0h ; mov fs,ax
48 db 8eh,0e8h ; mov gs,ax
49
50 db 0BEh ; opcode of mov si, mem16
51 dw BufferStartLocation ; mov si, BufferStartLocation
52 db 66h, 8Bh, 1Ch ; mov ebx,dword ptr [si]
53
54 db 0BFh ; opcode of mov di, mem16
55 dw PmodeOffsetLocation ; mov di, PmodeOffsetLocation
56 db 66h, 8Bh, 05h ; mov eax,dword ptr [di]
57 db 8Bh, 0F8h ; mov di, ax
58 db 83h, 0EFh,06h ; sub di, 06h
59 db 66h, 03h, 0C3h ; add eax, ebx
60 db 66h, 89h, 05h ; mov dword ptr [di],eax
61
62 db 0BEh ; opcode of mov si, mem16
63 dw GdtrLocation ; mov si, GdtrLocation
64 db 66h ; db 66h
65 db 2Eh, 0Fh, 01h, 14h ; lgdt fword ptr cs:[si]
66
67 db 0BEh
68 dw IdtrLocation ; mov si, IdtrLocation
69 db 66h ; db 66h
70 db 2Eh,0Fh, 01h, 1Ch ; lidt fword ptr cs:[si]
71
72 db 33h, 0C0h ; xor ax, ax
73 db 8Eh, 0D8h ; mov ds, ax
74
75 db 0Fh, 20h, 0C0h ; mov eax, cr0 ;Get control register 0
76 db 66h, 83h, 0C8h, 03h ; or eax, 000000003h ;Set PE bit (bit #0) & MP
77 db 0Fh, 22h, 0C0h ; mov cr0, eax
78
79 db 66h, 67h, 0EAh ; far jump
80 dd 0h ; 32-bit offset
81 dw PROTECT_MODE_CS ; 16-bit selector
82
83 Flat32Start:: ; protected mode entry point
84 mov ax, PROTECT_MODE_DS
85 mov ds, ax
86 mov es, ax
87 mov fs, ax
88 mov gs, ax
89 mov ss, ax
90
91 mov esi, ebx
92 mov edi, esi
93 add edi, LockLocation
94 mov eax, NotVacantFlag
95
96 TestLock:
97 xchg dword ptr [edi], eax
98 cmp eax, NotVacantFlag
99 jz TestLock
100
101 mov edi, esi
102 add edi, NumApsExecutingLoction
103 inc dword ptr [edi]
104 mov ebx, dword ptr [edi]
105
106 ProgramStack:
107 mov edi, esi
108 add edi, StackSizeLocation
109 mov eax, dword ptr [edi]
110 mov edi, esi
111 add edi, StackStartAddressLocation
112 add eax, dword ptr [edi]
113 mov esp, eax
114 mov dword ptr [edi], eax
115
116 Releaselock:
117 mov eax, VacantFlag
118 mov edi, esi
119 add edi, LockLocation
120 xchg dword ptr [edi], eax
121
122 CProcedureInvoke:
123 push ebp ; push BIST data at top of AP stack
124 xor ebp, ebp ; clear ebp for call stack trace
125 push ebp
126 mov ebp, esp
127
128 mov eax, InitializeFloatingPointUnits
129 call eax ; Call assembly function to initialize FPU per UEFI spec
130
131 push ebx ; Push NumApsExecuting
132 mov eax, esi
133 add eax, LockLocation
134 push eax ; push address of exchange info data buffer
135
136 mov edi, esi
137 add edi, ApProcedureLocation
138 mov eax, dword ptr [edi]
139
140 call eax ; invoke C function
141
142 jmp $ ; never reach here
143
144 RendezvousFunnelProc ENDP
145 RendezvousFunnelProcEnd::
146
147
148 AsmInitializeGdt PROC near C PUBLIC
149 push ebp
150 mov ebp, esp
151 pushad
152 mov edi, [ebp + 8] ; Load GDT register
153
154 mov ax,cs ; Get the selector data from our code image
155 mov es,ax
156 lgdt FWORD PTR es:[edi] ; and update the GDTR
157
158 push PROTECT_MODE_CS
159 lea eax, SetCodeSelectorFarJump
160 push eax
161 retf
162 SetCodeSelectorFarJump:
163 mov ax, PROTECT_MODE_DS ; Update the Base for the new selectors, too
164 mov ds, ax
165 mov es, ax
166 mov fs, ax
167 mov gs, ax
168 mov ss, ax
169
170 popad
171 pop ebp
172 ret
173 AsmInitializeGdt ENDP
174
175 END