File: | home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Core/Init/StmInit.c |
Warning: | line 759, column 52 Access to field 'RsdtAddress' results in a dereference of a null pointer (loaded from variable 'Rsdp') |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /** @file | |||
2 | STM initialization | |||
3 | ||||
4 | Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR> | |||
5 | This program and the accompanying materials | |||
6 | are licensed and made available under the terms and conditions of the BSD License | |||
7 | which accompanies this distribution. The full text of the license may be found at | |||
8 | http://opensource.org/licenses/bsd-license.php. | |||
9 | ||||
10 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |||
11 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |||
12 | ||||
13 | **/ | |||
14 | ||||
15 | #include "StmInit.h" | |||
16 | #include "PeStm.h" | |||
17 | #include <Library/PcdLib.h> | |||
18 | #include <string.h> | |||
19 | ||||
20 | extern PE_SMI_CONTROL PeSmiControl; | |||
21 | ||||
22 | extern void InitPe(); | |||
23 | ||||
24 | STM_HOST_CONTEXT_COMMON mHostContextCommon; | |||
25 | STM_GUEST_CONTEXT_COMMON mGuestContextCommonSmi; | |||
26 | STM_GUEST_CONTEXT_COMMON mGuestContextCommonSmm[NUM_PE_TYPE4]; | |||
27 | ||||
28 | ||||
29 | static SPIN_LOCK CpuReadyCountLock; | |||
30 | static unsigned int CpuReadyCount = 0; | |||
31 | void CpuReadySync(UINT32 Index); | |||
32 | VOIDvoid InitCpuReadySync(); | |||
33 | ||||
34 | volatile BOOLEAN mIsBspInitialized; | |||
35 | ||||
36 | extern volatile BOOLEAN *mCpuInitStatus; | |||
37 | ||||
38 | /*++ | |||
39 | STM runtime: | |||
40 | ||||
41 | +------------+ | |||
42 | | SMM handler| | |||
43 | +-------+ +------------+ | |||
44 | | Guest | -- ^ | | |||
45 | +-------+ | (2)VMResume| |(3)RSM | |||
46 | |(1) SMI | v | |||
47 | +-------+ |-----------> +------------+ | |||
48 | | | |(4) VMResume |SMI-H SMM-H| | |||
49 | | MVMM | -<----------- | STM | | |||
50 | | | (0) Init |STM-Init | | |||
51 | +-------+ -------------> +------------+ | |||
52 | ||||
53 | Memory layout: | |||
54 | +--------------------+ -- | |||
55 | | SMM VMCS | | | |||
56 | +--------------------+ |-> Per-Processor VMCS | |||
57 | | SMI VMCS | | | |||
58 | +--------------------+ -- | |||
59 | | SMM VMCS | | | |||
60 | +--------------------+ |-> Per-Processor VMCS | |||
61 | | SMI VMCS | | | |||
62 | +--------------------+ -- | |||
63 | | Stack | |-> Per-Processor Dynamic | |||
64 | +--------------------+ -- | |||
65 | | Stack | |-> Per-Processor Dynamic | |||
66 | RSP-> +--------------------+ -- | |||
67 | | Heap | | | |||
68 | +--------------------+ |-> Additional Dynamic | |||
69 | | Page Table (24K) | | | |||
70 | CR3-> +--------------------+ -- | |||
71 | RIP-> | STM Code | | | |||
72 | +--------------------+ | | |||
73 | | GDT (4K) | |-> Static Image | |||
74 | GDT-> +--------------------+ | | |||
75 | | STM Header (4K) | | | |||
76 | MSEG-> +--------------------+ -- | |||
77 | --*/ | |||
78 | ||||
79 | /** | |||
80 | ||||
81 | This function return 4K page aligned VMCS size. | |||
82 | ||||
83 | @return 4K page aligned VMCS size | |||
84 | ||||
85 | **/ | |||
86 | UINT32 | |||
87 | GetVmcsSize ( | |||
88 | VOIDvoid | |||
89 | ) | |||
90 | { | |||
91 | UINT64 Data64; | |||
92 | UINT32 VmcsSize; | |||
93 | ||||
94 | Data64 = AsmReadMsr64 (IA32_VMX_BASIC_MSR_INDEX0x480); | |||
95 | VmcsSize = (UINT32)(RShiftU64 (Data64, 32) & 0xFFFF); | |||
96 | VmcsSize = STM_PAGES_TO_SIZE (STM_SIZE_TO_PAGES (VmcsSize))( ((((VmcsSize) >> 12) + (((VmcsSize) & 0xFFF) ? 1 : 0))) << 12); | |||
97 | ||||
98 | return VmcsSize; | |||
99 | } | |||
100 | ||||
101 | /** | |||
102 | ||||
103 | This function return if Senter executed. | |||
104 | ||||
105 | @retval TRUE Senter executed | |||
106 | @retval FALSE Sexit not executed | |||
107 | ||||
108 | **/ | |||
109 | BOOLEAN | |||
110 | IsSentryEnabled ( | |||
111 | VOIDvoid | |||
112 | ) | |||
113 | { | |||
114 | UINT32 TxtStatus; | |||
115 | ||||
116 | TxtStatus = TxtPubRead32 (TXT_STS0x0); | |||
117 | if (((TxtStatus & TXT_STS_SENTER_DONE0x1) != 0) && | |||
118 | ((TxtStatus & TXT_STS_SEXIT_DONE0x2) == 0)) { | |||
119 | return TRUE((BOOLEAN)(1==1)); | |||
120 | } else { | |||
121 | return FALSE((BOOLEAN)(0==1)); | |||
122 | } | |||
123 | } | |||
124 | ||||
125 | /** | |||
126 | ||||
127 | This function get CPU number in TXT heap region. | |||
128 | ||||
129 | @return CPU number in TXT heap region | |||
130 | ||||
131 | **/ | |||
132 | UINT32 | |||
133 | GetCpuNumFromTxt ( | |||
134 | VOIDvoid | |||
135 | ) | |||
136 | { | |||
137 | TXT_BIOS_TO_OS_DATA *BiosToOsData; | |||
138 | ||||
139 | BiosToOsData = GetTxtBiosToOsData (); | |||
140 | ||||
141 | return BiosToOsData->NumLogProcs; | |||
142 | } | |||
143 | ||||
144 | /** | |||
145 | ||||
146 | This function return PCI Express information in TXT heap region. | |||
147 | Only one segment information is returned. | |||
148 | ||||
149 | @param PciExpressBaseAddress PCI Express base address | |||
150 | @param PciExpressLength PCI Express length | |||
151 | ||||
152 | @return PciExpressBaseAddress | |||
153 | ||||
154 | **/ | |||
155 | UINT64 | |||
156 | GetPciExpressInfoFromTxt ( | |||
157 | OUT UINT64 *PciExpressBaseAddress, | |||
158 | OUT UINT64 *PciExpressLength | |||
159 | ) | |||
160 | { | |||
161 | TXT_SINIT_TO_MLE_DATA *SinitToMleData; | |||
162 | TXT_SINIT_MEMORY_DESCRIPTOR_RECORD *SinitMemoryDescriptor; | |||
163 | UINTN Index; | |||
164 | ||||
165 | SinitToMleData = GetTxtSinitToMleData (); | |||
166 | SinitMemoryDescriptor = (TXT_SINIT_MEMORY_DESCRIPTOR_RECORD *)((UINTN)SinitToMleData - sizeof(UINT64) + SinitToMleData->SinitMdrTableOffset); | |||
167 | for (Index = 0; Index < SinitToMleData->NumberOfSinitMdrs; Index++) { | |||
168 | if (SinitMemoryDescriptor[Index].Type == TXT_SINIT_MDR_TYPE_PCIE3) { | |||
169 | *PciExpressBaseAddress = SinitMemoryDescriptor[Index].Address; | |||
170 | *PciExpressLength = SinitMemoryDescriptor[Index].Length; | |||
171 | return SinitMemoryDescriptor[Index].Address; | |||
172 | } | |||
173 | } | |||
174 | ||||
175 | *PciExpressBaseAddress = 0; | |||
176 | *PciExpressLength = 0; | |||
177 | return 0; | |||
178 | } | |||
179 | ||||
180 | #define EBDA_BASE_ADDRESS0x40E 0x40E | |||
181 | ||||
182 | /** | |||
183 | ||||
184 | This function find ACPI RSDPTR in TXT heap region. | |||
185 | ||||
186 | @return ACPI RSDPTR in TXT heap region | |||
187 | ||||
188 | **/ | |||
189 | VOIDvoid * | |||
190 | FindTxtAcpiRsdPtr ( | |||
191 | VOIDvoid | |||
192 | ) | |||
193 | { | |||
194 | TXT_OS_TO_SINIT_DATA *OsSinitData; | |||
195 | ||||
196 | OsSinitData = GetTxtOsToSinitData (); | |||
197 | if (OsSinitData->Version < 5) { | |||
198 | return NULL((void*)0); | |||
199 | } | |||
200 | ||||
201 | return (VOIDvoid *)(UINTN)OsSinitData->RsdpPtr; | |||
202 | } | |||
203 | ||||
204 | /** | |||
205 | ||||
206 | This function find ACPI RSDPTR in UEFI or legacy region. | |||
207 | ||||
208 | @return ACPI RSDPTR in UEFI or legacy region | |||
209 | ||||
210 | **/ | |||
211 | VOIDvoid * | |||
212 | FindAcpiRsdPtr ( | |||
213 | VOIDvoid | |||
214 | ) | |||
215 | { | |||
216 | if (mHostContextCommon.AcpiRsdp != 0) { | |||
217 | DEBUG((EFI_D_INFO, "RSDP found in mHostContextCommon.AcpiRsdp 0x%016llx\n", mHostContextCommon.AcpiRsdp))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "RSDP found in mHostContextCommon.AcpiRsdp 0x%016llx\n" , mHostContextCommon.AcpiRsdp); } } while (((BOOLEAN)(0==1))); | |||
218 | return (VOIDvoid *)(UINTN)mHostContextCommon.AcpiRsdp; | |||
219 | } else { | |||
220 | UINTN Address; | |||
221 | DEBUG((EFI_D_INFO, "Searching for RSDP\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Searching for RSDP\n" ); } } while (((BOOLEAN)(0==1))); | |||
222 | // | |||
223 | // Search EBDA | |||
224 | // | |||
225 | Address = (*(UINT16 *)(UINTN)(EBDA_BASE_ADDRESS0x40E)) << 4; | |||
226 | for (; Address < 0xA0000 ; Address += 0x10) { | |||
227 | if (*(UINT64 *)(Address) == EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE(((('R') | ('S' << 8)) | ((('D') | (' ' << 8)) << 16)) | ((UINT64) (((('P') | ('T' << 8)) | ((('R') | (' ' << 8)) << 16))) << 32))) { | |||
228 | DEBUG((EFI_D_INFO, "RSDP found\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "RSDP found\n" ); } } while (((BOOLEAN)(0==1))); | |||
229 | mHostContextCommon.AcpiRsdp = Address; // save having to keep looking for it | |||
230 | AsmWbinvd (); // let everone see it | |||
231 | return (VOIDvoid *)(Address); | |||
232 | } | |||
233 | } | |||
234 | ||||
235 | // | |||
236 | // First Seach 0x0e0000 - 0x0fffff for RSD Ptr | |||
237 | // | |||
238 | for (Address = 0xe0000; Address < 0xfffff; Address += 0x10) { | |||
239 | //DEBUG((EFI_D_INFO, "0x%08lx 0x%016llx 0x%016llx - ", Address, *(UINT64 *)(Address), EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE)); | |||
240 | if (*(UINT64 *)(Address) == EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE(((('R') | ('S' << 8)) | ((('D') | (' ' << 8)) << 16)) | ((UINT64) (((('P') | ('T' << 8)) | ((('R') | (' ' << 8)) << 16))) << 32))) { | |||
241 | DEBUG((EFI_D_INFO, "RSDP found\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "RSDP found\n" ); } } while (((BOOLEAN)(0==1))); | |||
242 | mHostContextCommon.AcpiRsdp = Address; // save having to keep looking for it | |||
243 | AsmWbinvd (); | |||
244 | return (VOIDvoid *)Address; | |||
245 | } | |||
246 | } | |||
247 | ||||
248 | // | |||
249 | // Not found | |||
250 | // | |||
251 | return NULL((void*)0); | |||
252 | } | |||
253 | } | |||
254 | ||||
255 | /** | |||
256 | ||||
257 | This function scan ACPI table in RSDT. | |||
258 | ||||
259 | @param Rsdt ACPI RSDT | |||
260 | @param Signature ACPI table signature | |||
261 | ||||
262 | @return ACPI table | |||
263 | ||||
264 | **/ | |||
265 | VOIDvoid * | |||
266 | ScanTableInRSDT ( | |||
267 | IN EFI_ACPI_DESCRIPTION_HEADER *Rsdt, | |||
268 | IN UINT32 Signature | |||
269 | ) | |||
270 | { | |||
271 | UINTN Index; | |||
272 | UINT32 EntryCount; | |||
273 | UINT32 *EntryPtr; | |||
274 | EFI_ACPI_DESCRIPTION_HEADER *Table; | |||
275 | ||||
276 | EntryCount = (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT32); | |||
277 | ||||
278 | EntryPtr = (UINT32 *)(Rsdt + 1); | |||
279 | for (Index = 0; Index < EntryCount; Index ++, EntryPtr ++) { | |||
280 | Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(*EntryPtr)); | |||
281 | if (Table->Signature == Signature) { | |||
282 | return Table; | |||
283 | } | |||
284 | } | |||
285 | ||||
286 | return NULL((void*)0); | |||
287 | } | |||
288 | ||||
289 | /** | |||
290 | ||||
291 | This function scan ACPI table in XSDT. | |||
292 | ||||
293 | @param Xsdt ACPI XSDT | |||
294 | @param Signature ACPI table signature | |||
295 | ||||
296 | @return ACPI table | |||
297 | ||||
298 | **/ | |||
299 | VOIDvoid * | |||
300 | ScanTableInXSDT ( | |||
301 | IN EFI_ACPI_DESCRIPTION_HEADER *Xsdt, | |||
302 | IN UINT32 Signature | |||
303 | ) | |||
304 | { | |||
305 | UINTN Index; | |||
306 | UINT32 EntryCount; | |||
307 | UINT64 EntryPtr; | |||
308 | UINTN BasePtr; | |||
309 | EFI_ACPI_DESCRIPTION_HEADER *Table; | |||
310 | ||||
311 | EntryCount = (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT64); | |||
312 | ||||
313 | BasePtr = (UINTN)(Xsdt + 1); | |||
314 | for (Index = 0; Index < EntryCount; Index ++) { | |||
315 | CopyMem (&EntryPtr, (VOIDvoid *)(BasePtr + Index * sizeof(UINT64)), sizeof(UINT64)); | |||
316 | Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(EntryPtr)); | |||
317 | if (Table->Signature == Signature) { | |||
318 | return Table; | |||
319 | } | |||
320 | } | |||
321 | ||||
322 | return NULL((void*)0); | |||
323 | } | |||
324 | ||||
325 | /** | |||
326 | ||||
327 | This function find ACPI table according to signature. | |||
328 | ||||
329 | @param RsdPtr ACPI RSDPTR | |||
330 | @param Signature ACPI table signature | |||
331 | ||||
332 | @return ACPI table | |||
333 | ||||
334 | **/ | |||
335 | VOIDvoid * | |||
336 | FindAcpiPtr ( | |||
337 | VOIDvoid *RsdPtr, | |||
338 | UINT32 Signature | |||
339 | ) | |||
340 | { | |||
341 | EFI_ACPI_DESCRIPTION_HEADER *AcpiTable; | |||
342 | EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; | |||
343 | EFI_ACPI_DESCRIPTION_HEADER *Rsdt; | |||
344 | EFI_ACPI_DESCRIPTION_HEADER *Xsdt; | |||
345 | ||||
346 | if (RsdPtr == NULL((void*)0)) { | |||
347 | return NULL((void*)0); | |||
348 | } | |||
349 | ||||
350 | AcpiTable = NULL((void*)0); | |||
351 | ||||
352 | Rsdp = (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)RsdPtr; | |||
353 | Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->RsdtAddress; | |||
354 | Xsdt = NULL((void*)0); | |||
355 | if ((Rsdp->Revision >= 2) && (Rsdp->XsdtAddress < (UINT64)(UINTN)-1)) { | |||
356 | Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->XsdtAddress; | |||
357 | } | |||
358 | // | |||
359 | // Check Xsdt | |||
360 | // | |||
361 | if (Xsdt != NULL((void*)0)) { | |||
362 | AcpiTable = ScanTableInXSDT (Xsdt, Signature); | |||
363 | } | |||
364 | // | |||
365 | // Check Rsdt | |||
366 | // | |||
367 | if ((AcpiTable == NULL((void*)0)) && (Rsdt != NULL((void*)0))) { | |||
368 | AcpiTable = ScanTableInRSDT (Rsdt, Signature); | |||
369 | } | |||
370 | ||||
371 | return AcpiTable; | |||
372 | } | |||
373 | ||||
374 | /** | |||
375 | ||||
376 | This function return CPU number from MADT. | |||
377 | ||||
378 | @return CPU number | |||
379 | ||||
380 | **/ | |||
381 | UINT32 | |||
382 | GetCpuNumFromAcpi ( | |||
383 | VOIDvoid | |||
384 | ) | |||
385 | { | |||
386 | UINT32 Index; | |||
387 | EFI_ACPI_2_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt; | |||
388 | UINTN Length; | |||
389 | EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC_STRUCTURE *LocalApic; | |||
390 | ||||
391 | Madt = FindAcpiPtr (FindAcpiRsdPtr (), EFI_ACPI_2_0_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE((('A') | ('P' << 8)) | ((('I') | ('C' << 8)) << 16))); | |||
392 | if (Madt == NULL((void*)0)) { | |||
393 | return 1; | |||
394 | } | |||
395 | ||||
396 | Index = 0; | |||
397 | Length = Madt->Header.Length; | |||
398 | LocalApic = (EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC_STRUCTURE *)(Madt + 1); | |||
399 | while ((UINTN)LocalApic < (UINTN)Madt + Length) { | |||
400 | if (LocalApic->Type == EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC0x00) { | |||
401 | if ((LocalApic->Flags & EFI_ACPI_2_0_LOCAL_APIC_ENABLED0x00000001) != 0) { | |||
402 | Index++; | |||
403 | } | |||
404 | } else if (LocalApic->Type == EFI_ACPI_4_0_PROCESSOR_LOCAL_X2APIC0x09) { | |||
405 | if ((((EFI_ACPI_4_0_PROCESSOR_LOCAL_X2APIC_STRUCTURE *)LocalApic)->Flags & EFI_ACPI_4_0_LOCAL_APIC_ENABLED0x00000001) != 0) { | |||
406 | Index++; | |||
407 | } | |||
408 | } | |||
409 | LocalApic = (EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC_STRUCTURE *)((UINTN)LocalApic + LocalApic->Length); | |||
410 | } | |||
411 | ||||
412 | return Index; | |||
413 | } | |||
414 | ||||
415 | /** | |||
416 | ||||
417 | This function return PCI Express information from MCFG. | |||
418 | Only one segment information is returned. | |||
419 | ||||
420 | @param PciExpressBaseAddress PCI Express base address | |||
421 | @param PciExpressLength PCI Express length | |||
422 | ||||
423 | @return PciExpressBaseAddress | |||
424 | ||||
425 | **/ | |||
426 | UINT64 | |||
427 | GetPciExpressInfoFromAcpi ( | |||
428 | OUT UINT64 *PciExpressBaseAddress, | |||
429 | OUT UINT64 *PciExpressLength | |||
430 | ) | |||
431 | { | |||
432 | EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *Mcfg; | |||
433 | UINTN Length; | |||
434 | EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *McfgStruct; | |||
435 | ||||
436 | Mcfg = FindAcpiPtr (FindAcpiRsdPtr (), EFI_ACPI_2_0_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_SIGNATURE((('M') | ('C' << 8)) | ((('F') | ('G' << 8)) << 16))); | |||
437 | if (Mcfg == NULL((void*)0)) { | |||
438 | *PciExpressBaseAddress = 0; | |||
439 | *PciExpressLength = 0; | |||
440 | return 0; | |||
441 | } | |||
442 | ||||
443 | Length = Mcfg->Header.Length; | |||
444 | McfgStruct = (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)(Mcfg + 1); | |||
445 | while ((UINTN)McfgStruct < (UINTN)Mcfg + Length) { | |||
446 | if ((McfgStruct->PciSegmentGroupNumber == 0) && (McfgStruct->StartBusNumber == 0)) { | |||
447 | *PciExpressBaseAddress = McfgStruct->BaseAddress; | |||
448 | *PciExpressLength = (McfgStruct->EndBusNumber + 1) * SIZE_1MB0x00100000; | |||
449 | return McfgStruct->BaseAddress; | |||
450 | } | |||
451 | McfgStruct ++; | |||
452 | } | |||
453 | ||||
454 | *PciExpressBaseAddress = 0; | |||
455 | *PciExpressLength = 0; | |||
456 | return 0; | |||
457 | } | |||
458 | ||||
459 | /** | |||
460 | ||||
461 | This function return minimal MSEG size required by STM. | |||
462 | ||||
463 | @param StmHeader Stm header | |||
464 | ||||
465 | @return minimal MSEG size | |||
466 | ||||
467 | **/ | |||
468 | UINTN | |||
469 | GetMinMsegSize ( | |||
470 | IN STM_HEADER *StmHeader | |||
471 | ) | |||
472 | { | |||
473 | UINTN MinMsegSize; | |||
474 | ||||
475 | //MinMsegSize = (STM_PAGES_TO_SIZE (STM_SIZE_TO_PAGES (StmHeader->SwStmHdr.StaticImageSize)) + | |||
476 | /* we use the page table offset in this calculation because the static memory size does | |||
477 | not account for the data and bss locations which come before the page tables and | |||
478 | are cleared by sinit */ | |||
479 | MinMsegSize = StmHeader->HwStmHdr.Cr3Offset + | |||
480 | StmHeader->SwStmHdr.AdditionalDynamicMemorySize + | |||
481 | ((StmHeader->SwStmHdr.PerProcDynamicMemorySize + GetVmcsSize () * 2) * mHostContextCommon.CpuNum); | |||
482 | ||||
483 | return MinMsegSize; | |||
484 | } | |||
485 | ||||
486 | /** | |||
487 | ||||
488 | This function return the index of CPU according to stack. | |||
489 | ||||
490 | @param Register stack value of this CPU | |||
491 | ||||
492 | @return CPU index | |||
493 | ||||
494 | **/ | |||
495 | UINT32 | |||
496 | GetIndexFromStack ( | |||
497 | IN X86_REGISTER *Register | |||
498 | ) | |||
499 | { | |||
500 | STM_HEADER *StmHeader; | |||
501 | UINTN ThisStackTop; | |||
502 | UINTN StackBottom; | |||
503 | UINTN Index; | |||
504 | ||||
505 | StmHeader = (STM_HEADER *)(UINTN)((UINT32)AsmReadMsr64(IA32_SMM_MONITOR_CTL_MSR_INDEX0x9B) & 0xFFFFF000); | |||
506 | ||||
507 | // | |||
508 | // Stack top of this CPU | |||
509 | // | |||
510 | ThisStackTop = ((UINTN)Register + SIZE_4KB0x00001000 - 1) & ~(SIZE_4KB0x00001000 - 1); | |||
511 | ||||
512 | // | |||
513 | // EspOffset pointer to bottom of 1st CPU | |||
514 | // | |||
515 | StackBottom = (UINTN)StmHeader + StmHeader->HwStmHdr.EspOffset; | |||
516 | Index = (ThisStackTop - StackBottom) / StmHeader->SwStmHdr.PerProcDynamicMemorySize; | |||
517 | ||||
518 | // | |||
519 | // Need minus one for 0-based CPU index | |||
520 | // | |||
521 | return (UINT32)(Index - 1); | |||
522 | } | |||
523 | ||||
524 | ||||
525 | UINT64 | |||
526 | GetMsegInfoFromTxt ( | |||
527 | OUT UINT64 *MsegBase, | |||
528 | OUT UINT64 *MsegLength | |||
529 | ) | |||
530 | { | |||
531 | *MsegBase = TxtPubRead64(TXT_MSEG_BASE0x310); | |||
532 | *MsegLength = TxtPubRead64(TXT_MSEG_SIZE0x318); | |||
533 | return 0; | |||
534 | } | |||
535 | ||||
536 | /** | |||
537 | ||||
538 | This function return MSEG information from MSR. | |||
539 | ||||
540 | @param MsegBase MSEG base address | |||
541 | @param | |||
542 | MSEG length | |||
543 | ||||
544 | @return MsegBase | |||
545 | ||||
546 | **/ | |||
547 | ||||
548 | extern MRTT_INFO mMtrrInfo; | |||
549 | ||||
550 | UINT64 | |||
551 | GetMsegInfoFromMsr ( | |||
552 | OUT UINT64 *MsegBase, | |||
553 | OUT UINT64 *MsegLength | |||
554 | ) | |||
555 | { | |||
556 | UINT32 SmrrBase; | |||
557 | UINT32 SmrrLength; | |||
558 | ||||
559 | SmrrBase = (UINT32)mMtrrInfo.SmrrBase & (UINT32)mMtrrInfo.SmrrMask & 0xFFFFF000; | |||
560 | SmrrLength = (UINT32)mMtrrInfo.SmrrMask & 0xFFFFF000; | |||
561 | SmrrLength = ~SmrrLength + 1; | |||
562 | ||||
563 | *MsegBase = (UINT64)((UINT32)AsmReadMsr64(IA32_SMM_MONITOR_CTL_MSR_INDEX0x9B) & 0xFFFFF000); | |||
564 | ||||
565 | *MsegLength = SmrrLength - (*MsegBase - SmrrBase); | |||
566 | ||||
567 | return *MsegLength; | |||
568 | } | |||
569 | ||||
570 | /** | |||
571 | ||||
572 | This function initialize STM heap. | |||
573 | ||||
574 | @param StmHeader MSEG STM header | |||
575 | ||||
576 | **/ | |||
577 | VOIDvoid | |||
578 | InitHeap ( | |||
579 | IN STM_HEADER *StmHeader | |||
580 | ) | |||
581 | { | |||
582 | HEAP_HEADER *HeaderPointer; | |||
583 | ||||
584 | UINT64 MsegBase; | |||
585 | UINT64 MsegLength; | |||
586 | ||||
587 | if (IsSentryEnabled()) { | |||
588 | GetMsegInfoFromTxt (&MsegBase, &MsegLength); | |||
589 | DEBUG ((EFI_D_INFO, "TXT MsegBase- %08x\n", (UINTN)MsegBase))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "TXT MsegBase- %08x\n" , (UINTN)MsegBase); } } while (((BOOLEAN)(0==1))); | |||
590 | DEBUG ((EFI_D_INFO, "TXT MsegLength - %08x\n", (UINTN)MsegLength))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "TXT MsegLength - %08x\n" , (UINTN)MsegLength); } } while (((BOOLEAN)(0==1))); | |||
591 | } else { | |||
592 | GetMsegInfoFromMsr (&MsegBase, &MsegLength); | |||
593 | } | |||
594 | DEBUG ((EFI_D_INFO, "MsegBase (MSR) - %08x\n", (UINTN)MsegBase))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "MsegBase (MSR) - %08x\n" , (UINTN)MsegBase); } } while (((BOOLEAN)(0==1))); | |||
595 | DEBUG ((EFI_D_INFO, "MsegLength (end of TSEG) - %08x\n", (UINTN)MsegLength))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "MsegLength (end of TSEG) - %08x\n" , (UINTN)MsegLength); } } while (((BOOLEAN)(0==1))); | |||
596 | if (MsegBase == 0) { | |||
597 | DEBUG ((EFI_D_ERROR, "MsegBase == 0\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "MsegBase == 0\n" ); } } while (((BOOLEAN)(0==1))); | |||
598 | CpuDeadLoop (); | |||
599 | } | |||
600 | ||||
601 | DEBUG ((EFI_D_INFO, "Cr30Offset - %08x\n", StmHeader->HwStmHdr.Cr3Offset))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Cr30Offset - %08x\n" , StmHeader->HwStmHdr.Cr3Offset); } } while (((BOOLEAN)(0== 1))); | |||
602 | DEBUG ((EFI_D_INFO, "Page Table Start - %08x\n", MsegBase + StmHeader->HwStmHdr.Cr3Offset))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Page Table Start - %08x\n" , MsegBase + StmHeader->HwStmHdr.Cr3Offset); } } while ((( BOOLEAN)(0==1))); | |||
603 | ||||
604 | ||||
605 | // make sure that the tseg size was set correctly | |||
606 | // right now we will assume a max size of 3mb for mseg, bug, bug | |||
607 | ||||
608 | mHostContextCommon.HeapBottom = (UINT64)((UINTN)StmHeader + | |||
609 | StmHeader->HwStmHdr.Cr3Offset + | |||
610 | STM_PAGES_TO_SIZE(6)( (6) << 12)); // reserve 6 page for page table | |||
611 | ||||
612 | mHostContextCommon.HeapTop = (UINT64)((UINTN)StmHeader + | |||
613 | STM_PAGES_TO_SIZE (STM_SIZE_TO_PAGES (StmHeader->SwStmHdr.StaticImageSize))( ((((StmHeader->SwStmHdr.StaticImageSize) >> 12) + ( ((StmHeader->SwStmHdr.StaticImageSize) & 0xFFF) ? 1 : 0 ))) << 12) + | |||
614 | StmHeader->SwStmHdr.AdditionalDynamicMemorySize); | |||
615 | ||||
616 | mHostContextCommon.HeapFree = mHostContextCommon.HeapBottom; | |||
617 | HeaderPointer = (HEAP_HEADER *)((UINTN) mHostContextCommon.HeapFree); | |||
618 | ||||
619 | HeaderPointer->NextBlock = 0L; | |||
620 | HeaderPointer->BlockLength = (mHostContextCommon.HeapTop - mHostContextCommon.HeapBottom) >> 12; | |||
621 | ||||
622 | } | |||
623 | ||||
624 | /** | |||
625 | ||||
626 | This function initialize basic context for STM. | |||
627 | ||||
628 | **/ | |||
629 | VOIDvoid | |||
630 | InitBasicContext ( | |||
631 | VOIDvoid | |||
632 | ) | |||
633 | { | |||
634 | mHostContextCommon.HostContextPerCpu = (STM_HOST_CONTEXT_PER_CPU *)AllocatePages (STM_SIZE_TO_PAGES(sizeof(STM_HOST_CONTEXT_PER_CPU))(((sizeof(STM_HOST_CONTEXT_PER_CPU)) >> 12) + (((sizeof (STM_HOST_CONTEXT_PER_CPU)) & 0xFFF) ? 1 : 0)) * mHostContextCommon.CpuNum); | |||
635 | mGuestContextCommonSmi.GuestContextPerCpu = (STM_GUEST_CONTEXT_PER_CPU *) AllocatePages (STM_SIZE_TO_PAGES(sizeof(STM_GUEST_CONTEXT_PER_CPU))(((sizeof(STM_GUEST_CONTEXT_PER_CPU)) >> 12) + (((sizeof (STM_GUEST_CONTEXT_PER_CPU)) & 0xFFF) ? 1 : 0)) * mHostContextCommon.CpuNum); | |||
636 | mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu = AllocatePages (STM_SIZE_TO_PAGES(sizeof(STM_GUEST_CONTEXT_PER_CPU))(((sizeof(STM_GUEST_CONTEXT_PER_CPU)) >> 12) + (((sizeof (STM_GUEST_CONTEXT_PER_CPU)) & 0xFFF) ? 1 : 0)) * mHostContextCommon.CpuNum); | |||
637 | } | |||
638 | ||||
639 | extern void GetMtrr(); // found in eptinit.c... | |||
640 | ||||
641 | /** | |||
642 | ||||
643 | This function initialize BSP. | |||
644 | ||||
645 | @param Register X86 register context | |||
646 | ||||
647 | **/ | |||
648 | VOIDvoid | |||
649 | BspInit ( | |||
650 | IN X86_REGISTER *Register | |||
651 | ) | |||
652 | { | |||
653 | STM_HEADER *StmHeader; | |||
654 | UINTN VmcsDatabasePage; | |||
655 | VMCS_RECORD_STRUCTURE *VmcsRecord; | |||
656 | TXT_PROCESSOR_SMM_DESCRIPTOR *TxtProcessorSmmDescriptor; | |||
657 | X86_REGISTER *Reg; | |||
658 | IA32_IDT_GATE_DESCRIPTOR *IdtGate; | |||
659 | UINT32 SubIndex; | |||
660 | UINTN XStateSize; | |||
661 | UINT32 RegEax; | |||
662 | IA32_VMX_MISC_MSR VmxMisc; | |||
663 | UINT32 BiosStmVer = 100; // initially assume that the BIOS supports v1.0 of the Intel ref | |||
664 | IA32_DESCRIPTOR IdtrLoad; | |||
665 | ||||
666 | GetMtrr(); //Needed in various inits | |||
667 | AsmWbinvd(); // make sure it gets out | |||
668 | ||||
669 | StmHeader = (STM_HEADER *)(UINTN)((UINT32)AsmReadMsr64(IA32_SMM_MONITOR_CTL_MSR_INDEX0x9B) & 0xFFFFF000); | |||
670 | ||||
671 | // on a platform that does not start with TXT, cannot assume the data space has been set to zero | |||
672 | ZeroMem(&mHostContextCommon, sizeof(STM_HOST_CONTEXT_COMMON)); | |||
673 | ZeroMem(&mGuestContextCommonSmi, sizeof(STM_HOST_CONTEXT_COMMON)); | |||
674 | ZeroMem(&mGuestContextCommonSmm, sizeof(STM_HOST_CONTEXT_COMMON) * NUM_PE_TYPE4); | |||
675 | ||||
676 | InitHeap (StmHeader); | |||
677 | // after that we can use mHostContextCommon | |||
678 | ||||
679 | InitializeSpinLock (&mHostContextCommon.DebugLock); | |||
680 | // after that we can use DEBUG | |||
681 | ||||
682 | DEBUG ((EFI_D_INFO, " ********************** STM/PE *********************\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " ********************** STM/PE *********************\n" ); } } while (((BOOLEAN)(0==1))); | |||
| ||||
683 | DEBUG ((EFI_D_INFO, "!!!STM build time - %a %a!!!\n", (CHAR8 *)__DATE__, (CHAR8 *)__TIME__))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "!!!STM build time - %a %a!!!\n" , (CHAR8 *)"May 8 2024", (CHAR8 *)"22:20:07"); } } while ((( BOOLEAN)(0==1))); | |||
684 | DEBUG ((EFI_D_INFO, "!!!STM Relocation DONE!!!\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "!!!STM Relocation DONE!!!\n" ); } } while (((BOOLEAN)(0==1))); | |||
685 | DEBUG ((EFI_D_INFO, "!!!Enter StmInit (BSP)!!! - %d (%x)\n", (UINTN)0, (UINTN)ReadUnaligned32 ((UINT32 *)&Register->Rax)))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "!!!Enter StmInit (BSP)!!! - %d (%x)\n" , (UINTN)0, (UINTN)ReadUnaligned32 ((UINT32 *)&Register-> Rax)); } } while (((BOOLEAN)(0==1))); | |||
686 | ||||
687 | // Check Signature and size | |||
688 | VmxMisc.Uint64 = AsmReadMsr64 (IA32_VMX_MISC_MSR_INDEX0x485); | |||
689 | if ((VmxMisc.Uint64 & BIT150x00008000) != 0) { | |||
690 | TxtProcessorSmmDescriptor = (TXT_PROCESSOR_SMM_DESCRIPTOR *)(UINTN)(AsmReadMsr64 (IA32_SMBASE_INDEX0x9E) + SMM_TXTPSD_OFFSET0xfb00); | |||
691 | } else { | |||
692 | TxtProcessorSmmDescriptor = (TXT_PROCESSOR_SMM_DESCRIPTOR *)(UINTN)(VmRead32 (VMCS_32_GUEST_SMBASE_INDEX0x4828) + SMM_TXTPSD_OFFSET0xfb00); | |||
693 | } | |||
694 | ||||
695 | DEBUG((EFI_D_INFO, "TxtProcessorSmmDescriptor: 0x%016llx\n", TxtProcessorSmmDescriptor))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "TxtProcessorSmmDescriptor: 0x%016llx\n" , TxtProcessorSmmDescriptor); } } while (((BOOLEAN)(0==1))); | |||
696 | ||||
697 | /*debug - used to make sure that the bios properly sets up the Smm Descriptors*********************debug*/ | |||
698 | ||||
699 | DEBUG ((EFI_D_INFO, "TxtProcessorSmmDescriptor - %08x\n", (UINTN)TxtProcessorSmmDescriptor))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "TxtProcessorSmmDescriptor - %08x\n" , (UINTN)TxtProcessorSmmDescriptor); } } while (((BOOLEAN)(0== 1))); | |||
700 | DEBUG ((EFI_D_INFO, " Signature - %016lx\n", TxtProcessorSmmDescriptor->Signature))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " Signature - %016lx\n" , TxtProcessorSmmDescriptor->Signature); } } while (((BOOLEAN )(0==1))); | |||
701 | DEBUG ((EFI_D_INFO, " Size - %04x\n", (UINTN)TxtProcessorSmmDescriptor->Size))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " Size - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->Size); } } while (((BOOLEAN )(0==1))); | |||
702 | DEBUG ((EFI_D_INFO, " SmmDescriptorVerMajor - %02x\n", (UINTN)TxtProcessorSmmDescriptor->SmmDescriptorVerMajor))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmDescriptorVerMajor - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmDescriptorVerMajor) ; } } while (((BOOLEAN)(0==1))); | |||
703 | DEBUG ((EFI_D_INFO, " SmmDescriptorVerMinor - %02x\n", (UINTN)TxtProcessorSmmDescriptor->SmmDescriptorVerMinor))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmDescriptorVerMinor - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmDescriptorVerMinor) ; } } while (((BOOLEAN)(0==1))); | |||
704 | DEBUG ((EFI_D_INFO, " LocalApicId - %08x\n", (UINTN)TxtProcessorSmmDescriptor->LocalApicId))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " LocalApicId - %08x\n" , (UINTN)TxtProcessorSmmDescriptor->LocalApicId); } } while (((BOOLEAN)(0==1))); | |||
705 | DEBUG ((EFI_D_INFO, " ExecutionDisableOutsideSmrr - %02x\n", (UINTN)TxtProcessorSmmDescriptor->SmmEntryState.ExecutionDisableOutsideSmrr))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " ExecutionDisableOutsideSmrr - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmEntryState.ExecutionDisableOutsideSmrr ); } } while (((BOOLEAN)(0==1))); | |||
706 | DEBUG ((EFI_D_INFO, " Intel64Mode - %02x\n", (UINTN)TxtProcessorSmmDescriptor->SmmEntryState.Intel64Mode))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " Intel64Mode - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmEntryState.Intel64Mode ); } } while (((BOOLEAN)(0==1))); | |||
707 | DEBUG ((EFI_D_INFO, " Cr4Pae - %02x\n", (UINTN)TxtProcessorSmmDescriptor->SmmEntryState.Cr4Pae))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " Cr4Pae - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmEntryState.Cr4Pae); } } while (((BOOLEAN)(0==1))); | |||
708 | DEBUG ((EFI_D_INFO, " Cr4Pse - %02x\n", (UINTN)TxtProcessorSmmDescriptor->SmmEntryState.Cr4Pse))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " Cr4Pse - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmEntryState.Cr4Pse); } } while (((BOOLEAN)(0==1))); | |||
709 | DEBUG ((EFI_D_INFO, " SmramToVmcsRestoreRequired - %02x\n", (UINTN)TxtProcessorSmmDescriptor->SmmResumeState.SmramToVmcsRestoreRequired))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmramToVmcsRestoreRequired - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmResumeState.SmramToVmcsRestoreRequired ); } } while (((BOOLEAN)(0==1))); | |||
710 | DEBUG ((EFI_D_INFO, " ReinitializeVmcsRequired - %02x\n", (UINTN)TxtProcessorSmmDescriptor->SmmResumeState.ReinitializeVmcsRequired))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " ReinitializeVmcsRequired - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmResumeState.ReinitializeVmcsRequired ); } } while (((BOOLEAN)(0==1))); | |||
711 | DEBUG ((EFI_D_INFO, " DomainType - %02x\n", (UINTN)TxtProcessorSmmDescriptor->StmSmmState.DomainType))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " DomainType - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->StmSmmState.DomainType ); } } while (((BOOLEAN)(0==1))); | |||
712 | DEBUG ((EFI_D_INFO, " XStatePolicy - %02x\n", (UINTN)TxtProcessorSmmDescriptor->StmSmmState.XStatePolicy))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " XStatePolicy - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->StmSmmState.XStatePolicy ); } } while (((BOOLEAN)(0==1))); | |||
713 | DEBUG ((EFI_D_INFO, " EptEnabled - %02x\n", (UINTN)TxtProcessorSmmDescriptor->StmSmmState.EptEnabled))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " EptEnabled - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->StmSmmState.EptEnabled ); } } while (((BOOLEAN)(0==1))); | |||
714 | DEBUG ((EFI_D_INFO, " SmmCs - %04x\n", (UINTN)TxtProcessorSmmDescriptor->SmmCs))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmCs - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmCs); } } while (((BOOLEAN )(0==1))); | |||
715 | DEBUG ((EFI_D_INFO, " SmmDs - %04x\n", (UINTN)TxtProcessorSmmDescriptor->SmmDs))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmDs - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmDs); } } while (((BOOLEAN )(0==1))); | |||
716 | DEBUG ((EFI_D_INFO, " SmmSs - %04x\n", (UINTN)TxtProcessorSmmDescriptor->SmmSs))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmSs - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmSs); } } while (((BOOLEAN )(0==1))); | |||
717 | DEBUG ((EFI_D_INFO, " SmmOtherSegment - %04x\n", (UINTN)TxtProcessorSmmDescriptor->SmmOtherSegment))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmOtherSegment - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmOtherSegment); } } while (((BOOLEAN)(0==1))); | |||
718 | DEBUG ((EFI_D_INFO, " SmmTr - %04x\n", (UINTN)TxtProcessorSmmDescriptor->SmmTr))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmTr - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmTr); } } while (((BOOLEAN )(0==1))); | |||
719 | DEBUG ((EFI_D_INFO, " SmmCr3 - %016lx\n", TxtProcessorSmmDescriptor->SmmCr3))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmCr3 - %016lx\n" , TxtProcessorSmmDescriptor->SmmCr3); } } while (((BOOLEAN )(0==1))); | |||
720 | DEBUG ((EFI_D_INFO, " SmmStmSetupRip - %016lx\n", TxtProcessorSmmDescriptor->SmmStmSetupRip))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmStmSetupRip - %016lx\n" , TxtProcessorSmmDescriptor->SmmStmSetupRip); } } while (( (BOOLEAN)(0==1))); | |||
721 | DEBUG ((EFI_D_INFO, " SmmStmTeardownRip - %016lx\n", TxtProcessorSmmDescriptor->SmmStmTeardownRip))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmStmTeardownRip - %016lx\n" , TxtProcessorSmmDescriptor->SmmStmTeardownRip); } } while (((BOOLEAN)(0==1))); | |||
722 | DEBUG ((EFI_D_INFO, " SmmSmiHandlerRip - %016lx\n", TxtProcessorSmmDescriptor->SmmSmiHandlerRip))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmSmiHandlerRip - %016lx\n" , TxtProcessorSmmDescriptor->SmmSmiHandlerRip); } } while ( ((BOOLEAN)(0==1))); | |||
723 | DEBUG ((EFI_D_INFO, " SmmSmiHandlerRsp - %016lx\n", TxtProcessorSmmDescriptor->SmmSmiHandlerRsp))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmSmiHandlerRsp - %016lx\n" , TxtProcessorSmmDescriptor->SmmSmiHandlerRsp); } } while ( ((BOOLEAN)(0==1))); | |||
724 | DEBUG ((EFI_D_INFO, " SmmGdtPtr - %016lx\n", TxtProcessorSmmDescriptor->SmmGdtPtr))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmGdtPtr - %016lx\n" , TxtProcessorSmmDescriptor->SmmGdtPtr); } } while (((BOOLEAN )(0==1))); | |||
725 | DEBUG ((EFI_D_INFO, " SmmGdtSize - %08x\n", (UINTN)TxtProcessorSmmDescriptor->SmmGdtSize))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SmmGdtSize - %08x\n" , (UINTN)TxtProcessorSmmDescriptor->SmmGdtSize); } } while (((BOOLEAN)(0==1))); | |||
726 | DEBUG ((EFI_D_INFO, " RequiredStmSmmRevId - %08x\n", (UINTN)TxtProcessorSmmDescriptor->RequiredStmSmmRevId))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " RequiredStmSmmRevId - %08x\n" , (UINTN)TxtProcessorSmmDescriptor->RequiredStmSmmRevId); } } while (((BOOLEAN)(0==1))); | |||
727 | DEBUG ((EFI_D_INFO, " StmProtectionExceptionHandler:\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " StmProtectionExceptionHandler:\n" ); } } while (((BOOLEAN)(0==1))); | |||
728 | DEBUG ((EFI_D_INFO, " SpeRip - %016lx\n", TxtProcessorSmmDescriptor->StmProtectionExceptionHandler.SpeRip))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SpeRip - %016lx\n" , TxtProcessorSmmDescriptor->StmProtectionExceptionHandler .SpeRip); } } while (((BOOLEAN)(0==1))); | |||
729 | DEBUG ((EFI_D_INFO, " SpeRsp - %016lx\n", TxtProcessorSmmDescriptor->StmProtectionExceptionHandler.SpeRsp))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SpeRsp - %016lx\n" , TxtProcessorSmmDescriptor->StmProtectionExceptionHandler .SpeRsp); } } while (((BOOLEAN)(0==1))); | |||
730 | DEBUG ((EFI_D_INFO, " SpeSs - %04x\n", (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler.SpeSs))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " SpeSs - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler .SpeSs); } } while (((BOOLEAN)(0==1))); | |||
731 | DEBUG ((EFI_D_INFO, " PageViolationException - %04x\n", (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler.PageViolationException))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " PageViolationException - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler .PageViolationException); } } while (((BOOLEAN)(0==1))); | |||
732 | DEBUG ((EFI_D_INFO, " MsrViolationException - %04x\n", (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler.MsrViolationException))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " MsrViolationException - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler .MsrViolationException); } } while (((BOOLEAN)(0==1))); | |||
733 | DEBUG ((EFI_D_INFO, " RegisterViolationException- %04x\n", (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler.RegisterViolationException))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " RegisterViolationException- %04x\n" , (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler .RegisterViolationException); } } while (((BOOLEAN)(0==1))); | |||
734 | DEBUG ((EFI_D_INFO, " IoViolationException - %04x\n", (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler.IoViolationException))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " IoViolationException - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler .IoViolationException); } } while (((BOOLEAN)(0==1))); | |||
735 | DEBUG ((EFI_D_INFO, " PciViolationException - %04x\n", (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler.PciViolationException))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " PciViolationException - %04x\n" , (UINTN)TxtProcessorSmmDescriptor->StmProtectionExceptionHandler .PciViolationException); } } while (((BOOLEAN)(0==1))); | |||
736 | DEBUG ((EFI_D_INFO, " BiosHwResourceRequirements - %016lx\n", TxtProcessorSmmDescriptor->BiosHwResourceRequirementsPtr))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " BiosHwResourceRequirements - %016lx\n" , TxtProcessorSmmDescriptor->BiosHwResourceRequirementsPtr ); } } while (((BOOLEAN)(0==1))); | |||
737 | DEBUG ((EFI_D_INFO, " AcpiRsdp - %016lx\n", TxtProcessorSmmDescriptor->AcpiRsdp))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " AcpiRsdp - %016lx\n" , TxtProcessorSmmDescriptor->AcpiRsdp); } } while (((BOOLEAN )(0==1))); | |||
738 | DEBUG ((EFI_D_INFO, " PhysicalAddressBits - %02x\n", (UINTN)TxtProcessorSmmDescriptor->PhysicalAddressBits))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " PhysicalAddressBits - %02x\n" , (UINTN)TxtProcessorSmmDescriptor->PhysicalAddressBits); } } while (((BOOLEAN)(0==1))); | |||
739 | ||||
740 | /************************************debug**********************************************************************/ | |||
741 | ||||
742 | // We have to know CpuNum, or we do not know where VMCS will be. | |||
743 | if (IsSentryEnabled ()) { | |||
744 | mHostContextCommon.CpuNum = GetCpuNumFromTxt (); | |||
745 | DEBUG ((EFI_D_INFO, "CpuNumber from TXT Region - %d\n", (UINTN)mHostContextCommon.CpuNum))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "CpuNumber from TXT Region - %d\n" , (UINTN)mHostContextCommon.CpuNum); } } while (((BOOLEAN)(0== 1))); | |||
746 | } else { | |||
747 | { | |||
748 | EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; | |||
749 | EFI_ACPI_DESCRIPTION_HEADER *Rsdt; | |||
750 | EFI_ACPI_DESCRIPTION_HEADER *Xsdt; | |||
751 | ||||
752 | mHostContextCommon.AcpiRsdp = TxtProcessorSmmDescriptor->AcpiRsdp; | |||
753 | Rsdp = FindAcpiRsdPtr (); | |||
754 | DEBUG ((EFI_D_INFO, "Rsdp - %08x\n", Rsdp))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Rsdp - %08x\n" , Rsdp); } } while (((BOOLEAN)(0==1))); | |||
755 | if (Rsdp == NULL((void*)0)) { | |||
756 | DEBUG ((EFI_D_INFO, "Null Rsdp - Can not continue\n", Rsdp))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Null Rsdp - Can not continue\n" , Rsdp); } } while (((BOOLEAN)(0==1))); | |||
757 | CpuDeadLoop (); | |||
758 | } | |||
759 | Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->RsdtAddress; | |||
| ||||
760 | DEBUG ((EFI_D_INFO, "Rsdt - %08x\n", Rsdt))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Rsdt - %08x\n" , Rsdt); } } while (((BOOLEAN)(0==1))); | |||
761 | DEBUG ((EFI_D_INFO, "RsdtLen - %08x\n", Rsdt->Length))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "RsdtLen - %08x\n" , Rsdt->Length); } } while (((BOOLEAN)(0==1))); | |||
762 | if ((Rsdp->Revision >= 2) && (Rsdp->XsdtAddress < (UINT64)(UINTN)-1)) { | |||
763 | Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->XsdtAddress; | |||
764 | DEBUG ((EFI_D_INFO, "Xsdt - %016lx\n", Xsdt))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Xsdt - %016lx\n" , Xsdt); } } while (((BOOLEAN)(0==1))); | |||
765 | DEBUG ((EFI_D_INFO, "XsdtLen - %08x\n", Xsdt->Length))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "XsdtLen - %08x\n" , Xsdt->Length); } } while (((BOOLEAN)(0==1))); | |||
766 | } | |||
767 | } | |||
768 | ||||
769 | mHostContextCommon.CpuNum = GetCpuNumFromAcpi (); | |||
770 | DEBUG ((EFI_D_INFO, "CpuNumber from ACPI MADT - %d\n", (UINTN)mHostContextCommon.CpuNum))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "CpuNumber from ACPI MADT - %d\n" , (UINTN)mHostContextCommon.CpuNum); } } while (((BOOLEAN)(0== 1))); | |||
771 | } | |||
772 | ||||
773 | InterlockedIncrement (&mHostContextCommon.JoinedCpuNum); | |||
774 | mHostContextCommon.StmShutdown = 0; // used by Stm/Pe to know when to stop the timer | |||
775 | InitializeSpinLock (&mHostContextCommon.MemoryLock); | |||
776 | InitializeSpinLock (&mHostContextCommon.SmiVmcallLock); | |||
777 | InitializeSpinLock (&mHostContextCommon.PciLock); | |||
778 | ||||
779 | DEBUG ((EFI_D_INFO, "HeapBottom - %08x\n", mHostContextCommon.HeapBottom))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "HeapBottom - %08x\n" , mHostContextCommon.HeapBottom); } } while (((BOOLEAN)(0==1) )); | |||
780 | DEBUG ((EFI_D_INFO, "HeapTop - %08x\n", mHostContextCommon.HeapTop))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "HeapTop - %08x\n" , mHostContextCommon.HeapTop); } } while (((BOOLEAN)(0==1))); | |||
781 | ||||
782 | // initialize PE state | |||
783 | ||||
784 | PeSmiControl.PeExec = 0; | |||
785 | PeSmiControl.PeNmiBreak = 0; | |||
786 | PeSmiControl.PeCpuIndex = -1; | |||
787 | ||||
788 | // Initialize CpuSync | |||
789 | ||||
790 | CpuReadyCount = 0; | |||
791 | InitializeSpinLock(&CpuReadyCountLock); | |||
792 | ||||
793 | if (TxtProcessorSmmDescriptor->Signature != TXT_PROCESSOR_SMM_DESCRIPTOR_SIGNATURE(((('T') | ('X' << 8)) | ((('T') | ('P' << 8)) << 16)) | ((UINT64) (((('S') | ('S' << 8)) | ((('I') | ('G' << 8)) << 16))) << 32))) { | |||
794 | DEBUG ((EFI_D_INFO, "TXT Descriptor Signature ERROR - %016lx!\n", TxtProcessorSmmDescriptor->Signature))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "TXT Descriptor Signature ERROR - %016lx!\n" , TxtProcessorSmmDescriptor->Signature); } } while (((BOOLEAN )(0==1))); | |||
795 | CpuDeadLoop (); | |||
796 | } | |||
797 | if(TxtProcessorSmmDescriptor->Size == sizeof(TXT_PROCESSOR_SMM_DESCRIPTOR) - 9) // are we dealing with a .99 Bios | |||
798 | { | |||
799 | BiosStmVer = 99; // version .99 has nine less bytes, etc | |||
800 | DEBUG((EFI_D_INFO, "Version .99 Bios detected Found Size: %08x SizeOf %08x\n", TxtProcessorSmmDescriptor->Size, sizeof(TXT_PROCESSOR_SMM_DESCRIPTOR)))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Version .99 Bios detected Found Size: %08x SizeOf %08x\n" , TxtProcessorSmmDescriptor->Size, sizeof(TXT_PROCESSOR_SMM_DESCRIPTOR )); } } while (((BOOLEAN)(0==1))); | |||
801 | } | |||
802 | else | |||
803 | { | |||
804 | if (TxtProcessorSmmDescriptor->Size != sizeof(TXT_PROCESSOR_SMM_DESCRIPTOR)) { | |||
805 | DEBUG ((EFI_D_INFO, "TXT Descriptor Size ERROR - %08x! Found %08x\n", TxtProcessorSmmDescriptor->Size, sizeof(TXT_PROCESSOR_SMM_DESCRIPTOR) ))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "TXT Descriptor Size ERROR - %08x! Found %08x\n" , TxtProcessorSmmDescriptor->Size, sizeof(TXT_PROCESSOR_SMM_DESCRIPTOR ) ); } } while (((BOOLEAN)(0==1))); | |||
806 | CpuDeadLoop (); | |||
807 | } | |||
808 | } | |||
809 | InitBasicContext (); | |||
810 | ||||
811 | DEBUG ((EFI_D_INFO, "Register(%d) - %08x\n", (UINTN)0, Register))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Register(%d) - %08x\n" , (UINTN)0, Register); } } while (((BOOLEAN)(0==1))); | |||
812 | Reg = &mGuestContextCommonSmi.GuestContextPerCpu[0].Register; | |||
813 | Register->Rsp = VmReadN (VMCS_N_GUEST_RSP_INDEX0x681C); | |||
814 | CopyMem (Reg, Register, sizeof(X86_REGISTER)); | |||
815 | ||||
816 | mHostContextCommon.StmHeader = StmHeader; | |||
817 | DEBUG ((EFI_D_INFO, "StmHeader - %08x\n", (UINTN)mHostContextCommon.StmHeader))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "StmHeader - %08x\n" , (UINTN)mHostContextCommon.StmHeader); } } while (((BOOLEAN) (0==1))); | |||
818 | DEBUG ((EFI_D_INFO, "Hardware field:\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Hardware field:\n" ); } } while (((BOOLEAN)(0==1))); | |||
819 | DEBUG ((EFI_D_INFO, " StmHeaderRevision - %08x\n", (UINTN)StmHeader->HwStmHdr.StmHeaderRevision))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " StmHeaderRevision - %08x\n" , (UINTN)StmHeader->HwStmHdr.StmHeaderRevision); } } while (((BOOLEAN)(0==1))); | |||
820 | DEBUG ((EFI_D_INFO, " MonitorFeatures - %08x\n", (UINTN)StmHeader->HwStmHdr.MonitorFeatures))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " MonitorFeatures - %08x\n" , (UINTN)StmHeader->HwStmHdr.MonitorFeatures); } } while ( ((BOOLEAN)(0==1))); | |||
821 | DEBUG ((EFI_D_INFO, " GdtrLimit - %08x\n", (UINTN)StmHeader->HwStmHdr.GdtrLimit))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " GdtrLimit - %08x\n" , (UINTN)StmHeader->HwStmHdr.GdtrLimit); } } while (((BOOLEAN )(0==1))); | |||
822 | DEBUG ((EFI_D_INFO, " GdtrBaseOffset - %08x\n", (UINTN)StmHeader->HwStmHdr.GdtrBaseOffset))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " GdtrBaseOffset - %08x\n" , (UINTN)StmHeader->HwStmHdr.GdtrBaseOffset); } } while (( (BOOLEAN)(0==1))); | |||
823 | DEBUG ((EFI_D_INFO, " CsSelector - %08x\n", (UINTN)StmHeader->HwStmHdr.CsSelector))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " CsSelector - %08x\n" , (UINTN)StmHeader->HwStmHdr.CsSelector); } } while (((BOOLEAN )(0==1))); | |||
824 | DEBUG ((EFI_D_INFO, " EipOffset - %08x\n", (UINTN)StmHeader->HwStmHdr.EipOffset))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " EipOffset - %08x\n" , (UINTN)StmHeader->HwStmHdr.EipOffset); } } while (((BOOLEAN )(0==1))); | |||
825 | DEBUG ((EFI_D_INFO, " EspOffset - %08x\n", (UINTN)StmHeader->HwStmHdr.EspOffset))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " EspOffset - %08x\n" , (UINTN)StmHeader->HwStmHdr.EspOffset); } } while (((BOOLEAN )(0==1))); | |||
826 | DEBUG ((EFI_D_INFO, " Cr3Offset - %08x\n", (UINTN)StmHeader->HwStmHdr.Cr3Offset))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " Cr3Offset - %08x\n" , (UINTN)StmHeader->HwStmHdr.Cr3Offset); } } while (((BOOLEAN )(0==1))); | |||
827 | DEBUG ((EFI_D_INFO, "Software field:\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "Software field:\n" ); } } while (((BOOLEAN)(0==1))); | |||
828 | DEBUG ((EFI_D_INFO, " StmSpecVerMajor - %02x\n", (UINTN)StmHeader->SwStmHdr.StmSpecVerMajor))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " StmSpecVerMajor - %02x\n" , (UINTN)StmHeader->SwStmHdr.StmSpecVerMajor); } } while ( ((BOOLEAN)(0==1))); | |||
829 | DEBUG ((EFI_D_INFO, " StmSpecVerMinor - %02x\n", (UINTN)StmHeader->SwStmHdr.StmSpecVerMinor))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " StmSpecVerMinor - %02x\n" , (UINTN)StmHeader->SwStmHdr.StmSpecVerMinor); } } while ( ((BOOLEAN)(0==1))); | |||
830 | DEBUG ((EFI_D_INFO, " StaticImageSize - %08x\n", (UINTN)StmHeader->SwStmHdr.StaticImageSize))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " StaticImageSize - %08x\n" , (UINTN)StmHeader->SwStmHdr.StaticImageSize); } } while ( ((BOOLEAN)(0==1))); | |||
831 | DEBUG ((EFI_D_INFO, " PerProcDynamicMemorySize - %08x\n", (UINTN)StmHeader->SwStmHdr.PerProcDynamicMemorySize))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " PerProcDynamicMemorySize - %08x\n" , (UINTN)StmHeader->SwStmHdr.PerProcDynamicMemorySize); } } while (((BOOLEAN)(0==1))); | |||
832 | DEBUG ((EFI_D_INFO, " AdditionalDynamicMemorySize - %08x\n", (UINTN)StmHeader->SwStmHdr.AdditionalDynamicMemorySize))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " AdditionalDynamicMemorySize - %08x\n" , (UINTN)StmHeader->SwStmHdr.AdditionalDynamicMemorySize); } } while (((BOOLEAN)(0==1))); | |||
833 | DEBUG ((EFI_D_INFO, " Intel64ModeSupported - %08x\n", (UINTN)StmHeader->SwStmHdr.StmFeatures.Intel64ModeSupported))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " Intel64ModeSupported - %08x\n" , (UINTN)StmHeader->SwStmHdr.StmFeatures.Intel64ModeSupported ); } } while (((BOOLEAN)(0==1))); | |||
834 | DEBUG ((EFI_D_INFO, " EptSupported - %08x\n", (UINTN)StmHeader->SwStmHdr.StmFeatures.EptSupported))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " EptSupported - %08x\n" , (UINTN)StmHeader->SwStmHdr.StmFeatures.EptSupported); } } while (((BOOLEAN)(0==1))); | |||
835 | DEBUG ((EFI_D_INFO, " NumberOfRevIDs - %08x\n", (UINTN)StmHeader->SwStmHdr.NumberOfRevIDs))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " NumberOfRevIDs - %08x\n" , (UINTN)StmHeader->SwStmHdr.NumberOfRevIDs); } } while (( (BOOLEAN)(0==1))); | |||
836 | for (SubIndex = 0; SubIndex < StmHeader->SwStmHdr.NumberOfRevIDs; SubIndex++) { | |||
837 | DEBUG ((EFI_D_INFO, " StmSmmRevID(%02d) - %08x\n", (UINTN)SubIndex, (UINTN)StmHeader->SwStmHdr.StmSmmRevID[SubIndex]))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, " StmSmmRevID(%02d) - %08x\n" , (UINTN)SubIndex, (UINTN)StmHeader->SwStmHdr.StmSmmRevID[ SubIndex]); } } while (((BOOLEAN)(0==1))); | |||
838 | } | |||
839 | ||||
840 | mHostContextCommon.AcpiRsdp = TxtProcessorSmmDescriptor->AcpiRsdp; | |||
841 | ||||
842 | // | |||
843 | // Check MSEG BASE/SIZE in TXT region | |||
844 | // | |||
845 | mHostContextCommon.StmSize = GetMinMsegSize (StmHeader); | |||
846 | { | |||
847 | UINT64 MsegBase, MsegLength; | |||
848 | INT32 AvailMseg; | |||
849 | ||||
850 | if (IsSentryEnabled()) { | |||
851 | GetMsegInfoFromTxt (&MsegBase, &MsegLength); | |||
852 | } else { | |||
853 | GetMsegInfoFromMsr (&MsegBase, &MsegLength); | |||
854 | } | |||
855 | AvailMseg = MsegLength - mHostContextCommon.StmSize; | |||
856 | ||||
857 | DEBUG ((EFI_D_INFO, "MinMsegSize - 0x%08x MsegLength 0x%08x AvailMseg 0x%08x \n",do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "MinMsegSize - 0x%08x MsegLength 0x%08x AvailMseg 0x%08x \n" , (UINTN)mHostContextCommon.StmSize, MsegLength, AvailMseg); } } while (((BOOLEAN)(0==1))) | |||
858 | (UINTN)mHostContextCommon.StmSize,do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "MinMsegSize - 0x%08x MsegLength 0x%08x AvailMseg 0x%08x \n" , (UINTN)mHostContextCommon.StmSize, MsegLength, AvailMseg); } } while (((BOOLEAN)(0==1))) | |||
859 | MsegLength,do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "MinMsegSize - 0x%08x MsegLength 0x%08x AvailMseg 0x%08x \n" , (UINTN)mHostContextCommon.StmSize, MsegLength, AvailMseg); } } while (((BOOLEAN)(0==1))) | |||
860 | AvailMseg))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "MinMsegSize - 0x%08x MsegLength 0x%08x AvailMseg 0x%08x \n" , (UINTN)mHostContextCommon.StmSize, MsegLength, AvailMseg); } } while (((BOOLEAN)(0==1))); | |||
861 | } | |||
862 | ||||
863 | if(BiosStmVer == 99) | |||
864 | { | |||
865 | mHostContextCommon.PhysicalAddressBits = 36; // for v.99 use this value for now. CPUID value might be too big | |||
866 | } | |||
867 | else | |||
868 | { | |||
869 | mHostContextCommon.PhysicalAddressBits = TxtProcessorSmmDescriptor->PhysicalAddressBits; | |||
870 | } | |||
871 | ||||
872 | AsmCpuid(CPUID_EXTENDED_INFORMATION0x80000000, &RegEax, NULL((void*)0), NULL((void*)0), NULL((void*)0)); | |||
873 | if (RegEax >= CPUID_EXTENDED_ADDRESS_SIZE0x80000008) { | |||
874 | AsmCpuid(CPUID_EXTENDED_ADDRESS_SIZE0x80000008, &RegEax, NULL((void*)0), NULL((void*)0), NULL((void*)0)); | |||
875 | RegEax = (UINT8)RegEax; | |||
876 | DEBUG((EFI_D_INFO, "CPUID - PhysicalAddressBits - 0x%02x\n", (UINT8)RegEax))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "CPUID - PhysicalAddressBits - 0x%02x\n" , (UINT8)RegEax); } } while (((BOOLEAN)(0==1))); | |||
877 | } else { | |||
878 | RegEax = 36; | |||
879 | } | |||
880 | if ((mHostContextCommon.PhysicalAddressBits == 0) || (mHostContextCommon.PhysicalAddressBits > (UINT8)RegEax)) { | |||
881 | mHostContextCommon.PhysicalAddressBits = (UINT8)RegEax; | |||
882 | } | |||
883 | if (sizeof(UINTN) == sizeof(UINT32)) { | |||
884 | if (mHostContextCommon.PhysicalAddressBits > 32) { | |||
885 | mHostContextCommon.PhysicalAddressBits = 32; | |||
886 | } | |||
887 | } | |||
888 | mHostContextCommon.MaximumSupportAddress = (LShiftU64(1, mHostContextCommon.PhysicalAddressBits) - 1); | |||
889 | ||||
890 | mHostContextCommon.PageTable = AsmReadCr3 (); | |||
891 | AsmReadGdtr (&mHostContextCommon.Gdtr); | |||
892 | ||||
893 | // | |||
894 | // Set up STM host IDT to catch exception | |||
895 | // | |||
896 | mHostContextCommon.Idtr.Limit = (UINT16)(STM_MAX_IDT_NUM0x20 * sizeof (IA32_IDT_GATE_DESCRIPTOR) - 1); | |||
897 | mHostContextCommon.Idtr.Base = (UINTN)AllocatePages (STM_SIZE_TO_PAGES (mHostContextCommon.Idtr.Limit + 1)(((mHostContextCommon.Idtr.Limit + 1) >> 12) + (((mHostContextCommon .Idtr.Limit + 1) & 0xFFF) ? 1 : 0))); | |||
898 | IdtGate = (IA32_IDT_GATE_DESCRIPTOR *)mHostContextCommon.Idtr.Base; | |||
899 | InitializeExternalVectorTablePtr (IdtGate); | |||
900 | ||||
901 | //IA32_DESCRIPTOR IdtrLoad; | |||
902 | ||||
903 | IdtrLoad = mHostContextCommon.Idtr; | |||
904 | ||||
905 | AsmWriteIdtr(&IdtrLoad); | |||
906 | ||||
907 | // | |||
908 | // Add more paging for Host CR3. | |||
909 | ///////// | |||
910 | //CreateHostPaging (); | |||
911 | // make host paging dynamic to save space for the PE/VMs | |||
912 | SetupStmPageFault(); | |||
913 | ||||
914 | // VMCS database: One CPU one page should be enough | |||
915 | VmcsDatabasePage = mHostContextCommon.CpuNum; | |||
916 | mHostContextCommon.VmcsDatabase = (UINT64)(UINTN)AllocatePages (VmcsDatabasePage); | |||
917 | // Set last entry | |||
918 | ZeroMem ((VOIDvoid *)(UINTN)mHostContextCommon.VmcsDatabase, STM_PAGES_TO_SIZE(VmcsDatabasePage)( (VmcsDatabasePage) << 12)); | |||
919 | VmcsRecord = (VMCS_RECORD_STRUCTURE *)(UINTN)mHostContextCommon.VmcsDatabase; | |||
920 | VmcsRecord[STM_PAGES_TO_SIZE(VmcsDatabasePage)( (VmcsDatabasePage) << 12) / sizeof(VMCS_RECORD_STRUCTURE) - 1].Type = VMCS_RECORD_LAST0xFFFFFFFF; | |||
921 | // DumpVmcsRecord (mHostContextCommon.VmcsDatabase); | |||
922 | ||||
923 | // EventLog | |||
924 | InitializeEventLog (); | |||
925 | ||||
926 | mCpuInitStatus = AllocatePages (STM_SIZE_TO_PAGES (mHostContextCommon.CpuNum)(((mHostContextCommon.CpuNum) >> 12) + (((mHostContextCommon .CpuNum) & 0xFFF) ? 1 : 0))); | |||
927 | ||||
928 | mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[0].Cr3 = (UINTN)TxtProcessorSmmDescriptor->SmmCr3; | |||
929 | mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[0].Actived = FALSE((BOOLEAN)(0==1)); | |||
930 | ||||
931 | // | |||
932 | // CompatiblePageTable for IA32 flat mode only | |||
933 | // | |||
934 | mGuestContextCommonSmm[SMI_HANDLER0].CompatiblePageTable = CreateCompatiblePageTable (); | |||
935 | mGuestContextCommonSmm[SMI_HANDLER0].CompatiblePaePageTable = CreateCompatiblePaePageTable (); | |||
936 | ||||
937 | // | |||
938 | // Allocate XState buffer | |||
939 | // | |||
940 | XStateSize = CalculateXStateSize (); | |||
941 | mGuestContextCommonSmi.ZeroXStateBuffer = (UINTN)AllocatePages (STM_SIZE_TO_PAGES(XStateSize)(((XStateSize) >> 12) + (((XStateSize) & 0xFFF) ? 1 : 0))); | |||
942 | for (SubIndex = 0; SubIndex < mHostContextCommon.CpuNum; SubIndex++) { | |||
943 | mGuestContextCommonSmi.GuestContextPerCpu[SubIndex].XStateBuffer = (UINTN)AllocatePages (STM_SIZE_TO_PAGES(XStateSize)(((XStateSize) >> 12) + (((XStateSize) & 0xFFF) ? 1 : 0))); | |||
944 | } | |||
945 | ||||
946 | EptInit (); | |||
947 | IoInit (); | |||
948 | MsrInit (); | |||
949 | ||||
950 | // | |||
951 | // Get PciExpressBaseAddress | |||
952 | // | |||
953 | if (IsSentryEnabled()) { | |||
954 | GetPciExpressInfoFromTxt(&mHostContextCommon.PciExpressBaseAddress, &mHostContextCommon.PciExpressLength); | |||
955 | DEBUG((EFI_D_INFO, "PCIExpressBase from TXT Region - %x\n", (UINTN)mHostContextCommon.PciExpressBaseAddress))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "PCIExpressBase from TXT Region - %x\n" , (UINTN)mHostContextCommon.PciExpressBaseAddress); } } while (((BOOLEAN)(0==1))); | |||
956 | DEBUG((EFI_D_INFO, "PCIExpressLength from TXT Region - %x\n", (UINTN)mHostContextCommon.PciExpressLength))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "PCIExpressLength from TXT Region - %x\n" , (UINTN)mHostContextCommon.PciExpressLength); } } while (((BOOLEAN )(0==1))); | |||
957 | } else { | |||
958 | GetPciExpressInfoFromAcpi(&mHostContextCommon.PciExpressBaseAddress, &mHostContextCommon.PciExpressLength); | |||
959 | DEBUG((EFI_D_INFO, "PCIExpressBase from ACPI MCFG - %x\n", (UINTN)mHostContextCommon.PciExpressBaseAddress))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "PCIExpressBase from ACPI MCFG - %x\n" , (UINTN)mHostContextCommon.PciExpressBaseAddress); } } while (((BOOLEAN)(0==1))); | |||
960 | DEBUG((EFI_D_INFO, "PCIExpressLength from ACPI MCFG - %x\n", (UINTN)mHostContextCommon.PciExpressLength))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "PCIExpressLength from ACPI MCFG - %x\n" , (UINTN)mHostContextCommon.PciExpressLength); } } while (((BOOLEAN )(0==1))); | |||
961 | } | |||
962 | if (mHostContextCommon.PciExpressBaseAddress == 0) { | |||
963 | DEBUG((EFI_D_INFO, "mHostContextCommon.PciExpressBaseAddress == 0\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "mHostContextCommon.PciExpressBaseAddress == 0\n" ); } } while (((BOOLEAN)(0==1))); | |||
964 | CpuDeadLoop(); | |||
965 | } | |||
966 | if ((mHostContextCommon.PciExpressBaseAddress > mHostContextCommon.MaximumSupportAddress) || | |||
967 | (mHostContextCommon.PciExpressLength > mHostContextCommon.MaximumSupportAddress - mHostContextCommon.PciExpressBaseAddress)) { | |||
968 | DEBUG((EFI_D_INFO, "mHostContextCommon.PciExpressBaseAddress overflow MaximumSupportAddress\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "mHostContextCommon.PciExpressBaseAddress overflow MaximumSupportAddress\n" ); } } while (((BOOLEAN)(0==1))); | |||
969 | CpuDeadLoop(); | |||
970 | } | |||
971 | if (IsOverlap (mHostContextCommon.PciExpressBaseAddress, mHostContextCommon.PciExpressLength, mHostContextCommon.TsegBase, mHostContextCommon.TsegLength)) { | |||
972 | DEBUG((EFI_D_INFO, "mHostContextCommon.PciExpressBaseAddress overlap with TSEG\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "mHostContextCommon.PciExpressBaseAddress overlap with TSEG\n" ); } } while (((BOOLEAN)(0==1))); | |||
973 | CpuDeadLoop(); | |||
974 | } | |||
975 | PcdSet64(PcdPciExpressBaseAddress, mHostContextCommon.PciExpressBaseAddress)(_gPcd_BinaryPatch_PcdPciExpressBaseAddress = ((mHostContextCommon .PciExpressBaseAddress))); | |||
976 | ||||
977 | for (SubIndex = 0; SubIndex < mHostContextCommon.CpuNum; SubIndex++) { | |||
978 | mHostContextCommon.HostContextPerCpu[SubIndex].HostMsrEntryCount = 1; | |||
979 | mGuestContextCommonSmi.GuestContextPerCpu[SubIndex].GuestMsrEntryCount = 1; | |||
980 | mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[SubIndex].GuestMsrEntryCount = 1; | |||
981 | mHostContextCommon.HostContextPerCpu[SubIndex].GuestVmType = SMI_HANDLER0; | |||
982 | } | |||
983 | mHostContextCommon.HostContextPerCpu[0].HostMsrEntryAddress = (UINT64)(UINTN)AllocatePages (STM_SIZE_TO_PAGES (sizeof(VM_EXIT_MSR_ENTRY) * mHostContextCommon.HostContextPerCpu[0].HostMsrEntryCount * mHostContextCommon.CpuNum)(((sizeof(VM_EXIT_MSR_ENTRY) * mHostContextCommon.HostContextPerCpu [0].HostMsrEntryCount * mHostContextCommon.CpuNum) >> 12 ) + (((sizeof(VM_EXIT_MSR_ENTRY) * mHostContextCommon.HostContextPerCpu [0].HostMsrEntryCount * mHostContextCommon.CpuNum) & 0xFFF ) ? 1 : 0))); | |||
984 | mGuestContextCommonSmi.GuestContextPerCpu[0].GuestMsrEntryAddress = (UINT64)(UINTN)AllocatePages (STM_SIZE_TO_PAGES (sizeof(VM_EXIT_MSR_ENTRY) * mGuestContextCommonSmi.GuestContextPerCpu[0].GuestMsrEntryCount * mHostContextCommon.CpuNum)(((sizeof(VM_EXIT_MSR_ENTRY) * mGuestContextCommonSmi.GuestContextPerCpu [0].GuestMsrEntryCount * mHostContextCommon.CpuNum) >> 12 ) + (((sizeof(VM_EXIT_MSR_ENTRY) * mGuestContextCommonSmi.GuestContextPerCpu [0].GuestMsrEntryCount * mHostContextCommon.CpuNum) & 0xFFF ) ? 1 : 0))); | |||
985 | mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[SubIndex].GuestMsrEntryAddress = (UINT64)(UINTN)AllocatePages (STM_SIZE_TO_PAGES(sizeof(VM_EXIT_MSR_ENTRY) * mGuestContextCommonSmm[SMI_HANDLER].GuestContextPerCpu[0].GuestMsrEntryCount * mHostContextCommon.CpuNum)(((sizeof(VM_EXIT_MSR_ENTRY) * mGuestContextCommonSmm[0].GuestContextPerCpu [0].GuestMsrEntryCount * mHostContextCommon.CpuNum) >> 12 ) + (((sizeof(VM_EXIT_MSR_ENTRY) * mGuestContextCommonSmm[0]. GuestContextPerCpu[0].GuestMsrEntryCount * mHostContextCommon .CpuNum) & 0xFFF) ? 1 : 0))); | |||
986 | for (SubIndex = 0; SubIndex < mHostContextCommon.CpuNum; SubIndex++) { | |||
987 | mHostContextCommon.HostContextPerCpu[SubIndex].HostMsrEntryAddress = mHostContextCommon.HostContextPerCpu[0].HostMsrEntryAddress + sizeof(VM_EXIT_MSR_ENTRY) * mGuestContextCommonSmi.GuestContextPerCpu[0].GuestMsrEntryCount * SubIndex; | |||
988 | mGuestContextCommonSmi.GuestContextPerCpu[SubIndex].GuestMsrEntryAddress = mGuestContextCommonSmi.GuestContextPerCpu[0].GuestMsrEntryAddress + sizeof(VM_EXIT_MSR_ENTRY) * mGuestContextCommonSmi.GuestContextPerCpu[0].GuestMsrEntryCount * SubIndex; | |||
989 | mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[SubIndex].GuestMsrEntryAddress = mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[0].GuestMsrEntryAddress + sizeof(VM_EXIT_MSR_ENTRY) * mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[0].GuestMsrEntryCount * SubIndex; | |||
990 | } | |||
991 | ||||
992 | DEBUG ((EFI_D_INFO, "DumpStmResource - %x\n", TxtProcessorSmmDescriptor->BiosHwResourceRequirementsPtr))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "DumpStmResource - %x\n" , TxtProcessorSmmDescriptor->BiosHwResourceRequirementsPtr ); } } while (((BOOLEAN)(0==1))); | |||
993 | DumpStmResource ((STM_RSC *)(UINTN)TxtProcessorSmmDescriptor->BiosHwResourceRequirementsPtr); | |||
994 | DEBUG ((EFI_D_INFO, "RegisterBiosResource - %x\n", TxtProcessorSmmDescriptor->BiosHwResourceRequirementsPtr))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "RegisterBiosResource - %x\n" , TxtProcessorSmmDescriptor->BiosHwResourceRequirementsPtr ); } } while (((BOOLEAN)(0==1))); | |||
995 | RegisterBiosResource ((STM_RSC *)(UINTN)TxtProcessorSmmDescriptor->BiosHwResourceRequirementsPtr); | |||
996 | ||||
997 | InitStmHandlerSmi (); | |||
998 | InitStmHandlerSmm (); | |||
999 | ||||
1000 | InitPe(); // Initialize protected execution | |||
1001 | //STM_PERF_INIT; | |||
1002 | ||||
1003 | // | |||
1004 | // Initialization done | |||
1005 | // | |||
1006 | ||||
1007 | mIsBspInitialized = TRUE((BOOLEAN)(1==1)); | |||
1008 | AsmWbinvd (); // let everyone else know | |||
1009 | return ; | |||
1010 | } | |||
1011 | ||||
1012 | /** | |||
1013 | ||||
1014 | This function initialize AP. | |||
1015 | ||||
1016 | @param Index CPU index | |||
1017 | @param Register X86 register context | |||
1018 | ||||
1019 | **/ | |||
1020 | VOIDvoid | |||
1021 | ApInit ( | |||
1022 | IN UINT32 Index, | |||
1023 | IN X86_REGISTER *Register | |||
1024 | ) | |||
1025 | { | |||
1026 | X86_REGISTER *Reg; | |||
1027 | IA32_DESCRIPTOR IdtrLoad; | |||
1028 | ||||
1029 | while (!mIsBspInitialized) { | |||
1030 | // | |||
1031 | // Wait here | |||
1032 | // | |||
1033 | } | |||
1034 | ||||
1035 | DEBUG ((EFI_D_INFO, "%ld !!!Enter StmInit (AP done)!!! (%x)\n", (UINTN)Index, (UINTN)ReadUnaligned32 ((UINT32 *)&Register->Rax)))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "%ld !!!Enter StmInit (AP done)!!! (%x)\n" , (UINTN)Index, (UINTN)ReadUnaligned32 ((UINT32 *)&Register ->Rax)); } } while (((BOOLEAN)(0==1))); | |||
1036 | ||||
1037 | if (Index >= mHostContextCommon.CpuNum) { | |||
1038 | DEBUG ((EFI_D_INFO, "%ld !!!Index(0x%x) >= mHostContextCommon.CpuNum(0x%x)\n", Index, (UINTN)Index, (UINTN)mHostContextCommon.CpuNum))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "%ld !!!Index(0x%x) >= mHostContextCommon.CpuNum(0x%x)\n" , Index, (UINTN)Index, (UINTN)mHostContextCommon.CpuNum); } } while (((BOOLEAN)(0==1))); | |||
1039 | CpuDeadLoop (); | |||
1040 | Index = GetIndexFromStack (Register); | |||
1041 | } | |||
1042 | ||||
1043 | // do this here to make sure that we can handle a page fault | |||
1044 | IdtrLoad = mHostContextCommon.Idtr; | |||
1045 | AsmWriteIdtr(&IdtrLoad); | |||
1046 | ||||
1047 | InterlockedIncrement (&mHostContextCommon.JoinedCpuNum); | |||
1048 | ||||
1049 | //DEBUG ((EFI_D_INFO, "%ld Register - %08x\n", (UINTN)Index, Register)); | |||
1050 | Reg = &mGuestContextCommonSmi.GuestContextPerCpu[Index].Register; | |||
1051 | Register->Rsp = VmReadN (VMCS_N_GUEST_RSP_INDEX0x681C); | |||
1052 | CopyMem (Reg, Register, sizeof(X86_REGISTER)); | |||
1053 | ||||
1054 | if (mHostContextCommon.JoinedCpuNum > mHostContextCommon.CpuNum) { | |||
1055 | DEBUG ((EFI_D_ERROR, "%ld JoinedCpuNum(%d) > CpuNum(%d)\n", Index, (UINTN)mHostContextCommon.JoinedCpuNum, (UINTN)mHostContextCommon.CpuNum))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "%ld JoinedCpuNum(%d) > CpuNum(%d)\n" , Index, (UINTN)mHostContextCommon.JoinedCpuNum, (UINTN)mHostContextCommon .CpuNum); } } while (((BOOLEAN)(0==1))); | |||
1056 | // Reset system | |||
1057 | CpuDeadLoop (); | |||
1058 | } | |||
1059 | ||||
1060 | return ; | |||
1061 | } | |||
1062 | ||||
1063 | /** | |||
1064 | ||||
1065 | This function initialize common part for BSP and AP. | |||
1066 | ||||
1067 | @param Index CPU index | |||
1068 | ||||
1069 | **/ | |||
1070 | VOIDvoid | |||
1071 | CommonInit ( | |||
1072 | IN UINT32 Index | |||
1073 | ) | |||
1074 | { | |||
1075 | UINTN StackBase; | |||
1076 | UINTN StackSize; | |||
1077 | STM_HEADER *StmHeader; | |||
1078 | UINT32 RegEdx; | |||
1079 | IA32_VMX_MISC_MSR VmxMisc; | |||
1080 | ||||
1081 | AsmWriteCr4 (AsmReadCr4 () | CR4_OSFXSR(1u << 9) | CR4_OSXMMEXCPT(1u << 10)); | |||
1082 | if (IsXStateSupoprted()) { | |||
1083 | AsmWriteCr4 (AsmReadCr4 () | CR4_OSXSAVE(1u << 18)); | |||
1084 | } | |||
1085 | ||||
1086 | VmxMisc.Uint64 = AsmReadMsr64 (IA32_VMX_MISC_MSR_INDEX0x485); | |||
1087 | RegEdx = ReadUnaligned32 ((UINT32 *)&mGuestContextCommonSmi.GuestContextPerCpu[Index].Register.Rdx); | |||
1088 | if ((RegEdx & STM_CONFIG_SMI_UNBLOCKING_BY_VMX_OFF0x1) != 0) { | |||
1089 | if (VmxMisc.Bits.VmxOffUnblockSmiSupport != 0) { | |||
1090 | AsmWriteMsr64 (IA32_SMM_MONITOR_CTL_MSR_INDEX0x9B, AsmReadMsr64(IA32_SMM_MONITOR_CTL_MSR_INDEX0x9B) | IA32_SMM_MONITOR_SMI_UNBLOCKING_BY_VMX_OFF(1u << 2)); | |||
1091 | } | |||
1092 | } | |||
1093 | ||||
1094 | mHostContextCommon.HostContextPerCpu[Index].Index = Index; | |||
1095 | mHostContextCommon.HostContextPerCpu[Index].ApicId = (UINT8)ReadLocalApicId (); | |||
1096 | mHostContextCommon.HostContextPerCpu[Index].Vmxon = VmRead64(VMCS_64_CONTROL_EXECUTIVE_VMCS_PTR_INDEX0x200C); | |||
1097 | ||||
1098 | StmHeader = mHostContextCommon.StmHeader; | |||
1099 | StackBase = (UINTN)StmHeader + | |||
1100 | STM_PAGES_TO_SIZE (STM_SIZE_TO_PAGES (StmHeader->SwStmHdr.StaticImageSize))( ((((StmHeader->SwStmHdr.StaticImageSize) >> 12) + ( ((StmHeader->SwStmHdr.StaticImageSize) & 0xFFF) ? 1 : 0 ))) << 12) + | |||
1101 | StmHeader->SwStmHdr.AdditionalDynamicMemorySize; | |||
1102 | StackSize = StmHeader->SwStmHdr.PerProcDynamicMemorySize; | |||
1103 | mHostContextCommon.HostContextPerCpu[Index].Stack = (UINTN)(StackBase + StackSize * (Index + 1)); // Stack Top | |||
1104 | ||||
1105 | if ((VmxMisc.Uint64 & BIT150x00008000) != 0) { | |||
1106 | mHostContextCommon.HostContextPerCpu[Index].Smbase = (UINT32)AsmReadMsr64 (IA32_SMBASE_INDEX0x9E); | |||
1107 | } else { | |||
1108 | mHostContextCommon.HostContextPerCpu[Index].Smbase = VmRead32 (VMCS_32_GUEST_SMBASE_INDEX0x4828); | |||
1109 | } | |||
1110 | mHostContextCommon.HostContextPerCpu[Index].TxtProcessorSmmDescriptor = (TXT_PROCESSOR_SMM_DESCRIPTOR *)(UINTN)(mHostContextCommon.HostContextPerCpu[Index].Smbase + SMM_TXTPSD_OFFSET0xfb00); | |||
1111 | mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[Index].Cr3 = (UINTN)mHostContextCommon.HostContextPerCpu[Index].TxtProcessorSmmDescriptor->SmmCr3; | |||
1112 | mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[Index].Efer = AsmReadMsr64 (IA32_EFER_MSR_INDEX0xC0000080); | |||
1113 | ||||
1114 | mGuestContextCommonSmi.GuestContextPerCpu[Index].Efer = AsmReadMsr64 (IA32_EFER_MSR_INDEX0xC0000080); | |||
1115 | } | |||
1116 | ||||
1117 | /** | |||
1118 | ||||
1119 | This function initialize VMCS. | |||
1120 | ||||
1121 | @param Index CPU index | |||
1122 | ||||
1123 | **/ | |||
1124 | VOIDvoid | |||
1125 | VmcsInit ( | |||
1126 | IN UINT32 Index | |||
1127 | ) | |||
1128 | { | |||
1129 | UINT64 CurrentVmcs; | |||
1130 | UINTN VmcsBase; | |||
1131 | UINT32 VmcsSize; | |||
1132 | STM_HEADER *StmHeader; | |||
1133 | UINTN Rflags; | |||
1134 | ||||
1135 | StmHeader = mHostContextCommon.StmHeader; | |||
1136 | /* have to use Cr3Offset because StaticImageSize ignores BSS and Data sections */ | |||
1137 | VmcsBase = (UINTN)StmHeader + | |||
1138 | //STM_PAGES_TO_SIZE (STM_SIZE_TO_PAGES (StmHeader->SwStmHdr.StaticImageSize)) + | |||
1139 | StmHeader->HwStmHdr.Cr3Offset + | |||
1140 | StmHeader->SwStmHdr.AdditionalDynamicMemorySize + | |||
1141 | StmHeader->SwStmHdr.PerProcDynamicMemorySize * mHostContextCommon.CpuNum; | |||
1142 | VmcsSize = GetVmcsSize(); | |||
1143 | ||||
1144 | mGuestContextCommonSmi.GuestContextPerCpu[Index].Vmcs = (UINT64)(VmcsBase + VmcsSize * (Index * 2)); | |||
1145 | mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[Index].Vmcs = (UINT64)(VmcsBase + VmcsSize * (Index * 2 + 1)); | |||
1146 | ||||
1147 | DEBUG ((EFI_D_INFO, "%d SmiVmcsPtr - %016lx\n", (UINTN)Index, mGuestContextCommonSmi.GuestContextPerCpu[Index].Vmcs))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "%d SmiVmcsPtr - %016lx\n" , (UINTN)Index, mGuestContextCommonSmi.GuestContextPerCpu[Index ].Vmcs); } } while (((BOOLEAN)(0==1))); | |||
1148 | DEBUG ((EFI_D_INFO, "%d SmmVmcsPtr - %016lx\n", (UINTN)Index, mGuestContextCommonSmm[SMI_HANDLER].GuestContextPerCpu[Index].Vmcs))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "%d SmmVmcsPtr - %016lx\n" , (UINTN)Index, mGuestContextCommonSmm[0].GuestContextPerCpu[ Index].Vmcs); } } while (((BOOLEAN)(0==1))); | |||
1149 | ||||
1150 | AsmVmPtrStore (&CurrentVmcs); | |||
1151 | DEBUG ((EFI_D_INFO, "%d CurrentVmcs - %016lx VmcsSize %x\n", (UINTN)Index, CurrentVmcs, VmcsSize))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "%d CurrentVmcs - %016lx VmcsSize %x\n" , (UINTN)Index, CurrentVmcs, VmcsSize); } } while (((BOOLEAN) (0==1))); | |||
1152 | if (IsOverlap (CurrentVmcs, VmcsSize, mHostContextCommon.TsegBase, mHostContextCommon.TsegLength)) { | |||
1153 | // Overlap TSEG | |||
1154 | DEBUG ((EFI_D_ERROR, "%d CurrentVmcs violation - %016lx\n", (UINTN)Index, CurrentVmcs))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "%d CurrentVmcs violation - %016lx\n" , (UINTN)Index, CurrentVmcs); } } while (((BOOLEAN)(0==1))); | |||
1155 | DumpVmcsAllField(Index); | |||
1156 | CpuDeadLoop() ; | |||
1157 | } | |||
1158 | Rflags = AsmVmClear (&CurrentVmcs); | |||
1159 | if ((Rflags & (RFLAGS_CF1u | RFLAGS_ZF(1u << 6))) != 0) { | |||
1160 | DEBUG ((EFI_D_ERROR, "%d ERROR: AsmVmClear - %016lx : %08x\n", (UINTN)Index, CurrentVmcs, Rflags))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "%d ERROR: AsmVmClear - %016lx : %08x\n" , (UINTN)Index, CurrentVmcs, Rflags); } } while (((BOOLEAN)(0 ==1))); | |||
1161 | CpuDeadLoop (); | |||
1162 | } | |||
1163 | ||||
1164 | CopyMem ( | |||
1165 | (VOIDvoid *)(UINTN)mGuestContextCommonSmi.GuestContextPerCpu[Index].Vmcs, | |||
1166 | (VOIDvoid *)(UINTN)CurrentVmcs, | |||
1167 | (UINTN)VmcsSize | |||
1168 | ); | |||
1169 | CopyMem ( | |||
1170 | (VOIDvoid *)(UINTN)mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[Index].Vmcs, | |||
1171 | (VOIDvoid *)(UINTN)CurrentVmcs, | |||
1172 | (UINTN)VmcsSize | |||
1173 | ); | |||
1174 | ||||
1175 | *(UINT32 *)(UINTN)mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[Index].Vmcs = (UINT32)AsmReadMsr64 (IA32_VMX_BASIC_MSR_INDEX0x480) & 0xFFFFFFFF; | |||
1176 | ||||
1177 | AsmWbinvd (); | |||
1178 | ||||
1179 | Rflags = AsmVmPtrLoad (&mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[Index].Vmcs); | |||
1180 | if ((Rflags & (RFLAGS_CF1u | RFLAGS_ZF(1u << 6))) != 0) { | |||
1181 | DEBUG ((EFI_D_ERROR, "%d ERROR: AsmVmPtrLoad - %016lx : %08x\n", (UINTN)Index, mGuestContextCommonSmm[SMI_HANDLER].GuestContextPerCpu[Index].Vmcs, Rflags))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "%d ERROR: AsmVmPtrLoad - %016lx : %08x\n" , (UINTN)Index, mGuestContextCommonSmm[0].GuestContextPerCpu[ Index].Vmcs, Rflags); } } while (((BOOLEAN)(0==1))); | |||
1182 | CpuDeadLoop (); | |||
1183 | } | |||
1184 | InitializeSmmVmcs (Index, &mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[Index].Vmcs); | |||
1185 | Rflags = AsmVmClear (&mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[Index].Vmcs); | |||
1186 | if ((Rflags & (RFLAGS_CF1u | RFLAGS_ZF(1u << 6))) != 0) { | |||
1187 | DEBUG ((EFI_D_ERROR, "%d ERROR: AsmVmClear - %016lx : %08x\n", (UINTN)Index, mGuestContextCommonSmm[SMI_HANDLER].GuestContextPerCpu[Index].Vmcs, Rflags))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "%d ERROR: AsmVmClear - %016lx : %08x\n" , (UINTN)Index, mGuestContextCommonSmm[0].GuestContextPerCpu[ Index].Vmcs, Rflags); } } while (((BOOLEAN)(0==1))); | |||
1188 | CpuDeadLoop (); | |||
1189 | } | |||
1190 | ||||
1191 | AsmWbinvd (); | |||
1192 | ||||
1193 | Rflags = AsmVmPtrLoad (&mGuestContextCommonSmi.GuestContextPerCpu[Index].Vmcs); | |||
1194 | if ((Rflags & (RFLAGS_CF1u | RFLAGS_ZF(1u << 6))) != 0) { | |||
1195 | DEBUG ((EFI_D_ERROR, "%d ERROR: AsmVmPtrLoad - %016lx : %08x\n", (UINTN)Index, mGuestContextCommonSmi.GuestContextPerCpu[Index].Vmcs, Rflags))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "%d ERROR: AsmVmPtrLoad - %016lx : %08x\n" , (UINTN)Index, mGuestContextCommonSmi.GuestContextPerCpu[Index ].Vmcs, Rflags); } } while (((BOOLEAN)(0==1))); | |||
1196 | CpuDeadLoop (); | |||
1197 | } | |||
1198 | InitializeSmiVmcs (Index, &mGuestContextCommonSmi.GuestContextPerCpu[Index].Vmcs); | |||
1199 | } | |||
1200 | ||||
1201 | /** | |||
1202 | ||||
1203 | This function launch back to MLE. | |||
1204 | ||||
1205 | @param Index CPU index | |||
1206 | ||||
1207 | **/ | |||
1208 | VOIDvoid | |||
1209 | LaunchBack ( | |||
1210 | IN UINT32 Index | |||
1211 | ) | |||
1212 | { | |||
1213 | UINTN Rflags; | |||
1214 | X86_REGISTER *Reg; | |||
1215 | ||||
1216 | Reg = &mGuestContextCommonSmi.GuestContextPerCpu[Index].Register; | |||
1217 | #if 0 | |||
1218 | // | |||
1219 | // Dump BIOS resource - already dumped | |||
1220 | // | |||
1221 | if ((Index == 0) && (ReadUnaligned32 ((UINT32 *)&Reg->Rax) == STM_API_INITIALIZE_PROTECTION0x00010007)) { | |||
1222 | DEBUG ((EFI_D_INFO, "BIOS resource:\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "BIOS resource:\n" ); } } while (((BOOLEAN)(0==1))); | |||
1223 | DumpStmResource ((STM_RSC *)(UINTN)mHostContextCommon.HostContextPerCpu[0].TxtProcessorSmmDescriptor->BiosHwResourceRequirementsPtr); | |||
1224 | } | |||
1225 | #endif | |||
1226 | if (ReadUnaligned32 ((UINT32 *)&Reg->Rax) == STM_API_START0x00010001) { | |||
1227 | // We need do additional thing for STM_API_START | |||
1228 | mGuestContextCommonSmm[SMI_HANDLER0].GuestContextPerCpu[Index].Actived = TRUE((BOOLEAN)(1==1)); | |||
1229 | SmmSetup (Index); | |||
1230 | } | |||
1231 | ||||
1232 | if(!IsResourceListValid ((STM_RSC *)(UINTN)mHostContextCommon.HostContextPerCpu[Index].TxtProcessorSmmDescriptor->BiosHwResourceRequirementsPtr, FALSE((BOOLEAN)(0==1)))) { | |||
1233 | DEBUG ((EFI_D_INFO, "%ld LaunchBack - ValidateBiosResourceList fail!\n", Index))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "%ld LaunchBack - ValidateBiosResourceList fail!\n" , Index); } } while (((BOOLEAN)(0==1))); | |||
1234 | WriteUnaligned32 ((UINT32 *)&Reg->Rax, ERROR_STM_MALFORMED_RESOURCE_LIST0x8001000D); | |||
1235 | VmWriteN (VMCS_N_GUEST_RFLAGS_INDEX0x6820, VmReadN(VMCS_N_GUEST_RFLAGS_INDEX0x6820) | RFLAGS_CF1u); | |||
1236 | } else { | |||
1237 | WriteUnaligned32 ((UINT32 *)&Reg->Rax, STM_SUCCESS0x00000000); | |||
1238 | VmWriteN (VMCS_N_GUEST_RFLAGS_INDEX0x6820, VmReadN(VMCS_N_GUEST_RFLAGS_INDEX0x6820) & ~RFLAGS_CF1u); | |||
1239 | } | |||
1240 | WriteUnaligned32 ((UINT32 *)&Reg->Rbx, 0); // Not support STM_RSC_BGM or STM_RSC_BGI or STM_RSC_MSR | |||
1241 | ||||
1242 | DEBUG ((EFI_D_INFO, "%ld !!!LaunchBack!!!\n", (UINTN)Index))do { if (DebugPrintEnabled ()) { DebugPrint (0x00000040, "%ld !!!LaunchBack!!!\n" , (UINTN)Index); } } while (((BOOLEAN)(0==1))); | |||
1243 | ||||
1244 | if(Index != 0) | |||
1245 | { | |||
1246 | // syncs the AP CPUS - all will wait until the BSP has completed setting up the API | |||
1247 | CpuReadySync(Index); | |||
1248 | } | |||
1249 | else | |||
1250 | { | |||
1251 | // DumpVmcsAllField(); | |||
1252 | } | |||
1253 | AsmWbinvd(); // flush caches | |||
1254 | Rflags = AsmVmLaunch (Reg); | |||
1255 | ||||
1256 | AcquireSpinLock (&mHostContextCommon.DebugLock); | |||
1257 | DEBUG ((EFI_D_ERROR, "%ld !!!LaunchBack FAIL!!!\n", Index))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "%ld !!!LaunchBack FAIL!!!\n" , Index); } } while (((BOOLEAN)(0==1))); | |||
1258 | DEBUG ((EFI_D_ERROR, "%ld Rflags: %08x\n", Index, Rflags))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "%ld Rflags: %08x\n" , Index, Rflags); } } while (((BOOLEAN)(0==1))); | |||
1259 | DEBUG ((EFI_D_ERROR, "%ld VMCS_32_RO_VM_INSTRUCTION_ERROR: %08x\n", Index, (UINTN)VmRead32 (VMCS_32_RO_VM_INSTRUCTION_ERROR_INDEX)))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "%ld VMCS_32_RO_VM_INSTRUCTION_ERROR: %08x\n" , Index, (UINTN)VmRead32 (0x4400)); } } while (((BOOLEAN)(0== 1))); | |||
1260 | ReleaseSpinLock (&mHostContextCommon.DebugLock); | |||
1261 | ||||
1262 | CpuDeadLoop (); | |||
1263 | } | |||
1264 | ||||
1265 | /** | |||
1266 | ||||
1267 | This function initialize STM. | |||
1268 | ||||
1269 | @param Register X86 register context | |||
1270 | ||||
1271 | **/ | |||
1272 | ||||
1273 | VOIDvoid | |||
1274 | InitializeSmmMonitor ( | |||
1275 | IN X86_REGISTER *Register | |||
1276 | ) | |||
1277 | { | |||
1278 | UINT32 Index; | |||
1279 | ||||
1280 | Index = GetIndexFromStack (Register); | |||
1281 | if (Index == 0) { | |||
1282 | // The build process should make sure "virtual address" is same as "file pointer to raw data", | |||
1283 | // in final PE/COFF image, so that we can let StmLoad load binrary to memory directly. | |||
1284 | // If no, GenStm tool will "load image". So here, we just need "relocate image" | |||
1285 | RelocateStmImage (FALSE((BOOLEAN)(0==1))); | |||
1286 | BspInit (Register); | |||
1287 | } else { | |||
1288 | Index = GetIndexFromStack (Register); | |||
1289 | ApInit (Index, Register); | |||
1290 | } | |||
1291 | ||||
1292 | CommonInit (Index); | |||
1293 | ||||
1294 | VmcsInit (Index); | |||
1295 | // | |||
1296 | AsmWbinvd(); // flush caches | |||
1297 | LaunchBack (Index); | |||
1298 | return ; | |||
1299 | } | |||
1300 | ||||
1301 | static unsigned int CpuSynched; | |||
1302 | ||||
1303 | VOIDvoid InitCpuReadySync() | |||
1304 | { | |||
1305 | CpuReadyCount = 0; // count of CPUs waiting in the loop | |||
1306 | CpuSynched = 0; // when 0 - not synched yet; when 1 CPUs are synched, but all have not exited the loop | |||
1307 | // need to prevent CPUs from entering the loop until all CPUs have exited | |||
1308 | AsmWbinvd (); // force it out | |||
1309 | } | |||
1310 | ||||
1311 | VOIDvoid CpuReadySync(UINT32 Index) | |||
1312 | { | |||
1313 | while(InterlockedCompareExchange32(&CpuSynched, 1, 1) == 1 /*CpuSynched == 1*/) {} // prevent processors from entering the synch loop until all the previous processors have left | |||
1314 | ||||
1315 | InterlockedIncrement(&CpuReadyCount); | |||
1316 | ||||
1317 | //DEBUG ((EFI_D_ERROR, "%ld CpuReadySync - CpuReadyCount: %d CpuNum %d\n", Index, CpuReadyCount, mHostContextCommon.CpuNum)); | |||
1318 | while(InterlockedCompareExchange32(&CpuSynched, 0, 0) == 0)//( CpuReadyCount < mHostContextCommon.CpuNum) | |||
1319 | { | |||
1320 | // spin until all CPUs are synced | |||
1321 | ||||
1322 | if((InterlockedCompareExchange32(&CpuSynched, 0, 0) == 0 /*CpuSynched == 0*/) && | |||
1323 | InterlockedCompareExchange32(&CpuReadyCount, mHostContextCommon.CpuNum, mHostContextCommon.CpuNum)== mHostContextCommon.CpuNum) | |||
1324 | { | |||
1325 | InterlockedCompareExchange32(&CpuSynched, 0, 1); //CpuSynched = 1; | |||
1326 | //DEBUG((EFI_D_ERROR, "%ld CpuReadySync - CpuSynched set to 1\n", Index)); | |||
1327 | } | |||
1328 | } | |||
1329 | ||||
1330 | if(InterlockedDecrement(&CpuReadyCount) == 0) | |||
1331 | { | |||
1332 | InterlockedCompareExchange32(&CpuSynched, 1, 0); // CpuSynched = 0; | |||
1333 | // DEBUG((EFI_D_ERROR, "%ld CpuReadySync - CpuSynched set to 0\n", Index)); | |||
1334 | } | |||
1335 | ||||
1336 | // DEBUG((EFI_D_ERROR, "%ld CpuReadySync - Cpu Released - CpuReadyCount: %d, \n", Index, CpuReadyCount));//could cause problems | |||
1337 | } | |||
1338 |