ValidateFmpCapsule(), and DisplayCapsuleImage() receives untrusted input and\r
performs basic validation.\r
\r
- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include <Library/CapsuleLib.h>\r
#include <Library/DevicePathLib.h>\r
#include <Library/UefiLib.h>\r
-#include <Library/PcdLib.h>\r
#include <Library/BmpSupportLib.h>\r
\r
#include <Protocol/GraphicsOutput.h>\r
#include <Protocol/FirmwareManagementProgress.h>\r
#include <Protocol/DevicePath.h>\r
\r
-EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable = NULL;\r
-BOOLEAN mIsVirtualAddrConverted = FALSE;\r
+EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable = NULL;\r
+BOOLEAN mIsVirtualAddrConverted = FALSE;\r
\r
-BOOLEAN mDxeCapsuleLibEndOfDxe = FALSE;\r
-EFI_EVENT mDxeCapsuleLibEndOfDxeEvent = NULL;\r
+BOOLEAN mDxeCapsuleLibEndOfDxe = FALSE;\r
+EFI_EVENT mDxeCapsuleLibEndOfDxeEvent = NULL;\r
\r
EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL *mFmpProgress = NULL;\r
\r
**/\r
EFI_STATUS\r
RecordCapsuleStatusVariable (\r
- IN EFI_CAPSULE_HEADER *CapsuleHeader,\r
- IN EFI_STATUS CapsuleStatus\r
+ IN EFI_CAPSULE_HEADER *CapsuleHeader,\r
+ IN EFI_STATUS CapsuleStatus\r
);\r
\r
/**\r
@param[in] PayloadIndex FMP payload index\r
@param[in] ImageHeader FMP image header\r
@param[in] FmpDevicePath DevicePath associated with the FMP producer\r
+ @param[in] CapFileName Capsule file name\r
\r
@retval EFI_SUCCESS The capsule status variable is recorded.\r
@retval EFI_OUT_OF_RESOURCES No resource to record the capsule status variable.\r
IN EFI_STATUS CapsuleStatus,\r
IN UINTN PayloadIndex,\r
IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader,\r
- IN EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath OPTIONAL\r
+ IN EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath OPTIONAL,\r
+ IN CHAR16 *CapFileName OPTIONAL\r
);\r
\r
/**\r
IN UINTN Completion\r
);\r
\r
+/**\r
+ Return if this capsule is a capsule name capsule, based upon CapsuleHeader.\r
+\r
+ @param[in] CapsuleHeader A pointer to EFI_CAPSULE_HEADER\r
+\r
+ @retval TRUE It is a capsule name capsule.\r
+ @retval FALSE It is not a capsule name capsule.\r
+**/\r
+BOOLEAN\r
+IsCapsuleNameCapsule (\r
+ IN EFI_CAPSULE_HEADER *CapsuleHeader\r
+ )\r
+{\r
+ return CompareGuid (&CapsuleHeader->CapsuleGuid, &gEdkiiCapsuleOnDiskNameGuid);\r
+}\r
+\r
/**\r
Return if this CapsuleGuid is a FMP capsule GUID or not.\r
\r
IN EFI_GUID *CapsuleGuid\r
)\r
{\r
- if (CompareGuid(&gEfiFmpCapsuleGuid, CapsuleGuid)) {\r
+ if (CompareGuid (&gEfiFmpCapsuleGuid, CapsuleGuid)) {\r
return TRUE;\r
}\r
\r
if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {\r
return FALSE;\r
}\r
+\r
if (CapsuleHeader->HeaderSize >= CapsuleHeader->CapsuleImageSize) {\r
return FALSE;\r
}\r
+\r
return TRUE;\r
}\r
\r
OUT UINT16 *EmbeddedDriverCount OPTIONAL\r
)\r
{\r
- EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader;\r
- UINT8 *EndOfCapsule;\r
- EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader;\r
- UINT8 *EndOfPayload;\r
- UINT64 *ItemOffsetList;\r
- UINT32 ItemNum;\r
- UINTN Index;\r
- UINTN FmpCapsuleSize;\r
- UINTN FmpCapsuleHeaderSize;\r
- UINT64 FmpImageSize;\r
- UINTN FmpImageHeaderSize;\r
-\r
- if (!IsFmpCapsuleGuid(&CapsuleHeader->CapsuleGuid)) {\r
+ EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader;\r
+ UINT8 *EndOfCapsule;\r
+ EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader;\r
+ UINT8 *EndOfPayload;\r
+ UINT64 *ItemOffsetList;\r
+ UINT32 ItemNum;\r
+ UINTN Index;\r
+ UINTN FmpCapsuleSize;\r
+ UINTN FmpCapsuleHeaderSize;\r
+ UINT64 FmpImageSize;\r
+ UINTN FmpImageHeaderSize;\r
+\r
+ if (!IsFmpCapsuleGuid (&CapsuleHeader->CapsuleGuid)) {\r
return ValidateFmpCapsule ((EFI_CAPSULE_HEADER *)((UINTN)CapsuleHeader + CapsuleHeader->HeaderSize), EmbeddedDriverCount);\r
}\r
\r
if (CapsuleHeader->HeaderSize >= CapsuleHeader->CapsuleImageSize) {\r
- DEBUG((DEBUG_ERROR, "HeaderSize(0x%x) >= CapsuleImageSize(0x%x)\n", CapsuleHeader->HeaderSize, CapsuleHeader->CapsuleImageSize));\r
+ DEBUG ((DEBUG_ERROR, "HeaderSize(0x%x) >= CapsuleImageSize(0x%x)\n", CapsuleHeader->HeaderSize, CapsuleHeader->CapsuleImageSize));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *) ((UINT8 *) CapsuleHeader + CapsuleHeader->HeaderSize);\r
- EndOfCapsule = (UINT8 *) CapsuleHeader + CapsuleHeader->CapsuleImageSize;\r
+ FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);\r
+ EndOfCapsule = (UINT8 *)CapsuleHeader + CapsuleHeader->CapsuleImageSize;\r
FmpCapsuleSize = (UINTN)EndOfCapsule - (UINTN)FmpCapsuleHeader;\r
\r
- if (FmpCapsuleSize < sizeof(EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER)) {\r
- DEBUG((DEBUG_ERROR, "FmpCapsuleSize(0x%x) < EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER\n", FmpCapsuleSize));\r
+ if (FmpCapsuleSize < sizeof (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER)) {\r
+ DEBUG ((DEBUG_ERROR, "FmpCapsuleSize(0x%x) < EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER\n", FmpCapsuleSize));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
// Check EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER\r
if (FmpCapsuleHeader->Version != EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER_INIT_VERSION) {\r
- DEBUG((DEBUG_ERROR, "FmpCapsuleHeader->Version(0x%x) != EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER_INIT_VERSION\n", FmpCapsuleHeader->Version));\r
+ DEBUG ((DEBUG_ERROR, "FmpCapsuleHeader->Version(0x%x) != EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER_INIT_VERSION\n", FmpCapsuleHeader->Version));\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);\r
\r
// No overflow\r
ItemNum = FmpCapsuleHeader->EmbeddedDriverCount + FmpCapsuleHeader->PayloadItemCount;\r
\r
- if ((FmpCapsuleSize - sizeof(EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER))/sizeof(UINT64) < ItemNum) {\r
- DEBUG((DEBUG_ERROR, "ItemNum(0x%x) too big\n", ItemNum));\r
+ if ((FmpCapsuleSize - sizeof (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER))/sizeof (UINT64) < ItemNum) {\r
+ DEBUG ((DEBUG_ERROR, "ItemNum(0x%x) too big\n", ItemNum));\r
return EFI_INVALID_PARAMETER;\r
}\r
- FmpCapsuleHeaderSize = sizeof(EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER) + sizeof(UINT64)*ItemNum;\r
+\r
+ FmpCapsuleHeaderSize = sizeof (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER) + sizeof (UINT64)*ItemNum;\r
\r
// Check ItemOffsetList\r
for (Index = 0; Index < ItemNum; Index++) {\r
if (ItemOffsetList[Index] >= FmpCapsuleSize) {\r
- DEBUG((DEBUG_ERROR, "ItemOffsetList[%d](0x%lx) >= FmpCapsuleSize(0x%x)\n", Index, ItemOffsetList[Index], FmpCapsuleSize));\r
+ DEBUG ((DEBUG_ERROR, "ItemOffsetList[%d](0x%lx) >= FmpCapsuleSize(0x%x)\n", Index, ItemOffsetList[Index], FmpCapsuleSize));\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
if (ItemOffsetList[Index] < FmpCapsuleHeaderSize) {\r
- DEBUG((DEBUG_ERROR, "ItemOffsetList[%d](0x%lx) < FmpCapsuleHeaderSize(0x%x)\n", Index, ItemOffsetList[Index], FmpCapsuleHeaderSize));\r
+ DEBUG ((DEBUG_ERROR, "ItemOffsetList[%d](0x%lx) < FmpCapsuleHeaderSize(0x%x)\n", Index, ItemOffsetList[Index], FmpCapsuleHeaderSize));\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
//\r
// All the address in ItemOffsetList must be stored in ascending order\r
//\r
if (Index > 0) {\r
if (ItemOffsetList[Index] <= ItemOffsetList[Index - 1]) {\r
- DEBUG((DEBUG_ERROR, "ItemOffsetList[%d](0x%lx) < ItemOffsetList[%d](0x%x)\n", Index, ItemOffsetList[Index], Index - 1, ItemOffsetList[Index - 1]));\r
+ DEBUG ((DEBUG_ERROR, "ItemOffsetList[%d](0x%lx) < ItemOffsetList[%d](0x%x)\n", Index, ItemOffsetList[Index], Index - 1, ItemOffsetList[Index - 1]));\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
\r
// Check EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER\r
for (Index = FmpCapsuleHeader->EmbeddedDriverCount; Index < ItemNum; Index++) {\r
- ImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[Index]);\r
+ ImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[Index]);\r
if (Index == ItemNum - 1) {\r
EndOfPayload = (UINT8 *)((UINTN)EndOfCapsule - (UINTN)FmpCapsuleHeader);\r
} else {\r
EndOfPayload = (UINT8 *)(UINTN)ItemOffsetList[Index+1];\r
}\r
+\r
FmpImageSize = (UINTN)EndOfPayload - ItemOffsetList[Index];\r
\r
- FmpImageHeaderSize = sizeof(EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER);\r
+ FmpImageHeaderSize = sizeof (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER);\r
if ((ImageHeader->Version > EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) ||\r
- (ImageHeader->Version < 1)) {\r
- DEBUG((DEBUG_ERROR, "ImageHeader->Version(0x%x) Unknown\n", ImageHeader->Version));\r
+ (ImageHeader->Version < 1))\r
+ {\r
+ DEBUG ((DEBUG_ERROR, "ImageHeader->Version(0x%x) Unknown\n", ImageHeader->Version));\r
return EFI_INVALID_PARAMETER;\r
}\r
- if (ImageHeader->Version < EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) {\r
- FmpImageHeaderSize = OFFSET_OF(EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER, UpdateHardwareInstance);\r
+\r
+ if (ImageHeader->Version == 1) {\r
+ FmpImageHeaderSize = OFFSET_OF (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER, UpdateHardwareInstance);\r
+ } else if (ImageHeader->Version == 2) {\r
+ FmpImageHeaderSize = OFFSET_OF (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER, ImageCapsuleSupport);\r
}\r
+\r
if (FmpImageSize < FmpImageHeaderSize) {\r
- DEBUG((DEBUG_ERROR, "FmpImageSize(0x%lx) < FmpImageHeaderSize(0x%x)\n", FmpImageSize, FmpImageHeaderSize));\r
+ DEBUG ((DEBUG_ERROR, "FmpImageSize(0x%lx) < FmpImageHeaderSize(0x%x)\n", FmpImageSize, FmpImageHeaderSize));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
// No overflow\r
if (FmpImageSize != (UINT64)FmpImageHeaderSize + (UINT64)ImageHeader->UpdateImageSize + (UINT64)ImageHeader->UpdateVendorCodeSize) {\r
- DEBUG((DEBUG_ERROR, "FmpImageSize(0x%lx) mismatch, UpdateImageSize(0x%x) UpdateVendorCodeSize(0x%x)\n", FmpImageSize, ImageHeader->UpdateImageSize, ImageHeader->UpdateVendorCodeSize));\r
+ DEBUG ((DEBUG_ERROR, "FmpImageSize(0x%lx) mismatch, UpdateImageSize(0x%x) UpdateVendorCodeSize(0x%x)\n", FmpImageSize, ImageHeader->UpdateImageSize, ImageHeader->UpdateVendorCodeSize));\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
//\r
EndOfPayload = (UINT8 *)(FmpCapsuleHeader + 1);\r
if (EndOfPayload != EndOfCapsule) {\r
- DEBUG((DEBUG_ERROR, "EndOfPayload(0x%x) mismatch, EndOfCapsule(0x%x)\n", EndOfPayload, EndOfCapsule));\r
+ DEBUG ((DEBUG_ERROR, "EndOfPayload(0x%x) mismatch, EndOfCapsule(0x%x)\n", EndOfPayload, EndOfCapsule));\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
return EFI_UNSUPPORTED;\r
}\r
\r
IN EFI_CAPSULE_HEADER *CapsuleHeader\r
)\r
{\r
- DISPLAY_DISPLAY_PAYLOAD *ImagePayload;\r
- UINTN PayloadSize;\r
- EFI_STATUS Status;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
- UINTN BltSize;\r
- UINTN Height;\r
- UINTN Width;\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
+ DISPLAY_DISPLAY_PAYLOAD *ImagePayload;\r
+ UINTN PayloadSize;\r
+ EFI_STATUS Status;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
+ UINTN BltSize;\r
+ UINTN Height;\r
+ UINTN Width;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
\r
//\r
// UX capsule doesn't have extended header entries.\r
if (CapsuleHeader->HeaderSize != sizeof (EFI_CAPSULE_HEADER)) {\r
return EFI_UNSUPPORTED;\r
}\r
- ImagePayload = (DISPLAY_DISPLAY_PAYLOAD *)((UINTN) CapsuleHeader + CapsuleHeader->HeaderSize);\r
+\r
+ ImagePayload = (DISPLAY_DISPLAY_PAYLOAD *)((UINTN)CapsuleHeader + CapsuleHeader->HeaderSize);\r
//\r
// (CapsuleImageSize > HeaderSize) is guaranteed by IsValidCapsuleHeader().\r
//\r
if (ImagePayload->Version != 1) {\r
return EFI_UNSUPPORTED;\r
}\r
- if (CalculateCheckSum8((UINT8 *)CapsuleHeader, CapsuleHeader->CapsuleImageSize) != 0) {\r
+\r
+ if (CalculateCheckSum8 ((UINT8 *)CapsuleHeader, CapsuleHeader->CapsuleImageSize) != 0) {\r
return EFI_UNSUPPORTED;\r
}\r
+\r
//\r
// Only Support Bitmap by now\r
//\r
//\r
Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput);\r
if (EFI_ERROR (Status)) {\r
- Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&GraphicsOutput);\r
- if (EFI_ERROR(Status)) {\r
+ Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&GraphicsOutput);\r
+ if (EFI_ERROR (Status)) {\r
return EFI_UNSUPPORTED;\r
}\r
}\r
return EFI_UNSUPPORTED;\r
}\r
\r
- Blt = NULL;\r
- Width = 0;\r
+ Blt = NULL;\r
+ Width = 0;\r
Height = 0;\r
Status = TranslateBmpToGopBlt (\r
ImagePayload + 1,\r
- PayloadSize - sizeof(DISPLAY_DISPLAY_PAYLOAD),\r
+ PayloadSize - sizeof (DISPLAY_DISPLAY_PAYLOAD),\r
&Blt,\r
&BltSize,\r
&Height,\r
EfiBltBufferToVideo,\r
0,\r
0,\r
- (UINTN) ImagePayload->OffsetX,\r
- (UINTN) ImagePayload->OffsetY,\r
+ (UINTN)ImagePayload->OffsetX,\r
+ (UINTN)ImagePayload->OffsetY,\r
Width,\r
Height,\r
Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
);\r
\r
- FreePool(Blt);\r
+ FreePool (Blt);\r
\r
return Status;\r
}\r
**/\r
VOID\r
DumpFmpImageInfo (\r
- IN UINTN ImageInfoSize,\r
- IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *ImageInfo,\r
- IN UINT32 DescriptorVersion,\r
- IN UINT8 DescriptorCount,\r
- IN UINTN DescriptorSize,\r
- IN UINT32 PackageVersion,\r
- IN CHAR16 *PackageVersionName\r
+ IN UINTN ImageInfoSize,\r
+ IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *ImageInfo,\r
+ IN UINT32 DescriptorVersion,\r
+ IN UINT8 DescriptorCount,\r
+ IN UINTN DescriptorSize,\r
+ IN UINT32 PackageVersion,\r
+ IN CHAR16 *PackageVersionName\r
)\r
{\r
- EFI_FIRMWARE_IMAGE_DESCRIPTOR *CurrentImageInfo;\r
- UINTN Index;\r
-\r
- DEBUG((DEBUG_VERBOSE, " DescriptorVersion - 0x%x\n", DescriptorVersion));\r
- DEBUG((DEBUG_VERBOSE, " DescriptorCount - 0x%x\n", DescriptorCount));\r
- DEBUG((DEBUG_VERBOSE, " DescriptorSize - 0x%x\n", DescriptorSize));\r
- DEBUG((DEBUG_VERBOSE, " PackageVersion - 0x%x\n", PackageVersion));\r
- DEBUG((DEBUG_VERBOSE, " PackageVersionName - %s\n\n", PackageVersionName));\r
+ EFI_FIRMWARE_IMAGE_DESCRIPTOR *CurrentImageInfo;\r
+ UINTN Index;\r
+\r
+ DEBUG ((DEBUG_VERBOSE, " DescriptorVersion - 0x%x\n", DescriptorVersion));\r
+ DEBUG ((DEBUG_VERBOSE, " DescriptorCount - 0x%x\n", DescriptorCount));\r
+ DEBUG ((DEBUG_VERBOSE, " DescriptorSize - 0x%x\n", DescriptorSize));\r
+ DEBUG ((DEBUG_VERBOSE, " PackageVersion - 0x%x\n", PackageVersion));\r
+ DEBUG ((DEBUG_VERBOSE, " PackageVersionName - %s\n\n", PackageVersionName));\r
CurrentImageInfo = ImageInfo;\r
for (Index = 0; Index < DescriptorCount; Index++) {\r
- DEBUG((DEBUG_VERBOSE, " ImageDescriptor (%d)\n", Index));\r
- DEBUG((DEBUG_VERBOSE, " ImageIndex - 0x%x\n", CurrentImageInfo->ImageIndex));\r
- DEBUG((DEBUG_VERBOSE, " ImageTypeId - %g\n", &CurrentImageInfo->ImageTypeId));\r
- DEBUG((DEBUG_VERBOSE, " ImageId - 0x%lx\n", CurrentImageInfo->ImageId));\r
- DEBUG((DEBUG_VERBOSE, " ImageIdName - %s\n", CurrentImageInfo->ImageIdName));\r
- DEBUG((DEBUG_VERBOSE, " Version - 0x%x\n", CurrentImageInfo->Version));\r
- DEBUG((DEBUG_VERBOSE, " VersionName - %s\n", CurrentImageInfo->VersionName));\r
- DEBUG((DEBUG_VERBOSE, " Size - 0x%x\n", CurrentImageInfo->Size));\r
- DEBUG((DEBUG_VERBOSE, " AttributesSupported - 0x%lx\n", CurrentImageInfo->AttributesSupported));\r
- DEBUG((DEBUG_VERBOSE, " AttributesSetting - 0x%lx\n", CurrentImageInfo->AttributesSetting));\r
- DEBUG((DEBUG_VERBOSE, " Compatibilities - 0x%lx\n", CurrentImageInfo->Compatibilities));\r
+ DEBUG ((DEBUG_VERBOSE, " ImageDescriptor (%d)\n", Index));\r
+ DEBUG ((DEBUG_VERBOSE, " ImageIndex - 0x%x\n", CurrentImageInfo->ImageIndex));\r
+ DEBUG ((DEBUG_VERBOSE, " ImageTypeId - %g\n", &CurrentImageInfo->ImageTypeId));\r
+ DEBUG ((DEBUG_VERBOSE, " ImageId - 0x%lx\n", CurrentImageInfo->ImageId));\r
+ DEBUG ((DEBUG_VERBOSE, " ImageIdName - %s\n", CurrentImageInfo->ImageIdName));\r
+ DEBUG ((DEBUG_VERBOSE, " Version - 0x%x\n", CurrentImageInfo->Version));\r
+ DEBUG ((DEBUG_VERBOSE, " VersionName - %s\n", CurrentImageInfo->VersionName));\r
+ DEBUG ((DEBUG_VERBOSE, " Size - 0x%x\n", CurrentImageInfo->Size));\r
+ DEBUG ((DEBUG_VERBOSE, " AttributesSupported - 0x%lx\n", CurrentImageInfo->AttributesSupported));\r
+ DEBUG ((DEBUG_VERBOSE, " AttributesSetting - 0x%lx\n", CurrentImageInfo->AttributesSetting));\r
+ DEBUG ((DEBUG_VERBOSE, " Compatibilities - 0x%lx\n", CurrentImageInfo->Compatibilities));\r
if (DescriptorVersion > 1) {\r
- DEBUG((DEBUG_VERBOSE, " LowestSupportedImageVersion - 0x%x\n", CurrentImageInfo->LowestSupportedImageVersion));\r
+ DEBUG ((DEBUG_VERBOSE, " LowestSupportedImageVersion - 0x%x\n", CurrentImageInfo->LowestSupportedImageVersion));\r
if (DescriptorVersion > 2) {\r
- DEBUG((DEBUG_VERBOSE, " LastAttemptVersion - 0x%x\n", CurrentImageInfo->LastAttemptVersion));\r
- DEBUG((DEBUG_VERBOSE, " LastAttemptStatus - 0x%x\n", CurrentImageInfo->LastAttemptStatus));\r
- DEBUG((DEBUG_VERBOSE, " HardwareInstance - 0x%lx\n", CurrentImageInfo->HardwareInstance));\r
+ DEBUG ((DEBUG_VERBOSE, " LastAttemptVersion - 0x%x\n", CurrentImageInfo->LastAttemptVersion));\r
+ DEBUG ((DEBUG_VERBOSE, " LastAttemptStatus - 0x%x\n", CurrentImageInfo->LastAttemptStatus));\r
+ DEBUG ((DEBUG_VERBOSE, " HardwareInstance - 0x%lx\n", CurrentImageInfo->HardwareInstance));\r
}\r
}\r
+\r
//\r
// Use DescriptorSize to move ImageInfo Pointer to stay compatible with different ImageInfo version\r
//\r
**/\r
VOID\r
DumpFmpCapsule (\r
- IN EFI_CAPSULE_HEADER *CapsuleHeader\r
+ IN EFI_CAPSULE_HEADER *CapsuleHeader\r
)\r
{\r
EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader;\r
\r
FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);\r
\r
- DEBUG((DEBUG_VERBOSE, "FmpCapsule:\n"));\r
- DEBUG((DEBUG_VERBOSE, " Version - 0x%x\n", FmpCapsuleHeader->Version));\r
- DEBUG((DEBUG_VERBOSE, " EmbeddedDriverCount - 0x%x\n", FmpCapsuleHeader->EmbeddedDriverCount));\r
- DEBUG((DEBUG_VERBOSE, " PayloadItemCount - 0x%x\n", FmpCapsuleHeader->PayloadItemCount));\r
+ DEBUG ((DEBUG_VERBOSE, "FmpCapsule:\n"));\r
+ DEBUG ((DEBUG_VERBOSE, " Version - 0x%x\n", FmpCapsuleHeader->Version));\r
+ DEBUG ((DEBUG_VERBOSE, " EmbeddedDriverCount - 0x%x\n", FmpCapsuleHeader->EmbeddedDriverCount));\r
+ DEBUG ((DEBUG_VERBOSE, " PayloadItemCount - 0x%x\n", FmpCapsuleHeader->PayloadItemCount));\r
\r
ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);\r
for (Index = 0; Index < FmpCapsuleHeader->EmbeddedDriverCount; Index++) {\r
- DEBUG((DEBUG_VERBOSE, " ItemOffsetList[%d] - 0x%lx\n", Index, ItemOffsetList[Index]));\r
+ DEBUG ((DEBUG_VERBOSE, " ItemOffsetList[%d] - 0x%lx\n", Index, ItemOffsetList[Index]));\r
}\r
- for (; Index < (UINT32)FmpCapsuleHeader->EmbeddedDriverCount + FmpCapsuleHeader->PayloadItemCount; Index++) {\r
- DEBUG((DEBUG_VERBOSE, " ItemOffsetList[%d] - 0x%lx\n", Index, ItemOffsetList[Index]));\r
+\r
+ for ( ; Index < (UINT32)FmpCapsuleHeader->EmbeddedDriverCount + FmpCapsuleHeader->PayloadItemCount; Index++) {\r
+ DEBUG ((DEBUG_VERBOSE, " ItemOffsetList[%d] - 0x%lx\n", Index, ItemOffsetList[Index]));\r
ImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[Index]);\r
\r
- DEBUG((DEBUG_VERBOSE, " ImageHeader:\n"));\r
- DEBUG((DEBUG_VERBOSE, " Version - 0x%x\n", ImageHeader->Version));\r
- DEBUG((DEBUG_VERBOSE, " UpdateImageTypeId - %g\n", &ImageHeader->UpdateImageTypeId));\r
- DEBUG((DEBUG_VERBOSE, " UpdateImageIndex - 0x%x\n", ImageHeader->UpdateImageIndex));\r
- DEBUG((DEBUG_VERBOSE, " UpdateImageSize - 0x%x\n", ImageHeader->UpdateImageSize));\r
- DEBUG((DEBUG_VERBOSE, " UpdateVendorCodeSize - 0x%x\n", ImageHeader->UpdateVendorCodeSize));\r
- if (ImageHeader->Version >= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) {\r
- DEBUG((DEBUG_VERBOSE, " UpdateHardwareInstance - 0x%lx\n", ImageHeader->UpdateHardwareInstance));\r
+ DEBUG ((DEBUG_VERBOSE, " ImageHeader:\n"));\r
+ DEBUG ((DEBUG_VERBOSE, " Version - 0x%x\n", ImageHeader->Version));\r
+ DEBUG ((DEBUG_VERBOSE, " UpdateImageTypeId - %g\n", &ImageHeader->UpdateImageTypeId));\r
+ DEBUG ((DEBUG_VERBOSE, " UpdateImageIndex - 0x%x\n", ImageHeader->UpdateImageIndex));\r
+ DEBUG ((DEBUG_VERBOSE, " UpdateImageSize - 0x%x\n", ImageHeader->UpdateImageSize));\r
+ DEBUG ((DEBUG_VERBOSE, " UpdateVendorCodeSize - 0x%x\n", ImageHeader->UpdateVendorCodeSize));\r
+ if (ImageHeader->Version >= 2) {\r
+ DEBUG ((DEBUG_VERBOSE, " UpdateHardwareInstance - 0x%lx\n", ImageHeader->UpdateHardwareInstance));\r
+ if (ImageHeader->Version >= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) {\r
+ DEBUG ((DEBUG_VERBOSE, " ImageCapsuleSupport - 0x%lx\n", ImageHeader->ImageCapsuleSupport));\r
+ }\r
}\r
}\r
}\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_HANDLE *HandleBuffer;\r
- UINTN NumberOfHandles;\r
- EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
- UINTN Index;\r
- UINTN ImageInfoSize;\r
- EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf;\r
- UINT32 FmpImageInfoDescriptorVer;\r
- UINT8 FmpImageInfoCount;\r
- UINTN DescriptorSize;\r
- UINT32 PackageVersion;\r
- CHAR16 *PackageVersionName;\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE *HandleBuffer;\r
+ UINTN NumberOfHandles;\r
+ EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
+ UINTN Index;\r
+ UINTN ImageInfoSize;\r
+ EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf;\r
+ UINT32 FmpImageInfoDescriptorVer;\r
+ UINT8 FmpImageInfoCount;\r
+ UINTN DescriptorSize;\r
+ UINT32 PackageVersion;\r
+ CHAR16 *PackageVersionName;\r
\r
Status = gBS->LocateHandleBuffer (\r
ByProtocol,\r
&NumberOfHandles,\r
&HandleBuffer\r
);\r
- if (EFI_ERROR(Status)) {\r
- return ;\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
}\r
\r
for (Index = 0; Index < NumberOfHandles; Index++) {\r
- Status = gBS->HandleProtocol(\r
+ Status = gBS->HandleProtocol (\r
HandleBuffer[Index],\r
&gEfiFirmwareManagementProtocolGuid,\r
(VOID **)&Fmp\r
);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR (Status)) {\r
continue;\r
}\r
\r
ImageInfoSize = 0;\r
- Status = Fmp->GetImageInfo (\r
- Fmp,\r
- &ImageInfoSize,\r
- NULL,\r
- NULL,\r
- NULL,\r
- NULL,\r
- NULL,\r
- NULL\r
- );\r
+ Status = Fmp->GetImageInfo (\r
+ Fmp,\r
+ &ImageInfoSize,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL\r
+ );\r
if (Status != EFI_BUFFER_TOO_SMALL) {\r
continue;\r
}\r
}\r
\r
PackageVersionName = NULL;\r
- Status = Fmp->GetImageInfo (\r
- Fmp,\r
- &ImageInfoSize, // ImageInfoSize\r
- FmpImageInfoBuf, // ImageInfo\r
- &FmpImageInfoDescriptorVer, // DescriptorVersion\r
- &FmpImageInfoCount, // DescriptorCount\r
- &DescriptorSize, // DescriptorSize\r
- &PackageVersion, // PackageVersion\r
- &PackageVersionName // PackageVersionName\r
- );\r
- if (EFI_ERROR(Status)) {\r
- FreePool(FmpImageInfoBuf);\r
+ Status = Fmp->GetImageInfo (\r
+ Fmp,\r
+ &ImageInfoSize, // ImageInfoSize\r
+ FmpImageInfoBuf, // ImageInfo\r
+ &FmpImageInfoDescriptorVer, // DescriptorVersion\r
+ &FmpImageInfoCount, // DescriptorCount\r
+ &DescriptorSize, // DescriptorSize\r
+ &PackageVersion, // PackageVersion\r
+ &PackageVersionName // PackageVersionName\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (FmpImageInfoBuf);\r
continue;\r
}\r
\r
- DEBUG((DEBUG_INFO, "FMP (%d) ImageInfo:\n", Index));\r
- DumpFmpImageInfo(\r
+ DEBUG ((DEBUG_INFO, "FMP (%d) ImageInfo:\n", Index));\r
+ DumpFmpImageInfo (\r
ImageInfoSize, // ImageInfoSize\r
FmpImageInfoBuf, // ImageInfo\r
FmpImageInfoDescriptorVer, // DescriptorVersion\r
);\r
\r
if (PackageVersionName != NULL) {\r
- FreePool(PackageVersionName);\r
+ FreePool (PackageVersionName);\r
}\r
\r
- FreePool(FmpImageInfoBuf);\r
+ FreePool (FmpImageInfoBuf);\r
}\r
\r
- return ;\r
+ FreePool (HandleBuffer);\r
+\r
+ return;\r
}\r
\r
/**\r
**/\r
EFI_STATUS\r
GetFmpHandleBufferByType (\r
- IN EFI_GUID *UpdateImageTypeId,\r
- IN UINT64 UpdateHardwareInstance,\r
- OUT UINTN *NoHandles, OPTIONAL\r
- OUT EFI_HANDLE **HandleBuf, OPTIONAL\r
- OUT BOOLEAN **ResetRequiredBuf OPTIONAL\r
+ IN EFI_GUID *UpdateImageTypeId,\r
+ IN UINT64 UpdateHardwareInstance,\r
+ OUT UINTN *NoHandles OPTIONAL,\r
+ OUT EFI_HANDLE **HandleBuf OPTIONAL,\r
+ OUT BOOLEAN **ResetRequiredBuf OPTIONAL\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_HANDLE *HandleBuffer;\r
- UINTN NumberOfHandles;\r
- EFI_HANDLE *MatchedHandleBuffer;\r
- BOOLEAN *MatchedResetRequiredBuffer;\r
- UINTN MatchedNumberOfHandles;\r
- EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
- UINTN Index;\r
- UINTN ImageInfoSize;\r
- EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf;\r
- UINT32 FmpImageInfoDescriptorVer;\r
- UINT8 FmpImageInfoCount;\r
- UINTN DescriptorSize;\r
- UINT32 PackageVersion;\r
- CHAR16 *PackageVersionName;\r
- UINTN Index2;\r
- EFI_FIRMWARE_IMAGE_DESCRIPTOR *TempFmpImageInfo;\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE *HandleBuffer;\r
+ UINTN NumberOfHandles;\r
+ EFI_HANDLE *MatchedHandleBuffer;\r
+ BOOLEAN *MatchedResetRequiredBuffer;\r
+ UINTN MatchedNumberOfHandles;\r
+ EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
+ UINTN Index;\r
+ UINTN ImageInfoSize;\r
+ EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf;\r
+ UINT32 FmpImageInfoDescriptorVer;\r
+ UINT8 FmpImageInfoCount;\r
+ UINTN DescriptorSize;\r
+ UINT32 PackageVersion;\r
+ CHAR16 *PackageVersionName;\r
+ UINTN Index2;\r
+ EFI_FIRMWARE_IMAGE_DESCRIPTOR *TempFmpImageInfo;\r
\r
if (NoHandles != NULL) {\r
*NoHandles = 0;\r
}\r
+\r
if (HandleBuf != NULL) {\r
*HandleBuf = NULL;\r
}\r
+\r
if (ResetRequiredBuf != NULL) {\r
*ResetRequiredBuf = NULL;\r
}\r
&NumberOfHandles,\r
&HandleBuffer\r
);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
\r
MatchedHandleBuffer = NULL;\r
if (HandleBuf != NULL) {\r
- MatchedHandleBuffer = AllocateZeroPool (sizeof(EFI_HANDLE) * NumberOfHandles);\r
+ MatchedHandleBuffer = AllocateZeroPool (sizeof (EFI_HANDLE) * NumberOfHandles);\r
if (MatchedHandleBuffer == NULL) {\r
FreePool (HandleBuffer);\r
return EFI_OUT_OF_RESOURCES;\r
\r
MatchedResetRequiredBuffer = NULL;\r
if (ResetRequiredBuf != NULL) {\r
- MatchedResetRequiredBuffer = AllocateZeroPool (sizeof(BOOLEAN) * NumberOfHandles);\r
+ MatchedResetRequiredBuffer = AllocateZeroPool (sizeof (BOOLEAN) * NumberOfHandles);\r
if (MatchedResetRequiredBuffer == NULL) {\r
if (MatchedHandleBuffer != NULL) {\r
FreePool (MatchedHandleBuffer);\r
}\r
+\r
FreePool (HandleBuffer);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
}\r
\r
for (Index = 0; Index < NumberOfHandles; Index++) {\r
- Status = gBS->HandleProtocol(\r
+ Status = gBS->HandleProtocol (\r
HandleBuffer[Index],\r
&gEfiFirmwareManagementProtocolGuid,\r
(VOID **)&Fmp\r
);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR (Status)) {\r
continue;\r
}\r
\r
ImageInfoSize = 0;\r
- Status = Fmp->GetImageInfo (\r
- Fmp,\r
- &ImageInfoSize,\r
- NULL,\r
- NULL,\r
- NULL,\r
- NULL,\r
- NULL,\r
- NULL\r
- );\r
+ Status = Fmp->GetImageInfo (\r
+ Fmp,\r
+ &ImageInfoSize,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL\r
+ );\r
if (Status != EFI_BUFFER_TOO_SMALL) {\r
continue;\r
}\r
}\r
\r
PackageVersionName = NULL;\r
- Status = Fmp->GetImageInfo (\r
- Fmp,\r
- &ImageInfoSize, // ImageInfoSize\r
- FmpImageInfoBuf, // ImageInfo\r
- &FmpImageInfoDescriptorVer, // DescriptorVersion\r
- &FmpImageInfoCount, // DescriptorCount\r
- &DescriptorSize, // DescriptorSize\r
- &PackageVersion, // PackageVersion\r
- &PackageVersionName // PackageVersionName\r
- );\r
- if (EFI_ERROR(Status)) {\r
- FreePool(FmpImageInfoBuf);\r
+ Status = Fmp->GetImageInfo (\r
+ Fmp,\r
+ &ImageInfoSize, // ImageInfoSize\r
+ FmpImageInfoBuf, // ImageInfo\r
+ &FmpImageInfoDescriptorVer, // DescriptorVersion\r
+ &FmpImageInfoCount, // DescriptorCount\r
+ &DescriptorSize, // DescriptorSize\r
+ &PackageVersion, // PackageVersion\r
+ &PackageVersionName // PackageVersionName\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (FmpImageInfoBuf);\r
continue;\r
}\r
\r
if (PackageVersionName != NULL) {\r
- FreePool(PackageVersionName);\r
+ FreePool (PackageVersionName);\r
}\r
\r
TempFmpImageInfo = FmpImageInfoBuf;\r
//\r
// Check if this FMP instance matches\r
//\r
- if (CompareGuid(UpdateImageTypeId, &TempFmpImageInfo->ImageTypeId)) {\r
+ if (CompareGuid (UpdateImageTypeId, &TempFmpImageInfo->ImageTypeId)) {\r
if ((UpdateHardwareInstance == 0) ||\r
((FmpImageInfoDescriptorVer >= EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION) &&\r
- (UpdateHardwareInstance == TempFmpImageInfo->HardwareInstance))) {\r
+ (UpdateHardwareInstance == TempFmpImageInfo->HardwareInstance)))\r
+ {\r
if (MatchedHandleBuffer != NULL) {\r
MatchedHandleBuffer[MatchedNumberOfHandles] = HandleBuffer[Index];\r
}\r
+\r
if (MatchedResetRequiredBuffer != NULL) {\r
- MatchedResetRequiredBuffer[MatchedNumberOfHandles] = (((TempFmpImageInfo->AttributesSupported & \r
- IMAGE_ATTRIBUTE_RESET_REQUIRED) != 0) &&\r
- ((TempFmpImageInfo->AttributesSetting &\r
- IMAGE_ATTRIBUTE_RESET_REQUIRED) != 0));\r
+ MatchedResetRequiredBuffer[MatchedNumberOfHandles] = (((TempFmpImageInfo->AttributesSupported &\r
+ IMAGE_ATTRIBUTE_RESET_REQUIRED) != 0) &&\r
+ ((TempFmpImageInfo->AttributesSetting &\r
+ IMAGE_ATTRIBUTE_RESET_REQUIRED) != 0));\r
}\r
+\r
MatchedNumberOfHandles++;\r
break;\r
}\r
}\r
+\r
TempFmpImageInfo = (EFI_FIRMWARE_IMAGE_DESCRIPTOR *)((UINT8 *)TempFmpImageInfo + DescriptorSize);\r
}\r
- FreePool(FmpImageInfoBuf);\r
+\r
+ FreePool (FmpImageInfoBuf);\r
}\r
\r
+ FreePool (HandleBuffer);\r
+\r
if (MatchedNumberOfHandles == 0) {\r
return EFI_NOT_FOUND;\r
}\r
if (NoHandles != NULL) {\r
*NoHandles = MatchedNumberOfHandles;\r
}\r
+\r
if (HandleBuf != NULL) {\r
*HandleBuf = MatchedHandleBuffer;\r
}\r
+\r
if (ResetRequiredBuf != NULL) {\r
*ResetRequiredBuf = MatchedResetRequiredBuffer;\r
}\r
**/\r
UINT32\r
GetFmpImageInfoDescriptorVer (\r
- IN EFI_HANDLE Handle\r
+ IN EFI_HANDLE Handle\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
- UINTN ImageInfoSize;\r
- EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf;\r
- UINT32 FmpImageInfoDescriptorVer;\r
- UINT8 FmpImageInfoCount;\r
- UINTN DescriptorSize;\r
- UINT32 PackageVersion;\r
- CHAR16 *PackageVersionName;\r
-\r
- Status = gBS->HandleProtocol(\r
+ EFI_STATUS Status;\r
+ EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
+ UINTN ImageInfoSize;\r
+ EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf;\r
+ UINT32 FmpImageInfoDescriptorVer;\r
+ UINT8 FmpImageInfoCount;\r
+ UINTN DescriptorSize;\r
+ UINT32 PackageVersion;\r
+ CHAR16 *PackageVersionName;\r
+\r
+ Status = gBS->HandleProtocol (\r
Handle,\r
&gEfiFirmwareManagementProtocolGuid,\r
(VOID **)&Fmp\r
);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR (Status)) {\r
return 0;\r
}\r
\r
ImageInfoSize = 0;\r
- Status = Fmp->GetImageInfo (\r
- Fmp,\r
- &ImageInfoSize,\r
- NULL,\r
- NULL,\r
- NULL,\r
- NULL,\r
- NULL,\r
- NULL\r
- );\r
+ Status = Fmp->GetImageInfo (\r
+ Fmp,\r
+ &ImageInfoSize,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL\r
+ );\r
if (Status != EFI_BUFFER_TOO_SMALL) {\r
return 0;\r
}\r
}\r
\r
PackageVersionName = NULL;\r
- Status = Fmp->GetImageInfo (\r
- Fmp,\r
- &ImageInfoSize, // ImageInfoSize\r
- FmpImageInfoBuf, // ImageInfo\r
- &FmpImageInfoDescriptorVer, // DescriptorVersion\r
- &FmpImageInfoCount, // DescriptorCount\r
- &DescriptorSize, // DescriptorSize\r
- &PackageVersion, // PackageVersion\r
- &PackageVersionName // PackageVersionName\r
- );\r
- if (EFI_ERROR(Status)) {\r
- FreePool(FmpImageInfoBuf);\r
+ Status = Fmp->GetImageInfo (\r
+ Fmp,\r
+ &ImageInfoSize, // ImageInfoSize\r
+ FmpImageInfoBuf, // ImageInfo\r
+ &FmpImageInfoDescriptorVer, // DescriptorVersion\r
+ &FmpImageInfoCount, // DescriptorCount\r
+ &DescriptorSize, // DescriptorSize\r
+ &PackageVersion, // PackageVersion\r
+ &PackageVersionName // PackageVersionName\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (FmpImageInfoBuf);\r
return 0;\r
}\r
+\r
return FmpImageInfoDescriptorVer;\r
}\r
\r
**/\r
EFI_STATUS\r
SetFmpImageData (\r
- IN EFI_HANDLE Handle,\r
- IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader,\r
- IN UINTN PayloadIndex\r
+ IN EFI_HANDLE Handle,\r
+ IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader,\r
+ IN UINTN PayloadIndex\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
- UINT8 *Image;\r
- VOID *VendorCode;\r
- CHAR16 *AbortReason;\r
- EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS ProgressCallback;\r
+ EFI_STATUS Status;\r
+ EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
+ UINT8 *Image;\r
+ VOID *VendorCode;\r
+ CHAR16 *AbortReason;\r
+ EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS ProgressCallback;\r
\r
- Status = gBS->HandleProtocol(\r
+ Status = gBS->HandleProtocol (\r
Handle,\r
&gEfiFirmwareManagementProtocolGuid,\r
(VOID **)&Fmp\r
);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
} else {\r
//\r
// If the EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER is version 1,\r
- // Header should exclude UpdateHardwareInstance field\r
+ // Header should exclude UpdateHardwareInstance field, and\r
+ // ImageCapsuleSupport field if version is 2.\r
//\r
- Image = (UINT8 *)ImageHeader + OFFSET_OF(EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER, UpdateHardwareInstance);\r
+ if (ImageHeader->Version == 1) {\r
+ Image = (UINT8 *)ImageHeader + OFFSET_OF (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER, UpdateHardwareInstance);\r
+ } else {\r
+ Image = (UINT8 *)ImageHeader + OFFSET_OF (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER, ImageCapsuleSupport);\r
+ }\r
}\r
\r
if (ImageHeader->UpdateVendorCodeSize == 0) {\r
} else {\r
VendorCode = Image + ImageHeader->UpdateImageSize;\r
}\r
+\r
AbortReason = NULL;\r
- DEBUG((DEBUG_INFO, "Fmp->SetImage ...\n"));\r
- DEBUG((DEBUG_INFO, "ImageTypeId - %g, ", &ImageHeader->UpdateImageTypeId));\r
- DEBUG((DEBUG_INFO, "PayloadIndex - 0x%x, ", PayloadIndex));\r
- DEBUG((DEBUG_INFO, "ImageIndex - 0x%x ", ImageHeader->UpdateImageIndex));\r
- if (ImageHeader->Version >= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) {\r
- DEBUG((DEBUG_INFO, "(UpdateHardwareInstance - 0x%x)", ImageHeader->UpdateHardwareInstance));\r
+ DEBUG ((DEBUG_INFO, "Fmp->SetImage ...\n"));\r
+ DEBUG ((DEBUG_INFO, "ImageTypeId - %g, ", &ImageHeader->UpdateImageTypeId));\r
+ DEBUG ((DEBUG_INFO, "PayloadIndex - 0x%x, ", PayloadIndex));\r
+ DEBUG ((DEBUG_INFO, "ImageIndex - 0x%x ", ImageHeader->UpdateImageIndex));\r
+ if (ImageHeader->Version >= 2) {\r
+ DEBUG ((DEBUG_INFO, "(UpdateHardwareInstance - 0x%x)", ImageHeader->UpdateHardwareInstance));\r
+ if (ImageHeader->Version >= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) {\r
+ DEBUG ((DEBUG_INFO, "(ImageCapsuleSupport - 0x%x)", ImageHeader->ImageCapsuleSupport));\r
+ }\r
}\r
- DEBUG((DEBUG_INFO, "\n"));\r
+\r
+ DEBUG ((DEBUG_INFO, "\n"));\r
\r
//\r
// Before calling SetImage(), reset the progress bar to 0%\r
//\r
ProgressCallback = UpdateImageProgress;\r
- Status = UpdateImageProgress (0);\r
+ Status = UpdateImageProgress (0);\r
if (EFI_ERROR (Status)) {\r
ProgressCallback = NULL;\r
}\r
\r
- Status = Fmp->SetImage(\r
+ Status = Fmp->SetImage (\r
Fmp,\r
ImageHeader->UpdateImageIndex, // ImageIndex\r
Image, // Image\r
UpdateImageProgress (100);\r
}\r
\r
- DEBUG((DEBUG_INFO, "Fmp->SetImage - %r\n", Status));\r
+ DEBUG ((DEBUG_INFO, "Fmp->SetImage - %r\n", Status));\r
if (AbortReason != NULL) {\r
DEBUG ((DEBUG_ERROR, "%s\n", AbortReason));\r
- FreePool(AbortReason);\r
+ FreePool (AbortReason);\r
}\r
\r
//\r
IN UINTN ImageSize\r
)\r
{\r
- MEMMAP_DEVICE_PATH MemMapNode;\r
- EFI_STATUS Status;\r
- EFI_HANDLE ImageHandle;\r
- EFI_DEVICE_PATH_PROTOCOL *DriverDevicePath;\r
- UINTN ExitDataSize;\r
+ MEMMAP_DEVICE_PATH MemMapNode;\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE ImageHandle;\r
+ EFI_DEVICE_PATH_PROTOCOL *DriverDevicePath;\r
+ UINTN ExitDataSize;\r
\r
SetDevicePathNodeLength (&MemMapNode.Header, sizeof (MemMapNode));\r
MemMapNode.Header.Type = HARDWARE_DEVICE_PATH;\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- DEBUG((DEBUG_INFO, "FmpCapsule: LoadImage ...\n"));\r
- Status = gBS->LoadImage(\r
+ DEBUG ((DEBUG_INFO, "FmpCapsule: LoadImage ...\n"));\r
+ Status = gBS->LoadImage (\r
FALSE,\r
gImageHandle,\r
DriverDevicePath,\r
ImageSize,\r
&ImageHandle\r
);\r
- DEBUG((DEBUG_INFO, "FmpCapsule: LoadImage - %r\n", Status));\r
- if (EFI_ERROR(Status)) {\r
- FreePool(DriverDevicePath);\r
+ DEBUG ((DEBUG_INFO, "FmpCapsule: LoadImage - %r\n", Status));\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // With EFI_SECURITY_VIOLATION retval, the Image was loaded and an ImageHandle was created\r
+ // with a valid EFI_LOADED_IMAGE_PROTOCOL, but the image can not be started right now.\r
+ // If the caller doesn't have the option to defer the execution of an image, we should\r
+ // unload image for the EFI_SECURITY_VIOLATION to avoid resource leak.\r
+ //\r
+ if (Status == EFI_SECURITY_VIOLATION) {\r
+ gBS->UnloadImage (ImageHandle);\r
+ }\r
+\r
+ FreePool (DriverDevicePath);\r
return Status;\r
}\r
\r
- DEBUG((DEBUG_INFO, "FmpCapsule: StartImage ...\n"));\r
- Status = gBS->StartImage(\r
+ DEBUG ((DEBUG_INFO, "FmpCapsule: StartImage ...\n"));\r
+ Status = gBS->StartImage (\r
ImageHandle,\r
&ExitDataSize,\r
NULL\r
);\r
- DEBUG((DEBUG_INFO, "FmpCapsule: StartImage - %r\n", Status));\r
- if (EFI_ERROR(Status)) {\r
+ DEBUG ((DEBUG_INFO, "FmpCapsule: StartImage - %r\n", Status));\r
+ if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "Driver Return Status = %r\n", Status));\r
}\r
\r
- FreePool(DriverDevicePath);\r
+ FreePool (DriverDevicePath);\r
return Status;\r
}\r
\r
/**\r
Record FMP capsule status.\r
\r
- @param[in] Handle A FMP handle.\r
+ @param[in] Handle A FMP handle.\r
@param[in] CapsuleHeader The capsule image header\r
@param[in] CapsuleStatus The capsule process stauts\r
@param[in] PayloadIndex FMP payload index\r
@param[in] ImageHeader FMP image header\r
+ @param[in] CapFileName Capsule file name\r
**/\r
VOID\r
RecordFmpCapsuleStatus (\r
- IN EFI_HANDLE Handle, OPTIONAL\r
+ IN EFI_HANDLE Handle OPTIONAL,\r
IN EFI_CAPSULE_HEADER *CapsuleHeader,\r
IN EFI_STATUS CapsuleStatus,\r
IN UINTN PayloadIndex,\r
- IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader\r
+ IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader,\r
+ IN CHAR16 *CapFileName OPTIONAL\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath;\r
- UINT32 FmpImageInfoDescriptorVer;\r
- EFI_STATUS StatusEsrt;\r
- ESRT_MANAGEMENT_PROTOCOL *EsrtProtocol;\r
- EFI_SYSTEM_RESOURCE_ENTRY EsrtEntry;\r
+ EFI_STATUS Status;\r
+ EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath;\r
+ UINT32 FmpImageInfoDescriptorVer;\r
+ EFI_STATUS StatusEsrt;\r
+ ESRT_MANAGEMENT_PROTOCOL *EsrtProtocol;\r
+ EFI_SYSTEM_RESOURCE_ENTRY EsrtEntry;\r
\r
FmpDevicePath = NULL;\r
if (Handle != NULL) {\r
- gBS->HandleProtocol(\r
+ gBS->HandleProtocol (\r
Handle,\r
&gEfiDevicePathProtocolGuid,\r
(VOID **)&FmpDevicePath\r
CapsuleStatus,\r
PayloadIndex,\r
ImageHeader,\r
- FmpDevicePath\r
+ FmpDevicePath,\r
+ CapFileName\r
);\r
\r
//\r
// Update corresponding ESRT entry LastAttemp Status\r
//\r
- Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtProtocol);\r
+ Status = gBS->LocateProtocol (&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtProtocol);\r
if (EFI_ERROR (Status)) {\r
- return ;\r
+ return;\r
}\r
\r
if (Handle == NULL) {\r
- return ;\r
+ return;\r
}\r
\r
//\r
//\r
FmpImageInfoDescriptorVer = GetFmpImageInfoDescriptorVer (Handle);\r
if (FmpImageInfoDescriptorVer < EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION) {\r
- StatusEsrt = EsrtProtocol->GetEsrtEntry(&ImageHeader->UpdateImageTypeId, &EsrtEntry);\r
- if (!EFI_ERROR(StatusEsrt)){\r
- if (!EFI_ERROR(CapsuleStatus)) {\r
+ StatusEsrt = EsrtProtocol->GetEsrtEntry (&ImageHeader->UpdateImageTypeId, &EsrtEntry);\r
+ if (!EFI_ERROR (StatusEsrt)) {\r
+ if (!EFI_ERROR (CapsuleStatus)) {\r
EsrtEntry.LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS;\r
} else {\r
EsrtEntry.LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL;\r
}\r
+\r
EsrtEntry.LastAttemptVersion = 0;\r
- EsrtProtocol->UpdateEsrtEntry(&EsrtEntry);\r
+ EsrtProtocol->UpdateEsrtEntry (&EsrtEntry);\r
}\r
}\r
}\r
This function need support nested FMP capsule.\r
\r
@param[in] CapsuleHeader Points to a capsule header.\r
+ @param[in] CapFileName Capsule file name.\r
@param[out] ResetRequired Indicates whether reset is required or not.\r
\r
@retval EFI_SUCESS Process Capsule Image successfully.\r
EFI_STATUS\r
ProcessFmpCapsuleImage (\r
IN EFI_CAPSULE_HEADER *CapsuleHeader,\r
+ IN CHAR16 *CapFileName OPTIONAL,\r
OUT BOOLEAN *ResetRequired OPTIONAL\r
)\r
{\r
BOOLEAN NotReady;\r
BOOLEAN Abort;\r
\r
- if (!IsFmpCapsuleGuid(&CapsuleHeader->CapsuleGuid)) {\r
- return ProcessFmpCapsuleImage ((EFI_CAPSULE_HEADER *)((UINTN)CapsuleHeader + CapsuleHeader->HeaderSize), ResetRequired);\r
+ if (!IsFmpCapsuleGuid (&CapsuleHeader->CapsuleGuid)) {\r
+ return ProcessFmpCapsuleImage ((EFI_CAPSULE_HEADER *)((UINTN)CapsuleHeader + CapsuleHeader->HeaderSize), CapFileName, ResetRequired);\r
}\r
\r
NotReady = FALSE;\r
- Abort = FALSE;\r
+ Abort = FALSE;\r
\r
- DumpFmpCapsule(CapsuleHeader);\r
+ DumpFmpCapsule (CapsuleHeader);\r
\r
- FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *) ((UINT8 *) CapsuleHeader + CapsuleHeader->HeaderSize);\r
+ FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);\r
\r
if (FmpCapsuleHeader->Version > EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER_INIT_VERSION) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);\r
\r
ItemNum = FmpCapsuleHeader->EmbeddedDriverCount + FmpCapsuleHeader->PayloadItemCount;\r
//\r
for (Index = 0; Index < FmpCapsuleHeader->EmbeddedDriverCount; Index++) {\r
if ((FmpCapsuleHeader->PayloadItemCount == 0) &&\r
- (Index == (UINTN)FmpCapsuleHeader->EmbeddedDriverCount - 1)) {\r
+ (Index == (UINTN)FmpCapsuleHeader->EmbeddedDriverCount - 1))\r
+ {\r
//\r
// When driver is last element in the ItemOffsetList array, the driver size is calculated by reference CapsuleImageSize in EFI_CAPSULE_HEADER\r
//\r
(UINT8 *)FmpCapsuleHeader + ItemOffsetList[Index],\r
DriverLen\r
);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "Driver Return Status = %r\n", Status));\r
return Status;\r
}\r
//\r
// 2. Route payload to right FMP instance\r
//\r
- DEBUG((DEBUG_INFO, "FmpCapsule: route payload to right FMP instance ...\n"));\r
+ DEBUG ((DEBUG_INFO, "FmpCapsule: route payload to right FMP instance ...\n"));\r
\r
DumpAllFmpInfo ();\r
\r
// Check all the payload entry in capsule payload list\r
//\r
for (Index = FmpCapsuleHeader->EmbeddedDriverCount; Index < ItemNum; Index++) {\r
- ImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[Index]);\r
+ ImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[Index]);\r
\r
UpdateHardwareInstance = 0;\r
- if (ImageHeader->Version >= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) {\r
+ ///\r
+ /// UpdateHardwareInstance field was added in Version 2\r
+ ///\r
+ if (ImageHeader->Version >= 2) {\r
UpdateHardwareInstance = ImageHeader->UpdateHardwareInstance;\r
}\r
\r
&HandleBuffer,\r
&ResetRequiredBuffer\r
);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR (Status) ||\r
+ (HandleBuffer == NULL) ||\r
+ (ResetRequiredBuffer == NULL))\r
+ {\r
NotReady = TRUE;\r
RecordFmpCapsuleStatus (\r
NULL,\r
CapsuleHeader,\r
EFI_NOT_READY,\r
Index - FmpCapsuleHeader->EmbeddedDriverCount,\r
- ImageHeader\r
+ ImageHeader,\r
+ CapFileName\r
);\r
continue;\r
}\r
CapsuleHeader,\r
EFI_ABORTED,\r
Index - FmpCapsuleHeader->EmbeddedDriverCount,\r
- ImageHeader\r
+ ImageHeader,\r
+ CapFileName\r
);\r
continue;\r
}\r
CapsuleHeader,\r
Status,\r
Index - FmpCapsuleHeader->EmbeddedDriverCount,\r
- ImageHeader\r
+ ImageHeader,\r
+ CapFileName\r
);\r
}\r
+\r
if (HandleBuffer != NULL) {\r
- FreePool(HandleBuffer);\r
+ FreePool (HandleBuffer);\r
}\r
+\r
if (ResetRequiredBuffer != NULL) {\r
- FreePool(ResetRequiredBuffer);\r
+ FreePool (ResetRequiredBuffer);\r
}\r
}\r
\r
**/\r
BOOLEAN\r
IsNestedFmpCapsule (\r
- IN EFI_CAPSULE_HEADER *CapsuleHeader\r
+ IN EFI_CAPSULE_HEADER *CapsuleHeader\r
)\r
{\r
EFI_STATUS Status;\r
\r
EsrtGuidFound = FALSE;\r
if (mIsVirtualAddrConverted) {\r
- if(mEsrtTable != NULL) {\r
+ if (mEsrtTable != NULL) {\r
EsrtEntry = (EFI_SYSTEM_RESOURCE_ENTRY *)(mEsrtTable + 1);\r
- for (Index = 0; Index < mEsrtTable->FwResourceCount ; Index++, EsrtEntry++) {\r
- if (CompareGuid(&EsrtEntry->FwClass, &CapsuleHeader->CapsuleGuid)) {\r
+ for (Index = 0; Index < mEsrtTable->FwResourceCount; Index++, EsrtEntry++) {\r
+ if (CompareGuid (&EsrtEntry->FwClass, &CapsuleHeader->CapsuleGuid)) {\r
EsrtGuidFound = TRUE;\r
break;\r
}\r
//\r
// Check ESRT protocol\r
//\r
- Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtProtocol);\r
- if (!EFI_ERROR(Status)) {\r
- Status = EsrtProtocol->GetEsrtEntry(&CapsuleHeader->CapsuleGuid, &Entry);\r
- if (!EFI_ERROR(Status)) {\r
+ Status = gBS->LocateProtocol (&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtProtocol);\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = EsrtProtocol->GetEsrtEntry (&CapsuleHeader->CapsuleGuid, &Entry);\r
+ if (!EFI_ERROR (Status)) {\r
EsrtGuidFound = TRUE;\r
}\r
}\r
NULL,\r
NULL\r
);\r
- if (!EFI_ERROR(Status)) {\r
+ if (!EFI_ERROR (Status)) {\r
EsrtGuidFound = TRUE;\r
}\r
}\r
}\r
+\r
if (!EsrtGuidFound) {\r
return FALSE;\r
}\r
// FMP GUID after ESRT one\r
//\r
NestedCapsuleHeader = (EFI_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);\r
- NestedCapsuleSize = (UINTN)CapsuleHeader + CapsuleHeader->CapsuleImageSize - (UINTN)NestedCapsuleHeader;\r
- if (NestedCapsuleSize < sizeof(EFI_CAPSULE_HEADER)) {\r
+ NestedCapsuleSize = (UINTN)CapsuleHeader + CapsuleHeader->CapsuleImageSize - (UINTN)NestedCapsuleHeader;\r
+ if (NestedCapsuleSize < sizeof (EFI_CAPSULE_HEADER)) {\r
return FALSE;\r
}\r
- if (!IsValidCapsuleHeader(NestedCapsuleHeader, NestedCapsuleSize)) {\r
+\r
+ if (!IsValidCapsuleHeader (NestedCapsuleHeader, NestedCapsuleSize)) {\r
return FALSE;\r
}\r
- if (!IsFmpCapsuleGuid(&NestedCapsuleHeader->CapsuleGuid)) {\r
+\r
+ if (!IsFmpCapsuleGuid (&NestedCapsuleHeader->CapsuleGuid)) {\r
return FALSE;\r
}\r
+\r
DEBUG ((DEBUG_INFO, "IsNestedFmpCapsule\n"));\r
return TRUE;\r
}\r
**/\r
BOOLEAN\r
IsFmpCapsule (\r
- IN EFI_CAPSULE_HEADER *CapsuleHeader\r
+ IN EFI_CAPSULE_HEADER *CapsuleHeader\r
)\r
{\r
- if (IsFmpCapsuleGuid(&CapsuleHeader->CapsuleGuid)) {\r
+ if (IsFmpCapsuleGuid (&CapsuleHeader->CapsuleGuid)) {\r
return TRUE;\r
}\r
- if (IsNestedFmpCapsule(CapsuleHeader)) {\r
+\r
+ if (IsNestedFmpCapsule (CapsuleHeader)) {\r
return TRUE;\r
}\r
+\r
return FALSE;\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
- if (IsFmpCapsule(CapsuleHeader)) {\r
+ //\r
+ // Check capsule file name capsule\r
+ //\r
+ if (IsCapsuleNameCapsule (CapsuleHeader)) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ if (IsFmpCapsule (CapsuleHeader)) {\r
+ //\r
+ // Fake capsule header is valid case in QueryCapsuleCpapbilities().\r
+ //\r
+ if (CapsuleHeader->HeaderSize == CapsuleHeader->CapsuleImageSize) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
//\r
// Check layout of FMP capsule\r
//\r
- return ValidateFmpCapsule(CapsuleHeader, NULL);\r
+ return ValidateFmpCapsule (CapsuleHeader, NULL);\r
}\r
- DEBUG((DEBUG_ERROR, "Unknown Capsule Guid - %g\n", &CapsuleHeader->CapsuleGuid));\r
+\r
+ DEBUG ((DEBUG_ERROR, "Unknown Capsule Guid - %g\n", &CapsuleHeader->CapsuleGuid));\r
return EFI_UNSUPPORTED;\r
}\r
\r
Caution: This function may receive untrusted input.\r
\r
@param[in] CapsuleHeader Points to a capsule header.\r
+ @param[in] CapFileName Capsule file name.\r
@param[out] ResetRequired Indicates whether reset is required or not.\r
\r
@retval EFI_SUCESS Process Capsule Image successfully.\r
EFIAPI\r
ProcessThisCapsuleImage (\r
IN EFI_CAPSULE_HEADER *CapsuleHeader,\r
+ IN CHAR16 *CapFileName OPTIONAL,\r
OUT BOOLEAN *ResetRequired OPTIONAL\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
if (SupportCapsuleImage (CapsuleHeader) != EFI_SUCCESS) {\r
- RecordCapsuleStatusVariable(CapsuleHeader, EFI_UNSUPPORTED);\r
+ RecordCapsuleStatusVariable (CapsuleHeader, EFI_UNSUPPORTED);\r
return EFI_UNSUPPORTED;\r
}\r
\r
// Display image in firmware update display capsule\r
//\r
if (CompareGuid (&gWindowsUxCapsuleGuid, &CapsuleHeader->CapsuleGuid)) {\r
- DEBUG((DEBUG_INFO, "ProcessCapsuleImage for WindowsUxCapsule ...\n"));\r
- Status = DisplayCapsuleImage(CapsuleHeader);\r
- RecordCapsuleStatusVariable(CapsuleHeader, Status);\r
+ DEBUG ((DEBUG_INFO, "ProcessCapsuleImage for WindowsUxCapsule ...\n"));\r
+ Status = DisplayCapsuleImage (CapsuleHeader);\r
+ RecordCapsuleStatusVariable (CapsuleHeader, Status);\r
return Status;\r
}\r
\r
// Check FMP capsule layout\r
//\r
if (IsFmpCapsule (CapsuleHeader)) {\r
- DEBUG((DEBUG_INFO, "ProcessCapsuleImage for FmpCapsule ...\n"));\r
- DEBUG((DEBUG_INFO, "ValidateFmpCapsule ...\n"));\r
- Status = ValidateFmpCapsule(CapsuleHeader, NULL);\r
- DEBUG((DEBUG_INFO, "ValidateFmpCapsule - %r\n", Status));\r
- if (EFI_ERROR(Status)) {\r
- RecordCapsuleStatusVariable(CapsuleHeader, Status);\r
+ DEBUG ((DEBUG_INFO, "ProcessCapsuleImage for FmpCapsule ...\n"));\r
+ DEBUG ((DEBUG_INFO, "ValidateFmpCapsule ...\n"));\r
+ Status = ValidateFmpCapsule (CapsuleHeader, NULL);\r
+ DEBUG ((DEBUG_INFO, "ValidateFmpCapsule - %r\n", Status));\r
+ if (EFI_ERROR (Status)) {\r
+ RecordCapsuleStatusVariable (CapsuleHeader, Status);\r
return Status;\r
}\r
\r
//\r
// Process EFI FMP Capsule\r
//\r
- DEBUG((DEBUG_INFO, "ProcessFmpCapsuleImage ...\n"));\r
- Status = ProcessFmpCapsuleImage(CapsuleHeader, ResetRequired);\r
- DEBUG((DEBUG_INFO, "ProcessFmpCapsuleImage - %r\n", Status));\r
+ DEBUG ((DEBUG_INFO, "ProcessFmpCapsuleImage ...\n"));\r
+ Status = ProcessFmpCapsuleImage (CapsuleHeader, CapFileName, ResetRequired);\r
+ DEBUG ((DEBUG_INFO, "ProcessFmpCapsuleImage - %r\n", Status));\r
\r
return Status;\r
}\r
IN EFI_CAPSULE_HEADER *CapsuleHeader\r
)\r
{\r
- return ProcessThisCapsuleImage (CapsuleHeader, NULL);\r
+ return ProcessThisCapsuleImage (CapsuleHeader, NULL, NULL);\r
}\r
\r
/**\r
EFI_STATUS\r
EFIAPI\r
DxeCapsuleLibConstructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
Status = gBS->CreateEventEx (\r
EVT_NOTIFY_SIGNAL,\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- InitCapsuleVariable();\r
+ InitCapsuleVariable ();\r
\r
return EFI_SUCCESS;\r
}\r
EFI_STATUS\r
EFIAPI\r
DxeCapsuleLibDestructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
//\r
// Close the End of DXE event.\r