]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / UefiPayloadPkg / UefiPayloadEntry / PrintHob.c
CommitLineData
fda5226a
ZL
1/** @file\r
2 Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
3 SPDX-License-Identifier: BSD-2-Clause-Patent\r
4**/\r
5\r
6#include "UefiPayloadEntry.h"\r
7#include <UniversalPayload/AcpiTable.h>\r
8#include <UniversalPayload/SerialPortInfo.h>\r
9#include <UniversalPayload/PciRootBridges.h>\r
10#include <UniversalPayload/ExtraData.h>\r
11#include <Guid/MemoryTypeInformation.h>\r
12#include <Guid/AcpiBoardInfoGuid.h>\r
dcd3d63f 13#include <Guid/BootManagerMenu.h>\r
fda5226a 14\r
e5efcf8b 15#define ROW_LIMITER 16\r
fda5226a
ZL
16\r
17typedef\r
18EFI_STATUS\r
19(*HOB_PRINT_HANDLER) (\r
e5efcf8b
MK
20 IN VOID *Hob,\r
21 IN UINT16 HobLength\r
22 );\r
fda5226a 23\r
e5efcf8b 24typedef struct {\r
fda5226a
ZL
25 UINT16 Type;\r
26 CHAR8 *Name;\r
27 HOB_PRINT_HANDLER PrintHandler;\r
28} HOB_PRINT_HANDLER_TABLE;\r
29\r
e5efcf8b 30CHAR8 *mMemoryTypeStr[] = {\r
fda5226a
ZL
31 "EfiReservedMemoryType",\r
32 "EfiLoaderCode",\r
33 "EfiLoaderData",\r
34 "EfiBootServicesCode",\r
35 "EfiBootServicesData",\r
36 "EfiRuntimeServicesCode",\r
37 "EfiRuntimeServicesData",\r
38 "EfiConventionalMemory",\r
39 "EfiUnusableMemory",\r
40 "EfiACPIReclaimMemory",\r
41 "EfiACPIMemoryNVS",\r
42 "EfiMemoryMappedIO",\r
43 "EfiMemoryMappedIOPortSpace",\r
44 "EfiPalCode",\r
45 "EfiPersistentMemory",\r
46 "EfiMaxMemoryType"\r
47};\r
48\r
e5efcf8b
MK
49CHAR8 *mResource_Type_List[] = {\r
50 "EFI_RESOURCE_SYSTEM_MEMORY ", // 0x00000000\r
51 "EFI_RESOURCE_MEMORY_MAPPED_IO ", // 0x00000001\r
52 "EFI_RESOURCE_IO ", // 0x00000002\r
53 "EFI_RESOURCE_FIRMWARE_DEVICE ", // 0x00000003\r
54 "EFI_RESOURCE_MEMORY_MAPPED_IO_PORT ", // 0x00000004\r
55 "EFI_RESOURCE_MEMORY_RESERVED ", // 0x00000005\r
56 "EFI_RESOURCE_IO_RESERVED ", // 0x00000006\r
57 "EFI_RESOURCE_MAX_MEMORY_TYPE " // 0x00000007\r
fda5226a
ZL
58};\r
59\r
60typedef\r
61EFI_STATUS\r
62(*GUID_HOB_PRINT) (\r
e5efcf8b
MK
63 IN UINT8 *HobRaw,\r
64 IN UINT16 HobLength\r
65 );\r
fda5226a
ZL
66\r
67typedef struct {\r
68 EFI_GUID *Guid;\r
69 GUID_HOB_PRINT PrintHandler;\r
70 CHAR8 *GuidName;\r
71} GUID_HOB_PRINT_HANDLE;\r
72\r
e5efcf8b
MK
73typedef struct {\r
74 EFI_GUID *Guid;\r
75 CHAR8 *Type;\r
fda5226a
ZL
76} PRINT_MEMORY_ALLOCCATION_HOB;\r
77\r
fda5226a
ZL
78/**\r
79 Print the Hex value of a given range.\r
80 @param[in] DataStart A pointer to the start of data to be printed.\r
81 @param[in] DataSize The length of the data to be printed.\r
82 @retval EFI_SUCCESS If it completed successfully.\r
83**/\r
84EFI_STATUS\r
85PrintHex (\r
e5efcf8b
MK
86 IN UINT8 *DataStart,\r
87 IN UINT16 DataSize\r
fda5226a
ZL
88 )\r
89{\r
90 UINTN Index1;\r
91 UINTN Index2;\r
92 UINT8 *StartAddr;\r
93\r
94 StartAddr = DataStart;\r
95 for (Index1 = 0; Index1 * ROW_LIMITER < DataSize; Index1++) {\r
96 DEBUG ((DEBUG_VERBOSE, " 0x%04p:", (DataStart - StartAddr)));\r
e5efcf8b 97 for (Index2 = 0; (Index2 < ROW_LIMITER) && (Index1 * ROW_LIMITER + Index2 < DataSize); Index2++) {\r
fda5226a
ZL
98 DEBUG ((DEBUG_VERBOSE, " %02x", *DataStart));\r
99 DataStart++;\r
100 }\r
e5efcf8b 101\r
fda5226a
ZL
102 DEBUG ((DEBUG_VERBOSE, "\n"));\r
103 }\r
104\r
105 return EFI_SUCCESS;\r
106}\r
107\r
108/**\r
109 Print the information in HandOffHob.\r
110\r
111 @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_HANDOFF.\r
112 @param[in] HobLength The length in bytes of HOB of type EFI_HOB_TYPE_HANDOFF.\r
113 @retval EFI_SUCCESS If it completed successfully.\r
114**/\r
115EFI_STATUS\r
e5efcf8b
MK
116PrintHandOffHob (\r
117 IN VOID *HobStart,\r
118 IN UINT16 HobLength\r
fda5226a
ZL
119 )\r
120{\r
121 EFI_PEI_HOB_POINTERS Hob;\r
e5efcf8b
MK
122\r
123 Hob.Raw = (UINT8 *)HobStart;\r
fda5226a 124 ASSERT (HobLength >= sizeof (*Hob.HandoffInformationTable));\r
e5efcf8b 125 DEBUG ((DEBUG_INFO, " BootMode = 0x%x\n", Hob.HandoffInformationTable->BootMode));\r
fda5226a
ZL
126 DEBUG ((DEBUG_INFO, " EfiMemoryTop = 0x%lx\n", Hob.HandoffInformationTable->EfiMemoryTop));\r
127 DEBUG ((DEBUG_INFO, " EfiMemoryBottom = 0x%lx\n", Hob.HandoffInformationTable->EfiMemoryBottom));\r
128 DEBUG ((DEBUG_INFO, " EfiFreeMemoryTop = 0x%lx\n", Hob.HandoffInformationTable->EfiFreeMemoryTop));\r
129 DEBUG ((DEBUG_INFO, " EfiFreeMemoryBottom = 0x%lx\n", Hob.HandoffInformationTable->EfiFreeMemoryBottom));\r
130 DEBUG ((DEBUG_INFO, " EfiEndOfHobList = 0x%lx\n", Hob.HandoffInformationTable->EfiEndOfHobList));\r
131 return EFI_SUCCESS;\r
132}\r
133\r
134/**\r
135 Print the information in Memory Allocation Hob.\r
136 @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_MEMORY_ALLOCATION.\r
137 @param[in] HobLength The length in bytes of HOB of type EFI_HOB_TYPE_MEMORY_ALLOCATION.\r
138 @retval EFI_SUCCESS If it completed successfully.\r
139**/\r
140EFI_STATUS\r
141PrintMemoryAllocationHob (\r
e5efcf8b
MK
142 IN VOID *HobStart,\r
143 IN UINT16 HobLength\r
fda5226a
ZL
144 )\r
145{\r
146 EFI_PEI_HOB_POINTERS Hob;\r
147\r
e5efcf8b 148 Hob.Raw = (UINT8 *)HobStart;\r
fda5226a 149\r
e5efcf8b 150 if (CompareGuid (&Hob.MemoryAllocation->AllocDescriptor.Name, &gEfiHobMemoryAllocStackGuid)) {\r
fda5226a
ZL
151 ASSERT (HobLength >= sizeof (*Hob.MemoryAllocationStack));\r
152 DEBUG ((DEBUG_INFO, " Type = EFI_HOB_MEMORY_ALLOCATION_STACK\n"));\r
153 } else if (CompareGuid (&Hob.MemoryAllocation->AllocDescriptor.Name, &gEfiHobMemoryAllocBspStoreGuid)) {\r
154 ASSERT (HobLength >= sizeof (*Hob.MemoryAllocationBspStore));\r
155 DEBUG ((DEBUG_INFO, " Type = EFI_HOB_MEMORY_ALLOCATION_BSP_STORE\n"));\r
156 } else if (CompareGuid (&Hob.MemoryAllocation->AllocDescriptor.Name, &gEfiHobMemoryAllocModuleGuid)) {\r
157 ASSERT (HobLength >= sizeof (*Hob.MemoryAllocationModule));\r
158 DEBUG ((DEBUG_INFO, " Type = EFI_HOB_MEMORY_ALLOCATION_MODULE\n"));\r
159 DEBUG ((DEBUG_INFO, " Module Name = %g\n", Hob.MemoryAllocationModule->ModuleName));\r
160 DEBUG ((DEBUG_INFO, " Physical Address = 0x%lx\n", Hob.MemoryAllocationModule->EntryPoint));\r
161 } else {\r
162 ASSERT (HobLength >= sizeof (*Hob.MemoryAllocation));\r
163 DEBUG ((DEBUG_INFO, " Type = EFI_HOB_TYPE_MEMORY_ALLOCATION\n"));\r
164 }\r
e5efcf8b 165\r
fda5226a
ZL
166 DEBUG ((DEBUG_INFO, " MemoryBaseAddress = 0x%lx\n", Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress));\r
167 DEBUG ((DEBUG_INFO, " MemoryLength = 0x%lx\n", Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength));\r
e5efcf8b 168 DEBUG ((DEBUG_INFO, " MemoryType = %a \n", mMemoryTypeStr[Hob.MemoryAllocationStack->AllocDescriptor.MemoryType]));\r
fda5226a
ZL
169 return EFI_SUCCESS;\r
170}\r
171\r
172/**\r
173 Print the information in Resource Discriptor Hob.\r
174 @param[in] HobStart A pointer to HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.\r
175 @param[in] HobLength The Length in bytes of HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.\r
176 @retval EFI_SUCCESS If it completed successfully.\r
177**/\r
178EFI_STATUS\r
179PrintResourceDiscriptorHob (\r
e5efcf8b
MK
180 IN VOID *HobStart,\r
181 IN UINT16 HobLength\r
fda5226a
ZL
182 )\r
183{\r
184 EFI_PEI_HOB_POINTERS Hob;\r
185\r
e5efcf8b 186 Hob.Raw = (UINT8 *)HobStart;\r
fda5226a
ZL
187 ASSERT (HobLength >= sizeof (*Hob.ResourceDescriptor));\r
188\r
189 DEBUG ((DEBUG_INFO, " ResourceType = %a\n", mResource_Type_List[Hob.ResourceDescriptor->ResourceType]));\r
e5efcf8b 190 if (!IsZeroGuid (&Hob.ResourceDescriptor->Owner)) {\r
fda5226a
ZL
191 DEBUG ((DEBUG_INFO, " Owner = %g\n", Hob.ResourceDescriptor->Owner));\r
192 }\r
e5efcf8b
MK
193\r
194 DEBUG ((DEBUG_INFO, " ResourceAttribute = 0x%x\n", Hob.ResourceDescriptor->ResourceAttribute));\r
fda5226a
ZL
195 DEBUG ((DEBUG_INFO, " PhysicalStart = 0x%lx\n", Hob.ResourceDescriptor->PhysicalStart));\r
196 DEBUG ((DEBUG_INFO, " ResourceLength = 0x%lx\n", Hob.ResourceDescriptor->ResourceLength));\r
197 return EFI_SUCCESS;\r
198}\r
199\r
200/**\r
201 Print the information in Acpi Guid Hob.\r
6ef57974 202\r
fda5226a 203 @param[in] HobRaw A pointer to the start of gUniversalPayloadAcpiTableGuid HOB.\r
6ef57974
GD
204 @param[in] HobLength The size of the HOB data buffer.\r
205\r
fda5226a
ZL
206 @retval EFI_SUCCESS If it completed successfully.\r
207**/\r
208EFI_STATUS\r
209PrintAcpiGuidHob (\r
e5efcf8b
MK
210 IN UINT8 *HobRaw,\r
211 IN UINT16 HobLength\r
fda5226a
ZL
212 )\r
213{\r
e5efcf8b
MK
214 UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTableHob;\r
215\r
216 AcpiTableHob = (UNIVERSAL_PAYLOAD_ACPI_TABLE *)GET_GUID_HOB_DATA (HobRaw);\r
fda5226a 217 ASSERT (HobLength >= AcpiTableHob->Header.Length);\r
e5efcf8b
MK
218 DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", AcpiTableHob->Header.Revision));\r
219 DEBUG ((DEBUG_INFO, " Length = 0x%x\n", AcpiTableHob->Header.Length));\r
220 DEBUG ((DEBUG_INFO, " Rsdp = 0x%p\n", (UINT64)AcpiTableHob->Rsdp));\r
fda5226a
ZL
221 return EFI_SUCCESS;\r
222}\r
223\r
224/**\r
225 Print the information in Serial Guid Hob.\r
226 @param[in] HobRaw A pointer to the start of gUniversalPayloadSerialPortInfoGuid HOB.\r
6ef57974
GD
227 @param[in] HobLength The size of the HOB data buffer.\r
228\r
fda5226a
ZL
229 @retval EFI_SUCCESS If it completed successfully.\r
230**/\r
231EFI_STATUS\r
232PrintSerialGuidHob (\r
e5efcf8b
MK
233 IN UINT8 *HobRaw,\r
234 IN UINT16 HobLength\r
fda5226a
ZL
235 )\r
236{\r
e5efcf8b
MK
237 UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *SerialPortInfo;\r
238\r
239 SerialPortInfo = (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *)GET_GUID_HOB_DATA (HobRaw);\r
fda5226a 240 ASSERT (HobLength >= SerialPortInfo->Header.Length);\r
e5efcf8b
MK
241 DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", SerialPortInfo->Header.Revision));\r
242 DEBUG ((DEBUG_INFO, " Length = 0x%x\n", SerialPortInfo->Header.Length));\r
243 DEBUG ((DEBUG_INFO, " UseMmio = 0x%x\n", SerialPortInfo->UseMmio));\r
244 DEBUG ((DEBUG_INFO, " RegisterStride = 0x%x\n", SerialPortInfo->RegisterStride));\r
245 DEBUG ((DEBUG_INFO, " BaudRate = %d\n", SerialPortInfo->BaudRate));\r
fda5226a
ZL
246 DEBUG ((DEBUG_INFO, " RegisterBase = 0x%lx\n", SerialPortInfo->RegisterBase));\r
247 return EFI_SUCCESS;\r
248}\r
249\r
250/**\r
251 Print the information in Smbios Guid Hob.\r
252 @param[in] HobRaw A pointer to the start of gUniversalPayloadSmbios3TableGuid HOB.\r
6ef57974 253 @param[in] HobLength The size of the HOB data buffer.\r
fda5226a
ZL
254 @retval EFI_SUCCESS If it completed successfully.\r
255**/\r
256EFI_STATUS\r
257PrintSmbios3GuidHob (\r
e5efcf8b
MK
258 IN UINT8 *HobRaw,\r
259 IN UINT16 HobLength\r
fda5226a
ZL
260 )\r
261{\r
e5efcf8b
MK
262 UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTable;\r
263\r
264 SmBiosTable = (UNIVERSAL_PAYLOAD_SMBIOS_TABLE *)GET_GUID_HOB_DATA (HobRaw);\r
fda5226a 265 ASSERT (HobLength >= SmBiosTable->Header.Length);\r
e5efcf8b
MK
266 DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", SmBiosTable->Header.Revision));\r
267 DEBUG ((DEBUG_INFO, " Length = 0x%x\n", SmBiosTable->Header.Length));\r
268 DEBUG ((DEBUG_INFO, " SmBiosEntryPoint = 0x%lx\n", (UINT64)SmBiosTable->SmBiosEntryPoint));\r
fda5226a
ZL
269 return EFI_SUCCESS;\r
270}\r
271\r
272/**\r
273 Print the information in Smbios Guid Hob.\r
274 @param[in] HobRaw A pointer to the start of gUniversalPayloadSmbiosTableGuid HOB.\r
6ef57974
GD
275 @param[in] HobLength The size of the HOB data buffer.\r
276\r
fda5226a
ZL
277 @retval EFI_SUCCESS If it completed successfully.\r
278**/\r
279EFI_STATUS\r
280PrintSmbiosTablGuidHob (\r
e5efcf8b
MK
281 IN UINT8 *HobRaw,\r
282 IN UINT16 HobLength\r
fda5226a
ZL
283 )\r
284{\r
e5efcf8b
MK
285 UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTable;\r
286\r
287 SmBiosTable = (UNIVERSAL_PAYLOAD_SMBIOS_TABLE *)GET_GUID_HOB_DATA (HobRaw);\r
fda5226a 288 ASSERT (HobLength >= SmBiosTable->Header.Length);\r
e5efcf8b
MK
289 DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", SmBiosTable->Header.Revision));\r
290 DEBUG ((DEBUG_INFO, " Length = 0x%x\n", SmBiosTable->Header.Length));\r
291 DEBUG ((DEBUG_INFO, " SmBiosEntryPoint = 0x%lx\n", (UINT64)SmBiosTable->SmBiosEntryPoint));\r
fda5226a
ZL
292 return EFI_SUCCESS;\r
293}\r
294\r
295/**\r
296 Print the information in Acpi BoardInfo Guid Hob.\r
297 @param[in] HobRaw A pointer to the start of gUefiAcpiBoardInfoGuid HOB.\r
6ef57974
GD
298 @param[in] HobLength The size of the HOB data buffer.\r
299\r
fda5226a
ZL
300 @retval EFI_SUCCESS If it completed successfully.\r
301**/\r
302EFI_STATUS\r
303PrintAcpiBoardInfoGuidHob (\r
e5efcf8b
MK
304 IN UINT8 *HobRaw,\r
305 IN UINT16 HobLength\r
fda5226a
ZL
306 )\r
307{\r
e5efcf8b
MK
308 ACPI_BOARD_INFO *AcpBoardInfo;\r
309\r
310 AcpBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (HobRaw);\r
fda5226a 311 ASSERT (HobLength >= sizeof (*AcpBoardInfo));\r
e5efcf8b
MK
312 DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", AcpBoardInfo->Revision));\r
313 DEBUG ((DEBUG_INFO, " Reserved0 = 0x%x\n", AcpBoardInfo->Reserved0));\r
314 DEBUG ((DEBUG_INFO, " ResetValue = 0x%x\n", AcpBoardInfo->ResetValue));\r
fda5226a
ZL
315 DEBUG ((DEBUG_INFO, " PmEvtBase = 0x%lx\n", AcpBoardInfo->PmEvtBase));\r
316 DEBUG ((DEBUG_INFO, " PmGpeEnBase = 0x%lx\n", AcpBoardInfo->PmGpeEnBase));\r
317 DEBUG ((DEBUG_INFO, " PmCtrlRegBase = 0x%lx\n", AcpBoardInfo->PmCtrlRegBase));\r
318 DEBUG ((DEBUG_INFO, " PmTimerRegBase = 0x%lx\n", AcpBoardInfo->PmTimerRegBase));\r
319 DEBUG ((DEBUG_INFO, " ResetRegAddress = 0x%lx\n", AcpBoardInfo->ResetRegAddress));\r
320 DEBUG ((DEBUG_INFO, " PcieBaseAddress = 0x%lx\n", AcpBoardInfo->PcieBaseAddress));\r
321 DEBUG ((DEBUG_INFO, " PcieBaseSize = 0x%lx\n", AcpBoardInfo->PcieBaseSize));\r
322 return EFI_SUCCESS;\r
323}\r
324\r
325/**\r
326 Print the information in Pci RootBridge Info Guid Hob.\r
327 @param[in] HobRaw A pointer to the start of gUniversalPayloadPciRootBridgeInfoGuid HOB.\r
6ef57974 328 @param[in] HobLength The size of the HOB data buffer.\r
fda5226a
ZL
329\r
330 @retval EFI_SUCCESS If it completed successfully.\r
331**/\r
332EFI_STATUS\r
333PrintPciRootBridgeInfoGuidHob (\r
e5efcf8b
MK
334 IN UINT8 *HobRaw,\r
335 IN UINT16 HobLength\r
fda5226a
ZL
336 )\r
337{\r
e5efcf8b
MK
338 UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *PciRootBridges;\r
339 UINTN Index;\r
340 UINTN Length;\r
341\r
342 Index = 0;\r
343 PciRootBridges = (UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *)GET_GUID_HOB_DATA (HobRaw);\r
344 Length = sizeof (UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES) + PciRootBridges->Count * sizeof (UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE);\r
d96df7e9 345 ASSERT (HobLength >= Length);\r
fda5226a
ZL
346 DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", PciRootBridges->Header.Revision));\r
347 DEBUG ((DEBUG_INFO, " Length = 0x%x\n", PciRootBridges->Header.Length));\r
348 DEBUG ((DEBUG_INFO, " Count = 0x%x\n", PciRootBridges->Count));\r
e5efcf8b 349 DEBUG ((DEBUG_INFO, " ResourceAssigned = %a\n", (PciRootBridges->ResourceAssigned ? "True" : "False")));\r
fda5226a 350\r
e5efcf8b 351 while (Index < PciRootBridges->Count) {\r
fda5226a 352 DEBUG ((DEBUG_INFO, " Root Bridge Index[%d]:\n", Index));\r
e5efcf8b 353 DEBUG ((DEBUG_INFO, " Segment = 0x%x\n", PciRootBridges->RootBridge[Index].Segment));\r
fda5226a
ZL
354 DEBUG ((DEBUG_INFO, " Supports = 0x%lx\n", PciRootBridges->RootBridge[Index].Supports));\r
355 DEBUG ((DEBUG_INFO, " Attributes = 0x%lx\n", PciRootBridges->RootBridge[Index].Attributes));\r
e5efcf8b
MK
356 DEBUG ((DEBUG_INFO, " DmaAbove4G = 0x%x\n", PciRootBridges->RootBridge[Index].DmaAbove4G));\r
357 DEBUG ((DEBUG_INFO, " NoExtendedConfigSpace = 0x%x\n", PciRootBridges->RootBridge[Index].NoExtendedConfigSpace));\r
fda5226a
ZL
358 DEBUG ((DEBUG_INFO, " AllocationAttributes = 0x%lx\n", PciRootBridges->RootBridge[Index].AllocationAttributes));\r
359 DEBUG ((DEBUG_INFO, " Bus.Base = 0x%lx\n", PciRootBridges->RootBridge[Index].Bus.Base));\r
360 DEBUG ((DEBUG_INFO, " Bus.Limit = 0x%lx\n", PciRootBridges->RootBridge[Index].Bus.Limit));\r
361 DEBUG ((DEBUG_INFO, " Bus.Translation = 0x%lx\n", PciRootBridges->RootBridge[Index].Bus.Translation));\r
362 DEBUG ((DEBUG_INFO, " Io.Base = 0x%lx\n", PciRootBridges->RootBridge[Index].Io.Base));\r
363 DEBUG ((DEBUG_INFO, " Io.Limit = 0x%lx\n", PciRootBridges->RootBridge[Index].Io.Limit));\r
364 DEBUG ((DEBUG_INFO, " Io.Translation = 0x%lx\n", PciRootBridges->RootBridge[Index].Io.Translation));\r
365 DEBUG ((DEBUG_INFO, " Mem.Base = 0x%lx\n", PciRootBridges->RootBridge[Index].Mem.Base));\r
366 DEBUG ((DEBUG_INFO, " Mem.Limit = 0x%lx\n", PciRootBridges->RootBridge[Index].Mem.Limit));\r
367 DEBUG ((DEBUG_INFO, " Mem.Translation = 0x%lx\n", PciRootBridges->RootBridge[Index].Mem.Translation));\r
368 DEBUG ((DEBUG_INFO, " MemAbove4G.Base = 0x%lx\n", PciRootBridges->RootBridge[Index].MemAbove4G.Base));\r
369 DEBUG ((DEBUG_INFO, " MemAbove4G.Limit = 0x%lx\n", PciRootBridges->RootBridge[Index].MemAbove4G.Limit));\r
370 DEBUG ((DEBUG_INFO, " MemAbove4G.Translation = 0x%lx\n", PciRootBridges->RootBridge[Index].MemAbove4G.Translation));\r
371 DEBUG ((DEBUG_INFO, " PMem.Base = 0x%lx\n", PciRootBridges->RootBridge[Index].PMem.Base));\r
372 DEBUG ((DEBUG_INFO, " PMem.Limit = 0x%lx\n", PciRootBridges->RootBridge[Index].PMem.Limit));\r
373 DEBUG ((DEBUG_INFO, " PMem.Translation = 0x%lx\n", PciRootBridges->RootBridge[Index].PMem.Translation));\r
374 DEBUG ((DEBUG_INFO, " PMemAbove4G.Base = 0x%lx\n", PciRootBridges->RootBridge[Index].PMemAbove4G.Base));\r
375 DEBUG ((DEBUG_INFO, " PMemAbove4G.Limit = 0x%lx\n", PciRootBridges->RootBridge[Index].PMemAbove4G.Limit));\r
376 DEBUG ((DEBUG_INFO, " PMemAbove4G.Translation = 0x%lx\n", PciRootBridges->RootBridge[Index].PMemAbove4G.Translation));\r
e5efcf8b 377 Index += 1;\r
fda5226a 378 }\r
e5efcf8b 379\r
fda5226a
ZL
380 return EFI_SUCCESS;\r
381}\r
382\r
383/**\r
384 Print the information in Extra Data Guid Hob.\r
385 @param[in] HobRaw A pointer to the start of gUniversalPayloadExtraDataGuid HOB.\r
6ef57974
GD
386 @param[in] HobLength The size of the HOB data buffer.\r
387\r
fda5226a
ZL
388 @retval EFI_SUCCESS If it completed successfully.\r
389**/\r
390EFI_STATUS\r
391PrintExtraDataGuidHob (\r
e5efcf8b
MK
392 IN UINT8 *HobRaw,\r
393 IN UINT16 HobLength\r
fda5226a
ZL
394 )\r
395{\r
e5efcf8b
MK
396 UNIVERSAL_PAYLOAD_EXTRA_DATA *ExtraData;\r
397 UINTN Index;\r
398 UINTN Length;\r
fda5226a
ZL
399\r
400 Index = 0;\r
e5efcf8b
MK
401 ExtraData = (UNIVERSAL_PAYLOAD_EXTRA_DATA *)GET_GUID_HOB_DATA (HobRaw);\r
402 Length = sizeof (UNIVERSAL_PAYLOAD_EXTRA_DATA) + ExtraData->Count * sizeof (UNIVERSAL_PAYLOAD_EXTRA_DATA_ENTRY);\r
d96df7e9 403 ASSERT (HobLength >= Length);\r
fda5226a
ZL
404 DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", ExtraData->Header.Revision));\r
405 DEBUG ((DEBUG_INFO, " Length = 0x%x\n", ExtraData->Header.Length));\r
406 DEBUG ((DEBUG_INFO, " Count = 0x%x\n", ExtraData->Count));\r
407\r
408 while (Index < ExtraData->Count) {\r
e5efcf8b
MK
409 DEBUG ((DEBUG_INFO, " Id[%d] = %a\n", Index, ExtraData->Entry[Index].Identifier));\r
410 DEBUG ((DEBUG_INFO, " Base[%d] = 0x%lx\n", Index, ExtraData->Entry[Index].Base));\r
411 DEBUG ((DEBUG_INFO, " Size[%d] = 0x%lx\n", Index, ExtraData->Entry[Index].Size));\r
412 Index += 1;\r
fda5226a 413 }\r
e5efcf8b 414\r
fda5226a
ZL
415 return EFI_SUCCESS;\r
416}\r
417\r
418/**\r
419 Print the information in MemoryTypeInfoGuidHob.\r
420 @param[in] HobRaw A pointer to the start of gEfiMemoryTypeInformationGuid HOB.\r
6ef57974
GD
421 @param[in] HobLength The size of the HOB data buffer.\r
422\r
fda5226a
ZL
423 @retval EFI_SUCCESS If it completed successfully.\r
424**/\r
425EFI_STATUS\r
426PrintMemoryTypeInfoGuidHob (\r
e5efcf8b
MK
427 IN UINT8 *HobRaw,\r
428 IN UINT16 HobLength\r
fda5226a
ZL
429 )\r
430{\r
e5efcf8b 431 EFI_MEMORY_TYPE_INFORMATION *MemoryTypeInfo;\r
fda5226a 432\r
e5efcf8b 433 MemoryTypeInfo = (EFI_MEMORY_TYPE_INFORMATION *)GET_GUID_HOB_DATA (HobRaw);\r
fda5226a
ZL
434 ASSERT (HobLength >= sizeof (*MemoryTypeInfo));\r
435 DEBUG ((DEBUG_INFO, " Type = 0x%x\n", MemoryTypeInfo->Type));\r
436 DEBUG ((DEBUG_INFO, " NumberOfPages = 0x%x\n", MemoryTypeInfo->NumberOfPages));\r
437 return EFI_SUCCESS;\r
438}\r
439\r
dcd3d63f 440/**\r
441 Print the information in EdkiiBootManagerMenuFileGuid.\r
442 @param[in] HobRaw A pointer to the start of gEdkiiBootManagerMenuFileGuid HOB.\r
6ef57974 443 @param[in] HobLength The size of the HOB data buffer.\r
dcd3d63f 444 @retval EFI_SUCCESS If it completed successfully.\r
445**/\r
446EFI_STATUS\r
447PrintBootManagerMenuGuidHob (\r
e5efcf8b
MK
448 IN UINT8 *HobRaw,\r
449 IN UINT16 HobLength\r
dcd3d63f 450 )\r
451{\r
e5efcf8b 452 UNIVERSAL_PAYLOAD_BOOT_MANAGER_MENU *BootManagerMenuFile;\r
dcd3d63f 453\r
e5efcf8b 454 BootManagerMenuFile = (UNIVERSAL_PAYLOAD_BOOT_MANAGER_MENU *)GET_GUID_HOB_DATA (HobRaw);\r
dcd3d63f 455 ASSERT (HobLength >= sizeof (*BootManagerMenuFile));\r
456 DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", BootManagerMenuFile->Header.Revision));\r
457 DEBUG ((DEBUG_INFO, " Length = 0x%x\n", BootManagerMenuFile->Header.Length));\r
e5efcf8b 458 DEBUG ((DEBUG_INFO, " FileName = %g\n", &BootManagerMenuFile->FileName));\r
dcd3d63f 459 return EFI_SUCCESS;\r
460}\r
461\r
fda5226a
ZL
462//\r
463// Mappint table for dump Guid Hob information.\r
464// This table can be easily extented.\r
465//\r
e5efcf8b
MK
466GUID_HOB_PRINT_HANDLE GuidHobPrintHandleTable[] = {\r
467 { &gUniversalPayloadAcpiTableGuid, PrintAcpiGuidHob, "gUniversalPayloadAcpiTableGuid(ACPI table Guid)" },\r
468 { &gUniversalPayloadSerialPortInfoGuid, PrintSerialGuidHob, "gUniversalPayloadSerialPortInfoGuid(Serial Port Info)" },\r
469 { &gUniversalPayloadSmbios3TableGuid, PrintSmbios3GuidHob, "gUniversalPayloadSmbios3TableGuid(SmBios Guid)" },\r
470 { &gUniversalPayloadSmbiosTableGuid, PrintSmbiosTablGuidHob, "gUniversalPayloadSmbiosTableGuid(SmBios Guid)" },\r
471 { &gUefiAcpiBoardInfoGuid, PrintAcpiBoardInfoGuidHob, "gUefiAcpiBoardInfoGuid(Acpi Guid)" },\r
472 { &gUniversalPayloadPciRootBridgeInfoGuid, PrintPciRootBridgeInfoGuidHob, "gUniversalPayloadPciRootBridgeInfoGuid(Pci Guid)" },\r
473 { &gEfiMemoryTypeInformationGuid, PrintMemoryTypeInfoGuidHob, "gEfiMemoryTypeInformationGuid(Memory Type Information Guid)" },\r
474 { &gUniversalPayloadExtraDataGuid, PrintExtraDataGuidHob, "gUniversalPayloadExtraDataGuid(PayLoad Extra Data Guid)" },\r
475 { &gEdkiiBootManagerMenuFileGuid, PrintBootManagerMenuGuidHob, "gEdkiiBootManagerMenuFileGuid(Boot Manager Menu File Guid)" }\r
fda5226a
ZL
476};\r
477\r
478/**\r
479 Print the Guid Hob using related print handle function.\r
480 @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_GUID_EXTENSION.\r
481 @param[in] HobLength The length in bytes of the HOB of type EFI_HOB_TYPE_GUID_EXTENSION.\r
482 @retval EFI_SUCCESS If it completed successfully.\r
483**/\r
484EFI_STATUS\r
485PrintGuidHob (\r
e5efcf8b
MK
486 IN VOID *HobStart,\r
487 IN UINT16 HobLength\r
fda5226a
ZL
488 )\r
489{\r
490 EFI_PEI_HOB_POINTERS Hob;\r
491 UINTN Index;\r
492 EFI_STATUS Status;\r
493\r
e5efcf8b 494 Hob.Raw = (UINT8 *)HobStart;\r
fda5226a
ZL
495 ASSERT (HobLength >= sizeof (Hob.Guid));\r
496\r
497 for (Index = 0; Index < ARRAY_SIZE (GuidHobPrintHandleTable); Index++) {\r
498 if (CompareGuid (&Hob.Guid->Name, GuidHobPrintHandleTable[Index].Guid)) {\r
499 DEBUG ((DEBUG_INFO, " Guid = %a\n", GuidHobPrintHandleTable[Index].GuidName));\r
d96df7e9 500 Status = GuidHobPrintHandleTable[Index].PrintHandler (Hob.Raw, GET_GUID_HOB_DATA_SIZE (Hob.Raw));\r
fda5226a
ZL
501 return Status;\r
502 }\r
503 }\r
e5efcf8b 504\r
fda5226a
ZL
505 DEBUG ((DEBUG_INFO, " Name = %g\n", &Hob.Guid->Name));\r
506 PrintHex (GET_GUID_HOB_DATA (Hob.Raw), GET_GUID_HOB_DATA_SIZE (Hob.Raw));\r
507 return EFI_SUCCESS;\r
508}\r
509\r
510/**\r
511 Print the information in FV Hob.\r
512 @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_FV.\r
513 @param[in] HobLength The length in bytes of the HOB of type EFI_HOB_TYPE_FV.\r
514 @retval EFI_SUCCESS If it completed successfully.\r
515**/\r
516EFI_STATUS\r
517PrintFvHob (\r
e5efcf8b
MK
518 IN VOID *HobStart,\r
519 IN UINT16 HobLength\r
fda5226a
ZL
520 )\r
521{\r
522 EFI_PEI_HOB_POINTERS Hob;\r
523\r
e5efcf8b 524 Hob.Raw = (UINT8 *)HobStart;\r
fda5226a
ZL
525 ASSERT (HobLength >= sizeof (*Hob.FirmwareVolume));\r
526\r
527 DEBUG ((DEBUG_INFO, " BaseAddress = 0x%lx\n", Hob.FirmwareVolume->BaseAddress));\r
528 DEBUG ((DEBUG_INFO, " Length = 0x%lx\n", Hob.FirmwareVolume->Length));\r
529 return EFI_SUCCESS;\r
530}\r
531\r
532/**\r
533 Print the information in Cpu Hob.\r
534 @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_CPU.\r
535 @param[in] HobLength The length in bytes of the HOB of type EFI_HOB_TYPE_CPU.\r
536 @retval EFI_SUCCESS If it completed successfully.\r
537**/\r
538EFI_STATUS\r
539PrintCpuHob (\r
e5efcf8b
MK
540 IN VOID *HobStart,\r
541 IN UINT16 HobLength\r
fda5226a
ZL
542 )\r
543{\r
544 EFI_PEI_HOB_POINTERS Hob;\r
545\r
e5efcf8b 546 Hob.Raw = (UINT8 *)HobStart;\r
fda5226a
ZL
547 ASSERT (HobLength >= sizeof (*Hob.Cpu));\r
548\r
549 DEBUG ((DEBUG_INFO, " SizeOfMemorySpace = 0x%lx\n", Hob.Cpu->SizeOfMemorySpace));\r
550 DEBUG ((DEBUG_INFO, " SizeOfIoSpace = 0x%lx\n", Hob.Cpu->SizeOfIoSpace));\r
551 return EFI_SUCCESS;\r
552}\r
553\r
554/**\r
555 Print the information in MemoryPoolHob.\r
556 @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_MEMORY_POOL.\r
557 @param[in] HobLength The length in bytes of the HOB of type EFI_HOB_TYPE_MEMORY_POOL.\r
558 @retval EFI_SUCCESS If it completed successfully.\r
559**/\r
560EFI_STATUS\r
561PrintMemoryPoolHob (\r
e5efcf8b
MK
562 IN VOID *HobStart,\r
563 IN UINT16 HobLength\r
fda5226a
ZL
564 )\r
565{\r
566 return EFI_SUCCESS;\r
567}\r
568\r
569/**\r
570 Print the information in Fv2Hob.\r
571 @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_FV2.\r
572 @param[in] HobLength The length in bytes of the HOB of type EFI_HOB_TYPE_FV2.\r
573 @retval EFI_SUCCESS If it completed successfully.\r
574**/\r
575EFI_STATUS\r
576PrintFv2Hob (\r
e5efcf8b
MK
577 IN VOID *HobStart,\r
578 IN UINT16 HobLength\r
fda5226a
ZL
579 )\r
580{\r
581 EFI_PEI_HOB_POINTERS Hob;\r
582\r
e5efcf8b 583 Hob.Raw = (UINT8 *)HobStart;\r
fda5226a
ZL
584 ASSERT (HobLength >= sizeof (*Hob.FirmwareVolume2));\r
585\r
586 DEBUG ((DEBUG_INFO, " BaseAddress = 0x%lx\n", Hob.FirmwareVolume2->BaseAddress));\r
587 DEBUG ((DEBUG_INFO, " Length = 0x%lx\n", Hob.FirmwareVolume2->Length));\r
e5efcf8b
MK
588 DEBUG ((DEBUG_INFO, " FvName = %g\n", &Hob.FirmwareVolume2->FvName));\r
589 DEBUG ((DEBUG_INFO, " FileName = %g\n", &Hob.FirmwareVolume2->FileName));\r
fda5226a
ZL
590 return EFI_SUCCESS;\r
591}\r
592\r
593/**\r
594 Print the information in Capsule Hob.\r
595 @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_UEFI_CAPSULE.\r
596 @param[in] HobLength The length in bytes of the HOB of type EFI_HOB_TYPE_UEFI_CAPSULE.\r
597 @retval EFI_SUCCESS If it completed successfully.\r
598**/\r
599EFI_STATUS\r
600PrintCapsuleHob (\r
e5efcf8b
MK
601 IN VOID *HobStart,\r
602 IN UINT16 HobLength\r
fda5226a
ZL
603 )\r
604{\r
605 EFI_PEI_HOB_POINTERS Hob;\r
606\r
e5efcf8b 607 Hob.Raw = (UINT8 *)HobStart;\r
fda5226a
ZL
608 ASSERT (HobLength >= sizeof (*Hob.Capsule));\r
609\r
610 DEBUG ((DEBUG_INFO, " BaseAddress = 0x%lx\n", Hob.Capsule->BaseAddress));\r
e5efcf8b 611 DEBUG ((DEBUG_INFO, " Length = 0x%lx\n", Hob.Capsule->Length));\r
fda5226a
ZL
612 return EFI_SUCCESS;\r
613}\r
614\r
615/**\r
616 Print the information in Fv3 Hob.\r
617 @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_FV3.\r
618 @param[in] HobLength The length in bytes of the HOB of type EFI_HOB_TYPE_FV3.\r
619 @retval EFI_SUCCESS If it completed successfully.\r
620**/\r
621EFI_STATUS\r
622PrintFv3Hob (\r
e5efcf8b
MK
623 IN VOID *HobStart,\r
624 IN UINT16 HobLength\r
fda5226a
ZL
625 )\r
626{\r
627 EFI_PEI_HOB_POINTERS Hob;\r
e5efcf8b
MK
628\r
629 Hob.Raw = (UINT8 *)HobStart;\r
fda5226a
ZL
630 ASSERT (HobLength >= sizeof (*Hob.FirmwareVolume3));\r
631\r
632 DEBUG ((DEBUG_INFO, " BaseAddress = 0x%lx\n", Hob.FirmwareVolume3->BaseAddress));\r
633 DEBUG ((DEBUG_INFO, " Length = 0x%lx\n", Hob.FirmwareVolume3->Length));\r
e5efcf8b
MK
634 DEBUG ((DEBUG_INFO, " AuthenticationStatus = 0x%x\n", Hob.FirmwareVolume3->AuthenticationStatus));\r
635 DEBUG ((DEBUG_INFO, " ExtractedFv = %a\n", (Hob.FirmwareVolume3->ExtractedFv ? "True" : "False")));\r
636 DEBUG ((DEBUG_INFO, " FVName = %g\n", &Hob.FirmwareVolume3->FvName));\r
637 DEBUG ((DEBUG_INFO, " FileName = %g\n", &Hob.FirmwareVolume3->FileName));\r
fda5226a
ZL
638 return EFI_SUCCESS;\r
639}\r
640\r
641//\r
642// Mappint table from Hob type to Hob print function.\r
643//\r
e5efcf8b
MK
644HOB_PRINT_HANDLER_TABLE mHobHandles[] = {\r
645 { EFI_HOB_TYPE_HANDOFF, "EFI_HOB_TYPE_HANDOFF", PrintHandOffHob },\r
646 { EFI_HOB_TYPE_MEMORY_ALLOCATION, "EFI_HOB_TYPE_MEMORY_ALLOCATION", PrintMemoryAllocationHob },\r
647 { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDiscriptorHob },\r
648 { EFI_HOB_TYPE_GUID_EXTENSION, "EFI_HOB_TYPE_GUID_EXTENSION", PrintGuidHob },\r
649 { EFI_HOB_TYPE_FV, "EFI_HOB_TYPE_FV", PrintFvHob },\r
650 { EFI_HOB_TYPE_CPU, "EFI_HOB_TYPE_CPU", PrintCpuHob },\r
651 { EFI_HOB_TYPE_MEMORY_POOL, "EFI_HOB_TYPE_MEMORY_POOL", PrintMemoryPoolHob },\r
652 { EFI_HOB_TYPE_FV2, "EFI_HOB_TYPE_FV2", PrintFv2Hob },\r
653 { EFI_HOB_TYPE_UEFI_CAPSULE, "EFI_HOB_TYPE_UEFI_CAPSULE", PrintCapsuleHob },\r
654 { EFI_HOB_TYPE_FV3, "EFI_HOB_TYPE_FV3", PrintFv3Hob }\r
fda5226a
ZL
655};\r
656\r
fda5226a
ZL
657/**\r
658 Print all HOBs info from the HOB list.\r
659 @param[in] HobStart A pointer to the HOB list\r
660 @return The pointer to the HOB list.\r
661**/\r
662VOID\r
663PrintHob (\r
e5efcf8b 664 IN CONST VOID *HobStart\r
fda5226a
ZL
665 )\r
666{\r
667 EFI_PEI_HOB_POINTERS Hob;\r
668 UINTN Count;\r
669 UINTN Index;\r
e5efcf8b 670\r
fda5226a
ZL
671 ASSERT (HobStart != NULL);\r
672\r
e5efcf8b 673 Hob.Raw = (UINT8 *)HobStart;\r
fda5226a
ZL
674 DEBUG ((DEBUG_INFO, "Print all Hob information from Hob 0x%p\n", Hob.Raw));\r
675\r
676 Count = 0;\r
677 //\r
678 // Parse the HOB list to see which type it is, and print the information.\r
679 //\r
680 while (!END_OF_HOB_LIST (Hob)) {\r
681 for (Index = 0; Index < ARRAY_SIZE (mHobHandles); Index++) {\r
682 if (Hob.Header->HobType == mHobHandles[Index].Type) {\r
e5efcf8b 683 DEBUG ((DEBUG_INFO, "HOB[%d]: Type = %a, Offset = 0x%p, Length = 0x%x\n", Count, mHobHandles[Index].Name, (Hob.Raw - (UINT8 *)HobStart), Hob.Header->HobLength));\r
fda5226a
ZL
684 mHobHandles[Index].PrintHandler (Hob.Raw, Hob.Header->HobLength);\r
685 break;\r
686 }\r
687 }\r
e5efcf8b 688\r
fda5226a
ZL
689 if (Index == ARRAY_SIZE (mHobHandles)) {\r
690 DEBUG ((DEBUG_INFO, "HOB[%d]: Type = %d, Offset = 0x%p, Length = 0x%x\n", Count, Hob.Header->HobType, (Hob.Raw - (UINT8 *)HobStart), Hob.Header->HobLength));\r
691 DEBUG ((DEBUG_INFO, " Unkown Hob type\n"));\r
692 PrintHex (Hob.Raw, Hob.Header->HobLength);\r
693 }\r
e5efcf8b 694\r
fda5226a
ZL
695 Count++;\r
696 Hob.Raw = GET_NEXT_HOB (Hob);\r
697 }\r
e5efcf8b 698\r
fda5226a
ZL
699 DEBUG ((DEBUG_INFO, "There are totally %d Hobs, the End Hob address is %p\n", Count, Hob.Raw));\r
700}\r