]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Application/CapsuleApp/CapsuleDump.c
UefiCpuPkg/Capsule: Fix coding style issues
[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
1e09ec09
JY
48/**\r
49 Write a file.\r
50\r
51 @param[in] FileName The file to be written.\r
52 @param[in] BufferSize The file buffer size\r
53 @param[in] Buffer The file buffer\r
54\r
55 @retval EFI_SUCCESS Write file successfully\r
56**/\r
57EFI_STATUS\r
58WriteFileFromBuffer (\r
59 IN CHAR16 *FileName,\r
60 IN UINTN BufferSize,\r
61 IN VOID *Buffer\r
62 );\r
63\r
592bad04
JY
64/**\r
65 Dump UX capsule information.\r
66\r
67 @param[in] CapsuleHeader The UX capsule header\r
68**/\r
69VOID\r
70DumpUxCapsule (\r
71 IN EFI_CAPSULE_HEADER *CapsuleHeader\r
72 )\r
73{\r
74 EFI_DISPLAY_CAPSULE *DisplayCapsule;\r
75 DisplayCapsule = (EFI_DISPLAY_CAPSULE *)CapsuleHeader;\r
76 Print(L"[UxCapusule]\n");\r
77 Print(L"CapsuleHeader:\n");\r
78 Print(L" CapsuleGuid - %g\n", &DisplayCapsule->CapsuleHeader.CapsuleGuid);\r
79 Print(L" HeaderSize - 0x%x\n", DisplayCapsule->CapsuleHeader.HeaderSize);\r
80 Print(L" Flags - 0x%x\n", DisplayCapsule->CapsuleHeader.Flags);\r
81 Print(L" CapsuleImageSize - 0x%x\n", DisplayCapsule->CapsuleHeader.CapsuleImageSize);\r
82 Print(L"ImagePayload:\n");\r
83 Print(L" Version - 0x%x\n", DisplayCapsule->ImagePayload.Version);\r
84 Print(L" Checksum - 0x%x\n", DisplayCapsule->ImagePayload.Checksum);\r
85 Print(L" ImageType - 0x%x\n", DisplayCapsule->ImagePayload.ImageType);\r
86 Print(L" Mode - 0x%x\n", DisplayCapsule->ImagePayload.Mode);\r
87 Print(L" OffsetX - 0x%x\n", DisplayCapsule->ImagePayload.OffsetX);\r
88 Print(L" OffsetY - 0x%x\n", DisplayCapsule->ImagePayload.OffsetY);\r
89}\r
90\r
91/**\r
92 Dump FMP image authentication information.\r
93\r
94 @param[in] Image The FMP capsule image\r
95 @param[in] ImageSize The size of the FMP capsule image in bytes.\r
96\r
97 @return the size of FMP authentication.\r
98**/\r
99UINTN\r
100DumpImageAuthentication (\r
101 IN VOID *Image,\r
102 IN UINTN ImageSize\r
103 )\r
104{\r
105 EFI_FIRMWARE_IMAGE_AUTHENTICATION *ImageAuthentication;\r
106\r
107 ImageAuthentication = Image;\r
108 if (CompareGuid(&ImageAuthentication->AuthInfo.CertType, &gEfiCertPkcs7Guid) ||\r
109 CompareGuid(&ImageAuthentication->AuthInfo.CertType, &gEfiCertTypeRsa2048Sha256Guid)) {\r
110 Print(L"[ImageAuthentication]\n");\r
111 Print(L" MonotonicCount - 0x%lx\n", ImageAuthentication->MonotonicCount);\r
112 Print(L"WIN_CERTIFICATE:\n");\r
113 Print(L" dwLength - 0x%x\n", ImageAuthentication->AuthInfo.Hdr.dwLength);\r
114 Print(L" wRevision - 0x%x\n", ImageAuthentication->AuthInfo.Hdr.wRevision);\r
115 Print(L" wCertificateType - 0x%x\n", ImageAuthentication->AuthInfo.Hdr.wCertificateType);\r
116 Print(L" CertType - %g\n", &ImageAuthentication->AuthInfo.CertType);\r
117 return sizeof(ImageAuthentication->MonotonicCount) + ImageAuthentication->AuthInfo.Hdr.dwLength;\r
118 } else {\r
119 return 0;\r
120 }\r
121}\r
122\r
123/**\r
124 Dump a non-nested FMP capsule.\r
125\r
126 @param[in] CapsuleHeader A pointer to CapsuleHeader\r
127**/\r
128VOID\r
129DumpFmpCapsule (\r
130 IN EFI_CAPSULE_HEADER *CapsuleHeader\r
131 )\r
132{\r
133 EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader;\r
134 UINT64 *ItemOffsetList;\r
135 UINTN Index;\r
136 UINTN Count;\r
137 EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *FmpImageHeader;\r
138\r
139 Print(L"[FmpCapusule]\n");\r
140 Print(L"CapsuleHeader:\n");\r
141 Print(L" CapsuleGuid - %g\n", &CapsuleHeader->CapsuleGuid);\r
142 Print(L" HeaderSize - 0x%x\n", CapsuleHeader->HeaderSize);\r
143 Print(L" Flags - 0x%x\n", CapsuleHeader->Flags);\r
144 Print(L" CapsuleImageSize - 0x%x\n", CapsuleHeader->CapsuleImageSize);\r
145\r
146 FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);\r
147 ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);\r
148 Print(L"FmpHeader:\n");\r
149 Print(L" Version - 0x%x\n", FmpCapsuleHeader->Version);\r
150 Print(L" EmbeddedDriverCount - 0x%x\n", FmpCapsuleHeader->EmbeddedDriverCount);\r
151 Print(L" PayloadItemCount - 0x%x\n", FmpCapsuleHeader->PayloadItemCount);\r
152 Count = FmpCapsuleHeader->EmbeddedDriverCount + FmpCapsuleHeader->PayloadItemCount;\r
153 for (Index = 0; Index < Count; Index++) {\r
154 Print(L" Offset[%d] - 0x%x\n", Index, ItemOffsetList[Index]);\r
155 }\r
156\r
157 for (Index = FmpCapsuleHeader->EmbeddedDriverCount; Index < Count; Index++) {\r
158 Print(L"FmpPayload[%d] ImageHeader:\n", Index);\r
159 FmpImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[Index]);\r
160 Print(L" Version - 0x%x\n", FmpImageHeader->Version);\r
161 Print(L" UpdateImageTypeId - %g\n", &FmpImageHeader->UpdateImageTypeId);\r
162 Print(L" UpdateImageIndex - 0x%x\n", FmpImageHeader->UpdateImageIndex);\r
163 Print(L" UpdateImageSize - 0x%x\n", FmpImageHeader->UpdateImageSize);\r
164 Print(L" UpdateVendorCodeSize - 0x%x\n", FmpImageHeader->UpdateVendorCodeSize);\r
165 if (FmpImageHeader->Version >= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) {\r
166 Print(L" UpdateHardwareInstance - 0x%lx\n", FmpImageHeader->UpdateHardwareInstance);\r
167 }\r
168 }\r
169}\r
170\r
171/**\r
172 Return if there is a FMP header below capsule header.\r
173\r
174 @param[in] CapsuleHeader A pointer to EFI_CAPSULE_HEADER\r
175\r
176 @retval TRUE There is a FMP header below capsule header.\r
177 @retval FALSE There is not a FMP header below capsule header\r
178**/\r
179BOOLEAN\r
180IsNestedFmpCapsule (\r
181 IN EFI_CAPSULE_HEADER *CapsuleHeader\r
182 )\r
183{\r
184 EFI_STATUS Status;\r
185 EFI_SYSTEM_RESOURCE_TABLE *Esrt;\r
186 EFI_SYSTEM_RESOURCE_ENTRY *EsrtEntry;\r
187 UINTN Index;\r
188 BOOLEAN EsrtGuidFound;\r
189 EFI_CAPSULE_HEADER *NestedCapsuleHeader;\r
190 UINTN NestedCapsuleSize;\r
191\r
192 //\r
193 // Check ESRT\r
194 //\r
195 EsrtGuidFound = FALSE;\r
196 Status = EfiGetSystemConfigurationTable(&gEfiSystemResourceTableGuid, (VOID **)&Esrt);\r
197 if (!EFI_ERROR(Status)) {\r
198 ASSERT (Esrt != NULL);\r
199 EsrtEntry = (VOID *)(Esrt + 1);\r
200 for (Index = 0; Index < Esrt->FwResourceCount; Index++, EsrtEntry++) {\r
201 if (CompareGuid(&EsrtEntry->FwClass, &CapsuleHeader->CapsuleGuid)) {\r
202 EsrtGuidFound = TRUE;\r
203 break;\r
204 }\r
205 }\r
206 }\r
207\r
208 if (!EsrtGuidFound) {\r
209 return FALSE;\r
210 }\r
211\r
212 //\r
213 // Check nested capsule header\r
214 // FMP GUID after ESRT one\r
215 //\r
216 NestedCapsuleHeader = (EFI_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);\r
217 NestedCapsuleSize = (UINTN)CapsuleHeader + CapsuleHeader->HeaderSize - (UINTN)NestedCapsuleHeader;\r
218 if (NestedCapsuleSize < sizeof(EFI_CAPSULE_HEADER)) {\r
219 return FALSE;\r
220 }\r
221 if (!CompareGuid(&NestedCapsuleHeader->CapsuleGuid, &gEfiFmpCapsuleGuid)) {\r
222 return FALSE;\r
223 }\r
224 return TRUE;\r
225}\r
226\r
227/**\r
228 Dump capsule information\r
229\r
230 @param[in] CapsuleName The name of the capsule image.\r
231\r
232 @retval EFI_SUCCESS The capsule information is dumped.\r
233 @retval EFI_UNSUPPORTED Input parameter is not valid.\r
234**/\r
235EFI_STATUS\r
236DumpCapsule (\r
237 IN CHAR16 *CapsuleName\r
238 )\r
239{\r
240 VOID *Buffer;\r
241 UINTN FileSize;\r
242 EFI_CAPSULE_HEADER *CapsuleHeader;\r
243 EFI_STATUS Status;\r
244\r
245 Status = ReadFileToBuffer(CapsuleName, &FileSize, &Buffer);\r
246 if (EFI_ERROR(Status)) {\r
247 Print(L"CapsuleApp: Capsule (%s) is not found.\n", CapsuleName);\r
248 goto Done;\r
249 }\r
250\r
251 CapsuleHeader = Buffer;\r
252 if (CompareGuid(&CapsuleHeader->CapsuleGuid, &gWindowsUxCapsuleGuid)) {\r
253 DumpUxCapsule(CapsuleHeader);\r
254 Status = EFI_SUCCESS;\r
255 goto Done;\r
256 }\r
257\r
258 if (CompareGuid(&CapsuleHeader->CapsuleGuid, &gEfiFmpCapsuleGuid)) {\r
259 DumpFmpCapsule(CapsuleHeader);\r
260 }\r
261 if (IsNestedFmpCapsule(CapsuleHeader)) {\r
262 Print(L"[NestedCapusule]\n");\r
263 Print(L"CapsuleHeader:\n");\r
264 Print(L" CapsuleGuid - %g\n", &CapsuleHeader->CapsuleGuid);\r
265 Print(L" HeaderSize - 0x%x\n", CapsuleHeader->HeaderSize);\r
266 Print(L" Flags - 0x%x\n", CapsuleHeader->Flags);\r
267 Print(L" CapsuleImageSize - 0x%x\n", CapsuleHeader->CapsuleImageSize);\r
268 DumpFmpCapsule((EFI_CAPSULE_HEADER *)((UINTN)CapsuleHeader + CapsuleHeader->HeaderSize));\r
269 }\r
270\r
271Done:\r
272 FreePool(Buffer);\r
273 return Status;\r
274}\r
275\r
276/**\r
277 Dump capsule status variable.\r
278\r
279 @retval EFI_SUCCESS The capsule status variable is dumped.\r
280 @retval EFI_UNSUPPORTED Input parameter is not valid.\r
281**/\r
282EFI_STATUS\r
283DmpCapsuleStatusVariable (\r
284 VOID\r
285 )\r
286{\r
287 EFI_STATUS Status;\r
288 UINT32 Index;\r
289 CHAR16 CapsuleVarName[20];\r
290 CHAR16 *TempVarName;\r
291 EFI_CAPSULE_RESULT_VARIABLE_HEADER *CapsuleResult;\r
292 EFI_CAPSULE_RESULT_VARIABLE_FMP *CapsuleResultFmp;\r
293 UINTN CapsuleFileNameSize;\r
294 CHAR16 CapsuleIndexData[12];\r
295 CHAR16 *CapsuleIndex;\r
296\r
297 Status = GetVariable2(\r
298 L"CapsuleMax",\r
299 &gEfiCapsuleReportGuid,\r
300 (VOID **)&CapsuleIndex,\r
301 NULL\r
302 );\r
303 if (!EFI_ERROR(Status)) {\r
a522ad7c 304 ASSERT (CapsuleIndex != NULL);\r
592bad04
JY
305 CopyMem(CapsuleIndexData, CapsuleIndex, 11 * sizeof(CHAR16));\r
306 CapsuleIndexData[11] = 0;\r
307 Print(L"CapsuleMax - %s\n", CapsuleIndexData);\r
308 FreePool(CapsuleIndex);\r
309 }\r
310 Status = GetVariable2(\r
311 L"CapsuleLast",\r
312 &gEfiCapsuleReportGuid,\r
313 (VOID **)&CapsuleIndex,\r
314 NULL\r
315 );\r
316 if (!EFI_ERROR(Status)) {\r
a522ad7c 317 ASSERT (CapsuleIndex != NULL);\r
592bad04
JY
318 CopyMem(CapsuleIndexData, CapsuleIndex, 11 * sizeof(CHAR16));\r
319 CapsuleIndexData[11] = 0;\r
320 Print(L"CapsuleLast - %s\n", CapsuleIndexData);\r
321 FreePool(CapsuleIndex);\r
322 }\r
323\r
324\r
325 StrCpyS (CapsuleVarName, sizeof(CapsuleVarName)/sizeof(CapsuleVarName[0]), L"Capsule");\r
326 TempVarName = CapsuleVarName + StrLen (CapsuleVarName);\r
327 Index = 0;\r
328\r
329 while (TRUE) {\r
330 UnicodeSPrint (TempVarName, 5 * sizeof(CHAR16), L"%04x", Index);\r
331\r
332 Status = GetVariable2 (\r
333 CapsuleVarName,\r
334 &gEfiCapsuleReportGuid,\r
335 (VOID **) &CapsuleResult,\r
336 NULL\r
337 );\r
338 if (Status == EFI_NOT_FOUND) {\r
339 break;\r
340 } else if (EFI_ERROR(Status)) {\r
341 continue;\r
342 }\r
343 ASSERT (CapsuleResult != NULL);\r
344\r
345 //\r
346 // display capsule process status\r
347 //\r
348 if (CapsuleResult->VariableTotalSize >= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER)) {\r
349 Print (L"CapsuleName: %s\n", CapsuleVarName);\r
350 Print (L" Capsule Guid: %g\n", &CapsuleResult->CapsuleGuid);\r
351 Print (L" Capsule ProcessedTime: %t\n", &CapsuleResult->CapsuleProcessed);\r
352 Print (L" Capsule Status: %r\n", CapsuleResult->CapsuleStatus);\r
353 }\r
354\r
355 if (CompareGuid(&CapsuleResult->CapsuleGuid, &gEfiFmpCapsuleGuid)) {\r
356 if (CapsuleResult->VariableTotalSize >= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP)) {\r
357 CapsuleResultFmp = (EFI_CAPSULE_RESULT_VARIABLE_FMP *)(CapsuleResult + 1);\r
358 Print(L" Capsule FMP Version: 0x%x\n", CapsuleResultFmp->Version);\r
359 Print(L" Capsule FMP PayloadIndex: 0x%x\n", CapsuleResultFmp->PayloadIndex);\r
360 Print(L" Capsule FMP UpdateImageIndex: 0x%x\n", CapsuleResultFmp->UpdateImageIndex);\r
361 Print(L" Capsule FMP UpdateImageTypeId: %g\n", &CapsuleResultFmp->UpdateImageTypeId);\r
362 if (CapsuleResult->VariableTotalSize > sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP)) {\r
363 Print(L" Capsule FMP CapsuleFileName: %s\n", (CapsuleResultFmp + 1));\r
364 CapsuleFileNameSize = StrSize((CHAR16 *)(CapsuleResultFmp + 1));\r
365 if (CapsuleResult->VariableTotalSize > sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP) + CapsuleFileNameSize) {\r
366 Print(L" Capsule FMP CapsuleTarget: %s\n", (UINT8 *)(CapsuleResultFmp + 1) + CapsuleFileNameSize);\r
367 }\r
368 }\r
369 }\r
370 }\r
371\r
372 FreePool(CapsuleResult);\r
373\r
374 Index++;\r
375 if (Index > 0xFFFF) {\r
376 break;\r
377 }\r
378 }\r
379\r
380 return EFI_SUCCESS;\r
381}\r
382\r
383CHAR8 *mFwTypeString[] = {\r
384 "Unknown",\r
385 "SystemFirmware",\r
386 "DeviceFirmware",\r
387 "UefiDriver",\r
388};\r
389\r
390CHAR8 *mLastAttemptStatusString[] = {\r
391 "Success",\r
392 "Error: Unsuccessful",\r
393 "Error: Insufficient Resources",\r
394 "Error: Incorrect Version",\r
395 "Error: Invalid Format",\r
396 "Error: Auth Error",\r
397 "Error: Power Event AC",\r
398 "Error: Power Event Battery",\r
399};\r
400\r
401/**\r
402 Convert FwType to a string.\r
403\r
404 @param[in] FwType FwType in ESRT\r
405\r
406 @return a string for FwType.\r
407**/\r
408CHAR8 *\r
409FwTypeToString (\r
410 IN UINT32 FwType\r
411 )\r
412{\r
413 if (FwType < sizeof(mFwTypeString) / sizeof(mFwTypeString[0])) {\r
414 return mFwTypeString[FwType];\r
415 } else {\r
416 return "Invalid";\r
417 }\r
418}\r
419\r
420/**\r
421 Convert LastAttemptStatus to a string.\r
422\r
423 @param[in] LastAttemptStatus LastAttemptStatus in FMP or ESRT\r
424\r
425 @return a string for LastAttemptStatus.\r
426**/\r
427CHAR8 *\r
428LastAttemptStatusToString (\r
429 IN UINT32 LastAttemptStatus\r
430 )\r
431{\r
432 if (LastAttemptStatus < sizeof(mLastAttemptStatusString) / sizeof(mLastAttemptStatusString[0])) {\r
433 return mLastAttemptStatusString[LastAttemptStatus];\r
434 } else {\r
435 return "Error: Unknown";\r
436 }\r
437}\r
438\r
439/**\r
440 Dump ESRT entry.\r
441\r
442 @param[in] EsrtEntry ESRT entry\r
443**/\r
444VOID\r
445DumpEsrtEntry (\r
446 IN EFI_SYSTEM_RESOURCE_ENTRY *EsrtEntry\r
447 )\r
448{\r
449 Print(L" FwClass - %g\n", &EsrtEntry->FwClass);\r
450 Print(L" FwType - 0x%x (%a)\n", EsrtEntry->FwType, FwTypeToString(EsrtEntry->FwType));\r
451 Print(L" FwVersion - 0x%x\n", EsrtEntry->FwVersion);\r
452 Print(L" LowestSupportedFwVersion - 0x%x\n", EsrtEntry->LowestSupportedFwVersion);\r
453 Print(L" CapsuleFlags - 0x%x\n", EsrtEntry->CapsuleFlags);\r
454 Print(L" PERSIST_ACROSS_RESET - 0x%x\n", EsrtEntry->CapsuleFlags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET);\r
455 Print(L" POPULATE_SYSTEM_TABLE - 0x%x\n", EsrtEntry->CapsuleFlags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE);\r
456 Print(L" INITIATE_RESET - 0x%x\n", EsrtEntry->CapsuleFlags & CAPSULE_FLAGS_INITIATE_RESET);\r
457 Print(L" LastAttemptVersion - 0x%x\n", EsrtEntry->LastAttemptVersion);\r
458 Print(L" LastAttemptStatus - 0x%x (%a)\n", EsrtEntry->LastAttemptStatus, LastAttemptStatusToString(EsrtEntry->LastAttemptStatus));\r
459}\r
460\r
461/**\r
462 Dump ESRT table.\r
463\r
464 @param[in] Esrt ESRT table\r
465**/\r
466VOID\r
467DumpEsrt (\r
468 IN EFI_SYSTEM_RESOURCE_TABLE *Esrt\r
469 )\r
470{\r
471 UINTN Index;\r
472 EFI_SYSTEM_RESOURCE_ENTRY *EsrtEntry;\r
473\r
474 if (Esrt == NULL) {\r
475 return ;\r
476 }\r
477\r
478 Print(L"EFI_SYSTEM_RESOURCE_TABLE:\n");\r
479 Print(L"FwResourceCount - 0x%x\n", Esrt->FwResourceCount);\r
480 Print(L"FwResourceCountMax - 0x%x\n", Esrt->FwResourceCountMax);\r
481 Print(L"FwResourceVersion - 0x%lx\n", Esrt->FwResourceVersion);\r
482\r
483 EsrtEntry = (VOID *)(Esrt + 1);\r
484 for (Index = 0; Index < Esrt->FwResourceCount; Index++) {\r
485 Print(L"EFI_SYSTEM_RESOURCE_ENTRY (%d):\n", Index);\r
486 DumpEsrtEntry(EsrtEntry);\r
487 EsrtEntry++;\r
488 }\r
489}\r
490\r
491/**\r
492 Dump ESRT info.\r
493**/\r
494VOID\r
495DumpEsrtData (\r
496 VOID\r
497 )\r
498{\r
499 EFI_STATUS Status;\r
500 EFI_SYSTEM_RESOURCE_TABLE *Esrt;\r
501\r
502 Print(L"##############\n");\r
503 Print(L"# ESRT TABLE #\n");\r
504 Print(L"##############\n");\r
505\r
506 Status = EfiGetSystemConfigurationTable (&gEfiSystemResourceTableGuid, (VOID **)&Esrt);\r
507 if (EFI_ERROR(Status)) {\r
508 Print(L"ESRT - %r\n", Status);\r
509 return;\r
510 }\r
511 DumpEsrt(Esrt);\r
512 Print(L"\n");\r
513}\r
514\r
515/**\r
516 Dump FMP information.\r
517\r
518 @param[in] ImageInfoSize The size of ImageInfo, in bytes.\r
519 @param[in] ImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
520 @param[in] DescriptorVersion The version of EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
521 @param[in] DescriptorCount The count of EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
522 @param[in] DescriptorSize The size of an individual EFI_FIRMWARE_IMAGE_DESCRIPTOR, in bytes.\r
523 @param[in] PackageVersion The version of package.\r
524 @param[in] PackageVersionName The version name of package.\r
525**/\r
526VOID\r
527DumpFmpImageInfo (\r
528 IN UINTN ImageInfoSize,\r
529 IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *ImageInfo,\r
530 IN UINT32 DescriptorVersion,\r
531 IN UINT8 DescriptorCount,\r
532 IN UINTN DescriptorSize,\r
533 IN UINT32 PackageVersion,\r
534 IN CHAR16 *PackageVersionName\r
535 )\r
536{\r
537 EFI_FIRMWARE_IMAGE_DESCRIPTOR *CurrentImageInfo;\r
538 UINTN Index;\r
539\r
540 Print(L" DescriptorVersion - 0x%x\n", DescriptorVersion);\r
541 Print(L" DescriptorCount - 0x%x\n", DescriptorCount);\r
542 Print(L" DescriptorSize - 0x%x\n", DescriptorSize);\r
543 Print(L" PackageVersion - 0x%x\n", PackageVersion);\r
544 Print(L" PackageVersionName - \"%s\"\n", PackageVersionName);\r
545 CurrentImageInfo = ImageInfo;\r
546 for (Index = 0; Index < DescriptorCount; Index++) {\r
547 Print(L" ImageDescriptor (%d)\n", Index);\r
548 Print(L" ImageIndex - 0x%x\n", CurrentImageInfo->ImageIndex);\r
549 Print(L" ImageTypeId - %g\n", &CurrentImageInfo->ImageTypeId);\r
550 Print(L" ImageId - 0x%lx\n", CurrentImageInfo->ImageId);\r
551 Print(L" ImageIdName - \"%s\"\n", CurrentImageInfo->ImageIdName);\r
552 Print(L" Version - 0x%x\n", CurrentImageInfo->Version);\r
553 Print(L" VersionName - \"%s\"\n", CurrentImageInfo->VersionName);\r
554 Print(L" Size - 0x%x\n", CurrentImageInfo->Size);\r
555 Print(L" AttributesSupported - 0x%lx\n", CurrentImageInfo->AttributesSupported);\r
556 Print(L" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
557 Print(L" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
558 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
559 Print(L" IN_USE - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_IN_USE);\r
560 Print(L" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_UEFI_IMAGE);\r
561 Print(L" AttributesSetting - 0x%lx\n", CurrentImageInfo->AttributesSetting);\r
562 Print(L" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
563 Print(L" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
564 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
565 Print(L" IN_USE - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_IN_USE);\r
566 Print(L" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_UEFI_IMAGE);\r
567 Print(L" Compatibilities - 0x%lx\n", CurrentImageInfo->Compatibilities);\r
568 Print(L" COMPATIB_CHECK_SUPPORTED - 0x%lx\n", CurrentImageInfo->Compatibilities & IMAGE_COMPATIBILITY_CHECK_SUPPORTED);\r
569 if (DescriptorVersion > 1) {\r
570 Print(L" LowestSupportedImageVersion - 0x%x\n", CurrentImageInfo->LowestSupportedImageVersion);\r
571 if (DescriptorVersion > 2) {\r
572 Print(L" LastAttemptVersion - 0x%x\n", CurrentImageInfo->LastAttemptVersion);\r
573 Print(L" LastAttemptStatus - 0x%x (%a)\n", CurrentImageInfo->LastAttemptStatus, LastAttemptStatusToString(CurrentImageInfo->LastAttemptStatus));\r
574 Print(L" HardwareInstance - 0x%lx\n", CurrentImageInfo->HardwareInstance);\r
575 }\r
576 }\r
577 //\r
578 // Use DescriptorSize to move ImageInfo Pointer to stay compatible with different ImageInfo version\r
579 //\r
580 CurrentImageInfo = (EFI_FIRMWARE_IMAGE_DESCRIPTOR *)((UINT8 *)CurrentImageInfo + DescriptorSize);\r
581 }\r
582}\r
583\r
584/**\r
585 Dump FMP package information.\r
586\r
587 @param[in] PackageVersion The version of package.\r
588 @param[in] PackageVersionName The version name of package.\r
589 @param[in] PackageVersionNameMaxLen The maximum length of PackageVersionName.\r
590 @param[in] AttributesSupported Package attributes that are supported by this device.\r
591 @param[in] AttributesSetting Package attributes.\r
592**/\r
593VOID\r
594DumpFmpPackageInfo (\r
595 IN UINT32 PackageVersion,\r
596 IN CHAR16 *PackageVersionName,\r
597 IN UINT32 PackageVersionNameMaxLen,\r
598 IN UINT64 AttributesSupported,\r
599 IN UINT64 AttributesSetting\r
600 )\r
601{\r
602 Print(L" PackageVersion - 0x%x\n", PackageVersion);\r
603 Print(L" PackageVersionName - \"%s\"\n", PackageVersionName);\r
604 Print(L" PackageVersionNameMaxLen - 0x%x\n", PackageVersionNameMaxLen);\r
605 Print(L" AttributesSupported - 0x%lx\n", AttributesSupported);\r
606 Print(L" IMAGE_UPDATABLE - 0x%lx\n", AttributesSupported & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
607 Print(L" RESET_REQUIRED - 0x%lx\n", AttributesSupported & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
608 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSupported & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
609 Print(L" AttributesSetting - 0x%lx\n", AttributesSetting);\r
610 Print(L" IMAGE_UPDATABLE - 0x%lx\n", AttributesSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE);\r
611 Print(L" RESET_REQUIRED - 0x%lx\n", AttributesSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED);\r
612 Print(L" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED);\r
613}\r
614\r
615/**\r
616 Dump FMP protocol info.\r
617**/\r
618VOID\r
619DumpFmpData (\r
620 VOID\r
621 )\r
622{\r
623 EFI_STATUS Status;\r
624 EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
625 EFI_HANDLE *HandleBuffer;\r
626 UINTN NumberOfHandles;\r
627 UINTN Index;\r
628 EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf;\r
629 UINTN ImageInfoSize;\r
630 UINT32 FmpImageInfoDescriptorVer;\r
631 UINT8 FmpImageInfoCount;\r
632 UINTN DescriptorSize;\r
633 UINT32 PackageVersion;\r
634 CHAR16 *PackageVersionName;\r
635 UINT32 PackageVersionNameMaxLen;\r
636 UINT64 AttributesSupported;\r
637 UINT64 AttributesSetting;\r
638\r
639 Print(L"############\n");\r
640 Print(L"# FMP DATA #\n");\r
641 Print(L"############\n");\r
642 Status = gBS->LocateHandleBuffer (\r
643 ByProtocol,\r
644 &gEfiFirmwareManagementProtocolGuid,\r
645 NULL,\r
646 &NumberOfHandles,\r
647 &HandleBuffer\r
648 );\r
649 if (EFI_ERROR(Status)) {\r
650 Print(L"FMP protocol - %r\n", EFI_NOT_FOUND);\r
651 return;\r
652 }\r
653\r
654 for (Index = 0; Index < NumberOfHandles; Index++) {\r
655 Status = gBS->HandleProtocol(\r
656 HandleBuffer[Index],\r
657 &gEfiFirmwareManagementProtocolGuid,\r
658 (VOID **)&Fmp\r
659 );\r
660 if (EFI_ERROR(Status)) {\r
661 continue;\r
662 }\r
663\r
664 ImageInfoSize = 0;\r
665 Status = Fmp->GetImageInfo (\r
666 Fmp,\r
667 &ImageInfoSize,\r
668 NULL,\r
669 NULL,\r
670 NULL,\r
671 NULL,\r
672 NULL,\r
673 NULL\r
674 );\r
675 if (Status != EFI_BUFFER_TOO_SMALL) {\r
676 continue;\r
677 }\r
678\r
679 FmpImageInfoBuf = NULL;\r
680 FmpImageInfoBuf = AllocateZeroPool (ImageInfoSize);\r
681 if (FmpImageInfoBuf == NULL) {\r
682 Status = EFI_OUT_OF_RESOURCES;\r
683 goto EXIT;\r
684 }\r
685\r
686 PackageVersionName = NULL;\r
687 Status = Fmp->GetImageInfo (\r
688 Fmp,\r
689 &ImageInfoSize, // ImageInfoSize\r
690 FmpImageInfoBuf, // ImageInfo\r
691 &FmpImageInfoDescriptorVer, // DescriptorVersion\r
692 &FmpImageInfoCount, // DescriptorCount\r
693 &DescriptorSize, // DescriptorSize\r
694 &PackageVersion, // PackageVersion\r
695 &PackageVersionName // PackageVersionName\r
696 );\r
697\r
698 //\r
699 // If FMP GetInformation interface failed, skip this resource\r
700 //\r
701 if (EFI_ERROR(Status)) {\r
702 Print(L"FMP (%d) ImageInfo - %r\n", Index, Status);\r
703 FreePool(FmpImageInfoBuf);\r
704 continue;\r
705 }\r
706\r
707 Print(L"FMP (%d) ImageInfo:\n", Index);\r
708 DumpFmpImageInfo(\r
709 ImageInfoSize, // ImageInfoSize\r
710 FmpImageInfoBuf, // ImageInfo\r
711 FmpImageInfoDescriptorVer, // DescriptorVersion\r
712 FmpImageInfoCount, // DescriptorCount\r
713 DescriptorSize, // DescriptorSize\r
714 PackageVersion, // PackageVersion\r
715 PackageVersionName // PackageVersionName\r
716 );\r
717\r
718 if (PackageVersionName != NULL) {\r
719 FreePool(PackageVersionName);\r
720 }\r
721 FreePool(FmpImageInfoBuf);\r
722\r
723 //\r
724 // Get package info\r
725 //\r
726 PackageVersionName = NULL;\r
727 Status = Fmp->GetPackageInfo (\r
728 Fmp,\r
729 &PackageVersion, // PackageVersion\r
730 &PackageVersionName, // PackageVersionName\r
731 &PackageVersionNameMaxLen, // PackageVersionNameMaxLen\r
732 &AttributesSupported, // AttributesSupported\r
733 &AttributesSetting // AttributesSetting\r
734 );\r
735 if (EFI_ERROR(Status)) {\r
736 Print(L"FMP (%d) PackageInfo - %r\n", Index, Status);\r
737 } else {\r
738 Print(L"FMP (%d) ImageInfo:\n", Index);\r
739 DumpFmpPackageInfo(\r
740 PackageVersion, // PackageVersion\r
741 PackageVersionName, // PackageVersionName\r
742 PackageVersionNameMaxLen, // PackageVersionNameMaxLen\r
743 AttributesSupported, // AttributesSupported\r
744 AttributesSetting // AttributesSetting\r
745 );\r
746\r
747 if (PackageVersionName != NULL) {\r
748 FreePool(PackageVersionName);\r
749 }\r
750 }\r
751 }\r
752 Print(L"\n");\r
753\r
754EXIT:\r
755 FreePool(HandleBuffer);\r
756}\r
1e09ec09
JY
757\r
758/**\r
759 Check if the ImageInfo includes the ImageTypeId.\r
760\r
761 @param[in] ImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
762 @param[in] DescriptorCount The count of EFI_FIRMWARE_IMAGE_DESCRIPTOR.\r
763 @param[in] DescriptorSize The size of an individual EFI_FIRMWARE_IMAGE_DESCRIPTOR, in bytes.\r
764 @param[in] ImageTypeId A unique GUID identifying the firmware image type.\r
765\r
766 @return TRUE This ImageInfo includes the ImageTypeId\r
767 @return FALSE This ImageInfo does not include the ImageTypeId\r
768**/\r
769BOOLEAN\r
770IsThisFmpImageInfo (\r
771 IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *ImageInfo,\r
772 IN UINT8 DescriptorCount,\r
773 IN UINTN DescriptorSize,\r
774 IN EFI_GUID *ImageTypeId\r
775 )\r
776{\r
777 EFI_FIRMWARE_IMAGE_DESCRIPTOR *CurrentImageInfo;\r
778 UINTN Index;\r
779\r
780 CurrentImageInfo = ImageInfo;\r
781 for (Index = 0; Index < DescriptorCount; Index++) {\r
782 if (CompareGuid (&CurrentImageInfo->ImageTypeId, ImageTypeId)) {\r
783 return TRUE;\r
784 }\r
785 CurrentImageInfo = (EFI_FIRMWARE_IMAGE_DESCRIPTOR *)((UINT8 *)CurrentImageInfo + DescriptorSize);\r
786 }\r
787 return FALSE;\r
788}\r
789\r
790/**\r
791 return the FMP whoes ImageInfo includes the ImageTypeId.\r
792\r
793 @param[in] ImageTypeId A unique GUID identifying the firmware image type.\r
794\r
795 @return The FMP whoes ImageInfo includes the ImageTypeId\r
796**/\r
797EFI_FIRMWARE_MANAGEMENT_PROTOCOL *\r
798FindFmpFromImageTypeId (\r
799 IN EFI_GUID *ImageTypeId\r
800 )\r
801{\r
802 EFI_STATUS Status;\r
803 EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
804 EFI_FIRMWARE_MANAGEMENT_PROTOCOL *TargetFmp;\r
805 EFI_HANDLE *HandleBuffer;\r
806 UINTN NumberOfHandles;\r
807 UINTN Index;\r
808 EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf;\r
809 UINTN ImageInfoSize;\r
810 UINT32 FmpImageInfoDescriptorVer;\r
811 UINT8 FmpImageInfoCount;\r
812 UINTN DescriptorSize;\r
813 UINT32 PackageVersion;\r
814 CHAR16 *PackageVersionName;\r
815\r
816 Status = gBS->LocateHandleBuffer (\r
817 ByProtocol,\r
818 &gEfiFirmwareManagementProtocolGuid,\r
819 NULL,\r
820 &NumberOfHandles,\r
821 &HandleBuffer\r
822 );\r
823 if (EFI_ERROR(Status)) {\r
824 Print(L"FMP protocol - %r\n", EFI_NOT_FOUND);\r
825 return NULL;\r
826 }\r
827\r
828 TargetFmp = NULL;\r
829 for (Index = 0; Index < NumberOfHandles; Index++) {\r
830 Status = gBS->HandleProtocol(\r
831 HandleBuffer[Index],\r
832 &gEfiFirmwareManagementProtocolGuid,\r
833 (VOID **)&Fmp\r
834 );\r
835 if (EFI_ERROR(Status)) {\r
836 continue;\r
837 }\r
838\r
839 ImageInfoSize = 0;\r
840 Status = Fmp->GetImageInfo (\r
841 Fmp,\r
842 &ImageInfoSize,\r
843 NULL,\r
844 NULL,\r
845 NULL,\r
846 NULL,\r
847 NULL,\r
848 NULL\r
849 );\r
850 if (Status != EFI_BUFFER_TOO_SMALL) {\r
851 continue;\r
852 }\r
853\r
854 FmpImageInfoBuf = NULL;\r
855 FmpImageInfoBuf = AllocateZeroPool (ImageInfoSize);\r
856 if (FmpImageInfoBuf == NULL) {\r
857 FreePool(HandleBuffer);\r
858 Print(L"Out of resource\n");\r
859 return NULL;\r
860 }\r
861\r
862 PackageVersionName = NULL;\r
863 Status = Fmp->GetImageInfo (\r
864 Fmp,\r
865 &ImageInfoSize, // ImageInfoSize\r
866 FmpImageInfoBuf, // ImageInfo\r
867 &FmpImageInfoDescriptorVer, // DescriptorVersion\r
868 &FmpImageInfoCount, // DescriptorCount\r
869 &DescriptorSize, // DescriptorSize\r
870 &PackageVersion, // PackageVersion\r
871 &PackageVersionName // PackageVersionName\r
872 );\r
873\r
874 //\r
875 // If FMP GetInformation interface failed, skip this resource\r
876 //\r
877 if (EFI_ERROR(Status)) {\r
878 FreePool(FmpImageInfoBuf);\r
879 continue;\r
880 }\r
881\r
882 if (PackageVersionName != NULL) {\r
883 FreePool(PackageVersionName);\r
884 }\r
885\r
886 if (IsThisFmpImageInfo (FmpImageInfoBuf, FmpImageInfoCount, DescriptorSize, ImageTypeId)) {\r
887 TargetFmp = Fmp;\r
888 }\r
889 FreePool(FmpImageInfoBuf);\r
890 if (TargetFmp != NULL) {\r
891 break;\r
892 }\r
893 }\r
894 FreePool(HandleBuffer);\r
895 return TargetFmp;\r
896}\r
897\r
898/**\r
899 Dump FMP image data.\r
900\r
901 @param[in] ImageTypeId The ImageTypeId of the FMP image.\r
902 It is used to identify the FMP protocol.\r
903 @param[in] ImageIndex The ImageIndex of the FMP image.\r
904 It is the input parameter for FMP->GetImage().\r
905 @param[in] ImageName The file name to hold the output FMP image.\r
906**/\r
907VOID\r
908DumpFmpImage (\r
909 IN EFI_GUID *ImageTypeId,\r
910 IN UINTN ImageIndex,\r
911 IN CHAR16 *ImageName\r
912 )\r
913{\r
914 EFI_STATUS Status;\r
915 EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
916 VOID *Image;\r
917 UINTN ImageSize;\r
918\r
919 Fmp = FindFmpFromImageTypeId (ImageTypeId);\r
920 if (Fmp == NULL) {\r
921 Print(L"No FMP include ImageTypeId %g\n", ImageTypeId);\r
922 return ;\r
923 }\r
924\r
925 if (ImageIndex > 0xFF) {\r
926 Print(L"ImageIndex 0x%x too big\n", ImageIndex);\r
927 return ;\r
928 }\r
929\r
930 Image = Fmp;\r
931 ImageSize = 0;\r
932 Status = Fmp->GetImage (Fmp, (UINT8)ImageIndex, Image, &ImageSize);\r
933 if (Status != EFI_BUFFER_TOO_SMALL) {\r
934 Print(L"Fmp->GetImage - %r\n", Status);\r
935 return ;\r
936 }\r
937\r
938 Image = AllocatePool (ImageSize);\r
939 if (Image == NULL) {\r
940 Print(L"Allocate FmpImage 0x%x - %r\n", ImageSize, EFI_OUT_OF_RESOURCES);\r
941 return ;\r
942 }\r
943\r
944 Status = Fmp->GetImage (Fmp, (UINT8)ImageIndex, Image, &ImageSize);\r
945 if (EFI_ERROR(Status)) {\r
946 Print(L"Fmp->GetImage - %r\n", Status);\r
947 return ;\r
948 }\r
949\r
950 Status = WriteFileFromBuffer(ImageName, ImageSize, Image);\r
951 Print(L"CapsuleApp: Dump %g ImageIndex (0x%x) to %s %r\n", ImageTypeId, ImageIndex, ImageName, Status);\r
952\r
953 return ;\r
954}\r