2 Dump Capsule image information.
4 Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include <Library/BaseLib.h>
17 #include <Library/DebugLib.h>
18 #include <Library/BaseMemoryLib.h>
19 #include <Library/MemoryAllocationLib.h>
20 #include <Library/UefiBootServicesTableLib.h>
21 #include <Library/UefiRuntimeServicesTableLib.h>
22 #include <Library/UefiLib.h>
23 #include <Library/PrintLib.h>
24 #include <Protocol/FirmwareManagement.h>
25 #include <Guid/ImageAuthentication.h>
26 #include <Guid/CapsuleReport.h>
27 #include <Guid/SystemResourceTable.h>
28 #include <Guid/FmpCapsule.h>
29 #include <IndustryStandard/WindowsUxCapsule.h>
34 @param[in] FileName The file to be read.
35 @param[out] BufferSize The file buffer size
36 @param[out] Buffer The file buffer
38 @retval EFI_SUCCESS Read file successfully
39 @retval EFI_NOT_FOUND File not found
44 OUT UINTN
*BufferSize
,
51 @param[in] FileName The file to be written.
52 @param[in] BufferSize The file buffer size
53 @param[in] Buffer The file buffer
55 @retval EFI_SUCCESS Write file successfully
65 Validate if it is valid capsule header
67 This function assumes the caller provided correct CapsuleHeader pointer
70 This function validates the fields in EFI_CAPSULE_HEADER.
72 @param[in] CapsuleHeader Points to a capsule header.
73 @param[in] CapsuleSize Size of the whole capsule image.
77 IsValidCapsuleHeader (
78 IN EFI_CAPSULE_HEADER
*CapsuleHeader
,
83 Dump UX capsule information.
85 @param[in] CapsuleHeader The UX capsule header
89 IN EFI_CAPSULE_HEADER
*CapsuleHeader
92 EFI_DISPLAY_CAPSULE
*DisplayCapsule
;
93 DisplayCapsule
= (EFI_DISPLAY_CAPSULE
*)CapsuleHeader
;
94 Print(L
"[UxCapusule]\n");
95 Print(L
"CapsuleHeader:\n");
96 Print(L
" CapsuleGuid - %g\n", &DisplayCapsule
->CapsuleHeader
.CapsuleGuid
);
97 Print(L
" HeaderSize - 0x%x\n", DisplayCapsule
->CapsuleHeader
.HeaderSize
);
98 Print(L
" Flags - 0x%x\n", DisplayCapsule
->CapsuleHeader
.Flags
);
99 Print(L
" CapsuleImageSize - 0x%x\n", DisplayCapsule
->CapsuleHeader
.CapsuleImageSize
);
100 Print(L
"ImagePayload:\n");
101 Print(L
" Version - 0x%x\n", DisplayCapsule
->ImagePayload
.Version
);
102 Print(L
" Checksum - 0x%x\n", DisplayCapsule
->ImagePayload
.Checksum
);
103 Print(L
" ImageType - 0x%x\n", DisplayCapsule
->ImagePayload
.ImageType
);
104 Print(L
" Mode - 0x%x\n", DisplayCapsule
->ImagePayload
.Mode
);
105 Print(L
" OffsetX - 0x%x\n", DisplayCapsule
->ImagePayload
.OffsetX
);
106 Print(L
" OffsetY - 0x%x\n", DisplayCapsule
->ImagePayload
.OffsetY
);
110 Dump FMP image authentication information.
112 @param[in] Image The FMP capsule image
113 @param[in] ImageSize The size of the FMP capsule image in bytes.
115 @return the size of FMP authentication.
118 DumpImageAuthentication (
123 EFI_FIRMWARE_IMAGE_AUTHENTICATION
*ImageAuthentication
;
125 ImageAuthentication
= Image
;
126 if (CompareGuid(&ImageAuthentication
->AuthInfo
.CertType
, &gEfiCertPkcs7Guid
) ||
127 CompareGuid(&ImageAuthentication
->AuthInfo
.CertType
, &gEfiCertTypeRsa2048Sha256Guid
)) {
128 Print(L
"[ImageAuthentication]\n");
129 Print(L
" MonotonicCount - 0x%lx\n", ImageAuthentication
->MonotonicCount
);
130 Print(L
"WIN_CERTIFICATE:\n");
131 Print(L
" dwLength - 0x%x\n", ImageAuthentication
->AuthInfo
.Hdr
.dwLength
);
132 Print(L
" wRevision - 0x%x\n", ImageAuthentication
->AuthInfo
.Hdr
.wRevision
);
133 Print(L
" wCertificateType - 0x%x\n", ImageAuthentication
->AuthInfo
.Hdr
.wCertificateType
);
134 Print(L
" CertType - %g\n", &ImageAuthentication
->AuthInfo
.CertType
);
135 return sizeof(ImageAuthentication
->MonotonicCount
) + ImageAuthentication
->AuthInfo
.Hdr
.dwLength
;
142 Dump a non-nested FMP capsule.
144 @param[in] CapsuleHeader A pointer to CapsuleHeader
148 IN EFI_CAPSULE_HEADER
*CapsuleHeader
151 EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER
*FmpCapsuleHeader
;
152 UINT64
*ItemOffsetList
;
155 EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
*FmpImageHeader
;
157 Print(L
"[FmpCapusule]\n");
158 Print(L
"CapsuleHeader:\n");
159 Print(L
" CapsuleGuid - %g\n", &CapsuleHeader
->CapsuleGuid
);
160 Print(L
" HeaderSize - 0x%x\n", CapsuleHeader
->HeaderSize
);
161 Print(L
" Flags - 0x%x\n", CapsuleHeader
->Flags
);
162 Print(L
" CapsuleImageSize - 0x%x\n", CapsuleHeader
->CapsuleImageSize
);
164 FmpCapsuleHeader
= (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER
*)((UINT8
*)CapsuleHeader
+ CapsuleHeader
->HeaderSize
);
165 ItemOffsetList
= (UINT64
*)(FmpCapsuleHeader
+ 1);
166 Print(L
"FmpHeader:\n");
167 Print(L
" Version - 0x%x\n", FmpCapsuleHeader
->Version
);
168 Print(L
" EmbeddedDriverCount - 0x%x\n", FmpCapsuleHeader
->EmbeddedDriverCount
);
169 Print(L
" PayloadItemCount - 0x%x\n", FmpCapsuleHeader
->PayloadItemCount
);
170 Count
= FmpCapsuleHeader
->EmbeddedDriverCount
+ FmpCapsuleHeader
->PayloadItemCount
;
171 for (Index
= 0; Index
< Count
; Index
++) {
172 Print(L
" Offset[%d] - 0x%x\n", Index
, ItemOffsetList
[Index
]);
175 for (Index
= FmpCapsuleHeader
->EmbeddedDriverCount
; Index
< Count
; Index
++) {
176 Print(L
"FmpPayload[%d] ImageHeader:\n", Index
);
177 FmpImageHeader
= (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
*)((UINT8
*)FmpCapsuleHeader
+ ItemOffsetList
[Index
]);
178 Print(L
" Version - 0x%x\n", FmpImageHeader
->Version
);
179 Print(L
" UpdateImageTypeId - %g\n", &FmpImageHeader
->UpdateImageTypeId
);
180 Print(L
" UpdateImageIndex - 0x%x\n", FmpImageHeader
->UpdateImageIndex
);
181 Print(L
" UpdateImageSize - 0x%x\n", FmpImageHeader
->UpdateImageSize
);
182 Print(L
" UpdateVendorCodeSize - 0x%x\n", FmpImageHeader
->UpdateVendorCodeSize
);
183 if (FmpImageHeader
->Version
>= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION
) {
184 Print(L
" UpdateHardwareInstance - 0x%lx\n", FmpImageHeader
->UpdateHardwareInstance
);
190 Return if there is a FMP header below capsule header.
192 @param[in] CapsuleHeader A pointer to EFI_CAPSULE_HEADER
194 @retval TRUE There is a FMP header below capsule header.
195 @retval FALSE There is not a FMP header below capsule header
199 IN EFI_CAPSULE_HEADER
*CapsuleHeader
203 EFI_SYSTEM_RESOURCE_TABLE
*Esrt
;
204 EFI_SYSTEM_RESOURCE_ENTRY
*EsrtEntry
;
206 BOOLEAN EsrtGuidFound
;
207 EFI_CAPSULE_HEADER
*NestedCapsuleHeader
;
208 UINTN NestedCapsuleSize
;
213 EsrtGuidFound
= FALSE
;
214 Status
= EfiGetSystemConfigurationTable(&gEfiSystemResourceTableGuid
, (VOID
**)&Esrt
);
215 if (!EFI_ERROR(Status
)) {
216 ASSERT (Esrt
!= NULL
);
217 EsrtEntry
= (VOID
*)(Esrt
+ 1);
218 for (Index
= 0; Index
< Esrt
->FwResourceCount
; Index
++, EsrtEntry
++) {
219 if (CompareGuid(&EsrtEntry
->FwClass
, &CapsuleHeader
->CapsuleGuid
)) {
220 EsrtGuidFound
= TRUE
;
226 if (!EsrtGuidFound
) {
231 // Check nested capsule header
232 // FMP GUID after ESRT one
234 NestedCapsuleHeader
= (EFI_CAPSULE_HEADER
*)((UINT8
*)CapsuleHeader
+ CapsuleHeader
->HeaderSize
);
235 NestedCapsuleSize
= (UINTN
)CapsuleHeader
+ CapsuleHeader
->CapsuleImageSize
- (UINTN
)NestedCapsuleHeader
;
236 if (NestedCapsuleSize
< sizeof(EFI_CAPSULE_HEADER
)) {
239 if (!CompareGuid(&NestedCapsuleHeader
->CapsuleGuid
, &gEfiFmpCapsuleGuid
)) {
246 Dump capsule information
248 @param[in] CapsuleName The name of the capsule image.
250 @retval EFI_SUCCESS The capsule information is dumped.
251 @retval EFI_UNSUPPORTED Input parameter is not valid.
255 IN CHAR16
*CapsuleName
260 EFI_CAPSULE_HEADER
*CapsuleHeader
;
264 Status
= ReadFileToBuffer(CapsuleName
, &FileSize
, &Buffer
);
265 if (EFI_ERROR(Status
)) {
266 Print(L
"CapsuleApp: Capsule (%s) is not found.\n", CapsuleName
);
269 if (!IsValidCapsuleHeader (Buffer
, FileSize
)) {
270 Print(L
"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName
);
271 Status
= EFI_INVALID_PARAMETER
;
275 CapsuleHeader
= Buffer
;
276 if (CompareGuid(&CapsuleHeader
->CapsuleGuid
, &gWindowsUxCapsuleGuid
)) {
277 DumpUxCapsule(CapsuleHeader
);
278 Status
= EFI_SUCCESS
;
282 if (CompareGuid(&CapsuleHeader
->CapsuleGuid
, &gEfiFmpCapsuleGuid
)) {
283 DumpFmpCapsule(CapsuleHeader
);
285 if (IsNestedFmpCapsule(CapsuleHeader
)) {
286 Print(L
"[NestedCapusule]\n");
287 Print(L
"CapsuleHeader:\n");
288 Print(L
" CapsuleGuid - %g\n", &CapsuleHeader
->CapsuleGuid
);
289 Print(L
" HeaderSize - 0x%x\n", CapsuleHeader
->HeaderSize
);
290 Print(L
" Flags - 0x%x\n", CapsuleHeader
->Flags
);
291 Print(L
" CapsuleImageSize - 0x%x\n", CapsuleHeader
->CapsuleImageSize
);
292 DumpFmpCapsule((EFI_CAPSULE_HEADER
*)((UINTN
)CapsuleHeader
+ CapsuleHeader
->HeaderSize
));
296 if (Buffer
!= NULL
) {
303 Dump capsule status variable.
305 @retval EFI_SUCCESS The capsule status variable is dumped.
306 @retval EFI_UNSUPPORTED Input parameter is not valid.
309 DumpCapsuleStatusVariable (
315 CHAR16 CapsuleVarName
[20];
317 EFI_CAPSULE_RESULT_VARIABLE_HEADER
*CapsuleResult
;
318 EFI_CAPSULE_RESULT_VARIABLE_FMP
*CapsuleResultFmp
;
319 UINTN CapsuleFileNameSize
;
320 CHAR16 CapsuleIndexData
[12];
321 CHAR16
*CapsuleIndex
;
322 CHAR16
*CapsuleFileName
;
323 CHAR16
*CapsuleTarget
;
325 Status
= GetVariable2(
327 &gEfiCapsuleReportGuid
,
328 (VOID
**)&CapsuleIndex
,
331 if (!EFI_ERROR(Status
)) {
332 ASSERT (CapsuleIndex
!= NULL
);
333 CopyMem(CapsuleIndexData
, CapsuleIndex
, 11 * sizeof(CHAR16
));
334 CapsuleIndexData
[11] = 0;
335 Print(L
"CapsuleMax - %s\n", CapsuleIndexData
);
336 FreePool(CapsuleIndex
);
338 Status
= GetVariable2(
340 &gEfiCapsuleReportGuid
,
341 (VOID
**)&CapsuleIndex
,
344 if (!EFI_ERROR(Status
)) {
345 ASSERT (CapsuleIndex
!= NULL
);
346 CopyMem(CapsuleIndexData
, CapsuleIndex
, 11 * sizeof(CHAR16
));
347 CapsuleIndexData
[11] = 0;
348 Print(L
"CapsuleLast - %s\n", CapsuleIndexData
);
349 FreePool(CapsuleIndex
);
353 StrCpyS (CapsuleVarName
, sizeof(CapsuleVarName
)/sizeof(CapsuleVarName
[0]), L
"Capsule");
354 TempVarName
= CapsuleVarName
+ StrLen (CapsuleVarName
);
358 UnicodeSPrint (TempVarName
, 5 * sizeof(CHAR16
), L
"%04x", Index
);
360 Status
= GetVariable2 (
362 &gEfiCapsuleReportGuid
,
363 (VOID
**) &CapsuleResult
,
366 if (Status
== EFI_NOT_FOUND
) {
368 } else if (EFI_ERROR(Status
)) {
371 ASSERT (CapsuleResult
!= NULL
);
374 // display capsule process status
376 if (CapsuleResult
->VariableTotalSize
>= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER
)) {
377 Print (L
"CapsuleName: %s\n", CapsuleVarName
);
378 Print (L
" Capsule Guid: %g\n", &CapsuleResult
->CapsuleGuid
);
379 Print (L
" Capsule ProcessedTime: %t\n", &CapsuleResult
->CapsuleProcessed
);
380 Print (L
" Capsule Status: %r\n", CapsuleResult
->CapsuleStatus
);
383 if (CompareGuid(&CapsuleResult
->CapsuleGuid
, &gEfiFmpCapsuleGuid
)) {
384 if (CapsuleResult
->VariableTotalSize
>= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER
) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP
) + sizeof(CHAR16
) * 2) {
385 CapsuleResultFmp
= (EFI_CAPSULE_RESULT_VARIABLE_FMP
*)(CapsuleResult
+ 1);
386 Print(L
" Capsule FMP Version: 0x%x\n", CapsuleResultFmp
->Version
);
387 Print(L
" Capsule FMP PayloadIndex: 0x%x\n", CapsuleResultFmp
->PayloadIndex
);
388 Print(L
" Capsule FMP UpdateImageIndex: 0x%x\n", CapsuleResultFmp
->UpdateImageIndex
);
389 Print(L
" Capsule FMP UpdateImageTypeId: %g\n", &CapsuleResultFmp
->UpdateImageTypeId
);
390 CapsuleFileName
= (CHAR16
*)(CapsuleResultFmp
+ 1);
391 Print(L
" Capsule FMP CapsuleFileName: \"%s\"\n", CapsuleFileName
);
392 CapsuleFileNameSize
= StrSize(CapsuleFileName
);
393 CapsuleTarget
= (CHAR16
*)((UINTN
)CapsuleFileName
+ CapsuleFileNameSize
);
394 Print(L
" Capsule FMP CapsuleTarget: \"%s\"\n", CapsuleTarget
);
398 FreePool(CapsuleResult
);
401 if (Index
> 0xFFFF) {
409 CHAR8
*mFwTypeString
[] = {
416 CHAR8
*mLastAttemptStatusString
[] = {
418 "Error: Unsuccessful",
419 "Error: Insufficient Resources",
420 "Error: Incorrect Version",
421 "Error: Invalid Format",
423 "Error: Power Event AC",
424 "Error: Power Event Battery",
428 Convert FwType to a string.
430 @param[in] FwType FwType in ESRT
432 @return a string for FwType.
439 if (FwType
< sizeof(mFwTypeString
) / sizeof(mFwTypeString
[0])) {
440 return mFwTypeString
[FwType
];
447 Convert LastAttemptStatus to a string.
449 @param[in] LastAttemptStatus LastAttemptStatus in FMP or ESRT
451 @return a string for LastAttemptStatus.
454 LastAttemptStatusToString (
455 IN UINT32 LastAttemptStatus
458 if (LastAttemptStatus
< sizeof(mLastAttemptStatusString
) / sizeof(mLastAttemptStatusString
[0])) {
459 return mLastAttemptStatusString
[LastAttemptStatus
];
461 return "Error: Unknown";
468 @param[in] EsrtEntry ESRT entry
472 IN EFI_SYSTEM_RESOURCE_ENTRY
*EsrtEntry
475 Print(L
" FwClass - %g\n", &EsrtEntry
->FwClass
);
476 Print(L
" FwType - 0x%x (%a)\n", EsrtEntry
->FwType
, FwTypeToString(EsrtEntry
->FwType
));
477 Print(L
" FwVersion - 0x%x\n", EsrtEntry
->FwVersion
);
478 Print(L
" LowestSupportedFwVersion - 0x%x\n", EsrtEntry
->LowestSupportedFwVersion
);
479 Print(L
" CapsuleFlags - 0x%x\n", EsrtEntry
->CapsuleFlags
);
480 Print(L
" LastAttemptVersion - 0x%x\n", EsrtEntry
->LastAttemptVersion
);
481 Print(L
" LastAttemptStatus - 0x%x (%a)\n", EsrtEntry
->LastAttemptStatus
, LastAttemptStatusToString(EsrtEntry
->LastAttemptStatus
));
487 @param[in] Esrt ESRT table
491 IN EFI_SYSTEM_RESOURCE_TABLE
*Esrt
495 EFI_SYSTEM_RESOURCE_ENTRY
*EsrtEntry
;
501 Print(L
"EFI_SYSTEM_RESOURCE_TABLE:\n");
502 Print(L
"FwResourceCount - 0x%x\n", Esrt
->FwResourceCount
);
503 Print(L
"FwResourceCountMax - 0x%x\n", Esrt
->FwResourceCountMax
);
504 Print(L
"FwResourceVersion - 0x%lx\n", Esrt
->FwResourceVersion
);
506 EsrtEntry
= (VOID
*)(Esrt
+ 1);
507 for (Index
= 0; Index
< Esrt
->FwResourceCount
; Index
++) {
508 Print(L
"EFI_SYSTEM_RESOURCE_ENTRY (%d):\n", Index
);
509 DumpEsrtEntry(EsrtEntry
);
523 EFI_SYSTEM_RESOURCE_TABLE
*Esrt
;
525 Print(L
"##############\n");
526 Print(L
"# ESRT TABLE #\n");
527 Print(L
"##############\n");
529 Status
= EfiGetSystemConfigurationTable (&gEfiSystemResourceTableGuid
, (VOID
**)&Esrt
);
530 if (EFI_ERROR(Status
)) {
531 Print(L
"ESRT - %r\n", Status
);
539 Dump FMP information.
541 @param[in] ImageInfoSize The size of ImageInfo, in bytes.
542 @param[in] ImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR.
543 @param[in] DescriptorVersion The version of EFI_FIRMWARE_IMAGE_DESCRIPTOR.
544 @param[in] DescriptorCount The count of EFI_FIRMWARE_IMAGE_DESCRIPTOR.
545 @param[in] DescriptorSize The size of an individual EFI_FIRMWARE_IMAGE_DESCRIPTOR, in bytes.
546 @param[in] PackageVersion The version of package.
547 @param[in] PackageVersionName The version name of package.
551 IN UINTN ImageInfoSize
,
552 IN EFI_FIRMWARE_IMAGE_DESCRIPTOR
*ImageInfo
,
553 IN UINT32 DescriptorVersion
,
554 IN UINT8 DescriptorCount
,
555 IN UINTN DescriptorSize
,
556 IN UINT32 PackageVersion
,
557 IN CHAR16
*PackageVersionName
560 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*CurrentImageInfo
;
563 Print(L
" DescriptorVersion - 0x%x\n", DescriptorVersion
);
564 Print(L
" DescriptorCount - 0x%x\n", DescriptorCount
);
565 Print(L
" DescriptorSize - 0x%x\n", DescriptorSize
);
566 Print(L
" PackageVersion - 0x%x\n", PackageVersion
);
567 Print(L
" PackageVersionName - \"%s\"\n", PackageVersionName
);
568 CurrentImageInfo
= ImageInfo
;
569 for (Index
= 0; Index
< DescriptorCount
; Index
++) {
570 Print(L
" ImageDescriptor (%d)\n", Index
);
571 Print(L
" ImageIndex - 0x%x\n", CurrentImageInfo
->ImageIndex
);
572 Print(L
" ImageTypeId - %g\n", &CurrentImageInfo
->ImageTypeId
);
573 Print(L
" ImageId - 0x%lx\n", CurrentImageInfo
->ImageId
);
574 Print(L
" ImageIdName - \"%s\"\n", CurrentImageInfo
->ImageIdName
);
575 Print(L
" Version - 0x%x\n", CurrentImageInfo
->Version
);
576 Print(L
" VersionName - \"%s\"\n", CurrentImageInfo
->VersionName
);
577 Print(L
" Size - 0x%x\n", CurrentImageInfo
->Size
);
578 Print(L
" AttributesSupported - 0x%lx\n", CurrentImageInfo
->AttributesSupported
);
579 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
580 Print(L
" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
581 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
582 Print(L
" IN_USE - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_IN_USE
);
583 Print(L
" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_UEFI_IMAGE
);
584 Print(L
" AttributesSetting - 0x%lx\n", CurrentImageInfo
->AttributesSetting
);
585 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
586 Print(L
" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
587 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
588 Print(L
" IN_USE - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_IN_USE
);
589 Print(L
" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_UEFI_IMAGE
);
590 Print(L
" Compatibilities - 0x%lx\n", CurrentImageInfo
->Compatibilities
);
591 Print(L
" COMPATIB_CHECK_SUPPORTED - 0x%lx\n", CurrentImageInfo
->Compatibilities
& IMAGE_COMPATIBILITY_CHECK_SUPPORTED
);
592 if (DescriptorVersion
> 1) {
593 Print(L
" LowestSupportedImageVersion - 0x%x\n", CurrentImageInfo
->LowestSupportedImageVersion
);
594 if (DescriptorVersion
> 2) {
595 Print(L
" LastAttemptVersion - 0x%x\n", CurrentImageInfo
->LastAttemptVersion
);
596 Print(L
" LastAttemptStatus - 0x%x (%a)\n", CurrentImageInfo
->LastAttemptStatus
, LastAttemptStatusToString(CurrentImageInfo
->LastAttemptStatus
));
597 Print(L
" HardwareInstance - 0x%lx\n", CurrentImageInfo
->HardwareInstance
);
601 // Use DescriptorSize to move ImageInfo Pointer to stay compatible with different ImageInfo version
603 CurrentImageInfo
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR
*)((UINT8
*)CurrentImageInfo
+ DescriptorSize
);
608 Dump FMP package information.
610 @param[in] PackageVersion The version of package.
611 @param[in] PackageVersionName The version name of package.
612 @param[in] PackageVersionNameMaxLen The maximum length of PackageVersionName.
613 @param[in] AttributesSupported Package attributes that are supported by this device.
614 @param[in] AttributesSetting Package attributes.
618 IN UINT32 PackageVersion
,
619 IN CHAR16
*PackageVersionName
,
620 IN UINT32 PackageVersionNameMaxLen
,
621 IN UINT64 AttributesSupported
,
622 IN UINT64 AttributesSetting
625 Print(L
" PackageVersion - 0x%x\n", PackageVersion
);
626 Print(L
" PackageVersionName - \"%s\"\n", PackageVersionName
);
627 Print(L
" PackageVersionNameMaxLen - 0x%x\n", PackageVersionNameMaxLen
);
628 Print(L
" AttributesSupported - 0x%lx\n", AttributesSupported
);
629 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", AttributesSupported
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
630 Print(L
" RESET_REQUIRED - 0x%lx\n", AttributesSupported
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
631 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSupported
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
632 Print(L
" AttributesSetting - 0x%lx\n", AttributesSetting
);
633 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", AttributesSetting
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
634 Print(L
" RESET_REQUIRED - 0x%lx\n", AttributesSetting
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
635 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSetting
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
639 Dump FMP protocol info.
647 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*Fmp
;
648 EFI_HANDLE
*HandleBuffer
;
649 UINTN NumberOfHandles
;
651 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*FmpImageInfoBuf
;
653 UINT32 FmpImageInfoDescriptorVer
;
654 UINT8 FmpImageInfoCount
;
655 UINTN DescriptorSize
;
656 UINT32 PackageVersion
;
657 CHAR16
*PackageVersionName
;
658 UINT32 PackageVersionNameMaxLen
;
659 UINT64 AttributesSupported
;
660 UINT64 AttributesSetting
;
662 Print(L
"############\n");
663 Print(L
"# FMP DATA #\n");
664 Print(L
"############\n");
665 Status
= gBS
->LocateHandleBuffer (
667 &gEfiFirmwareManagementProtocolGuid
,
672 if (EFI_ERROR(Status
)) {
673 Print(L
"FMP protocol - %r\n", EFI_NOT_FOUND
);
677 for (Index
= 0; Index
< NumberOfHandles
; Index
++) {
678 Status
= gBS
->HandleProtocol(
680 &gEfiFirmwareManagementProtocolGuid
,
683 if (EFI_ERROR(Status
)) {
688 Status
= Fmp
->GetImageInfo (
698 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
702 FmpImageInfoBuf
= NULL
;
703 FmpImageInfoBuf
= AllocateZeroPool (ImageInfoSize
);
704 if (FmpImageInfoBuf
== NULL
) {
705 Status
= EFI_OUT_OF_RESOURCES
;
709 PackageVersionName
= NULL
;
710 Status
= Fmp
->GetImageInfo (
712 &ImageInfoSize
, // ImageInfoSize
713 FmpImageInfoBuf
, // ImageInfo
714 &FmpImageInfoDescriptorVer
, // DescriptorVersion
715 &FmpImageInfoCount
, // DescriptorCount
716 &DescriptorSize
, // DescriptorSize
717 &PackageVersion
, // PackageVersion
718 &PackageVersionName
// PackageVersionName
722 // If FMP GetInformation interface failed, skip this resource
724 if (EFI_ERROR(Status
)) {
725 Print(L
"FMP (%d) ImageInfo - %r\n", Index
, Status
);
726 FreePool(FmpImageInfoBuf
);
730 Print(L
"FMP (%d) ImageInfo:\n", Index
);
732 ImageInfoSize
, // ImageInfoSize
733 FmpImageInfoBuf
, // ImageInfo
734 FmpImageInfoDescriptorVer
, // DescriptorVersion
735 FmpImageInfoCount
, // DescriptorCount
736 DescriptorSize
, // DescriptorSize
737 PackageVersion
, // PackageVersion
738 PackageVersionName
// PackageVersionName
741 if (PackageVersionName
!= NULL
) {
742 FreePool(PackageVersionName
);
744 FreePool(FmpImageInfoBuf
);
749 PackageVersionName
= NULL
;
750 Status
= Fmp
->GetPackageInfo (
752 &PackageVersion
, // PackageVersion
753 &PackageVersionName
, // PackageVersionName
754 &PackageVersionNameMaxLen
, // PackageVersionNameMaxLen
755 &AttributesSupported
, // AttributesSupported
756 &AttributesSetting
// AttributesSetting
758 if (EFI_ERROR(Status
)) {
759 Print(L
"FMP (%d) PackageInfo - %r\n", Index
, Status
);
761 Print(L
"FMP (%d) ImageInfo:\n", Index
);
763 PackageVersion
, // PackageVersion
764 PackageVersionName
, // PackageVersionName
765 PackageVersionNameMaxLen
, // PackageVersionNameMaxLen
766 AttributesSupported
, // AttributesSupported
767 AttributesSetting
// AttributesSetting
770 if (PackageVersionName
!= NULL
) {
771 FreePool(PackageVersionName
);
778 FreePool(HandleBuffer
);
782 Check if the ImageInfo includes the ImageTypeId.
784 @param[in] ImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR.
785 @param[in] DescriptorCount The count of EFI_FIRMWARE_IMAGE_DESCRIPTOR.
786 @param[in] DescriptorSize The size of an individual EFI_FIRMWARE_IMAGE_DESCRIPTOR, in bytes.
787 @param[in] ImageTypeId A unique GUID identifying the firmware image type.
789 @return TRUE This ImageInfo includes the ImageTypeId
790 @return FALSE This ImageInfo does not include the ImageTypeId
794 IN EFI_FIRMWARE_IMAGE_DESCRIPTOR
*ImageInfo
,
795 IN UINT8 DescriptorCount
,
796 IN UINTN DescriptorSize
,
797 IN EFI_GUID
*ImageTypeId
800 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*CurrentImageInfo
;
803 CurrentImageInfo
= ImageInfo
;
804 for (Index
= 0; Index
< DescriptorCount
; Index
++) {
805 if (CompareGuid (&CurrentImageInfo
->ImageTypeId
, ImageTypeId
)) {
808 CurrentImageInfo
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR
*)((UINT8
*)CurrentImageInfo
+ DescriptorSize
);
814 return the FMP whoes ImageInfo includes the ImageTypeId.
816 @param[in] ImageTypeId A unique GUID identifying the firmware image type.
818 @return The FMP whoes ImageInfo includes the ImageTypeId
820 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*
821 FindFmpFromImageTypeId (
822 IN EFI_GUID
*ImageTypeId
826 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*Fmp
;
827 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*TargetFmp
;
828 EFI_HANDLE
*HandleBuffer
;
829 UINTN NumberOfHandles
;
831 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*FmpImageInfoBuf
;
833 UINT32 FmpImageInfoDescriptorVer
;
834 UINT8 FmpImageInfoCount
;
835 UINTN DescriptorSize
;
836 UINT32 PackageVersion
;
837 CHAR16
*PackageVersionName
;
839 Status
= gBS
->LocateHandleBuffer (
841 &gEfiFirmwareManagementProtocolGuid
,
846 if (EFI_ERROR(Status
)) {
847 Print(L
"FMP protocol - %r\n", EFI_NOT_FOUND
);
852 for (Index
= 0; Index
< NumberOfHandles
; Index
++) {
853 Status
= gBS
->HandleProtocol(
855 &gEfiFirmwareManagementProtocolGuid
,
858 if (EFI_ERROR(Status
)) {
863 Status
= Fmp
->GetImageInfo (
873 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
877 FmpImageInfoBuf
= NULL
;
878 FmpImageInfoBuf
= AllocateZeroPool (ImageInfoSize
);
879 if (FmpImageInfoBuf
== NULL
) {
880 FreePool(HandleBuffer
);
881 Print(L
"Out of resource\n");
885 PackageVersionName
= NULL
;
886 Status
= Fmp
->GetImageInfo (
888 &ImageInfoSize
, // ImageInfoSize
889 FmpImageInfoBuf
, // ImageInfo
890 &FmpImageInfoDescriptorVer
, // DescriptorVersion
891 &FmpImageInfoCount
, // DescriptorCount
892 &DescriptorSize
, // DescriptorSize
893 &PackageVersion
, // PackageVersion
894 &PackageVersionName
// PackageVersionName
898 // If FMP GetInformation interface failed, skip this resource
900 if (EFI_ERROR(Status
)) {
901 FreePool(FmpImageInfoBuf
);
905 if (PackageVersionName
!= NULL
) {
906 FreePool(PackageVersionName
);
909 if (IsThisFmpImageInfo (FmpImageInfoBuf
, FmpImageInfoCount
, DescriptorSize
, ImageTypeId
)) {
912 FreePool(FmpImageInfoBuf
);
913 if (TargetFmp
!= NULL
) {
917 FreePool(HandleBuffer
);
924 @param[in] ImageTypeId The ImageTypeId of the FMP image.
925 It is used to identify the FMP protocol.
926 @param[in] ImageIndex The ImageIndex of the FMP image.
927 It is the input parameter for FMP->GetImage().
928 @param[in] ImageName The file name to hold the output FMP image.
932 IN EFI_GUID
*ImageTypeId
,
938 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*Fmp
;
942 Fmp
= FindFmpFromImageTypeId (ImageTypeId
);
944 Print(L
"No FMP include ImageTypeId %g\n", ImageTypeId
);
948 if (ImageIndex
> 0xFF) {
949 Print(L
"ImageIndex 0x%x too big\n", ImageIndex
);
955 Status
= Fmp
->GetImage (Fmp
, (UINT8
)ImageIndex
, Image
, &ImageSize
);
956 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
957 Print(L
"Fmp->GetImage - %r\n", Status
);
961 Image
= AllocatePool (ImageSize
);
963 Print(L
"Allocate FmpImage 0x%x - %r\n", ImageSize
, EFI_OUT_OF_RESOURCES
);
967 Status
= Fmp
->GetImage (Fmp
, (UINT8
)ImageIndex
, Image
, &ImageSize
);
968 if (EFI_ERROR(Status
)) {
969 Print(L
"Fmp->GetImage - %r\n", Status
);
973 Status
= WriteFileFromBuffer(ImageName
, ImageSize
, Image
);
974 Print(L
"CapsuleApp: Dump %g ImageIndex (0x%x) to %s %r\n", ImageTypeId
, ImageIndex
, ImageName
, Status
);