]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Application/CapsuleApp/CapsuleDump.c
MdeModulePkg/CapsuleApp: Add CapsuleApp application.
[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
288 CopyMem(CapsuleIndexData, CapsuleIndex, 11 * sizeof(CHAR16));\r
289 CapsuleIndexData[11] = 0;\r
290 Print(L"CapsuleMax - %s\n", CapsuleIndexData);\r
291 FreePool(CapsuleIndex);\r
292 }\r
293 Status = GetVariable2(\r
294 L"CapsuleLast",\r
295 &gEfiCapsuleReportGuid,\r
296 (VOID **)&CapsuleIndex,\r
297 NULL\r
298 );\r
299 if (!EFI_ERROR(Status)) {\r
300 CopyMem(CapsuleIndexData, CapsuleIndex, 11 * sizeof(CHAR16));\r
301 CapsuleIndexData[11] = 0;\r
302 Print(L"CapsuleLast - %s\n", CapsuleIndexData);\r
303 FreePool(CapsuleIndex);\r
304 }\r
305\r
306\r
307 StrCpyS (CapsuleVarName, sizeof(CapsuleVarName)/sizeof(CapsuleVarName[0]), L"Capsule");\r
308 TempVarName = CapsuleVarName + StrLen (CapsuleVarName);\r
309 Index = 0;\r
310\r
311 while (TRUE) {\r
312 UnicodeSPrint (TempVarName, 5 * sizeof(CHAR16), L"%04x", Index);\r
313\r
314 Status = GetVariable2 (\r
315 CapsuleVarName,\r
316 &gEfiCapsuleReportGuid,\r
317 (VOID **) &CapsuleResult,\r
318 NULL\r
319 );\r
320 if (Status == EFI_NOT_FOUND) {\r
321 break;\r
322 } else if (EFI_ERROR(Status)) {\r
323 continue;\r
324 }\r
325 ASSERT (CapsuleResult != NULL);\r
326\r
327 //\r
328 // display capsule process status\r
329 //\r
330 if (CapsuleResult->VariableTotalSize >= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER)) {\r
331 Print (L"CapsuleName: %s\n", CapsuleVarName);\r
332 Print (L" Capsule Guid: %g\n", &CapsuleResult->CapsuleGuid);\r
333 Print (L" Capsule ProcessedTime: %t\n", &CapsuleResult->CapsuleProcessed);\r
334 Print (L" Capsule Status: %r\n", CapsuleResult->CapsuleStatus);\r
335 }\r
336\r
337 if (CompareGuid(&CapsuleResult->CapsuleGuid, &gEfiFmpCapsuleGuid)) {\r
338 if (CapsuleResult->VariableTotalSize >= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP)) {\r
339 CapsuleResultFmp = (EFI_CAPSULE_RESULT_VARIABLE_FMP *)(CapsuleResult + 1);\r
340 Print(L" Capsule FMP Version: 0x%x\n", CapsuleResultFmp->Version);\r
341 Print(L" Capsule FMP PayloadIndex: 0x%x\n", CapsuleResultFmp->PayloadIndex);\r
342 Print(L" Capsule FMP UpdateImageIndex: 0x%x\n", CapsuleResultFmp->UpdateImageIndex);\r
343 Print(L" Capsule FMP UpdateImageTypeId: %g\n", &CapsuleResultFmp->UpdateImageTypeId);\r
344 if (CapsuleResult->VariableTotalSize > sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP)) {\r
345 Print(L" Capsule FMP CapsuleFileName: %s\n", (CapsuleResultFmp + 1));\r
346 CapsuleFileNameSize = StrSize((CHAR16 *)(CapsuleResultFmp + 1));\r
347 if (CapsuleResult->VariableTotalSize > sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP) + CapsuleFileNameSize) {\r
348 Print(L" Capsule FMP CapsuleTarget: %s\n", (UINT8 *)(CapsuleResultFmp + 1) + CapsuleFileNameSize);\r
349 }\r
350 }\r
351 }\r
352 }\r
353\r
354 FreePool(CapsuleResult);\r
355\r
356 Index++;\r
357 if (Index > 0xFFFF) {\r
358 break;\r
359 }\r
360 }\r
361\r
362 return EFI_SUCCESS;\r
363}\r
364\r
365CHAR8 *mFwTypeString[] = {\r
366 "Unknown",\r
367 "SystemFirmware",\r
368 "DeviceFirmware",\r
369 "UefiDriver",\r
370};\r
371\r
372CHAR8 *mLastAttemptStatusString[] = {\r
373 "Success",\r
374 "Error: Unsuccessful",\r
375 "Error: Insufficient Resources",\r
376 "Error: Incorrect Version",\r
377 "Error: Invalid Format",\r
378 "Error: Auth Error",\r
379 "Error: Power Event AC",\r
380 "Error: Power Event Battery",\r
381};\r
382\r
383/**\r
384 Convert FwType to a string.\r
385\r
386 @param[in] FwType FwType in ESRT\r
387\r
388 @return a string for FwType.\r
389**/\r
390CHAR8 *\r
391FwTypeToString (\r
392 IN UINT32 FwType\r
393 )\r
394{\r
395 if (FwType < sizeof(mFwTypeString) / sizeof(mFwTypeString[0])) {\r
396 return mFwTypeString[FwType];\r
397 } else {\r
398 return "Invalid";\r
399 }\r
400}\r
401\r
402/**\r
403 Convert LastAttemptStatus to a string.\r
404\r
405 @param[in] LastAttemptStatus LastAttemptStatus in FMP or ESRT\r
406\r
407 @return a string for LastAttemptStatus.\r
408**/\r
409CHAR8 *\r
410LastAttemptStatusToString (\r
411 IN UINT32 LastAttemptStatus\r
412 )\r
413{\r
414 if (LastAttemptStatus < sizeof(mLastAttemptStatusString) / sizeof(mLastAttemptStatusString[0])) {\r
415 return mLastAttemptStatusString[LastAttemptStatus];\r
416 } else {\r
417 return "Error: Unknown";\r
418 }\r
419}\r
420\r
421/**\r
422 Dump ESRT entry.\r
423\r
424 @param[in] EsrtEntry ESRT entry\r
425**/\r
426VOID\r
427DumpEsrtEntry (\r
428 IN EFI_SYSTEM_RESOURCE_ENTRY *EsrtEntry\r
429 )\r
430{\r
431 Print(L" FwClass - %g\n", &EsrtEntry->FwClass);\r
432 Print(L" FwType - 0x%x (%a)\n", EsrtEntry->FwType, FwTypeToString(EsrtEntry->FwType));\r
433 Print(L" FwVersion - 0x%x\n", EsrtEntry->FwVersion);\r
434 Print(L" LowestSupportedFwVersion - 0x%x\n", EsrtEntry->LowestSupportedFwVersion);\r
435 Print(L" CapsuleFlags - 0x%x\n", EsrtEntry->CapsuleFlags);\r
436 Print(L" PERSIST_ACROSS_RESET - 0x%x\n", EsrtEntry->CapsuleFlags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET);\r
437 Print(L" POPULATE_SYSTEM_TABLE - 0x%x\n", EsrtEntry->CapsuleFlags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE);\r
438 Print(L" INITIATE_RESET - 0x%x\n", EsrtEntry->CapsuleFlags & CAPSULE_FLAGS_INITIATE_RESET);\r
439 Print(L" LastAttemptVersion - 0x%x\n", EsrtEntry->LastAttemptVersion);\r
440 Print(L" LastAttemptStatus - 0x%x (%a)\n", EsrtEntry->LastAttemptStatus, LastAttemptStatusToString(EsrtEntry->LastAttemptStatus));\r
441}\r
442\r
443/**\r
444 Dump ESRT table.\r
445\r
446 @param[in] Esrt ESRT table\r
447**/\r
448VOID\r
449DumpEsrt (\r
450 IN EFI_SYSTEM_RESOURCE_TABLE *Esrt\r
451 )\r
452{\r
453 UINTN Index;\r
454 EFI_SYSTEM_RESOURCE_ENTRY *EsrtEntry;\r
455\r
456 if (Esrt == NULL) {\r
457 return ;\r
458 }\r
459\r
460 Print(L"EFI_SYSTEM_RESOURCE_TABLE:\n");\r
461 Print(L"FwResourceCount - 0x%x\n", Esrt->FwResourceCount);\r
462 Print(L"FwResourceCountMax - 0x%x\n", Esrt->FwResourceCountMax);\r
463 Print(L"FwResourceVersion - 0x%lx\n", Esrt->FwResourceVersion);\r
464\r
465 EsrtEntry = (VOID *)(Esrt + 1);\r
466 for (Index = 0; Index < Esrt->FwResourceCount; Index++) {\r
467 Print(L"EFI_SYSTEM_RESOURCE_ENTRY (%d):\n", Index);\r
468 DumpEsrtEntry(EsrtEntry);\r
469 EsrtEntry++;\r
470 }\r
471}\r
472\r
473/**\r
474 Dump ESRT info.\r
475**/\r
476VOID\r
477DumpEsrtData (\r
478 VOID\r
479 )\r
480{\r
481 EFI_STATUS Status;\r
482 EFI_SYSTEM_RESOURCE_TABLE *Esrt;\r
483\r
484 Print(L"##############\n");\r
485 Print(L"# ESRT TABLE #\n");\r
486 Print(L"##############\n");\r
487\r
488 Status = EfiGetSystemConfigurationTable (&gEfiSystemResourceTableGuid, (VOID **)&Esrt);\r
489 if (EFI_ERROR(Status)) {\r
490 Print(L"ESRT - %r\n", Status);\r
491 return;\r
492 }\r
493 DumpEsrt(Esrt);\r
494 Print(L"\n");\r
495}\r
496\r
497/**\r
498 Dump FMP information.\r
499\r
500 @param[in] ImageInfoSize The size of ImageInfo, in bytes.\r
501 @param[in] ImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
502 @param[in] DescriptorVersion The version of EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
503 @param[in] DescriptorCount The count of EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
504 @param[in] DescriptorSize The size of an individual EFI_FIRMWARE_IMAGE_DESCRIPTOR, in bytes.\r
505 @param[in] PackageVersion The version of package.\r
506 @param[in] PackageVersionName The version name of package.\r
507**/\r
508VOID\r
509DumpFmpImageInfo (\r
510 IN UINTN ImageInfoSize,\r
511 IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *ImageInfo,\r
512 IN UINT32 DescriptorVersion,\r
513 IN UINT8 DescriptorCount,\r
514 IN UINTN DescriptorSize,\r
515 IN UINT32 PackageVersion,\r
516 IN CHAR16 *PackageVersionName\r
517 )\r
518{\r
519 EFI_FIRMWARE_IMAGE_DESCRIPTOR *CurrentImageInfo;\r
520 UINTN Index;\r
521\r
522 Print(L" DescriptorVersion - 0x%x\n", DescriptorVersion);\r
523 Print(L" DescriptorCount - 0x%x\n", DescriptorCount);\r
524 Print(L" DescriptorSize - 0x%x\n", DescriptorSize);\r
525 Print(L" PackageVersion - 0x%x\n", PackageVersion);\r
526 Print(L" PackageVersionName - \"%s\"\n", PackageVersionName);\r
527 CurrentImageInfo = ImageInfo;\r
528 for (Index = 0; Index < DescriptorCount; Index++) {\r
529 Print(L" ImageDescriptor (%d)\n", Index);\r
530 Print(L" ImageIndex - 0x%x\n", CurrentImageInfo->ImageIndex);\r
531 Print(L" ImageTypeId - %g\n", &CurrentImageInfo->ImageTypeId);\r
532 Print(L" ImageId - 0x%lx\n", CurrentImageInfo->ImageId);\r
533 Print(L" ImageIdName - \"%s\"\n", CurrentImageInfo->ImageIdName);\r
534 Print(L" Version - 0x%x\n", CurrentImageInfo->Version);\r
535 Print(L" VersionName - \"%s\"\n", CurrentImageInfo->VersionName);\r
536 Print(L" Size - 0x%x\n", CurrentImageInfo->Size);\r
537 Print(L" AttributesSupported - 0x%lx\n", CurrentImageInfo->AttributesSupported);\r
538 Print(L" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
539 Print(L" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
540 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
541 Print(L" IN_USE - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_IN_USE);\r
542 Print(L" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_UEFI_IMAGE);\r
543 Print(L" AttributesSetting - 0x%lx\n", CurrentImageInfo->AttributesSetting);\r
544 Print(L" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
545 Print(L" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
546 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
547 Print(L" IN_USE - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_IN_USE);\r
548 Print(L" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_UEFI_IMAGE);\r
549 Print(L" Compatibilities - 0x%lx\n", CurrentImageInfo->Compatibilities);\r
550 Print(L" COMPATIB_CHECK_SUPPORTED - 0x%lx\n", CurrentImageInfo->Compatibilities & IMAGE_COMPATIBILITY_CHECK_SUPPORTED);\r
551 if (DescriptorVersion > 1) {\r
552 Print(L" LowestSupportedImageVersion - 0x%x\n", CurrentImageInfo->LowestSupportedImageVersion);\r
553 if (DescriptorVersion > 2) {\r
554 Print(L" LastAttemptVersion - 0x%x\n", CurrentImageInfo->LastAttemptVersion);\r
555 Print(L" LastAttemptStatus - 0x%x (%a)\n", CurrentImageInfo->LastAttemptStatus, LastAttemptStatusToString(CurrentImageInfo->LastAttemptStatus));\r
556 Print(L" HardwareInstance - 0x%lx\n", CurrentImageInfo->HardwareInstance);\r
557 }\r
558 }\r
559 //\r
560 // Use DescriptorSize to move ImageInfo Pointer to stay compatible with different ImageInfo version\r
561 //\r
562 CurrentImageInfo = (EFI_FIRMWARE_IMAGE_DESCRIPTOR *)((UINT8 *)CurrentImageInfo + DescriptorSize);\r
563 }\r
564}\r
565\r
566/**\r
567 Dump FMP package information.\r
568\r
569 @param[in] PackageVersion The version of package.\r
570 @param[in] PackageVersionName The version name of package.\r
571 @param[in] PackageVersionNameMaxLen The maximum length of PackageVersionName.\r
572 @param[in] AttributesSupported Package attributes that are supported by this device.\r
573 @param[in] AttributesSetting Package attributes.\r
574**/\r
575VOID\r
576DumpFmpPackageInfo (\r
577 IN UINT32 PackageVersion,\r
578 IN CHAR16 *PackageVersionName,\r
579 IN UINT32 PackageVersionNameMaxLen,\r
580 IN UINT64 AttributesSupported,\r
581 IN UINT64 AttributesSetting\r
582 )\r
583{\r
584 Print(L" PackageVersion - 0x%x\n", PackageVersion);\r
585 Print(L" PackageVersionName - \"%s\"\n", PackageVersionName);\r
586 Print(L" PackageVersionNameMaxLen - 0x%x\n", PackageVersionNameMaxLen);\r
587 Print(L" AttributesSupported - 0x%lx\n", AttributesSupported);\r
588 Print(L" IMAGE_UPDATABLE - 0x%lx\n", AttributesSupported & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
589 Print(L" RESET_REQUIRED - 0x%lx\n", AttributesSupported & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
590 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSupported & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
591 Print(L" AttributesSetting - 0x%lx\n", AttributesSetting);\r
592 Print(L" IMAGE_UPDATABLE - 0x%lx\n", AttributesSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
593 Print(L" RESET_REQUIRED - 0x%lx\n", AttributesSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
594 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
595}\r
596\r
597/**\r
598 Dump FMP protocol info.\r
599**/\r
600VOID\r
601DumpFmpData (\r
602 VOID\r
603 )\r
604{\r
605 EFI_STATUS Status;\r
606 EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
607 EFI_HANDLE *HandleBuffer;\r
608 UINTN NumberOfHandles;\r
609 UINTN Index;\r
610 EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf;\r
611 UINTN ImageInfoSize;\r
612 UINT32 FmpImageInfoDescriptorVer;\r
613 UINT8 FmpImageInfoCount;\r
614 UINTN DescriptorSize;\r
615 UINT32 PackageVersion;\r
616 CHAR16 *PackageVersionName;\r
617 UINT32 PackageVersionNameMaxLen;\r
618 UINT64 AttributesSupported;\r
619 UINT64 AttributesSetting;\r
620\r
621 Print(L"############\n");\r
622 Print(L"# FMP DATA #\n");\r
623 Print(L"############\n");\r
624 Status = gBS->LocateHandleBuffer (\r
625 ByProtocol,\r
626 &gEfiFirmwareManagementProtocolGuid,\r
627 NULL,\r
628 &NumberOfHandles,\r
629 &HandleBuffer\r
630 );\r
631 if (EFI_ERROR(Status)) {\r
632 Print(L"FMP protocol - %r\n", EFI_NOT_FOUND);\r
633 return;\r
634 }\r
635\r
636 for (Index = 0; Index < NumberOfHandles; Index++) {\r
637 Status = gBS->HandleProtocol(\r
638 HandleBuffer[Index],\r
639 &gEfiFirmwareManagementProtocolGuid,\r
640 (VOID **)&Fmp\r
641 );\r
642 if (EFI_ERROR(Status)) {\r
643 continue;\r
644 }\r
645\r
646 ImageInfoSize = 0;\r
647 Status = Fmp->GetImageInfo (\r
648 Fmp,\r
649 &ImageInfoSize,\r
650 NULL,\r
651 NULL,\r
652 NULL,\r
653 NULL,\r
654 NULL,\r
655 NULL\r
656 );\r
657 if (Status != EFI_BUFFER_TOO_SMALL) {\r
658 continue;\r
659 }\r
660\r
661 FmpImageInfoBuf = NULL;\r
662 FmpImageInfoBuf = AllocateZeroPool (ImageInfoSize);\r
663 if (FmpImageInfoBuf == NULL) {\r
664 Status = EFI_OUT_OF_RESOURCES;\r
665 goto EXIT;\r
666 }\r
667\r
668 PackageVersionName = NULL;\r
669 Status = Fmp->GetImageInfo (\r
670 Fmp,\r
671 &ImageInfoSize, // ImageInfoSize\r
672 FmpImageInfoBuf, // ImageInfo\r
673 &FmpImageInfoDescriptorVer, // DescriptorVersion\r
674 &FmpImageInfoCount, // DescriptorCount\r
675 &DescriptorSize, // DescriptorSize\r
676 &PackageVersion, // PackageVersion\r
677 &PackageVersionName // PackageVersionName\r
678 );\r
679\r
680 //\r
681 // If FMP GetInformation interface failed, skip this resource\r
682 //\r
683 if (EFI_ERROR(Status)) {\r
684 Print(L"FMP (%d) ImageInfo - %r\n", Index, Status);\r
685 FreePool(FmpImageInfoBuf);\r
686 continue;\r
687 }\r
688\r
689 Print(L"FMP (%d) ImageInfo:\n", Index);\r
690 DumpFmpImageInfo(\r
691 ImageInfoSize, // ImageInfoSize\r
692 FmpImageInfoBuf, // ImageInfo\r
693 FmpImageInfoDescriptorVer, // DescriptorVersion\r
694 FmpImageInfoCount, // DescriptorCount\r
695 DescriptorSize, // DescriptorSize\r
696 PackageVersion, // PackageVersion\r
697 PackageVersionName // PackageVersionName\r
698 );\r
699\r
700 if (PackageVersionName != NULL) {\r
701 FreePool(PackageVersionName);\r
702 }\r
703 FreePool(FmpImageInfoBuf);\r
704\r
705 //\r
706 // Get package info\r
707 //\r
708 PackageVersionName = NULL;\r
709 Status = Fmp->GetPackageInfo (\r
710 Fmp,\r
711 &PackageVersion, // PackageVersion\r
712 &PackageVersionName, // PackageVersionName\r
713 &PackageVersionNameMaxLen, // PackageVersionNameMaxLen\r
714 &AttributesSupported, // AttributesSupported\r
715 &AttributesSetting // AttributesSetting\r
716 );\r
717 if (EFI_ERROR(Status)) {\r
718 Print(L"FMP (%d) PackageInfo - %r\n", Index, Status);\r
719 } else {\r
720 Print(L"FMP (%d) ImageInfo:\n", Index);\r
721 DumpFmpPackageInfo(\r
722 PackageVersion, // PackageVersion\r
723 PackageVersionName, // PackageVersionName\r
724 PackageVersionNameMaxLen, // PackageVersionNameMaxLen\r
725 AttributesSupported, // AttributesSupported\r
726 AttributesSetting // AttributesSetting\r
727 );\r
728\r
729 if (PackageVersionName != NULL) {\r
730 FreePool(PackageVersionName);\r
731 }\r
732 }\r
733 }\r
734 Print(L"\n");\r
735\r
736EXIT:\r
737 FreePool(HandleBuffer);\r
738}\r