X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=SignedCapsulePkg%2FUniversal%2FSystemFirmwareUpdate%2FSystemFirmwareUpdateDxe.c;fp=SignedCapsulePkg%2FUniversal%2FSystemFirmwareUpdate%2FSystemFirmwareUpdateDxe.c;h=c33b515341d0cf9f2b890b5c37840df964f986ce;hp=ea795cd7db58a805c21954b0666c39164a0c14a4;hb=b87864896714cf3062a7bc6d577d8fbd62d105e5;hpb=47d20b54f9a65b08aa602a1866c1b59a69088dfc diff --git a/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c b/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c index ea795cd7db..c33b515341 100644 --- a/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c +++ b/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c @@ -18,9 +18,9 @@ // // SystemFmp driver private data // -SYSTEM_FMP_PRIVATE_DATA *mSystemFmpPrivate = NULL; +SYSTEM_FMP_PRIVATE_DATA *mSystemFmpPrivate = NULL; -EFI_GUID mCurrentImageTypeId; +EFI_GUID mCurrentImageTypeId; BOOLEAN mNvRamUpdated = FALSE; @@ -39,10 +39,10 @@ BOOLEAN mNvRamUpdated = FALSE; **/ EFI_STATUS ParseUpdateDataFile ( - IN UINT8 *DataBuffer, - IN UINTN BufferSize, - IN OUT CONFIG_HEADER *ConfigHeader, - IN OUT UPDATE_CONFIG_DATA **UpdateArray + IN UINT8 *DataBuffer, + IN UINTN BufferSize, + IN OUT CONFIG_HEADER *ConfigHeader, + IN OUT UPDATE_CONFIG_DATA **UpdateArray ); /** @@ -72,15 +72,16 @@ PerformUpdate ( IN UINTN EndPercentage ) { - EFI_STATUS Status; + EFI_STATUS Status; - DEBUG((DEBUG_INFO, "PlatformUpdate:")); - DEBUG((DEBUG_INFO, " BaseAddress - 0x%lx,", ConfigData->BaseAddress)); - DEBUG((DEBUG_INFO, " ImageOffset - 0x%x,", ConfigData->ImageOffset)); - DEBUG((DEBUG_INFO, " Legnth - 0x%x\n", ConfigData->Length)); + DEBUG ((DEBUG_INFO, "PlatformUpdate:")); + DEBUG ((DEBUG_INFO, " BaseAddress - 0x%lx,", ConfigData->BaseAddress)); + DEBUG ((DEBUG_INFO, " ImageOffset - 0x%x,", ConfigData->ImageOffset)); + DEBUG ((DEBUG_INFO, " Legnth - 0x%x\n", ConfigData->Length)); if (Progress != NULL) { Progress (StartPercentage); } + Status = PerformFlashWriteWithProgress ( ConfigData->FirmwareType, ConfigData->BaseAddress, @@ -94,7 +95,8 @@ PerformUpdate ( if (Progress != NULL) { Progress (EndPercentage); } - if (!EFI_ERROR(Status)) { + + if (!EFI_ERROR (Status)) { *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; if (ConfigData->FirmwareType == PlatformFirmwareTypeNvRam) { mNvRamUpdated = TRUE; @@ -102,6 +104,7 @@ PerformUpdate ( } else { *LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL; } + return Status; } @@ -130,26 +133,27 @@ UpdateImage ( IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress ) { - EFI_STATUS Status; - UPDATE_CONFIG_DATA *ConfigData; - UPDATE_CONFIG_DATA *UpdateConfigData; - CONFIG_HEADER ConfigHeader; - UINTN Index; - UINTN TotalSize; - UINTN BytesWritten; - UINTN StartPercentage; - UINTN EndPercentage; + EFI_STATUS Status; + UPDATE_CONFIG_DATA *ConfigData; + UPDATE_CONFIG_DATA *UpdateConfigData; + CONFIG_HEADER ConfigHeader; + UINTN Index; + UINTN TotalSize; + UINTN BytesWritten; + UINTN StartPercentage; + UINTN EndPercentage; if (ConfigImage == NULL) { - DEBUG((DEBUG_INFO, "PlatformUpdate (NoConfig):")); - DEBUG((DEBUG_INFO, " BaseAddress - 0x%x,", 0)); - DEBUG((DEBUG_INFO, " Length - 0x%x\n", SystemFirmwareImageSize)); + DEBUG ((DEBUG_INFO, "PlatformUpdate (NoConfig):")); + DEBUG ((DEBUG_INFO, " BaseAddress - 0x%x,", 0)); + DEBUG ((DEBUG_INFO, " Length - 0x%x\n", SystemFirmwareImageSize)); // ASSUME the whole System Firmware include NVRAM region. StartPercentage = 0; - EndPercentage = 100; + EndPercentage = 100; if (Progress != NULL) { Progress (StartPercentage); } + Status = PerformFlashWriteWithProgress ( PlatformFirmwareTypeNvRam, 0, @@ -163,57 +167,60 @@ UpdateImage ( if (Progress != NULL) { Progress (EndPercentage); } - if (!EFI_ERROR(Status)) { + + if (!EFI_ERROR (Status)) { *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; - mNvRamUpdated = TRUE; + mNvRamUpdated = TRUE; } else { *LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL; } + return Status; } - DEBUG((DEBUG_INFO, "PlatformUpdate (With Config):\n")); - ConfigData = NULL; - ZeroMem (&ConfigHeader, sizeof(ConfigHeader)); - Status = ParseUpdateDataFile ( - ConfigImage, - ConfigImageSize, - &ConfigHeader, - &ConfigData - ); - DEBUG((DEBUG_INFO, "ParseUpdateDataFile - %r\n", Status)); - if (EFI_ERROR(Status)) { + DEBUG ((DEBUG_INFO, "PlatformUpdate (With Config):\n")); + ConfigData = NULL; + ZeroMem (&ConfigHeader, sizeof (ConfigHeader)); + Status = ParseUpdateDataFile ( + ConfigImage, + ConfigImageSize, + &ConfigHeader, + &ConfigData + ); + DEBUG ((DEBUG_INFO, "ParseUpdateDataFile - %r\n", Status)); + if (EFI_ERROR (Status)) { *LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL; return EFI_INVALID_PARAMETER; } - DEBUG((DEBUG_INFO, "ConfigHeader.NumOfUpdates - 0x%x\n", ConfigHeader.NumOfUpdates)); - DEBUG((DEBUG_INFO, "PcdEdkiiSystemFirmwareFileGuid - %g\n", PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))); + + DEBUG ((DEBUG_INFO, "ConfigHeader.NumOfUpdates - 0x%x\n", ConfigHeader.NumOfUpdates)); + DEBUG ((DEBUG_INFO, "PcdEdkiiSystemFirmwareFileGuid - %g\n", PcdGetPtr (PcdEdkiiSystemFirmwareFileGuid))); TotalSize = 0; for (Index = 0; Index < ConfigHeader.NumOfUpdates; Index++) { - if (CompareGuid(&ConfigData[Index].FileGuid, PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))) { + if (CompareGuid (&ConfigData[Index].FileGuid, PcdGetPtr (PcdEdkiiSystemFirmwareFileGuid))) { TotalSize = TotalSize + ConfigData[Index].Length; } } - BytesWritten = 0; - Index = 0; + BytesWritten = 0; + Index = 0; UpdateConfigData = ConfigData; while (Index < ConfigHeader.NumOfUpdates) { - if (CompareGuid(&UpdateConfigData->FileGuid, PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))) { - DEBUG((DEBUG_INFO, "FileGuid - %g (processing)\n", &UpdateConfigData->FileGuid)); + if (CompareGuid (&UpdateConfigData->FileGuid, PcdGetPtr (PcdEdkiiSystemFirmwareFileGuid))) { + DEBUG ((DEBUG_INFO, "FileGuid - %g (processing)\n", &UpdateConfigData->FileGuid)); StartPercentage = (BytesWritten * 100) / TotalSize; EndPercentage = ((BytesWritten + UpdateConfigData->Length) * 100) / TotalSize; - Status = PerformUpdate ( - SystemFirmwareImage, - SystemFirmwareImageSize, - UpdateConfigData, - LastAttemptVersion, - LastAttemptStatus, - Progress, - StartPercentage, - EndPercentage - ); + Status = PerformUpdate ( + SystemFirmwareImage, + SystemFirmwareImageSize, + UpdateConfigData, + LastAttemptVersion, + LastAttemptStatus, + Progress, + StartPercentage, + EndPercentage + ); // // Shall updates be serialized so that if an update is not successfully completed, // the remaining updates won't be performed. @@ -222,7 +229,7 @@ UpdateImage ( break; } } else { - DEBUG((DEBUG_INFO, "FileGuid - %g (ignored)\n", &UpdateConfigData->FileGuid)); + DEBUG ((DEBUG_INFO, "FileGuid - %g (ignored)\n", &UpdateConfigData->FileGuid)); } BytesWritten += UpdateConfigData->Length; @@ -258,38 +265,38 @@ SystemFirmwareAuthenticatedUpdate ( IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress ) { - EFI_STATUS Status; - VOID *SystemFirmwareImage; - UINTN SystemFirmwareImageSize; - VOID *ConfigImage; - UINTN ConfigImageSize; - VOID *AuthenticatedImage; - UINTN AuthenticatedImageSize; + EFI_STATUS Status; + VOID *SystemFirmwareImage; + UINTN SystemFirmwareImageSize; + VOID *ConfigImage; + UINTN ConfigImageSize; + VOID *AuthenticatedImage; + UINTN AuthenticatedImageSize; AuthenticatedImage = NULL; AuthenticatedImageSize = 0; - DEBUG((DEBUG_INFO, "SystemFirmwareAuthenticatedUpdate...\n")); + DEBUG ((DEBUG_INFO, "SystemFirmwareAuthenticatedUpdate...\n")); - Status = CapsuleAuthenticateSystemFirmware(Image, ImageSize, FALSE, LastAttemptVersion, LastAttemptStatus, &AuthenticatedImage, &AuthenticatedImageSize); - if (EFI_ERROR(Status)) { - DEBUG((DEBUG_INFO, "SystemFirmwareAuthenticateImage - %r\n", Status)); + Status = CapsuleAuthenticateSystemFirmware (Image, ImageSize, FALSE, LastAttemptVersion, LastAttemptStatus, &AuthenticatedImage, &AuthenticatedImageSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "SystemFirmwareAuthenticateImage - %r\n", Status)); return Status; } - DEBUG((DEBUG_INFO, "ExtractSystemFirmwareImage ...\n")); - ExtractSystemFirmwareImage(AuthenticatedImage, AuthenticatedImageSize, &SystemFirmwareImage, &SystemFirmwareImageSize); - DEBUG((DEBUG_INFO, "ExtractConfigImage ...\n")); - ExtractConfigImage(AuthenticatedImage, AuthenticatedImageSize, &ConfigImage, &ConfigImageSize); + DEBUG ((DEBUG_INFO, "ExtractSystemFirmwareImage ...\n")); + ExtractSystemFirmwareImage (AuthenticatedImage, AuthenticatedImageSize, &SystemFirmwareImage, &SystemFirmwareImageSize); + DEBUG ((DEBUG_INFO, "ExtractConfigImage ...\n")); + ExtractConfigImage (AuthenticatedImage, AuthenticatedImageSize, &ConfigImage, &ConfigImageSize); - DEBUG((DEBUG_INFO, "UpdateImage ...\n")); - Status = UpdateImage(SystemFirmwareImage, SystemFirmwareImageSize, ConfigImage, ConfigImageSize, LastAttemptVersion, LastAttemptStatus, Progress); - if (EFI_ERROR(Status)) { - DEBUG((DEBUG_INFO, "UpdateImage - %r\n", Status)); + DEBUG ((DEBUG_INFO, "UpdateImage ...\n")); + Status = UpdateImage (SystemFirmwareImage, SystemFirmwareImageSize, ConfigImage, ConfigImageSize, LastAttemptVersion, LastAttemptStatus, Progress); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "UpdateImage - %r\n", Status)); return Status; } - DEBUG((DEBUG_INFO, "SystemFirmwareAuthenticatedUpdate Done\n")); + DEBUG ((DEBUG_INFO, "SystemFirmwareAuthenticatedUpdate Done\n")); return EFI_SUCCESS; } @@ -314,14 +321,14 @@ SystemFirmwareAuthenticatedUpdate ( EFI_STATUS EFIAPI GetVariableHook ( - IN CHAR16 *VariableName, - IN EFI_GUID *VendorGuid, - OUT UINT32 *Attributes OPTIONAL, - IN OUT UINTN *DataSize, - OUT VOID *Data + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + OUT UINT32 *Attributes OPTIONAL, + IN OUT UINTN *DataSize, + OUT VOID *Data ) { - DEBUG((DEBUG_INFO, "GetVariableHook - %S, %g\n", VariableName, VendorGuid)); + DEBUG ((DEBUG_INFO, "GetVariableHook - %S, %g\n", VariableName, VendorGuid)); return EFI_NOT_AVAILABLE_YET; } @@ -342,12 +349,12 @@ GetVariableHook ( EFI_STATUS EFIAPI GetNextVariableNameHook ( - IN OUT UINTN *VariableNameSize, - IN OUT CHAR16 *VariableName, - IN OUT EFI_GUID *VendorGuid + IN OUT UINTN *VariableNameSize, + IN OUT CHAR16 *VariableName, + IN OUT EFI_GUID *VendorGuid ) { - DEBUG((DEBUG_INFO, "GetNextVariableNameHook - %S, %g\n", VariableName, VendorGuid)); + DEBUG ((DEBUG_INFO, "GetNextVariableNameHook - %S, %g\n", VariableName, VendorGuid)); return EFI_NOT_AVAILABLE_YET; } @@ -372,14 +379,14 @@ GetNextVariableNameHook ( EFI_STATUS EFIAPI SetVariableHook ( - IN CHAR16 *VariableName, - IN EFI_GUID *VendorGuid, - IN UINT32 Attributes, - IN UINTN DataSize, - IN VOID *Data + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN UINT32 Attributes, + IN UINTN DataSize, + IN VOID *Data ) { - DEBUG((DEBUG_INFO, "SetVariableHook - %S, %g, 0x%x (0x%x)\n", VariableName, VendorGuid, Attributes, DataSize)); + DEBUG ((DEBUG_INFO, "SetVariableHook - %S, %g, 0x%x (0x%x)\n", VariableName, VendorGuid, Attributes, DataSize)); return EFI_NOT_AVAILABLE_YET; } @@ -402,13 +409,13 @@ SetVariableHook ( EFI_STATUS EFIAPI QueryVariableInfoHook ( - IN UINT32 Attributes, - OUT UINT64 *MaximumVariableStorageSize, - OUT UINT64 *RemainingVariableStorageSize, - OUT UINT64 *MaximumVariableSize + IN UINT32 Attributes, + OUT UINT64 *MaximumVariableStorageSize, + OUT UINT64 *RemainingVariableStorageSize, + OUT UINT64 *MaximumVariableSize ) { - DEBUG((DEBUG_INFO, "QueryVariableInfoHook - 0x%x\n", Attributes)); + DEBUG ((DEBUG_INFO, "QueryVariableInfoHook - 0x%x\n", Attributes)); return EFI_NOT_AVAILABLE_YET; } @@ -461,32 +468,32 @@ QueryVariableInfoHook ( EFI_STATUS EFIAPI FmpSetImage ( - IN EFI_FIRMWARE_MANAGEMENT_PROTOCOL *This, - IN UINT8 ImageIndex, - IN CONST VOID *Image, - IN UINTN ImageSize, - IN CONST VOID *VendorCode, - IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, - OUT CHAR16 **AbortReason + IN EFI_FIRMWARE_MANAGEMENT_PROTOCOL *This, + IN UINT8 ImageIndex, + IN CONST VOID *Image, + IN UINTN ImageSize, + IN CONST VOID *VendorCode, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, + OUT CHAR16 **AbortReason ) { - EFI_STATUS Status; - EFI_STATUS VarStatus; - SYSTEM_FMP_PRIVATE_DATA *SystemFmpPrivate; + EFI_STATUS Status; + EFI_STATUS VarStatus; + SYSTEM_FMP_PRIVATE_DATA *SystemFmpPrivate; - if (Image == NULL || ImageSize == 0 || AbortReason == NULL) { + if ((Image == NULL) || (ImageSize == 0) || (AbortReason == NULL)) { return EFI_INVALID_PARAMETER; } - SystemFmpPrivate = SYSTEM_FMP_PRIVATE_DATA_FROM_FMP(This); + SystemFmpPrivate = SYSTEM_FMP_PRIVATE_DATA_FROM_FMP (This); *AbortReason = NULL; - if (ImageIndex == 0 || ImageIndex > SystemFmpPrivate->DescriptorCount) { + if ((ImageIndex == 0) || (ImageIndex > SystemFmpPrivate->DescriptorCount)) { return EFI_INVALID_PARAMETER; } - Status = SystemFirmwareAuthenticatedUpdate((VOID *)Image, ImageSize, &SystemFmpPrivate->LastAttempt.LastAttemptVersion, &SystemFmpPrivate->LastAttempt.LastAttemptStatus, Progress); - DEBUG((DEBUG_INFO, "SetImage - LastAttempt Version - 0x%x, State - 0x%x\n", SystemFmpPrivate->LastAttempt.LastAttemptVersion, SystemFmpPrivate->LastAttempt.LastAttemptStatus)); + Status = SystemFirmwareAuthenticatedUpdate ((VOID *)Image, ImageSize, &SystemFmpPrivate->LastAttempt.LastAttemptVersion, &SystemFmpPrivate->LastAttempt.LastAttemptStatus, Progress); + DEBUG ((DEBUG_INFO, "SetImage - LastAttempt Version - 0x%x, State - 0x%x\n", SystemFmpPrivate->LastAttempt.LastAttemptVersion, SystemFmpPrivate->LastAttempt.LastAttemptStatus)); // // If NVRAM is updated, we should no longer touch variable services, because @@ -501,20 +508,20 @@ FmpSetImage ( gRT->Hdr.CRC32 = 0; gBS->CalculateCrc32 ( - (UINT8 *) &gRT->Hdr, - gRT->Hdr.HeaderSize, - &gRT->Hdr.CRC32 - ); + (UINT8 *)&gRT->Hdr, + gRT->Hdr.HeaderSize, + &gRT->Hdr.CRC32 + ); } - VarStatus = gRT->SetVariable( + VarStatus = gRT->SetVariable ( SYSTEM_FMP_LAST_ATTEMPT_VARIABLE_NAME, &gSystemFmpLastAttemptVariableGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, - sizeof(SystemFmpPrivate->LastAttempt), + sizeof (SystemFmpPrivate->LastAttempt), &SystemFmpPrivate->LastAttempt ); - DEBUG((DEBUG_INFO, "SetLastAttempt - %r\n", VarStatus)); + DEBUG ((DEBUG_INFO, "SetLastAttempt - %r\n", VarStatus)); return Status; } @@ -568,16 +575,16 @@ GetFmpImageDescriptors ( // Determine the size required for the set of EFI_FIRMWARE_IMAGE_DESCRIPTORs. // ImageInfoSize = 0; - Status = Fmp->GetImageInfo ( - Fmp, // FMP Pointer - &ImageInfoSize, // Buffer Size (in this case 0) - NULL, // NULL so we can get size - &FmpImageInfoDescriptorVer, // DescriptorVersion - FmpImageInfoCount, // DescriptorCount - DescriptorSize, // DescriptorSize - &PackageVersion, // PackageVersion - &PackageVersionName // PackageVersionName - ); + Status = Fmp->GetImageInfo ( + Fmp, // FMP Pointer + &ImageInfoSize, // Buffer Size (in this case 0) + NULL, // NULL so we can get size + &FmpImageInfoDescriptorVer, // DescriptorVersion + FmpImageInfoCount, // DescriptorCount + DescriptorSize, // DescriptorSize + &PackageVersion, // PackageVersion + &PackageVersionName // PackageVersionName + ); if (Status != EFI_BUFFER_TOO_SMALL) { DEBUG ((DEBUG_ERROR, "SystemFirmwareUpdateDxe: Unexpected Failure. Status = %r\n", Status)); return NULL; @@ -597,16 +604,16 @@ GetFmpImageDescriptors ( // Retrieve the set of EFI_FIRMWARE_IMAGE_DESCRIPTORs. // PackageVersionName = NULL; - Status = Fmp->GetImageInfo ( - Fmp, - &ImageInfoSize, // ImageInfoSize - FmpImageInfoBuf, // ImageInfo - &FmpImageInfoDescriptorVer, // DescriptorVersion - FmpImageInfoCount, // DescriptorCount - DescriptorSize, // DescriptorSize - &PackageVersion, // PackageVersion - &PackageVersionName // PackageVersionName - ); + Status = Fmp->GetImageInfo ( + Fmp, + &ImageInfoSize, // ImageInfoSize + FmpImageInfoBuf, // ImageInfo + &FmpImageInfoDescriptorVer, // DescriptorVersion + FmpImageInfoCount, // DescriptorCount + DescriptorSize, // DescriptorSize + &PackageVersion, // PackageVersion + &PackageVersionName // PackageVersionName + ); // // Free unused PackageVersionName return buffer @@ -621,6 +628,7 @@ GetFmpImageDescriptors ( if (FmpImageInfoBuf != NULL) { FreePool (FmpImageInfoBuf); } + return NULL; } @@ -656,16 +664,16 @@ FindMatchingFmpHandles ( UINTN DescriptorSize; BOOLEAN MatchFound; - *HandleCount = 0; + *HandleCount = 0; TempHandleCount = 0; - HandleBuffer = NULL; - Status = gBS->LocateHandleBuffer ( - ByProtocol, - ProtocolGuid, - NULL, - &TempHandleCount, - &HandleBuffer - ); + HandleBuffer = NULL; + Status = gBS->LocateHandleBuffer ( + ByProtocol, + ProtocolGuid, + NULL, + &TempHandleCount, + &HandleBuffer + ); if (EFI_ERROR (Status)) { return NULL; } @@ -688,21 +696,24 @@ FindMatchingFmpHandles ( for (Index2 = 0; Index2 < FmpImageInfoCount; Index2++) { for (Index3 = 0; Index3 < mSystemFmpPrivate->DescriptorCount; Index3++) { MatchFound = CompareGuid ( - &FmpImageInfoBuf->ImageTypeId, - &mSystemFmpPrivate->ImageDescriptor[Index3].ImageTypeId - ); + &FmpImageInfoBuf->ImageTypeId, + &mSystemFmpPrivate->ImageDescriptor[Index3].ImageTypeId + ); if (MatchFound) { break; } } + if (MatchFound) { break; } + // // Increment the buffer pointer ahead by the size of the descriptor // FmpImageInfoBuf = (EFI_FIRMWARE_IMAGE_DESCRIPTOR *)(((UINT8 *)FmpImageInfoBuf) + DescriptorSize); } + if (MatchFound) { HandleBuffer[*HandleCount] = HandleBuffer[Index]; (*HandleCount)++; @@ -719,6 +730,7 @@ FindMatchingFmpHandles ( FreePool (HandleBuffer); return NULL; } + return HandleBuffer; } @@ -752,7 +764,7 @@ UninstallMatchingSystemFmpProtocols ( DEBUG ((DEBUG_INFO, "SystemFirmwareUpdateDxe: Found %d matching System FMP instances\n", HandleCount)); for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol( + Status = gBS->HandleProtocol ( HandleBuffer[Index], &gSystemFmpProtocolGuid, (VOID **)&SystemFmp @@ -760,6 +772,7 @@ UninstallMatchingSystemFmpProtocols ( if (EFI_ERROR (Status)) { continue; } + DEBUG ((DEBUG_INFO, "SystemFirmwareUpdateDxe: Uninstall SystemFmp produced by another capsule\n")); Status = gBS->UninstallProtocolInterface ( HandleBuffer[Index], @@ -772,6 +785,7 @@ UninstallMatchingSystemFmpProtocols ( return Status; } } + if (HandleBuffer != NULL) { FreePool (HandleBuffer); } @@ -832,7 +846,7 @@ SystemFirmwareUpdateMainDxe ( // // Look for a handle with matching Firmware Management Protocol // - HandleCount = 0; + HandleCount = 0; HandleBuffer = FindMatchingFmpHandles ( &gEfiFirmwareManagementProtocolGuid, &HandleCount @@ -840,38 +854,38 @@ SystemFirmwareUpdateMainDxe ( DEBUG ((DEBUG_INFO, "SystemFirmwareUpdateDxe: Found %d matching FMP instances\n", HandleCount)); switch (HandleCount) { - case 0: - // - // Install FMP protocol onto a new handle. - // - DEBUG ((DEBUG_INFO, "SystemFirmwareUpdateDxe: Install FMP onto a new handle\n")); - Status = gBS->InstallMultipleProtocolInterfaces ( - &mSystemFmpPrivate->Handle, - &gEfiFirmwareManagementProtocolGuid, - &mSystemFmpPrivate->Fmp, - NULL - ); - break; - case 1: - // - // Install System FMP protocol onto handle with matching FMP Protocol - // - DEBUG ((DEBUG_INFO, "SystemFirmwareUpdateDxe: Install System FMP onto matching FMP handle\n")); - mSystemFmpPrivate->Handle = HandleBuffer[0]; - Status = gBS->InstallMultipleProtocolInterfaces ( - &HandleBuffer[0], - &gSystemFmpProtocolGuid, - &mSystemFmpPrivate->Fmp, - NULL - ); - break; - default: - // - // More than one matching handle is not expected. Unload driver. - // - DEBUG ((DEBUG_ERROR, "SystemFirmwareUpdateDxe: More than one matching FMP handle. Unload driver.\n")); - Status = EFI_DEVICE_ERROR; - break; + case 0: + // + // Install FMP protocol onto a new handle. + // + DEBUG ((DEBUG_INFO, "SystemFirmwareUpdateDxe: Install FMP onto a new handle\n")); + Status = gBS->InstallMultipleProtocolInterfaces ( + &mSystemFmpPrivate->Handle, + &gEfiFirmwareManagementProtocolGuid, + &mSystemFmpPrivate->Fmp, + NULL + ); + break; + case 1: + // + // Install System FMP protocol onto handle with matching FMP Protocol + // + DEBUG ((DEBUG_INFO, "SystemFirmwareUpdateDxe: Install System FMP onto matching FMP handle\n")); + mSystemFmpPrivate->Handle = HandleBuffer[0]; + Status = gBS->InstallMultipleProtocolInterfaces ( + &HandleBuffer[0], + &gSystemFmpProtocolGuid, + &mSystemFmpPrivate->Fmp, + NULL + ); + break; + default: + // + // More than one matching handle is not expected. Unload driver. + // + DEBUG ((DEBUG_ERROR, "SystemFirmwareUpdateDxe: More than one matching FMP handle. Unload driver.\n")); + Status = EFI_DEVICE_ERROR; + break; } if (HandleBuffer != NULL) {