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 Dump UX capsule information.
67 @param[in] CapsuleHeader The UX capsule header
71 IN EFI_CAPSULE_HEADER
*CapsuleHeader
74 EFI_DISPLAY_CAPSULE
*DisplayCapsule
;
75 DisplayCapsule
= (EFI_DISPLAY_CAPSULE
*)CapsuleHeader
;
76 Print(L
"[UxCapusule]\n");
77 Print(L
"CapsuleHeader:\n");
78 Print(L
" CapsuleGuid - %g\n", &DisplayCapsule
->CapsuleHeader
.CapsuleGuid
);
79 Print(L
" HeaderSize - 0x%x\n", DisplayCapsule
->CapsuleHeader
.HeaderSize
);
80 Print(L
" Flags - 0x%x\n", DisplayCapsule
->CapsuleHeader
.Flags
);
81 Print(L
" CapsuleImageSize - 0x%x\n", DisplayCapsule
->CapsuleHeader
.CapsuleImageSize
);
82 Print(L
"ImagePayload:\n");
83 Print(L
" Version - 0x%x\n", DisplayCapsule
->ImagePayload
.Version
);
84 Print(L
" Checksum - 0x%x\n", DisplayCapsule
->ImagePayload
.Checksum
);
85 Print(L
" ImageType - 0x%x\n", DisplayCapsule
->ImagePayload
.ImageType
);
86 Print(L
" Mode - 0x%x\n", DisplayCapsule
->ImagePayload
.Mode
);
87 Print(L
" OffsetX - 0x%x\n", DisplayCapsule
->ImagePayload
.OffsetX
);
88 Print(L
" OffsetY - 0x%x\n", DisplayCapsule
->ImagePayload
.OffsetY
);
92 Dump FMP image authentication information.
94 @param[in] Image The FMP capsule image
95 @param[in] ImageSize The size of the FMP capsule image in bytes.
97 @return the size of FMP authentication.
100 DumpImageAuthentication (
105 EFI_FIRMWARE_IMAGE_AUTHENTICATION
*ImageAuthentication
;
107 ImageAuthentication
= Image
;
108 if (CompareGuid(&ImageAuthentication
->AuthInfo
.CertType
, &gEfiCertPkcs7Guid
) ||
109 CompareGuid(&ImageAuthentication
->AuthInfo
.CertType
, &gEfiCertTypeRsa2048Sha256Guid
)) {
110 Print(L
"[ImageAuthentication]\n");
111 Print(L
" MonotonicCount - 0x%lx\n", ImageAuthentication
->MonotonicCount
);
112 Print(L
"WIN_CERTIFICATE:\n");
113 Print(L
" dwLength - 0x%x\n", ImageAuthentication
->AuthInfo
.Hdr
.dwLength
);
114 Print(L
" wRevision - 0x%x\n", ImageAuthentication
->AuthInfo
.Hdr
.wRevision
);
115 Print(L
" wCertificateType - 0x%x\n", ImageAuthentication
->AuthInfo
.Hdr
.wCertificateType
);
116 Print(L
" CertType - %g\n", &ImageAuthentication
->AuthInfo
.CertType
);
117 return sizeof(ImageAuthentication
->MonotonicCount
) + ImageAuthentication
->AuthInfo
.Hdr
.dwLength
;
124 Dump a non-nested FMP capsule.
126 @param[in] CapsuleHeader A pointer to CapsuleHeader
130 IN EFI_CAPSULE_HEADER
*CapsuleHeader
133 EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER
*FmpCapsuleHeader
;
134 UINT64
*ItemOffsetList
;
137 EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
*FmpImageHeader
;
139 Print(L
"[FmpCapusule]\n");
140 Print(L
"CapsuleHeader:\n");
141 Print(L
" CapsuleGuid - %g\n", &CapsuleHeader
->CapsuleGuid
);
142 Print(L
" HeaderSize - 0x%x\n", CapsuleHeader
->HeaderSize
);
143 Print(L
" Flags - 0x%x\n", CapsuleHeader
->Flags
);
144 Print(L
" CapsuleImageSize - 0x%x\n", CapsuleHeader
->CapsuleImageSize
);
146 FmpCapsuleHeader
= (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER
*)((UINT8
*)CapsuleHeader
+ CapsuleHeader
->HeaderSize
);
147 ItemOffsetList
= (UINT64
*)(FmpCapsuleHeader
+ 1);
148 Print(L
"FmpHeader:\n");
149 Print(L
" Version - 0x%x\n", FmpCapsuleHeader
->Version
);
150 Print(L
" EmbeddedDriverCount - 0x%x\n", FmpCapsuleHeader
->EmbeddedDriverCount
);
151 Print(L
" PayloadItemCount - 0x%x\n", FmpCapsuleHeader
->PayloadItemCount
);
152 Count
= FmpCapsuleHeader
->EmbeddedDriverCount
+ FmpCapsuleHeader
->PayloadItemCount
;
153 for (Index
= 0; Index
< Count
; Index
++) {
154 Print(L
" Offset[%d] - 0x%x\n", Index
, ItemOffsetList
[Index
]);
157 for (Index
= FmpCapsuleHeader
->EmbeddedDriverCount
; Index
< Count
; Index
++) {
158 Print(L
"FmpPayload[%d] ImageHeader:\n", Index
);
159 FmpImageHeader
= (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
*)((UINT8
*)FmpCapsuleHeader
+ ItemOffsetList
[Index
]);
160 Print(L
" Version - 0x%x\n", FmpImageHeader
->Version
);
161 Print(L
" UpdateImageTypeId - %g\n", &FmpImageHeader
->UpdateImageTypeId
);
162 Print(L
" UpdateImageIndex - 0x%x\n", FmpImageHeader
->UpdateImageIndex
);
163 Print(L
" UpdateImageSize - 0x%x\n", FmpImageHeader
->UpdateImageSize
);
164 Print(L
" UpdateVendorCodeSize - 0x%x\n", FmpImageHeader
->UpdateVendorCodeSize
);
165 if (FmpImageHeader
->Version
>= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION
) {
166 Print(L
" UpdateHardwareInstance - 0x%lx\n", FmpImageHeader
->UpdateHardwareInstance
);
172 Return if there is a FMP header below capsule header.
174 @param[in] CapsuleHeader A pointer to EFI_CAPSULE_HEADER
176 @retval TRUE There is a FMP header below capsule header.
177 @retval FALSE There is not a FMP header below capsule header
181 IN EFI_CAPSULE_HEADER
*CapsuleHeader
185 EFI_SYSTEM_RESOURCE_TABLE
*Esrt
;
186 EFI_SYSTEM_RESOURCE_ENTRY
*EsrtEntry
;
188 BOOLEAN EsrtGuidFound
;
189 EFI_CAPSULE_HEADER
*NestedCapsuleHeader
;
190 UINTN NestedCapsuleSize
;
195 EsrtGuidFound
= FALSE
;
196 Status
= EfiGetSystemConfigurationTable(&gEfiSystemResourceTableGuid
, (VOID
**)&Esrt
);
197 if (!EFI_ERROR(Status
)) {
198 ASSERT (Esrt
!= NULL
);
199 EsrtEntry
= (VOID
*)(Esrt
+ 1);
200 for (Index
= 0; Index
< Esrt
->FwResourceCount
; Index
++, EsrtEntry
++) {
201 if (CompareGuid(&EsrtEntry
->FwClass
, &CapsuleHeader
->CapsuleGuid
)) {
202 EsrtGuidFound
= TRUE
;
208 if (!EsrtGuidFound
) {
213 // Check nested capsule header
214 // FMP GUID after ESRT one
216 NestedCapsuleHeader
= (EFI_CAPSULE_HEADER
*)((UINT8
*)CapsuleHeader
+ CapsuleHeader
->HeaderSize
);
217 NestedCapsuleSize
= (UINTN
)CapsuleHeader
+ CapsuleHeader
->HeaderSize
- (UINTN
)NestedCapsuleHeader
;
218 if (NestedCapsuleSize
< sizeof(EFI_CAPSULE_HEADER
)) {
221 if (!CompareGuid(&NestedCapsuleHeader
->CapsuleGuid
, &gEfiFmpCapsuleGuid
)) {
228 Dump capsule information
230 @param[in] CapsuleName The name of the capsule image.
232 @retval EFI_SUCCESS The capsule information is dumped.
233 @retval EFI_UNSUPPORTED Input parameter is not valid.
237 IN CHAR16
*CapsuleName
242 EFI_CAPSULE_HEADER
*CapsuleHeader
;
246 Status
= ReadFileToBuffer(CapsuleName
, &FileSize
, &Buffer
);
247 if (EFI_ERROR(Status
)) {
248 Print(L
"CapsuleApp: Capsule (%s) is not found.\n", CapsuleName
);
252 CapsuleHeader
= Buffer
;
253 if (CompareGuid(&CapsuleHeader
->CapsuleGuid
, &gWindowsUxCapsuleGuid
)) {
254 DumpUxCapsule(CapsuleHeader
);
255 Status
= EFI_SUCCESS
;
259 if (CompareGuid(&CapsuleHeader
->CapsuleGuid
, &gEfiFmpCapsuleGuid
)) {
260 DumpFmpCapsule(CapsuleHeader
);
262 if (IsNestedFmpCapsule(CapsuleHeader
)) {
263 Print(L
"[NestedCapusule]\n");
264 Print(L
"CapsuleHeader:\n");
265 Print(L
" CapsuleGuid - %g\n", &CapsuleHeader
->CapsuleGuid
);
266 Print(L
" HeaderSize - 0x%x\n", CapsuleHeader
->HeaderSize
);
267 Print(L
" Flags - 0x%x\n", CapsuleHeader
->Flags
);
268 Print(L
" CapsuleImageSize - 0x%x\n", CapsuleHeader
->CapsuleImageSize
);
269 DumpFmpCapsule((EFI_CAPSULE_HEADER
*)((UINTN
)CapsuleHeader
+ CapsuleHeader
->HeaderSize
));
273 if (Buffer
!= NULL
) {
280 Dump capsule status variable.
282 @retval EFI_SUCCESS The capsule status variable is dumped.
283 @retval EFI_UNSUPPORTED Input parameter is not valid.
286 DmpCapsuleStatusVariable (
292 CHAR16 CapsuleVarName
[20];
294 EFI_CAPSULE_RESULT_VARIABLE_HEADER
*CapsuleResult
;
295 EFI_CAPSULE_RESULT_VARIABLE_FMP
*CapsuleResultFmp
;
296 UINTN CapsuleFileNameSize
;
297 CHAR16 CapsuleIndexData
[12];
298 CHAR16
*CapsuleIndex
;
299 CHAR16
*CapsuleFileName
;
300 CHAR16
*CapsuleTarget
;
302 Status
= GetVariable2(
304 &gEfiCapsuleReportGuid
,
305 (VOID
**)&CapsuleIndex
,
308 if (!EFI_ERROR(Status
)) {
309 ASSERT (CapsuleIndex
!= NULL
);
310 CopyMem(CapsuleIndexData
, CapsuleIndex
, 11 * sizeof(CHAR16
));
311 CapsuleIndexData
[11] = 0;
312 Print(L
"CapsuleMax - %s\n", CapsuleIndexData
);
313 FreePool(CapsuleIndex
);
315 Status
= GetVariable2(
317 &gEfiCapsuleReportGuid
,
318 (VOID
**)&CapsuleIndex
,
321 if (!EFI_ERROR(Status
)) {
322 ASSERT (CapsuleIndex
!= NULL
);
323 CopyMem(CapsuleIndexData
, CapsuleIndex
, 11 * sizeof(CHAR16
));
324 CapsuleIndexData
[11] = 0;
325 Print(L
"CapsuleLast - %s\n", CapsuleIndexData
);
326 FreePool(CapsuleIndex
);
330 StrCpyS (CapsuleVarName
, sizeof(CapsuleVarName
)/sizeof(CapsuleVarName
[0]), L
"Capsule");
331 TempVarName
= CapsuleVarName
+ StrLen (CapsuleVarName
);
335 UnicodeSPrint (TempVarName
, 5 * sizeof(CHAR16
), L
"%04x", Index
);
337 Status
= GetVariable2 (
339 &gEfiCapsuleReportGuid
,
340 (VOID
**) &CapsuleResult
,
343 if (Status
== EFI_NOT_FOUND
) {
345 } else if (EFI_ERROR(Status
)) {
348 ASSERT (CapsuleResult
!= NULL
);
351 // display capsule process status
353 if (CapsuleResult
->VariableTotalSize
>= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER
)) {
354 Print (L
"CapsuleName: %s\n", CapsuleVarName
);
355 Print (L
" Capsule Guid: %g\n", &CapsuleResult
->CapsuleGuid
);
356 Print (L
" Capsule ProcessedTime: %t\n", &CapsuleResult
->CapsuleProcessed
);
357 Print (L
" Capsule Status: %r\n", CapsuleResult
->CapsuleStatus
);
360 if (CompareGuid(&CapsuleResult
->CapsuleGuid
, &gEfiFmpCapsuleGuid
)) {
361 if (CapsuleResult
->VariableTotalSize
>= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER
) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP
) + sizeof(CHAR16
) * 2) {
362 CapsuleResultFmp
= (EFI_CAPSULE_RESULT_VARIABLE_FMP
*)(CapsuleResult
+ 1);
363 Print(L
" Capsule FMP Version: 0x%x\n", CapsuleResultFmp
->Version
);
364 Print(L
" Capsule FMP PayloadIndex: 0x%x\n", CapsuleResultFmp
->PayloadIndex
);
365 Print(L
" Capsule FMP UpdateImageIndex: 0x%x\n", CapsuleResultFmp
->UpdateImageIndex
);
366 Print(L
" Capsule FMP UpdateImageTypeId: %g\n", &CapsuleResultFmp
->UpdateImageTypeId
);
367 CapsuleFileName
= (CHAR16
*)(CapsuleResultFmp
+ 1);
368 Print(L
" Capsule FMP CapsuleFileName: \"%s\"\n", CapsuleFileName
);
369 CapsuleFileNameSize
= StrSize(CapsuleFileName
);
370 CapsuleTarget
= (CHAR16
*)((UINTN
)CapsuleFileName
+ CapsuleFileNameSize
);
371 Print(L
" Capsule FMP CapsuleTarget: \"%s\"\n", CapsuleTarget
);
375 FreePool(CapsuleResult
);
378 if (Index
> 0xFFFF) {
386 CHAR8
*mFwTypeString
[] = {
393 CHAR8
*mLastAttemptStatusString
[] = {
395 "Error: Unsuccessful",
396 "Error: Insufficient Resources",
397 "Error: Incorrect Version",
398 "Error: Invalid Format",
400 "Error: Power Event AC",
401 "Error: Power Event Battery",
405 Convert FwType to a string.
407 @param[in] FwType FwType in ESRT
409 @return a string for FwType.
416 if (FwType
< sizeof(mFwTypeString
) / sizeof(mFwTypeString
[0])) {
417 return mFwTypeString
[FwType
];
424 Convert LastAttemptStatus to a string.
426 @param[in] LastAttemptStatus LastAttemptStatus in FMP or ESRT
428 @return a string for LastAttemptStatus.
431 LastAttemptStatusToString (
432 IN UINT32 LastAttemptStatus
435 if (LastAttemptStatus
< sizeof(mLastAttemptStatusString
) / sizeof(mLastAttemptStatusString
[0])) {
436 return mLastAttemptStatusString
[LastAttemptStatus
];
438 return "Error: Unknown";
445 @param[in] EsrtEntry ESRT entry
449 IN EFI_SYSTEM_RESOURCE_ENTRY
*EsrtEntry
452 Print(L
" FwClass - %g\n", &EsrtEntry
->FwClass
);
453 Print(L
" FwType - 0x%x (%a)\n", EsrtEntry
->FwType
, FwTypeToString(EsrtEntry
->FwType
));
454 Print(L
" FwVersion - 0x%x\n", EsrtEntry
->FwVersion
);
455 Print(L
" LowestSupportedFwVersion - 0x%x\n", EsrtEntry
->LowestSupportedFwVersion
);
456 Print(L
" CapsuleFlags - 0x%x\n", EsrtEntry
->CapsuleFlags
);
457 Print(L
" PERSIST_ACROSS_RESET - 0x%x\n", EsrtEntry
->CapsuleFlags
& CAPSULE_FLAGS_PERSIST_ACROSS_RESET
);
458 Print(L
" POPULATE_SYSTEM_TABLE - 0x%x\n", EsrtEntry
->CapsuleFlags
& CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE
);
459 Print(L
" INITIATE_RESET - 0x%x\n", EsrtEntry
->CapsuleFlags
& CAPSULE_FLAGS_INITIATE_RESET
);
460 Print(L
" LastAttemptVersion - 0x%x\n", EsrtEntry
->LastAttemptVersion
);
461 Print(L
" LastAttemptStatus - 0x%x (%a)\n", EsrtEntry
->LastAttemptStatus
, LastAttemptStatusToString(EsrtEntry
->LastAttemptStatus
));
467 @param[in] Esrt ESRT table
471 IN EFI_SYSTEM_RESOURCE_TABLE
*Esrt
475 EFI_SYSTEM_RESOURCE_ENTRY
*EsrtEntry
;
481 Print(L
"EFI_SYSTEM_RESOURCE_TABLE:\n");
482 Print(L
"FwResourceCount - 0x%x\n", Esrt
->FwResourceCount
);
483 Print(L
"FwResourceCountMax - 0x%x\n", Esrt
->FwResourceCountMax
);
484 Print(L
"FwResourceVersion - 0x%lx\n", Esrt
->FwResourceVersion
);
486 EsrtEntry
= (VOID
*)(Esrt
+ 1);
487 for (Index
= 0; Index
< Esrt
->FwResourceCount
; Index
++) {
488 Print(L
"EFI_SYSTEM_RESOURCE_ENTRY (%d):\n", Index
);
489 DumpEsrtEntry(EsrtEntry
);
503 EFI_SYSTEM_RESOURCE_TABLE
*Esrt
;
505 Print(L
"##############\n");
506 Print(L
"# ESRT TABLE #\n");
507 Print(L
"##############\n");
509 Status
= EfiGetSystemConfigurationTable (&gEfiSystemResourceTableGuid
, (VOID
**)&Esrt
);
510 if (EFI_ERROR(Status
)) {
511 Print(L
"ESRT - %r\n", Status
);
519 Dump FMP information.
521 @param[in] ImageInfoSize The size of ImageInfo, in bytes.
522 @param[in] ImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR.
523 @param[in] DescriptorVersion The version of EFI_FIRMWARE_IMAGE_DESCRIPTOR.
524 @param[in] DescriptorCount The count of EFI_FIRMWARE_IMAGE_DESCRIPTOR.
525 @param[in] DescriptorSize The size of an individual EFI_FIRMWARE_IMAGE_DESCRIPTOR, in bytes.
526 @param[in] PackageVersion The version of package.
527 @param[in] PackageVersionName The version name of package.
531 IN UINTN ImageInfoSize
,
532 IN EFI_FIRMWARE_IMAGE_DESCRIPTOR
*ImageInfo
,
533 IN UINT32 DescriptorVersion
,
534 IN UINT8 DescriptorCount
,
535 IN UINTN DescriptorSize
,
536 IN UINT32 PackageVersion
,
537 IN CHAR16
*PackageVersionName
540 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*CurrentImageInfo
;
543 Print(L
" DescriptorVersion - 0x%x\n", DescriptorVersion
);
544 Print(L
" DescriptorCount - 0x%x\n", DescriptorCount
);
545 Print(L
" DescriptorSize - 0x%x\n", DescriptorSize
);
546 Print(L
" PackageVersion - 0x%x\n", PackageVersion
);
547 Print(L
" PackageVersionName - \"%s\"\n", PackageVersionName
);
548 CurrentImageInfo
= ImageInfo
;
549 for (Index
= 0; Index
< DescriptorCount
; Index
++) {
550 Print(L
" ImageDescriptor (%d)\n", Index
);
551 Print(L
" ImageIndex - 0x%x\n", CurrentImageInfo
->ImageIndex
);
552 Print(L
" ImageTypeId - %g\n", &CurrentImageInfo
->ImageTypeId
);
553 Print(L
" ImageId - 0x%lx\n", CurrentImageInfo
->ImageId
);
554 Print(L
" ImageIdName - \"%s\"\n", CurrentImageInfo
->ImageIdName
);
555 Print(L
" Version - 0x%x\n", CurrentImageInfo
->Version
);
556 Print(L
" VersionName - \"%s\"\n", CurrentImageInfo
->VersionName
);
557 Print(L
" Size - 0x%x\n", CurrentImageInfo
->Size
);
558 Print(L
" AttributesSupported - 0x%lx\n", CurrentImageInfo
->AttributesSupported
);
559 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
560 Print(L
" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
561 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
562 Print(L
" IN_USE - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_IN_USE
);
563 Print(L
" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_UEFI_IMAGE
);
564 Print(L
" AttributesSetting - 0x%lx\n", CurrentImageInfo
->AttributesSetting
);
565 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
566 Print(L
" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
567 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
568 Print(L
" IN_USE - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_IN_USE
);
569 Print(L
" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_UEFI_IMAGE
);
570 Print(L
" Compatibilities - 0x%lx\n", CurrentImageInfo
->Compatibilities
);
571 Print(L
" COMPATIB_CHECK_SUPPORTED - 0x%lx\n", CurrentImageInfo
->Compatibilities
& IMAGE_COMPATIBILITY_CHECK_SUPPORTED
);
572 if (DescriptorVersion
> 1) {
573 Print(L
" LowestSupportedImageVersion - 0x%x\n", CurrentImageInfo
->LowestSupportedImageVersion
);
574 if (DescriptorVersion
> 2) {
575 Print(L
" LastAttemptVersion - 0x%x\n", CurrentImageInfo
->LastAttemptVersion
);
576 Print(L
" LastAttemptStatus - 0x%x (%a)\n", CurrentImageInfo
->LastAttemptStatus
, LastAttemptStatusToString(CurrentImageInfo
->LastAttemptStatus
));
577 Print(L
" HardwareInstance - 0x%lx\n", CurrentImageInfo
->HardwareInstance
);
581 // Use DescriptorSize to move ImageInfo Pointer to stay compatible with different ImageInfo version
583 CurrentImageInfo
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR
*)((UINT8
*)CurrentImageInfo
+ DescriptorSize
);
588 Dump FMP package information.
590 @param[in] PackageVersion The version of package.
591 @param[in] PackageVersionName The version name of package.
592 @param[in] PackageVersionNameMaxLen The maximum length of PackageVersionName.
593 @param[in] AttributesSupported Package attributes that are supported by this device.
594 @param[in] AttributesSetting Package attributes.
598 IN UINT32 PackageVersion
,
599 IN CHAR16
*PackageVersionName
,
600 IN UINT32 PackageVersionNameMaxLen
,
601 IN UINT64 AttributesSupported
,
602 IN UINT64 AttributesSetting
605 Print(L
" PackageVersion - 0x%x\n", PackageVersion
);
606 Print(L
" PackageVersionName - \"%s\"\n", PackageVersionName
);
607 Print(L
" PackageVersionNameMaxLen - 0x%x\n", PackageVersionNameMaxLen
);
608 Print(L
" AttributesSupported - 0x%lx\n", AttributesSupported
);
609 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", AttributesSupported
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
610 Print(L
" RESET_REQUIRED - 0x%lx\n", AttributesSupported
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
611 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSupported
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
612 Print(L
" AttributesSetting - 0x%lx\n", AttributesSetting
);
613 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", AttributesSetting
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
614 Print(L
" RESET_REQUIRED - 0x%lx\n", AttributesSetting
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
615 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSetting
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
619 Dump FMP protocol info.
627 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*Fmp
;
628 EFI_HANDLE
*HandleBuffer
;
629 UINTN NumberOfHandles
;
631 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*FmpImageInfoBuf
;
633 UINT32 FmpImageInfoDescriptorVer
;
634 UINT8 FmpImageInfoCount
;
635 UINTN DescriptorSize
;
636 UINT32 PackageVersion
;
637 CHAR16
*PackageVersionName
;
638 UINT32 PackageVersionNameMaxLen
;
639 UINT64 AttributesSupported
;
640 UINT64 AttributesSetting
;
642 Print(L
"############\n");
643 Print(L
"# FMP DATA #\n");
644 Print(L
"############\n");
645 Status
= gBS
->LocateHandleBuffer (
647 &gEfiFirmwareManagementProtocolGuid
,
652 if (EFI_ERROR(Status
)) {
653 Print(L
"FMP protocol - %r\n", EFI_NOT_FOUND
);
657 for (Index
= 0; Index
< NumberOfHandles
; Index
++) {
658 Status
= gBS
->HandleProtocol(
660 &gEfiFirmwareManagementProtocolGuid
,
663 if (EFI_ERROR(Status
)) {
668 Status
= Fmp
->GetImageInfo (
678 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
682 FmpImageInfoBuf
= NULL
;
683 FmpImageInfoBuf
= AllocateZeroPool (ImageInfoSize
);
684 if (FmpImageInfoBuf
== NULL
) {
685 Status
= EFI_OUT_OF_RESOURCES
;
689 PackageVersionName
= NULL
;
690 Status
= Fmp
->GetImageInfo (
692 &ImageInfoSize
, // ImageInfoSize
693 FmpImageInfoBuf
, // ImageInfo
694 &FmpImageInfoDescriptorVer
, // DescriptorVersion
695 &FmpImageInfoCount
, // DescriptorCount
696 &DescriptorSize
, // DescriptorSize
697 &PackageVersion
, // PackageVersion
698 &PackageVersionName
// PackageVersionName
702 // If FMP GetInformation interface failed, skip this resource
704 if (EFI_ERROR(Status
)) {
705 Print(L
"FMP (%d) ImageInfo - %r\n", Index
, Status
);
706 FreePool(FmpImageInfoBuf
);
710 Print(L
"FMP (%d) ImageInfo:\n", Index
);
712 ImageInfoSize
, // ImageInfoSize
713 FmpImageInfoBuf
, // ImageInfo
714 FmpImageInfoDescriptorVer
, // DescriptorVersion
715 FmpImageInfoCount
, // DescriptorCount
716 DescriptorSize
, // DescriptorSize
717 PackageVersion
, // PackageVersion
718 PackageVersionName
// PackageVersionName
721 if (PackageVersionName
!= NULL
) {
722 FreePool(PackageVersionName
);
724 FreePool(FmpImageInfoBuf
);
729 PackageVersionName
= NULL
;
730 Status
= Fmp
->GetPackageInfo (
732 &PackageVersion
, // PackageVersion
733 &PackageVersionName
, // PackageVersionName
734 &PackageVersionNameMaxLen
, // PackageVersionNameMaxLen
735 &AttributesSupported
, // AttributesSupported
736 &AttributesSetting
// AttributesSetting
738 if (EFI_ERROR(Status
)) {
739 Print(L
"FMP (%d) PackageInfo - %r\n", Index
, Status
);
741 Print(L
"FMP (%d) ImageInfo:\n", Index
);
743 PackageVersion
, // PackageVersion
744 PackageVersionName
, // PackageVersionName
745 PackageVersionNameMaxLen
, // PackageVersionNameMaxLen
746 AttributesSupported
, // AttributesSupported
747 AttributesSetting
// AttributesSetting
750 if (PackageVersionName
!= NULL
) {
751 FreePool(PackageVersionName
);
758 FreePool(HandleBuffer
);
762 Check if the ImageInfo includes the ImageTypeId.
764 @param[in] ImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR.
765 @param[in] DescriptorCount The count of EFI_FIRMWARE_IMAGE_DESCRIPTOR.
766 @param[in] DescriptorSize The size of an individual EFI_FIRMWARE_IMAGE_DESCRIPTOR, in bytes.
767 @param[in] ImageTypeId A unique GUID identifying the firmware image type.
769 @return TRUE This ImageInfo includes the ImageTypeId
770 @return FALSE This ImageInfo does not include the ImageTypeId
774 IN EFI_FIRMWARE_IMAGE_DESCRIPTOR
*ImageInfo
,
775 IN UINT8 DescriptorCount
,
776 IN UINTN DescriptorSize
,
777 IN EFI_GUID
*ImageTypeId
780 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*CurrentImageInfo
;
783 CurrentImageInfo
= ImageInfo
;
784 for (Index
= 0; Index
< DescriptorCount
; Index
++) {
785 if (CompareGuid (&CurrentImageInfo
->ImageTypeId
, ImageTypeId
)) {
788 CurrentImageInfo
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR
*)((UINT8
*)CurrentImageInfo
+ DescriptorSize
);
794 return the FMP whoes ImageInfo includes the ImageTypeId.
796 @param[in] ImageTypeId A unique GUID identifying the firmware image type.
798 @return The FMP whoes ImageInfo includes the ImageTypeId
800 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*
801 FindFmpFromImageTypeId (
802 IN EFI_GUID
*ImageTypeId
806 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*Fmp
;
807 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*TargetFmp
;
808 EFI_HANDLE
*HandleBuffer
;
809 UINTN NumberOfHandles
;
811 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*FmpImageInfoBuf
;
813 UINT32 FmpImageInfoDescriptorVer
;
814 UINT8 FmpImageInfoCount
;
815 UINTN DescriptorSize
;
816 UINT32 PackageVersion
;
817 CHAR16
*PackageVersionName
;
819 Status
= gBS
->LocateHandleBuffer (
821 &gEfiFirmwareManagementProtocolGuid
,
826 if (EFI_ERROR(Status
)) {
827 Print(L
"FMP protocol - %r\n", EFI_NOT_FOUND
);
832 for (Index
= 0; Index
< NumberOfHandles
; Index
++) {
833 Status
= gBS
->HandleProtocol(
835 &gEfiFirmwareManagementProtocolGuid
,
838 if (EFI_ERROR(Status
)) {
843 Status
= Fmp
->GetImageInfo (
853 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
857 FmpImageInfoBuf
= NULL
;
858 FmpImageInfoBuf
= AllocateZeroPool (ImageInfoSize
);
859 if (FmpImageInfoBuf
== NULL
) {
860 FreePool(HandleBuffer
);
861 Print(L
"Out of resource\n");
865 PackageVersionName
= NULL
;
866 Status
= Fmp
->GetImageInfo (
868 &ImageInfoSize
, // ImageInfoSize
869 FmpImageInfoBuf
, // ImageInfo
870 &FmpImageInfoDescriptorVer
, // DescriptorVersion
871 &FmpImageInfoCount
, // DescriptorCount
872 &DescriptorSize
, // DescriptorSize
873 &PackageVersion
, // PackageVersion
874 &PackageVersionName
// PackageVersionName
878 // If FMP GetInformation interface failed, skip this resource
880 if (EFI_ERROR(Status
)) {
881 FreePool(FmpImageInfoBuf
);
885 if (PackageVersionName
!= NULL
) {
886 FreePool(PackageVersionName
);
889 if (IsThisFmpImageInfo (FmpImageInfoBuf
, FmpImageInfoCount
, DescriptorSize
, ImageTypeId
)) {
892 FreePool(FmpImageInfoBuf
);
893 if (TargetFmp
!= NULL
) {
897 FreePool(HandleBuffer
);
904 @param[in] ImageTypeId The ImageTypeId of the FMP image.
905 It is used to identify the FMP protocol.
906 @param[in] ImageIndex The ImageIndex of the FMP image.
907 It is the input parameter for FMP->GetImage().
908 @param[in] ImageName The file name to hold the output FMP image.
912 IN EFI_GUID
*ImageTypeId
,
918 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*Fmp
;
922 Fmp
= FindFmpFromImageTypeId (ImageTypeId
);
924 Print(L
"No FMP include ImageTypeId %g\n", ImageTypeId
);
928 if (ImageIndex
> 0xFF) {
929 Print(L
"ImageIndex 0x%x too big\n", ImageIndex
);
935 Status
= Fmp
->GetImage (Fmp
, (UINT8
)ImageIndex
, Image
, &ImageSize
);
936 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
937 Print(L
"Fmp->GetImage - %r\n", Status
);
941 Image
= AllocatePool (ImageSize
);
943 Print(L
"Allocate FmpImage 0x%x - %r\n", ImageSize
, EFI_OUT_OF_RESOURCES
);
947 Status
= Fmp
->GetImage (Fmp
, (UINT8
)ImageIndex
, Image
, &ImageSize
);
948 if (EFI_ERROR(Status
)) {
949 Print(L
"Fmp->GetImage - %r\n", Status
);
953 Status
= WriteFileFromBuffer(ImageName
, ImageSize
, Image
);
954 Print(L
"CapsuleApp: Dump %g ImageIndex (0x%x) to %s %r\n", ImageTypeId
, ImageIndex
, ImageName
, Status
);