]> git.proxmox.com Git - mirror_edk2.git/blob - UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/MpFuncs.nasm
UefiCpuPkg/PiSmmCpuDxeSmm: patch "gSmiCr3" with PatchInstructionX86()
[mirror_edk2.git] / UefiCpuPkg / PiSmmCpuDxeSmm / Ia32 / MpFuncs.nasm
1 ;------------------------------------------------------------------------------ ;
2 ; Copyright (c) 2016, 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.nasm
14 ;
15 ; Abstract:
16 ;
17 ; This is the assembly code for Multi-processor S3 support
18 ;
19 ;-------------------------------------------------------------------------------
20
21 SECTION .text
22
23 extern ASM_PFX(InitializeFloatingPointUnits)
24
25 %define VacantFlag 0x0
26 %define NotVacantFlag 0xff
27
28 %define LockLocation RendezvousFunnelProcEnd - RendezvousFunnelProcStart
29 %define StackStart LockLocation + 0x4
30 %define StackSize LockLocation + 0x8
31 %define RendezvousProc LockLocation + 0xC
32 %define GdtrProfile LockLocation + 0x10
33 %define IdtrProfile LockLocation + 0x16
34 %define BufferStart LockLocation + 0x1C
35
36 ;-------------------------------------------------------------------------------------
37 ;RendezvousFunnelProc procedure follows. All APs execute their procedure. This
38 ;procedure serializes all the AP processors through an Init sequence. It must be
39 ;noted that APs arrive here very raw...ie: real mode, no stack.
40 ;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
41 ;IS IN MACHINE CODE.
42 ;-------------------------------------------------------------------------------------
43 ;RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
44
45 BITS 16
46 global ASM_PFX(RendezvousFunnelProc)
47 ASM_PFX(RendezvousFunnelProc):
48 RendezvousFunnelProcStart:
49
50 ; At this point CS = 0x(vv00) and ip= 0x0.
51
52 mov ax, cs
53 mov ds, ax
54 mov es, ax
55 mov ss, ax
56 xor ax, ax
57 mov fs, ax
58 mov gs, ax
59
60 flat32Start:
61
62 mov si, BufferStart
63 mov edx,dword [si] ; EDX is keeping the start address of wakeup buffer
64
65 mov si, GdtrProfile
66 o32 lgdt [cs:si]
67
68 mov si, IdtrProfile
69 o32 lidt [cs:si]
70
71 xor ax, ax
72 mov ds, ax
73
74 mov eax, cr0 ; Get control register 0
75 or eax, 0x000000001 ; Set PE bit (bit #0)
76 mov cr0, eax
77
78 FLAT32_JUMP:
79
80 a32 jmp dword 0x20:0x0
81
82 BITS 32
83 PMODE_ENTRY: ; protected mode entry point
84
85 mov ax, 0x8
86 o16 mov ds, ax
87 o16 mov es, ax
88 o16 mov fs, ax
89 o16 mov gs, ax
90 o16 mov ss, ax ; Flat mode setup.
91
92 mov esi, edx
93
94 mov edi, esi
95 add edi, LockLocation
96 mov al, NotVacantFlag
97 TestLock:
98 xchg byte [edi], al
99 cmp al, NotVacantFlag
100 jz TestLock
101
102 ProgramStack:
103
104 mov edi, esi
105 add edi, StackSize
106 mov eax, dword [edi]
107 mov edi, esi
108 add edi, StackStart
109 add eax, dword [edi]
110 mov esp, eax
111 mov dword [edi], eax
112
113 Releaselock:
114
115 mov al, VacantFlag
116 mov edi, esi
117 add edi, LockLocation
118 xchg byte [edi], al
119
120 ;
121 ; Call assembly function to initialize FPU.
122 ;
123 mov ebx, ASM_PFX(InitializeFloatingPointUnits)
124 call ebx
125 ;
126 ; Call C Function
127 ;
128 mov edi, esi
129 add edi, RendezvousProc
130 mov eax, dword [edi]
131
132 test eax, eax
133 jz GoToSleep
134 call eax ; Call C function
135
136 GoToSleep:
137 cli
138 hlt
139 jmp $-2
140
141 RendezvousFunnelProcEnd:
142 ;-------------------------------------------------------------------------------------
143 ; AsmGetAddressMap (&AddressMap);
144 ;-------------------------------------------------------------------------------------
145 global ASM_PFX(AsmGetAddressMap)
146 ASM_PFX(AsmGetAddressMap):
147
148 pushad
149 mov ebp,esp
150
151 mov ebx, dword [ebp+0x24]
152 mov dword [ebx], RendezvousFunnelProcStart
153 mov dword [ebx+0x4], PMODE_ENTRY - RendezvousFunnelProcStart
154 mov dword [ebx+0x8], FLAT32_JUMP - RendezvousFunnelProcStart
155 mov dword [ebx+0xc], RendezvousFunnelProcEnd - RendezvousFunnelProcStart
156
157 popad
158 ret
159