]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Application/CapsuleApp/CapsuleDump.c
UefiCpuPkg/PiSmmCpuDxeSmm: Clear some semaphores on S3 boot path
[mirror_edk2.git] / MdeModulePkg / Application / CapsuleApp / CapsuleDump.c
CommitLineData
592bad04
JY
1/** @file\r
2 Dump Capsule image information.\r
3\r
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include <PiDxe.h>\r
16#include <Library/BaseLib.h>\r
17#include <Library/DebugLib.h>\r
18#include <Library/BaseMemoryLib.h>\r
19#include <Library/MemoryAllocationLib.h>\r
20#include <Library/UefiBootServicesTableLib.h>\r
21#include <Library/UefiRuntimeServicesTableLib.h>\r
22#include <Library/UefiLib.h>\r
23#include <Library/PrintLib.h>\r
24#include <Protocol/FirmwareManagement.h>\r
25#include <Guid/ImageAuthentication.h>\r
26#include <Guid/CapsuleReport.h>\r
27#include <Guid/SystemResourceTable.h>\r
28#include <Guid/FmpCapsule.h>\r
29#include <IndustryStandard/WindowsUxCapsule.h>\r
30\r
31/**\r
32 Read a file.\r
33\r
34 @param[in] FileName The file to be read.\r
35 @param[in] BufferSize The file buffer size\r
36 @param[in] Buffer The file buffer\r
37\r
38 @retval EFI_SUCCESS Read file successfully\r
39 @retval EFI_NOT_FOUND File not found\r
40**/\r
41EFI_STATUS\r
42ReadFileToBuffer (\r
43 IN CHAR16 *FileName,\r
44 OUT UINTN *BufferSize,\r
45 OUT VOID **Buffer\r
46 );\r
47\r
48/**\r
49 Dump UX capsule information.\r
50\r
51 @param[in] CapsuleHeader The UX capsule header\r
52**/\r
53VOID\r
54DumpUxCapsule (\r
55 IN EFI_CAPSULE_HEADER *CapsuleHeader\r
56 )\r
57{\r
58 EFI_DISPLAY_CAPSULE *DisplayCapsule;\r
59 DisplayCapsule = (EFI_DISPLAY_CAPSULE *)CapsuleHeader;\r
60 Print(L"[UxCapusule]\n");\r
61 Print(L"CapsuleHeader:\n");\r
62 Print(L" CapsuleGuid - %g\n", &DisplayCapsule->CapsuleHeader.CapsuleGuid);\r
63 Print(L" HeaderSize - 0x%x\n", DisplayCapsule->CapsuleHeader.HeaderSize);\r
64 Print(L" Flags - 0x%x\n", DisplayCapsule->CapsuleHeader.Flags);\r
65 Print(L" CapsuleImageSize - 0x%x\n", DisplayCapsule->CapsuleHeader.CapsuleImageSize);\r
66 Print(L"ImagePayload:\n");\r
67 Print(L" Version - 0x%x\n", DisplayCapsule->ImagePayload.Version);\r
68 Print(L" Checksum - 0x%x\n", DisplayCapsule->ImagePayload.Checksum);\r
69 Print(L" ImageType - 0x%x\n", DisplayCapsule->ImagePayload.ImageType);\r
70 Print(L" Mode - 0x%x\n", DisplayCapsule->ImagePayload.Mode);\r
71 Print(L" OffsetX - 0x%x\n", DisplayCapsule->ImagePayload.OffsetX);\r
72 Print(L" OffsetY - 0x%x\n", DisplayCapsule->ImagePayload.OffsetY);\r
73}\r
74\r
75/**\r
76 Dump FMP image authentication information.\r
77\r
78 @param[in] Image The FMP capsule image\r
79 @param[in] ImageSize The size of the FMP capsule image in bytes.\r
80\r
81 @return the size of FMP authentication.\r
82**/\r
83UINTN\r
84DumpImageAuthentication (\r
85 IN VOID *Image,\r
86 IN UINTN ImageSize\r
87 )\r
88{\r
89 EFI_FIRMWARE_IMAGE_AUTHENTICATION *ImageAuthentication;\r
90\r
91 ImageAuthentication = Image;\r
92 if (CompareGuid(&ImageAuthentication->AuthInfo.CertType, &gEfiCertPkcs7Guid) ||\r
93 CompareGuid(&ImageAuthentication->AuthInfo.CertType, &gEfiCertTypeRsa2048Sha256Guid)) {\r
94 Print(L"[ImageAuthentication]\n");\r
95 Print(L" MonotonicCount - 0x%lx\n", ImageAuthentication->MonotonicCount);\r
96 Print(L"WIN_CERTIFICATE:\n");\r
97 Print(L" dwLength - 0x%x\n", ImageAuthentication->AuthInfo.Hdr.dwLength);\r
98 Print(L" wRevision - 0x%x\n", ImageAuthentication->AuthInfo.Hdr.wRevision);\r
99 Print(L" wCertificateType - 0x%x\n", ImageAuthentication->AuthInfo.Hdr.wCertificateType);\r
100 Print(L" CertType - %g\n", &ImageAuthentication->AuthInfo.CertType);\r
101 return sizeof(ImageAuthentication->MonotonicCount) + ImageAuthentication->AuthInfo.Hdr.dwLength;\r
102 } else {\r
103 return 0;\r
104 }\r
105}\r
106\r
107/**\r
108 Dump a non-nested FMP capsule.\r
109\r
110 @param[in] CapsuleHeader A pointer to CapsuleHeader\r
111**/\r
112VOID\r
113DumpFmpCapsule (\r
114 IN EFI_CAPSULE_HEADER *CapsuleHeader\r
115 )\r
116{\r
117 EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader;\r
118 UINT64 *ItemOffsetList;\r
119 UINTN Index;\r
120 UINTN Count;\r
121 EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *FmpImageHeader;\r
122\r
123 Print(L"[FmpCapusule]\n");\r
124 Print(L"CapsuleHeader:\n");\r
125 Print(L" CapsuleGuid - %g\n", &CapsuleHeader->CapsuleGuid);\r
126 Print(L" HeaderSize - 0x%x\n", CapsuleHeader->HeaderSize);\r
127 Print(L" Flags - 0x%x\n", CapsuleHeader->Flags);\r
128 Print(L" CapsuleImageSize - 0x%x\n", CapsuleHeader->CapsuleImageSize);\r
129\r
130 FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);\r
131 ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);\r
132 Print(L"FmpHeader:\n");\r
133 Print(L" Version - 0x%x\n", FmpCapsuleHeader->Version);\r
134 Print(L" EmbeddedDriverCount - 0x%x\n", FmpCapsuleHeader->EmbeddedDriverCount);\r
135 Print(L" PayloadItemCount - 0x%x\n", FmpCapsuleHeader->PayloadItemCount);\r
136 Count = FmpCapsuleHeader->EmbeddedDriverCount + FmpCapsuleHeader->PayloadItemCount;\r
137 for (Index = 0; Index < Count; Index++) {\r
138 Print(L" Offset[%d] - 0x%x\n", Index, ItemOffsetList[Index]);\r
139 }\r
140\r
141 for (Index = FmpCapsuleHeader->EmbeddedDriverCount; Index < Count; Index++) {\r
142 Print(L"FmpPayload[%d] ImageHeader:\n", Index);\r
143 FmpImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[Index]);\r
144 Print(L" Version - 0x%x\n", FmpImageHeader->Version);\r
145 Print(L" UpdateImageTypeId - %g\n", &FmpImageHeader->UpdateImageTypeId);\r
146 Print(L" UpdateImageIndex - 0x%x\n", FmpImageHeader->UpdateImageIndex);\r
147 Print(L" UpdateImageSize - 0x%x\n", FmpImageHeader->UpdateImageSize);\r
148 Print(L" UpdateVendorCodeSize - 0x%x\n", FmpImageHeader->UpdateVendorCodeSize);\r
149 if (FmpImageHeader->Version >= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) {\r
150 Print(L" UpdateHardwareInstance - 0x%lx\n", FmpImageHeader->UpdateHardwareInstance);\r
151 }\r
152 }\r
153}\r
154\r
155/**\r
156 Return if there is a FMP header below capsule header.\r
157\r
158 @param[in] CapsuleHeader A pointer to EFI_CAPSULE_HEADER\r
159\r
160 @retval TRUE There is a FMP header below capsule header.\r
161 @retval FALSE There is not a FMP header below capsule header\r
162**/\r
163BOOLEAN\r
164IsNestedFmpCapsule (\r
165 IN EFI_CAPSULE_HEADER *CapsuleHeader\r
166 )\r
167{\r
168 EFI_STATUS Status;\r
169 EFI_SYSTEM_RESOURCE_TABLE *Esrt;\r
170 EFI_SYSTEM_RESOURCE_ENTRY *EsrtEntry;\r
171 UINTN Index;\r
172 BOOLEAN EsrtGuidFound;\r
173 EFI_CAPSULE_HEADER *NestedCapsuleHeader;\r
174 UINTN NestedCapsuleSize;\r
175\r
176 //\r
177 // Check ESRT\r
178 //\r
179 EsrtGuidFound = FALSE;\r
180 Status = EfiGetSystemConfigurationTable(&gEfiSystemResourceTableGuid, (VOID **)&Esrt);\r
181 if (!EFI_ERROR(Status)) {\r
182 ASSERT (Esrt != NULL);\r
183 EsrtEntry = (VOID *)(Esrt + 1);\r
184 for (Index = 0; Index < Esrt->FwResourceCount; Index++, EsrtEntry++) {\r
185 if (CompareGuid(&EsrtEntry->FwClass, &CapsuleHeader->CapsuleGuid)) {\r
186 EsrtGuidFound = TRUE;\r
187 break;\r
188 }\r
189 }\r
190 }\r
191\r
192 if (!EsrtGuidFound) {\r
193 return FALSE;\r
194 }\r
195\r
196 //\r
197 // Check nested capsule header\r
198 // FMP GUID after ESRT one\r
199 //\r
200 NestedCapsuleHeader = (EFI_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);\r
201 NestedCapsuleSize = (UINTN)CapsuleHeader + CapsuleHeader->HeaderSize - (UINTN)NestedCapsuleHeader;\r
202 if (NestedCapsuleSize < sizeof(EFI_CAPSULE_HEADER)) {\r
203 return FALSE;\r
204 }\r
205 if (!CompareGuid(&NestedCapsuleHeader->CapsuleGuid, &gEfiFmpCapsuleGuid)) {\r
206 return FALSE;\r
207 }\r
208 return TRUE;\r
209}\r
210\r
211/**\r
212 Dump capsule information\r
213\r
214 @param[in] CapsuleName The name of the capsule image.\r
215\r
216 @retval EFI_SUCCESS The capsule information is dumped.\r
217 @retval EFI_UNSUPPORTED Input parameter is not valid.\r
218**/\r
219EFI_STATUS\r
220DumpCapsule (\r
221 IN CHAR16 *CapsuleName\r
222 )\r
223{\r
224 VOID *Buffer;\r
225 UINTN FileSize;\r
226 EFI_CAPSULE_HEADER *CapsuleHeader;\r
227 EFI_STATUS Status;\r
228\r
229 Status = ReadFileToBuffer(CapsuleName, &FileSize, &Buffer);\r
230 if (EFI_ERROR(Status)) {\r
231 Print(L"CapsuleApp: Capsule (%s) is not found.\n", CapsuleName);\r
232 goto Done;\r
233 }\r
234\r
235 CapsuleHeader = Buffer;\r
236 if (CompareGuid(&CapsuleHeader->CapsuleGuid, &gWindowsUxCapsuleGuid)) {\r
237 DumpUxCapsule(CapsuleHeader);\r
238 Status = EFI_SUCCESS;\r
239 goto Done;\r
240 }\r
241\r
242 if (CompareGuid(&CapsuleHeader->CapsuleGuid, &gEfiFmpCapsuleGuid)) {\r
243 DumpFmpCapsule(CapsuleHeader);\r
244 }\r
245 if (IsNestedFmpCapsule(CapsuleHeader)) {\r
246 Print(L"[NestedCapusule]\n");\r
247 Print(L"CapsuleHeader:\n");\r
248 Print(L" CapsuleGuid - %g\n", &CapsuleHeader->CapsuleGuid);\r
249 Print(L" HeaderSize - 0x%x\n", CapsuleHeader->HeaderSize);\r
250 Print(L" Flags - 0x%x\n", CapsuleHeader->Flags);\r
251 Print(L" CapsuleImageSize - 0x%x\n", CapsuleHeader->CapsuleImageSize);\r
252 DumpFmpCapsule((EFI_CAPSULE_HEADER *)((UINTN)CapsuleHeader + CapsuleHeader->HeaderSize));\r
253 }\r
254\r
255Done:\r
256 FreePool(Buffer);\r
257 return Status;\r
258}\r
259\r
260/**\r
261 Dump capsule status variable.\r
262\r
263 @retval EFI_SUCCESS The capsule status variable is dumped.\r
264 @retval EFI_UNSUPPORTED Input parameter is not valid.\r
265**/\r
266EFI_STATUS\r
267DmpCapsuleStatusVariable (\r
268 VOID\r
269 )\r
270{\r
271 EFI_STATUS Status;\r
272 UINT32 Index;\r
273 CHAR16 CapsuleVarName[20];\r
274 CHAR16 *TempVarName;\r
275 EFI_CAPSULE_RESULT_VARIABLE_HEADER *CapsuleResult;\r
276 EFI_CAPSULE_RESULT_VARIABLE_FMP *CapsuleResultFmp;\r
277 UINTN CapsuleFileNameSize;\r
278 CHAR16 CapsuleIndexData[12];\r
279 CHAR16 *CapsuleIndex;\r
280\r
281 Status = GetVariable2(\r
282 L"CapsuleMax",\r
283 &gEfiCapsuleReportGuid,\r
284 (VOID **)&CapsuleIndex,\r
285 NULL\r
286 );\r
287 if (!EFI_ERROR(Status)) {\r
a522ad7c 288 ASSERT (CapsuleIndex != NULL);\r
592bad04
JY
289 CopyMem(CapsuleIndexData, CapsuleIndex, 11 * sizeof(CHAR16));\r
290 CapsuleIndexData[11] = 0;\r
291 Print(L"CapsuleMax - %s\n", CapsuleIndexData);\r
292 FreePool(CapsuleIndex);\r
293 }\r
294 Status = GetVariable2(\r
295 L"CapsuleLast",\r
296 &gEfiCapsuleReportGuid,\r
297 (VOID **)&CapsuleIndex,\r
298 NULL\r
299 );\r
300 if (!EFI_ERROR(Status)) {\r
a522ad7c 301 ASSERT (CapsuleIndex != NULL);\r
592bad04
JY
302 CopyMem(CapsuleIndexData, CapsuleIndex, 11 * sizeof(CHAR16));\r
303 CapsuleIndexData[11] = 0;\r
304 Print(L"CapsuleLast - %s\n", CapsuleIndexData);\r
305 FreePool(CapsuleIndex);\r
306 }\r
307\r
308\r
309 StrCpyS (CapsuleVarName, sizeof(CapsuleVarName)/sizeof(CapsuleVarName[0]), L"Capsule");\r
310 TempVarName = CapsuleVarName + StrLen (CapsuleVarName);\r
311 Index = 0;\r
312\r
313 while (TRUE) {\r
314 UnicodeSPrint (TempVarName, 5 * sizeof(CHAR16), L"%04x", Index);\r
315\r
316 Status = GetVariable2 (\r
317 CapsuleVarName,\r
318 &gEfiCapsuleReportGuid,\r
319 (VOID **) &CapsuleResult,\r
320 NULL\r
321 );\r
322 if (Status == EFI_NOT_FOUND) {\r
323 break;\r
324 } else if (EFI_ERROR(Status)) {\r
325 continue;\r
326 }\r
327 ASSERT (CapsuleResult != NULL);\r
328\r
329 //\r
330 // display capsule process status\r
331 //\r
332 if (CapsuleResult->VariableTotalSize >= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER)) {\r
333 Print (L"CapsuleName: %s\n", CapsuleVarName);\r
334 Print (L" Capsule Guid: %g\n", &CapsuleResult->CapsuleGuid);\r
335 Print (L" Capsule ProcessedTime: %t\n", &CapsuleResult->CapsuleProcessed);\r
336 Print (L" Capsule Status: %r\n", CapsuleResult->CapsuleStatus);\r
337 }\r
338\r
339 if (CompareGuid(&CapsuleResult->CapsuleGuid, &gEfiFmpCapsuleGuid)) {\r
340 if (CapsuleResult->VariableTotalSize >= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP)) {\r
341 CapsuleResultFmp = (EFI_CAPSULE_RESULT_VARIABLE_FMP *)(CapsuleResult + 1);\r
342 Print(L" Capsule FMP Version: 0x%x\n", CapsuleResultFmp->Version);\r
343 Print(L" Capsule FMP PayloadIndex: 0x%x\n", CapsuleResultFmp->PayloadIndex);\r
344 Print(L" Capsule FMP UpdateImageIndex: 0x%x\n", CapsuleResultFmp->UpdateImageIndex);\r
345 Print(L" Capsule FMP UpdateImageTypeId: %g\n", &CapsuleResultFmp->UpdateImageTypeId);\r
346 if (CapsuleResult->VariableTotalSize > sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP)) {\r
347 Print(L" Capsule FMP CapsuleFileName: %s\n", (CapsuleResultFmp + 1));\r
348 CapsuleFileNameSize = StrSize((CHAR16 *)(CapsuleResultFmp + 1));\r
349 if (CapsuleResult->VariableTotalSize > sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP) + CapsuleFileNameSize) {\r
350 Print(L" Capsule FMP CapsuleTarget: %s\n", (UINT8 *)(CapsuleResultFmp + 1) + CapsuleFileNameSize);\r
351 }\r
352 }\r
353 }\r
354 }\r
355\r
356 FreePool(CapsuleResult);\r
357\r
358 Index++;\r
359 if (Index > 0xFFFF) {\r
360 break;\r
361 }\r
362 }\r
363\r
364 return EFI_SUCCESS;\r
365}\r
366\r
367CHAR8 *mFwTypeString[] = {\r
368 "Unknown",\r
369 "SystemFirmware",\r
370 "DeviceFirmware",\r
371 "UefiDriver",\r
372};\r
373\r
374CHAR8 *mLastAttemptStatusString[] = {\r
375 "Success",\r
376 "Error: Unsuccessful",\r
377 "Error: Insufficient Resources",\r
378 "Error: Incorrect Version",\r
379 "Error: Invalid Format",\r
380 "Error: Auth Error",\r
381 "Error: Power Event AC",\r
382 "Error: Power Event Battery",\r
383};\r
384\r
385/**\r
386 Convert FwType to a string.\r
387\r
388 @param[in] FwType FwType in ESRT\r
389\r
390 @return a string for FwType.\r
391**/\r
392CHAR8 *\r
393FwTypeToString (\r
394 IN UINT32 FwType\r
395 )\r
396{\r
397 if (FwType < sizeof(mFwTypeString) / sizeof(mFwTypeString[0])) {\r
398 return mFwTypeString[FwType];\r
399 } else {\r
400 return "Invalid";\r
401 }\r
402}\r
403\r
404/**\r
405 Convert LastAttemptStatus to a string.\r
406\r
407 @param[in] LastAttemptStatus LastAttemptStatus in FMP or ESRT\r
408\r
409 @return a string for LastAttemptStatus.\r
410**/\r
411CHAR8 *\r
412LastAttemptStatusToString (\r
413 IN UINT32 LastAttemptStatus\r
414 )\r
415{\r
416 if (LastAttemptStatus < sizeof(mLastAttemptStatusString) / sizeof(mLastAttemptStatusString[0])) {\r
417 return mLastAttemptStatusString[LastAttemptStatus];\r
418 } else {\r
419 return "Error: Unknown";\r
420 }\r
421}\r
422\r
423/**\r
424 Dump ESRT entry.\r
425\r
426 @param[in] EsrtEntry ESRT entry\r
427**/\r
428VOID\r
429DumpEsrtEntry (\r
430 IN EFI_SYSTEM_RESOURCE_ENTRY *EsrtEntry\r
431 )\r
432{\r
433 Print(L" FwClass - %g\n", &EsrtEntry->FwClass);\r
434 Print(L" FwType - 0x%x (%a)\n", EsrtEntry->FwType, FwTypeToString(EsrtEntry->FwType));\r
435 Print(L" FwVersion - 0x%x\n", EsrtEntry->FwVersion);\r
436 Print(L" LowestSupportedFwVersion - 0x%x\n", EsrtEntry->LowestSupportedFwVersion);\r
437 Print(L" CapsuleFlags - 0x%x\n", EsrtEntry->CapsuleFlags);\r
438 Print(L" PERSIST_ACROSS_RESET - 0x%x\n", EsrtEntry->CapsuleFlags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET);\r
439 Print(L" POPULATE_SYSTEM_TABLE - 0x%x\n", EsrtEntry->CapsuleFlags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE);\r
440 Print(L" INITIATE_RESET - 0x%x\n", EsrtEntry->CapsuleFlags & CAPSULE_FLAGS_INITIATE_RESET);\r
441 Print(L" LastAttemptVersion - 0x%x\n", EsrtEntry->LastAttemptVersion);\r
442 Print(L" LastAttemptStatus - 0x%x (%a)\n", EsrtEntry->LastAttemptStatus, LastAttemptStatusToString(EsrtEntry->LastAttemptStatus));\r
443}\r
444\r
445/**\r
446 Dump ESRT table.\r
447\r
448 @param[in] Esrt ESRT table\r
449**/\r
450VOID\r
451DumpEsrt (\r
452 IN EFI_SYSTEM_RESOURCE_TABLE *Esrt\r
453 )\r
454{\r
455 UINTN Index;\r
456 EFI_SYSTEM_RESOURCE_ENTRY *EsrtEntry;\r
457\r
458 if (Esrt == NULL) {\r
459 return ;\r
460 }\r
461\r
462 Print(L"EFI_SYSTEM_RESOURCE_TABLE:\n");\r
463 Print(L"FwResourceCount - 0x%x\n", Esrt->FwResourceCount);\r
464 Print(L"FwResourceCountMax - 0x%x\n", Esrt->FwResourceCountMax);\r
465 Print(L"FwResourceVersion - 0x%lx\n", Esrt->FwResourceVersion);\r
466\r
467 EsrtEntry = (VOID *)(Esrt + 1);\r
468 for (Index = 0; Index < Esrt->FwResourceCount; Index++) {\r
469 Print(L"EFI_SYSTEM_RESOURCE_ENTRY (%d):\n", Index);\r
470 DumpEsrtEntry(EsrtEntry);\r
471 EsrtEntry++;\r
472 }\r
473}\r
474\r
475/**\r
476 Dump ESRT info.\r
477**/\r
478VOID\r
479DumpEsrtData (\r
480 VOID\r
481 )\r
482{\r
483 EFI_STATUS Status;\r
484 EFI_SYSTEM_RESOURCE_TABLE *Esrt;\r
485\r
486 Print(L"##############\n");\r
487 Print(L"# ESRT TABLE #\n");\r
488 Print(L"##############\n");\r
489\r
490 Status = EfiGetSystemConfigurationTable (&gEfiSystemResourceTableGuid, (VOID **)&Esrt);\r
491 if (EFI_ERROR(Status)) {\r
492 Print(L"ESRT - %r\n", Status);\r
493 return;\r
494 }\r
495 DumpEsrt(Esrt);\r
496 Print(L"\n");\r
497}\r
498\r
499/**\r
500 Dump FMP information.\r
501\r
502 @param[in] ImageInfoSize The size of ImageInfo, in bytes.\r
503 @param[in] ImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
504 @param[in] DescriptorVersion The version of EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
505 @param[in] DescriptorCount The count of EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
506 @param[in] DescriptorSize The size of an individual EFI_FIRMWARE_IMAGE_DESCRIPTOR, in bytes.\r
507 @param[in] PackageVersion The version of package.\r
508 @param[in] PackageVersionName The version name of package.\r
509**/\r
510VOID\r
511DumpFmpImageInfo (\r
512 IN UINTN ImageInfoSize,\r
513 IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *ImageInfo,\r
514 IN UINT32 DescriptorVersion,\r
515 IN UINT8 DescriptorCount,\r
516 IN UINTN DescriptorSize,\r
517 IN UINT32 PackageVersion,\r
518 IN CHAR16 *PackageVersionName\r
519 )\r
520{\r
521 EFI_FIRMWARE_IMAGE_DESCRIPTOR *CurrentImageInfo;\r
522 UINTN Index;\r
523\r
524 Print(L" DescriptorVersion - 0x%x\n", DescriptorVersion);\r
525 Print(L" DescriptorCount - 0x%x\n", DescriptorCount);\r
526 Print(L" DescriptorSize - 0x%x\n", DescriptorSize);\r
527 Print(L" PackageVersion - 0x%x\n", PackageVersion);\r
528 Print(L" PackageVersionName - \"%s\"\n", PackageVersionName);\r
529 CurrentImageInfo = ImageInfo;\r
530 for (Index = 0; Index < DescriptorCount; Index++) {\r
531 Print(L" ImageDescriptor (%d)\n", Index);\r
532 Print(L" ImageIndex - 0x%x\n", CurrentImageInfo->ImageIndex);\r
533 Print(L" ImageTypeId - %g\n", &CurrentImageInfo->ImageTypeId);\r
534 Print(L" ImageId - 0x%lx\n", CurrentImageInfo->ImageId);\r
535 Print(L" ImageIdName - \"%s\"\n", CurrentImageInfo->ImageIdName);\r
536 Print(L" Version - 0x%x\n", CurrentImageInfo->Version);\r
537 Print(L" VersionName - \"%s\"\n", CurrentImageInfo->VersionName);\r
538 Print(L" Size - 0x%x\n", CurrentImageInfo->Size);\r
539 Print(L" AttributesSupported - 0x%lx\n", CurrentImageInfo->AttributesSupported);\r
540 Print(L" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
541 Print(L" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
542 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
543 Print(L" IN_USE - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_IN_USE);\r
544 Print(L" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_UEFI_IMAGE);\r
545 Print(L" AttributesSetting - 0x%lx\n", CurrentImageInfo->AttributesSetting);\r
546 Print(L" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
547 Print(L" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
548 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
549 Print(L" IN_USE - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_IN_USE);\r
550 Print(L" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_UEFI_IMAGE);\r
551 Print(L" Compatibilities - 0x%lx\n", CurrentImageInfo->Compatibilities);\r
552 Print(L" COMPATIB_CHECK_SUPPORTED - 0x%lx\n", CurrentImageInfo->Compatibilities & IMAGE_COMPATIBILITY_CHECK_SUPPORTED);\r
553 if (DescriptorVersion > 1) {\r
554 Print(L" LowestSupportedImageVersion - 0x%x\n", CurrentImageInfo->LowestSupportedImageVersion);\r
555 if (DescriptorVersion > 2) {\r
556 Print(L" LastAttemptVersion - 0x%x\n", CurrentImageInfo->LastAttemptVersion);\r
557 Print(L" LastAttemptStatus - 0x%x (%a)\n", CurrentImageInfo->LastAttemptStatus, LastAttemptStatusToString(CurrentImageInfo->LastAttemptStatus));\r
558 Print(L" HardwareInstance - 0x%lx\n", CurrentImageInfo->HardwareInstance);\r
559 }\r
560 }\r
561 //\r
562 // Use DescriptorSize to move ImageInfo Pointer to stay compatible with different ImageInfo version\r
563 //\r
564 CurrentImageInfo = (EFI_FIRMWARE_IMAGE_DESCRIPTOR *)((UINT8 *)CurrentImageInfo + DescriptorSize);\r
565 }\r
566}\r
567\r
568/**\r
569 Dump FMP package information.\r
570\r
571 @param[in] PackageVersion The version of package.\r
572 @param[in] PackageVersionName The version name of package.\r
573 @param[in] PackageVersionNameMaxLen The maximum length of PackageVersionName.\r
574 @param[in] AttributesSupported Package attributes that are supported by this device.\r
575 @param[in] AttributesSetting Package attributes.\r
576**/\r
577VOID\r
578DumpFmpPackageInfo (\r
579 IN UINT32 PackageVersion,\r
580 IN CHAR16 *PackageVersionName,\r
581 IN UINT32 PackageVersionNameMaxLen,\r
582 IN UINT64 AttributesSupported,\r
583 IN UINT64 AttributesSetting\r
584 )\r
585{\r
586 Print(L" PackageVersion - 0x%x\n", PackageVersion);\r
587 Print(L" PackageVersionName - \"%s\"\n", PackageVersionName);\r
588 Print(L" PackageVersionNameMaxLen - 0x%x\n", PackageVersionNameMaxLen);\r
589 Print(L" AttributesSupported - 0x%lx\n", AttributesSupported);\r
590 Print(L" IMAGE_UPDATABLE - 0x%lx\n", AttributesSupported & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
591 Print(L" RESET_REQUIRED - 0x%lx\n", AttributesSupported & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
592 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSupported & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
593 Print(L" AttributesSetting - 0x%lx\n", AttributesSetting);\r
594 Print(L" IMAGE_UPDATABLE - 0x%lx\n", AttributesSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
595 Print(L" RESET_REQUIRED - 0x%lx\n", AttributesSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
596 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
597}\r
598\r
599/**\r
600 Dump FMP protocol info.\r
601**/\r
602VOID\r
603DumpFmpData (\r
604 VOID\r
605 )\r
606{\r
607 EFI_STATUS Status;\r
608 EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
609 EFI_HANDLE *HandleBuffer;\r
610 UINTN NumberOfHandles;\r
611 UINTN Index;\r
612 EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf;\r
613 UINTN ImageInfoSize;\r
614 UINT32 FmpImageInfoDescriptorVer;\r
615 UINT8 FmpImageInfoCount;\r
616 UINTN DescriptorSize;\r
617 UINT32 PackageVersion;\r
618 CHAR16 *PackageVersionName;\r
619 UINT32 PackageVersionNameMaxLen;\r
620 UINT64 AttributesSupported;\r
621 UINT64 AttributesSetting;\r
622\r
623 Print(L"############\n");\r
624 Print(L"# FMP DATA #\n");\r
625 Print(L"############\n");\r
626 Status = gBS->LocateHandleBuffer (\r
627 ByProtocol,\r
628 &gEfiFirmwareManagementProtocolGuid,\r
629 NULL,\r
630 &NumberOfHandles,\r
631 &HandleBuffer\r
632 );\r
633 if (EFI_ERROR(Status)) {\r
634 Print(L"FMP protocol - %r\n", EFI_NOT_FOUND);\r
635 return;\r
636 }\r
637\r
638 for (Index = 0; Index < NumberOfHandles; Index++) {\r
639 Status = gBS->HandleProtocol(\r
640 HandleBuffer[Index],\r
641 &gEfiFirmwareManagementProtocolGuid,\r
642 (VOID **)&Fmp\r
643 );\r
644 if (EFI_ERROR(Status)) {\r
645 continue;\r
646 }\r
647\r
648 ImageInfoSize = 0;\r
649 Status = Fmp->GetImageInfo (\r
650 Fmp,\r
651 &ImageInfoSize,\r
652 NULL,\r
653 NULL,\r
654 NULL,\r
655 NULL,\r
656 NULL,\r
657 NULL\r
658 );\r
659 if (Status != EFI_BUFFER_TOO_SMALL) {\r
660 continue;\r
661 }\r
662\r
663 FmpImageInfoBuf = NULL;\r
664 FmpImageInfoBuf = AllocateZeroPool (ImageInfoSize);\r
665 if (FmpImageInfoBuf == NULL) {\r
666 Status = EFI_OUT_OF_RESOURCES;\r
667 goto EXIT;\r
668 }\r
669\r
670 PackageVersionName = NULL;\r
671 Status = Fmp->GetImageInfo (\r
672 Fmp,\r
673 &ImageInfoSize, // ImageInfoSize\r
674 FmpImageInfoBuf, // ImageInfo\r
675 &FmpImageInfoDescriptorVer, // DescriptorVersion\r
676 &FmpImageInfoCount, // DescriptorCount\r
677 &DescriptorSize, // DescriptorSize\r
678 &PackageVersion, // PackageVersion\r
679 &PackageVersionName // PackageVersionName\r
680 );\r
681\r
682 //\r
683 // If FMP GetInformation interface failed, skip this resource\r
684 //\r
685 if (EFI_ERROR(Status)) {\r
686 Print(L"FMP (%d) ImageInfo - %r\n", Index, Status);\r
687 FreePool(FmpImageInfoBuf);\r
688 continue;\r
689 }\r
690\r
691 Print(L"FMP (%d) ImageInfo:\n", Index);\r
692 DumpFmpImageInfo(\r
693 ImageInfoSize, // ImageInfoSize\r
694 FmpImageInfoBuf, // ImageInfo\r
695 FmpImageInfoDescriptorVer, // DescriptorVersion\r
696 FmpImageInfoCount, // DescriptorCount\r
697 DescriptorSize, // DescriptorSize\r
698 PackageVersion, // PackageVersion\r
699 PackageVersionName // PackageVersionName\r
700 );\r
701\r
702 if (PackageVersionName != NULL) {\r
703 FreePool(PackageVersionName);\r
704 }\r
705 FreePool(FmpImageInfoBuf);\r
706\r
707 //\r
708 // Get package info\r
709 //\r
710 PackageVersionName = NULL;\r
711 Status = Fmp->GetPackageInfo (\r
712 Fmp,\r
713 &PackageVersion, // PackageVersion\r
714 &PackageVersionName, // PackageVersionName\r
715 &PackageVersionNameMaxLen, // PackageVersionNameMaxLen\r
716 &AttributesSupported, // AttributesSupported\r
717 &AttributesSetting // AttributesSetting\r
718 );\r
719 if (EFI_ERROR(Status)) {\r
720 Print(L"FMP (%d) PackageInfo - %r\n", Index, Status);\r
721 } else {\r
722 Print(L"FMP (%d) ImageInfo:\n", Index);\r
723 DumpFmpPackageInfo(\r
724 PackageVersion, // PackageVersion\r
725 PackageVersionName, // PackageVersionName\r
726 PackageVersionNameMaxLen, // PackageVersionNameMaxLen\r
727 AttributesSupported, // AttributesSupported\r
728 AttributesSetting // AttributesSetting\r
729 );\r
730\r
731 if (PackageVersionName != NULL) {\r
732 FreePool(PackageVersionName);\r
733 }\r
734 }\r
735 }\r
736 Print(L"\n");\r
737\r
738EXIT:\r
739 FreePool(HandleBuffer);\r
740}\r