From: "Xu, Wei6" <wei6.xu@intel.com>
To: devel@edk2.groups.io
Cc: Michael D Kinney <michael.d.kinney@intel.com>,
Liming Gao <liming.gao@intel.com>,
Sean Brogan <sean.brogan@microsoft.com>
Subject: [edk2-devel] [PATCH 4/4] FmpDevicePkg/FmpDxe: Use FmpDependencyLib and FmpDependencyCheckLib
Date: Tue, 28 Apr 2020 21:25:30 +0800 [thread overview]
Message-ID: <20200428132530.4068-5-wei6.xu@intel.com> (raw)
In-Reply-To: <20200428132530.4068-1-wei6.xu@intel.com>
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2696
Remove the orginal Fmp Capsule Dependency implement, and use new
FmpDependencyLib and FmpDependencyCheckLib APIs instead. A platform
can perform the dependency check in a platform specific manner by
implementing its own FmpDependencyCheckLib.
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Sean Brogan <sean.brogan@microsoft.com>
Signed-off-by: Wei6 Xu <wei6.xu@intel.com>
---
FmpDevicePkg/FmpDxe/Dependency.c | 679 --------------------------------------
FmpDevicePkg/FmpDxe/Dependency.h | 63 ----
FmpDevicePkg/FmpDxe/FmpDxe.c | 255 +++-----------
FmpDevicePkg/FmpDxe/FmpDxe.h | 3 +
FmpDevicePkg/FmpDxe/FmpDxe.inf | 4 +-
FmpDevicePkg/FmpDxe/FmpDxeLib.inf | 4 +-
6 files changed, 60 insertions(+), 948 deletions(-)
delete mode 100644 FmpDevicePkg/FmpDxe/Dependency.c
delete mode 100644 FmpDevicePkg/FmpDxe/Dependency.h
diff --git a/FmpDevicePkg/FmpDxe/Dependency.c b/FmpDevicePkg/FmpDxe/Dependency.c
deleted file mode 100644
index 8f97c42916..0000000000
--- a/FmpDevicePkg/FmpDxe/Dependency.c
+++ /dev/null
@@ -1,679 +0,0 @@
-/** @file
- Supports Capsule Dependency Expression.
-
- Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-#include "FmpDxe.h"
-#include "Dependency.h"
-
-//
-// Define the initial size of the dependency expression evaluation stack
-//
-#define DEPEX_STACK_SIZE_INCREMENT 0x1000
-
-//
-// Type of stack element
-//
-typedef enum {
- BooleanType,
- VersionType
-} ELEMENT_TYPE;
-
-//
-// Value of stack element
-//
-typedef union {
- BOOLEAN Boolean;
- UINT32 Version;
-} ELEMENT_VALUE;
-
-//
-// Stack element used to evaluate dependency expressions
-//
-typedef struct {
- ELEMENT_VALUE Value;
- ELEMENT_TYPE Type;
-} DEPEX_ELEMENT;
-
-//
-// Global variable used to support dependency evaluation
-//
-UINTN mNumberOfFmpInstance = 0;
-EFI_FIRMWARE_IMAGE_DESCRIPTOR **mFmpImageInfoBuf = NULL;
-
-//
-// Indicates the status of dependency check, default value is DEPENDENCIES_SATISFIED.
-//
-UINT8 mDependenciesCheckStatus = DEPENDENCIES_SATISFIED;
-
-//
-// Global stack used to evaluate dependency expressions
-//
-DEPEX_ELEMENT *mDepexEvaluationStack = NULL;
-DEPEX_ELEMENT *mDepexEvaluationStackEnd = NULL;
-DEPEX_ELEMENT *mDepexEvaluationStackPointer = NULL;
-
-/**
- Grow size of the Depex stack
-
- @retval EFI_SUCCESS Stack successfully growed.
- @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.
-
-**/
-EFI_STATUS
-GrowDepexStack (
- VOID
- )
-{
- DEPEX_ELEMENT *NewStack;
- UINTN Size;
-
- Size = DEPEX_STACK_SIZE_INCREMENT;
- if (mDepexEvaluationStack != NULL) {
- Size = Size + (mDepexEvaluationStackEnd - mDepexEvaluationStack);
- }
-
- NewStack = AllocatePool (Size * sizeof (DEPEX_ELEMENT));
- if (NewStack == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- if (mDepexEvaluationStack != NULL) {
- //
- // Copy to Old Stack to the New Stack
- //
- CopyMem (
- NewStack,
- mDepexEvaluationStack,
- (mDepexEvaluationStackEnd - mDepexEvaluationStack) * sizeof (DEPEX_ELEMENT)
- );
-
- //
- // Free The Old Stack
- //
- FreePool (mDepexEvaluationStack);
- }
-
- //
- // Make the Stack pointer point to the old data in the new stack
- //
- mDepexEvaluationStackPointer = NewStack + (mDepexEvaluationStackPointer - mDepexEvaluationStack);
- mDepexEvaluationStack = NewStack;
- mDepexEvaluationStackEnd = NewStack + Size;
-
- return EFI_SUCCESS;
-}
-
-/**
- Push an element onto the Stack.
-
- @param[in] Value Value to push.
- @param[in] Type Element Type
-
- @retval EFI_SUCCESS The value was pushed onto the stack.
- @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.
- @retval EFI_INVALID_PARAMETER Wrong stack element type.
-
-**/
-EFI_STATUS
-Push (
- IN UINT32 Value,
- IN UINTN Type
- )
-{
- EFI_STATUS Status;
- DEPEX_ELEMENT Element;
-
- //
- // Check Type
- //
- if (Type != BooleanType && Type != VersionType) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Check for a stack overflow condition
- //
- if (mDepexEvaluationStackPointer == mDepexEvaluationStackEnd) {
- //
- // Grow the stack
- //
- Status = GrowDepexStack ();
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
-
- Element.Value.Version = Value;
- Element.Type = Type;
-
- //
- // Push the item onto the stack
- //
- *mDepexEvaluationStackPointer = Element;
- mDepexEvaluationStackPointer++;
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Pop an element from the stack.
-
- @param[out] Element Element to pop.
- @param[in] Type Type of element.
-
- @retval EFI_SUCCESS The value was popped onto the stack.
- @retval EFI_ACCESS_DENIED The pop operation underflowed the stack.
- @retval EFI_INVALID_PARAMETER Type is mismatched.
-
-**/
-EFI_STATUS
-Pop (
- OUT DEPEX_ELEMENT *Element,
- IN ELEMENT_TYPE Type
- )
-{
- //
- // Check for a stack underflow condition
- //
- if (mDepexEvaluationStackPointer == mDepexEvaluationStack) {
- return EFI_ACCESS_DENIED;
- }
-
- //
- // Pop the item off the stack
- //
- mDepexEvaluationStackPointer--;
- *Element = *mDepexEvaluationStackPointer;
- if ((*Element).Type != Type) {
- return EFI_INVALID_PARAMETER;
- }
- return EFI_SUCCESS;
-}
-
-/**
- Evaluate the dependencies.
-
- @param[in] Dependencies Dependency expressions.
- @param[in] DependenciesSize Size of Dependency expressions.
-
- @retval TRUE Dependency expressions evaluate to TRUE.
- @retval FALSE Dependency expressions evaluate to FALSE.
-
-**/
-BOOLEAN
-EvaluateDependencies (
- IN CONST EFI_FIRMWARE_IMAGE_DEP * Dependencies,
- IN CONST UINTN DependenciesSize
- )
-{
- EFI_STATUS Status;
- UINT8 *Iterator;
- UINT8 Index;
- DEPEX_ELEMENT Element1;
- DEPEX_ELEMENT Element2;
- GUID ImageTypeId;
- UINT32 Version;
-
- if (Dependencies == NULL || DependenciesSize == 0) {
- return FALSE;
- }
-
- //
- // Clean out memory leaks in Depex Boolean stack. Leaks are only caused by
- // incorrectly formed DEPEX expressions
- //
- mDepexEvaluationStackPointer = mDepexEvaluationStack;
-
- Iterator = (UINT8 *) Dependencies->Dependencies;
- while (Iterator < (UINT8 *) Dependencies->Dependencies + DependenciesSize) {
- switch (*Iterator)
- {
- case EFI_FMP_DEP_PUSH_GUID:
- if (Iterator + sizeof (EFI_GUID) >= (UINT8 *) Dependencies->Dependencies + DependenciesSize) {
- Status = EFI_INVALID_PARAMETER;
- goto Error;
- }
-
- CopyGuid (&ImageTypeId, (EFI_GUID *) (Iterator + 1));
- Iterator = Iterator + sizeof (EFI_GUID);
-
- for (Index = 0; Index < mNumberOfFmpInstance; Index ++){
- if (mFmpImageInfoBuf[Index] == NULL) {
- continue;
- }
- if(CompareGuid (&mFmpImageInfoBuf[Index]->ImageTypeId, &ImageTypeId)){
- Status = Push (mFmpImageInfoBuf[Index]->Version, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- }
- }
- if (Index == mNumberOfFmpInstance) {
- Status = EFI_NOT_FOUND;
- goto Error;
- }
- break;
- case EFI_FMP_DEP_PUSH_VERSION:
- if (Iterator + sizeof (UINT32) >= (UINT8 *) Dependencies->Dependencies + DependenciesSize ) {
- Status = EFI_INVALID_PARAMETER;
- goto Error;
- }
-
- Version = *(UINT32 *) (Iterator + 1);
- Status = Push (Version, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Iterator = Iterator + sizeof (UINT32);
- break;
- case EFI_FMP_DEP_VERSION_STR:
- Iterator += AsciiStrnLenS ((CHAR8 *) Iterator, DependenciesSize - (Iterator - Dependencies->Dependencies));
- break;
- case EFI_FMP_DEP_AND:
- Status = Pop (&Element1, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = Pop (&Element2, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = Push (Element1.Value.Boolean & Element2.Value.Boolean, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- case EFI_FMP_DEP_OR:
- Status = Pop (&Element1, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = Pop(&Element2, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = Push (Element1.Value.Boolean | Element2.Value.Boolean, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- case EFI_FMP_DEP_NOT:
- Status = Pop (&Element1, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = Push (!(Element1.Value.Boolean), BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- case EFI_FMP_DEP_TRUE:
- Status = Push (TRUE, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- case EFI_FMP_DEP_FALSE:
- Status = Push (FALSE, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- case EFI_FMP_DEP_EQ:
- Status = Pop (&Element1, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = Pop (&Element2, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = (Element1.Value.Version == Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- case EFI_FMP_DEP_GT:
- Status = Pop (&Element1, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = Pop (&Element2, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = (Element1.Value.Version > Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- case EFI_FMP_DEP_GTE:
- Status = Pop (&Element1, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = Pop (&Element2, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = (Element1.Value.Version >= Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- case EFI_FMP_DEP_LT:
- Status = Pop (&Element1, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = Pop (&Element2, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = (Element1.Value.Version < Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- case EFI_FMP_DEP_LTE:
- Status = Pop (&Element1, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = Pop (&Element2, VersionType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Status = (Element1.Value.Version <= Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- break;
- case EFI_FMP_DEP_END:
- Status = Pop (&Element1, BooleanType);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- return Element1.Value.Boolean;
- default:
- Status = EFI_INVALID_PARAMETER;
- goto Error;
- }
- Iterator++;
- }
-
-Error:
-
- DEBUG ((DEBUG_ERROR, "FmpDxe(%s): EvaluateDependencies() - RESULT = FALSE (Status = %r)\n", mImageIdName, Status));
- return FALSE;
-}
-
-/**
- Validate the dependency expression and output its size.
-
- @param[in] ImageDepex Pointer to the EFI_FIRMWARE_IMAGE_DEP.
- @param[in] MaxDepexSize Max size of the dependency.
- @param[out] DepexSize Size of dependency.
-
- @retval TRUE The capsule is valid.
- @retval FALSE The capsule is invalid.
-
-**/
-BOOLEAN
-ValidateImageDepex (
- IN EFI_FIRMWARE_IMAGE_DEP *ImageDepex,
- IN CONST UINTN MaxDepexSize,
- OUT UINT32 *DepexSize
- )
-{
- UINT8 *Depex;
-
- *DepexSize = 0;
- Depex = ImageDepex->Dependencies;
- while (Depex < ImageDepex->Dependencies + MaxDepexSize) {
- switch (*Depex)
- {
- case EFI_FMP_DEP_PUSH_GUID:
- Depex += sizeof (EFI_GUID) + 1;
- break;
- case EFI_FMP_DEP_PUSH_VERSION:
- Depex += sizeof (UINT32) + 1;
- break;
- case EFI_FMP_DEP_VERSION_STR:
- Depex += AsciiStrnLenS ((CHAR8 *) Depex, ImageDepex->Dependencies + MaxDepexSize - Depex) + 1;
- break;
- case EFI_FMP_DEP_AND:
- case EFI_FMP_DEP_OR:
- case EFI_FMP_DEP_NOT:
- case EFI_FMP_DEP_TRUE:
- case EFI_FMP_DEP_FALSE:
- case EFI_FMP_DEP_EQ:
- case EFI_FMP_DEP_GT:
- case EFI_FMP_DEP_GTE:
- case EFI_FMP_DEP_LT:
- case EFI_FMP_DEP_LTE:
- Depex += 1;
- break;
- case EFI_FMP_DEP_END:
- Depex += 1;
- *DepexSize = (UINT32)(Depex - ImageDepex->Dependencies);
- return TRUE;
- default:
- return FALSE;
- }
- }
-
- return FALSE;
-}
-
-
-/**
- Get the size of dependencies. Assume the dependencies is validated before
- calling this function.
-
- @param[in] Dependencies Pointer to the EFI_FIRMWARE_IMAGE_DEP.
-
- @retval The size of dependencies.
-
-**/
-UINTN
-GetDepexSize (
- IN CONST EFI_FIRMWARE_IMAGE_DEP *Dependencies
- )
-{
- UINTN Index;
-
- if (Dependencies == NULL) {
- return 0;
- }
-
- Index = 0;
- while (Dependencies->Dependencies[Index] != EFI_FMP_DEP_END) {
- Index ++;
- }
-
- return Index + 1;
-}
-
-/**
- Check dependency for firmware update.
-
- @param[in] ImageTypeId Image Type Id.
- @param[in] Version New version.
- @param[in] Dependencies The dependencies.
- @param[in] DependenciesSize Size of the dependencies
- @param[out] IsSatisfied Indicate the dependencies is satisfied or not.
-
- @retval EFI_SUCCESS Dependency Evaluation is successful.
- @retval Others Dependency Evaluation fails with unexpected error.
-
-**/
-EFI_STATUS
-EvaluateImageDependencies (
- IN CONST EFI_GUID ImageTypeId,
- IN CONST UINT32 Version,
- IN CONST EFI_FIRMWARE_IMAGE_DEP *Dependencies,
- IN CONST UINT32 DependenciesSize,
- OUT BOOLEAN *IsSatisfied
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE *HandleBuffer;
- UINTN Index;
- EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;
- UINTN ImageInfoSize;
- UINT32 FmpImageInfoDescriptorVer;
- UINT8 FmpImageInfoCount;
- UINTN DescriptorSize;
- UINT32 PackageVersion;
- CHAR16 *PackageVersionName;
- UINTN DepexSize;
-
- *IsSatisfied = TRUE;
- PackageVersionName = NULL;
-
- //
- // Get ImageDescriptors of all FMP instances, and archive them for depex evaluation.
- //
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiFirmwareManagementProtocolGuid,
- NULL,
- &mNumberOfFmpInstance,
- &HandleBuffer
- );
- if (EFI_ERROR (Status)) {
- return EFI_ABORTED;
- }
-
- mFmpImageInfoBuf = AllocatePool (sizeof(EFI_FIRMWARE_IMAGE_DESCRIPTOR *) * mNumberOfFmpInstance);
- if (mFmpImageInfoBuf == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- for (Index = 0; Index < mNumberOfFmpInstance; Index ++) {
- Status = gBS->HandleProtocol (
- HandleBuffer[Index],
- &gEfiFirmwareManagementProtocolGuid,
- (VOID **) &Fmp
- );
- if (EFI_ERROR(Status)) {
- continue;
- }
-
- ImageInfoSize = 0;
- Status = Fmp->GetImageInfo (
- Fmp,
- &ImageInfoSize,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
- );
- if (Status != EFI_BUFFER_TOO_SMALL) {
- continue;
- }
-
- mFmpImageInfoBuf[Index] = AllocateZeroPool (ImageInfoSize);
- if (mFmpImageInfoBuf[Index] == NULL) {
- continue;
- }
-
- Status = Fmp->GetImageInfo (
- Fmp,
- &ImageInfoSize, // ImageInfoSize
- mFmpImageInfoBuf[Index], // ImageInfo
- &FmpImageInfoDescriptorVer, // DescriptorVersion
- &FmpImageInfoCount, // DescriptorCount
- &DescriptorSize, // DescriptorSize
- &PackageVersion, // PackageVersion
- &PackageVersionName // PackageVersionName
- );
- if (EFI_ERROR(Status)) {
- FreePool (mFmpImageInfoBuf[Index]);
- mFmpImageInfoBuf[Index] = NULL;
- continue;
- }
-
- if (PackageVersionName != NULL) {
- FreePool (PackageVersionName);
- PackageVersionName = NULL;
- }
- }
-
- //
- // Step 1 - Evaluate firmware image's depex, against the version of other Fmp instances.
- //
- if (Dependencies != NULL) {
- *IsSatisfied = EvaluateDependencies (Dependencies, DependenciesSize);
- }
-
- if (!*IsSatisfied) {
- goto cleanup;
- }
-
- //
- // Step 2 - Evaluate the depex of all other Fmp instances, against the new version in
- // the firmware image.
- //
-
- //
- // Update the new version to mFmpImageInfoBuf.
- //
- for (Index = 0; Index < mNumberOfFmpInstance; Index ++) {
- if (mFmpImageInfoBuf[Index] != NULL) {
- if (CompareGuid (&ImageTypeId, &mFmpImageInfoBuf[Index]->ImageTypeId)) {
- mFmpImageInfoBuf[Index]->Version = Version;
- break;
- }
- }
- }
-
- //
- // Evaluate the Dependencies one by one.
- //
- for (Index = 0; Index < mNumberOfFmpInstance; Index ++) {
- if (mFmpImageInfoBuf[Index] != NULL) {
- //
- // Skip the Fmp instance to be "SetImage".
- //
- if (CompareGuid (&ImageTypeId, &mFmpImageInfoBuf[Index]->ImageTypeId)) {
- continue;
- }
- if ((mFmpImageInfoBuf[Index]->AttributesSupported & IMAGE_ATTRIBUTE_DEPENDENCY) &&
- mFmpImageInfoBuf[Index]->Dependencies != NULL) {
- //
- // Get the size of depex.
- // Assume that the dependencies in EFI_FIRMWARE_IMAGE_DESCRIPTOR is validated when PopulateDescriptor().
- //
- DepexSize = GetDepexSize (mFmpImageInfoBuf[Index]->Dependencies);
- if (DepexSize > 0) {
- *IsSatisfied = EvaluateDependencies (mFmpImageInfoBuf[Index]->Dependencies, DepexSize);
- if (!*IsSatisfied) {
- break;
- }
- }
- }
- }
- }
-
-cleanup:
- if (mFmpImageInfoBuf != NULL) {
- for (Index = 0; Index < mNumberOfFmpInstance; Index ++) {
- if (mFmpImageInfoBuf[Index] != NULL) {
- FreePool (mFmpImageInfoBuf[Index]);
- }
- }
- FreePool (mFmpImageInfoBuf);
- }
-
- return EFI_SUCCESS;
-}
diff --git a/FmpDevicePkg/FmpDxe/Dependency.h b/FmpDevicePkg/FmpDxe/Dependency.h
deleted file mode 100644
index badd2542d6..0000000000
--- a/FmpDevicePkg/FmpDxe/Dependency.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/** @file
- Fmp Capsule Dependency support functions for Firmware Management Protocol based
- firmware updates.
-
- Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef __DEPENDENCY_H__
-#define __DEPENDENCY_H__
-
-#include <Library/UefiLib.h>
-#include <Protocol/FirmwareManagement.h>
-
-#define DEPENDENCIES_SATISFIED 0
-#define DEPENDENCIES_UNSATISFIED 1
-#define DEPENDENCIES_INVALID 2
-
-extern UINT8 mDependenciesCheckStatus;
-
-/**
- Validate the dependency expression and output its size.
-
- @param[in] ImageDepex Pointer to the EFI_FIRMWARE_IMAGE_DEP.
- @param[in] MaxDepexSize Max size of the dependency.
- @param[out] DepexSize Size of dependency.
-
- @retval TRUE The capsule is valid.
- @retval FALSE The capsule is invalid.
-
-**/
-BOOLEAN
-ValidateImageDepex (
- IN EFI_FIRMWARE_IMAGE_DEP *ImageDepex,
- IN CONST UINTN MaxDepexSize,
- OUT UINT32 *DepexSize
- );
-
-/**
- Check dependency for firmware update.
-
- @param[in] ImageTypeId Image Type Id.
- @param[in] Version New version.
- @param[in] Dependencies The dependencies.
- @param[in] DepexSize Size of the dependencies
- @param[out] IsSatisfied Indicate the dependencies is satisfied or not.
-
- @retval EFI_SUCCESS Dependency Evaluation is successful.
- @retval Others Dependency Evaluation fails with unexpected error.
-
-**/
-EFI_STATUS
-EvaluateImageDependencies (
- IN CONST EFI_GUID ImageTypeId,
- IN CONST UINT32 Version,
- IN CONST EFI_FIRMWARE_IMAGE_DEP *Dependencies,
- IN CONST UINT32 DepexSize,
- OUT BOOLEAN *IsSatisfied
- );
-
-#endif
diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.c b/FmpDevicePkg/FmpDxe/FmpDxe.c
index 5b523291e4..d4ba53655d 100644
--- a/FmpDevicePkg/FmpDxe/FmpDxe.c
+++ b/FmpDevicePkg/FmpDxe/FmpDxe.c
@@ -10,11 +10,10 @@
**/
#include "FmpDxe.h"
#include "VariableSupport.h"
-#include "Dependency.h"
///
/// FILE_GUID from FmpDxe.inf. When FmpDxe.inf is used in a platform, the
/// FILE_GUID must always be overridden in the <Defines> section to provide
/// the ESRT GUID value associated with the updatable firmware image. A
@@ -79,11 +78,12 @@ const FIRMWARE_MANAGEMENT_PRIVATE_DATA mFirmwareManagementPrivateDataTemplate =
NULL, // FmpDeviceContext
NULL, // VersionVariableName
NULL, // LsvVariableName
NULL, // LastAttemptStatusVariableName
NULL, // LastAttemptVersionVariableName
- NULL // FmpStateVariableName
+ NULL, // FmpStateVariableName
+ TRUE // DependenciesSatisfied
};
///
/// GUID that is used to create event used to lock the firmware storage device.
///
@@ -274,17 +274,10 @@ VOID
PopulateDescriptor (
FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private
)
{
EFI_STATUS Status;
- VOID *Image;
- UINTN ImageSize;
- BOOLEAN IsDepexValid;
- UINT32 DepexSize;
-
- Image = NULL;
- ImageSize = 0;
if (Private->DescriptorPopulated) {
return;
}
@@ -385,50 +378,22 @@ PopulateDescriptor (
Private->Descriptor.LastAttemptVersion = GetLastAttemptVersionFromVariable (Private);
Private->Descriptor.LastAttemptStatus = GetLastAttemptStatusFromVariable (Private);
//
- // Get the dependency from the FmpDeviceLib and populate it to the descriptor.
+ // Get the dependency from the FmpDependencyCheckLib.
//
Private->Descriptor.Dependencies = NULL;
//
// Check the attribute IMAGE_ATTRIBUTE_DEPENDENCY
//
- if (Private->Descriptor.AttributesSupported & IMAGE_ATTRIBUTE_DEPENDENCY) {
- //
- // The parameter "Image" of FmpDeviceGetImage() is extended to contain the dependency.
- // Get the dependency from the Image.
- //
- ImageSize = Private->Descriptor.Size;
- Image = AllocatePool (ImageSize);
- if (Image != NULL) {
- Status = FmpDeviceGetImage (Image, &ImageSize);
- if (Status == EFI_BUFFER_TOO_SMALL) {
- FreePool (Image);
- Image = AllocatePool (ImageSize);
- if (Image != NULL) {
- Status = FmpDeviceGetImage (Image, &ImageSize);
- }
- }
- }
- if (!EFI_ERROR (Status) && Image != NULL) {
- IsDepexValid = ValidateImageDepex ((EFI_FIRMWARE_IMAGE_DEP *) Image, ImageSize, &DepexSize);
- if (IsDepexValid) {
- Private->Descriptor.Dependencies = AllocatePool (DepexSize);
- if (Private->Descriptor.Dependencies != NULL) {
- CopyMem (Private->Descriptor.Dependencies->Dependencies, Image, DepexSize);
- }
- }
- }
+ if (Private->Descriptor.AttributesSetting & IMAGE_ATTRIBUTE_DEPENDENCY) {
+ Private->Descriptor.Dependencies = GetFmpDependency (NULL);
}
Private->DescriptorPopulated = TRUE;
-
- if (Image != NULL) {
- FreePool (Image);
- }
}
/**
Returns information about the current firmware image(s) of the device.
@@ -586,21 +551,16 @@ GetTheImage (
)
{
EFI_STATUS Status;
FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private;
UINTN Size;
- UINT8 *ImageBuffer;
- UINTN ImageBufferSize;
- UINT32 DepexSize;
if (!FeaturePcdGet (PcdFmpDeviceStorageAccessEnable)) {
return EFI_UNSUPPORTED;
}
- Status = EFI_SUCCESS;
- ImageBuffer = NULL;
- DepexSize = 0;
+ Status = EFI_SUCCESS;
//
// Retrieve the private context structure
//
Private = FIRMWARE_MANAGEMENT_PRIVATE_DATA_FROM_THIS (This);
@@ -626,49 +586,12 @@ GetTheImage (
//
Status = FmpDeviceGetSize (&Size);
if (EFI_ERROR (Status)) {
Size = 0;
}
-
- //
- // The parameter "Image" of FmpDeviceGetImage() is extended to contain the dependency.
- // Get the Fmp Payload from the Image.
- //
- ImageBufferSize = Size;
- ImageBuffer = AllocatePool (ImageBufferSize);
- if (ImageBuffer == NULL) {
- DEBUG ((DEBUG_ERROR, "FmpDxe(%s): GetImage() - AllocatePool fails.\n", mImageIdName));
- Status = EFI_NOT_FOUND;
- goto cleanup;
- }
- Status = FmpDeviceGetImage (ImageBuffer, &ImageBufferSize);
- if (Status == EFI_BUFFER_TOO_SMALL) {
- FreePool (ImageBuffer);
- ImageBuffer = AllocatePool (ImageBufferSize);
- if (ImageBuffer == NULL) {
- DEBUG ((DEBUG_ERROR, "FmpDxe(%s): GetImage() - AllocatePool fails.\n", mImageIdName));
- Status = EFI_NOT_FOUND;
- goto cleanup;
- }
- Status = FmpDeviceGetImage (ImageBuffer, &ImageBufferSize);
- }
- if (EFI_ERROR (Status)) {
- goto cleanup;
- }
-
- //
- // Check the attribute IMAGE_ATTRIBUTE_DEPENDENCY
- //
- if (Private->Descriptor.AttributesSetting & IMAGE_ATTRIBUTE_DEPENDENCY) {
- //
- // Validate the dependency to get its size.
- //
- ValidateImageDepex ((EFI_FIRMWARE_IMAGE_DEP *) ImageBuffer, ImageBufferSize, &DepexSize);
- }
-
- if (*ImageSize < ImageBufferSize - DepexSize) {
- *ImageSize = ImageBufferSize - DepexSize;
+ if (*ImageSize < Size) {
+ *ImageSize = Size;
DEBUG ((DEBUG_VERBOSE, "FmpDxe(%s): GetImage() - ImageSize is to small.\n", mImageIdName));
Status = EFI_BUFFER_TOO_SMALL;
goto cleanup;
}
@@ -676,57 +599,50 @@ GetTheImage (
DEBUG ((DEBUG_ERROR, "FmpDxe(%s): GetImage() - Image Pointer Parameter is NULL.\n", mImageIdName));
Status = EFI_INVALID_PARAMETER;
goto cleanup;
}
- //
- // Image is after the dependency expression.
- //
- *ImageSize = ImageBufferSize - DepexSize;
- CopyMem (Image, ImageBuffer + DepexSize, *ImageSize);
- Status = EFI_SUCCESS;
-
+ Status = FmpDeviceGetImage (Image, ImageSize);
cleanup:
- if (ImageBuffer != NULL) {
- FreePool (ImageBuffer);
- }
return Status;
}
/**
Helper function to safely retrieve the FMP header from
within an EFI_FIRMWARE_IMAGE_AUTHENTICATION structure.
- @param[in] Image Pointer to the image.
- @param[in] ImageSize Size of the image.
+ @param[in] Image Pointer to the image.
+ @param[in] ImageSize Size of the image.
+ @param[in] AdditionalHeaderSize Size of any headers that cannot be calculated by this function.
@param[out] PayloadSize
@retval !NULL Valid pointer to the header.
@retval NULL Structure is bad and pointer cannot be found.
**/
VOID *
GetFmpHeader (
IN CONST EFI_FIRMWARE_IMAGE_AUTHENTICATION *Image,
IN CONST UINTN ImageSize,
+ IN CONST UINTN AdditionalHeaderSize,
OUT UINTN *PayloadSize
)
{
//
// Check to make sure that operation can be safely performed.
//
- if (((UINTN)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength) < (UINTN)Image || \
- ((UINTN)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength) >= (UINTN)Image + ImageSize) {
+ if (((UINTN)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength) + AdditionalHeaderSize < (UINTN)Image || \
+ ((UINTN)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength) + AdditionalHeaderSize >= (UINTN)Image + ImageSize) {
//
// Pointer overflow. Invalid image.
//
return NULL;
}
- *PayloadSize = ImageSize - (sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength);
- return (VOID *)((UINT8 *)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength);
+ *PayloadSize = ImageSize - (sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength + AdditionalHeaderSize);
+ return (VOID *)((UINT8 *)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength + AdditionalHeaderSize);
}
/**
Helper function to safely calculate the size of all headers
within an EFI_FIRMWARE_IMAGE_AUTHENTICATION structure.
@@ -809,12 +725,10 @@ CheckTheImage (
UINTN PublicKeyDataLength;
UINT8 *PublicKeyDataXdr;
UINT8 *PublicKeyDataXdrEnd;
EFI_FIRMWARE_IMAGE_DEP *Dependencies;
UINT32 DependenciesSize;
- BOOLEAN IsDepexValid;
- BOOLEAN IsDepexSatisfied;
Status = EFI_SUCCESS;
RawSize = 0;
FmpPayloadHeader = NULL;
FmpPayloadSize = 0;
@@ -848,10 +762,15 @@ CheckTheImage (
//
//Set to valid and then if any tests fail it will update this flag.
//
*ImageUpdatable = IMAGE_UPDATABLE_VALID;
+ //
+ // Set to satisfied and then if dependency evaluates to false it will update this flag.
+ //
+ Private->DependenciesSatisfied = TRUE;
+
if (Image == NULL) {
DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckImage() - Image Pointer Parameter is NULL.\n", mImageIdName));
//
// not sure if this is needed
//
@@ -933,49 +852,30 @@ CheckTheImage (
*ImageUpdatable = IMAGE_UPDATABLE_INVALID_TYPE;
Status = EFI_SUCCESS;
goto cleanup;
}
+ //
+ // Get the dependency from Image.
+ //
+ Dependencies = GetImageDependency ((EFI_FIRMWARE_IMAGE_AUTHENTICATION *)Image, ImageSize, &DependenciesSize);
//
// Check the FmpPayloadHeader
//
- FmpPayloadHeader = GetFmpHeader ( (EFI_FIRMWARE_IMAGE_AUTHENTICATION *)Image, ImageSize, &FmpPayloadSize );
+ FmpPayloadHeader = GetFmpHeader ( (EFI_FIRMWARE_IMAGE_AUTHENTICATION *)Image, ImageSize, DependenciesSize, &FmpPayloadSize );
if (FmpPayloadHeader == NULL) {
DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - GetFmpHeader failed.\n", mImageIdName));
Status = EFI_ABORTED;
goto cleanup;
}
Status = GetFmpPayloadHeaderVersion (FmpPayloadHeader, FmpPayloadSize, &Version);
if (EFI_ERROR (Status)) {
- //
- // Check if there is dependency expression
- //
- IsDepexValid = ValidateImageDepex ((EFI_FIRMWARE_IMAGE_DEP*) FmpPayloadHeader, FmpPayloadSize, &DependenciesSize);
- if (IsDepexValid && (DependenciesSize < FmpPayloadSize)) {
- //
- // Fmp payload is after dependency expression
- //
- Dependencies = (EFI_FIRMWARE_IMAGE_DEP*) FmpPayloadHeader;
- FmpPayloadHeader = (UINT8 *) Dependencies + DependenciesSize;
- FmpPayloadSize = FmpPayloadSize - DependenciesSize;
- Status = GetFmpPayloadHeaderVersion (FmpPayloadHeader, FmpPayloadSize, &Version);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - GetFmpPayloadHeaderVersion failed %r.\n", mImageIdName, Status));
- *ImageUpdatable = IMAGE_UPDATABLE_INVALID;
- Status = EFI_SUCCESS;
- goto cleanup;
- }
- } else {
- DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - Dependency is invalid.\n", mImageIdName));
- mDependenciesCheckStatus = DEPENDENCIES_INVALID;
- *ImageUpdatable = IMAGE_UPDATABLE_INVALID;
- Status = EFI_SUCCESS;
- goto cleanup;
- }
- } else {
- DEBUG ((DEBUG_WARN, "FmpDxe(%s): CheckTheImage() - No dependency associated in image.\n", mImageIdName));
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - GetFmpPayloadHeaderVersion failed %r.\n", mImageIdName, Status));
+ *ImageUpdatable = IMAGE_UPDATABLE_INVALID;
+ Status = EFI_SUCCESS;
+ goto cleanup;
}
//
// Check the lowest supported version
//
@@ -991,18 +891,13 @@ CheckTheImage (
}
//
// Evaluate dependency expression
//
- Status = EvaluateImageDependencies (Private->Descriptor.ImageTypeId, Version, Dependencies, DependenciesSize, &IsDepexSatisfied);
- if (!IsDepexSatisfied || EFI_ERROR (Status)) {
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - Dependency check failed %r.\n", mImageIdName, Status));
- } else {
- DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - Dependency is not satisfied.\n", mImageIdName));
- }
- mDependenciesCheckStatus = DEPENDENCIES_UNSATISFIED;
+ Private->DependenciesSatisfied = CheckFmpDependency (Private->Descriptor.ImageTypeId, Version, Dependencies, DependenciesSize);
+ if (!Private->DependenciesSatisfied) {
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - Dependency check failed.\n", mImageIdName));
*ImageUpdatable = IMAGE_UPDATABLE_INVALID;
Status = EFI_SUCCESS;
goto cleanup;
}
@@ -1111,13 +1006,10 @@ SetTheImage (
UINT32 LastAttemptStatus;
UINT32 Version;
UINT32 LowestSupportedVersion;
EFI_FIRMWARE_IMAGE_DEP *Dependencies;
UINT32 DependenciesSize;
- BOOLEAN IsDepexValid;
- UINT8 *ImageBuffer;
- UINTN ImageBufferSize;
Status = EFI_SUCCESS;
Updateable = 0;
BooleanValue = FALSE;
FmpHeaderSize = 0;
@@ -1126,12 +1018,10 @@ SetTheImage (
AllHeaderSize = 0;
IncomingFwVersion = 0;
LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL;
Dependencies = NULL;
DependenciesSize = 0;
- ImageBuffer = NULL;
- ImageBufferSize = 0;
if (!FeaturePcdGet (PcdFmpDeviceStorageAccessEnable)) {
return EFI_UNSUPPORTED;
}
@@ -1159,15 +1049,10 @@ SetTheImage (
DEBUG ((DEBUG_ERROR, "FmpDxe(%s): SetTheImage() - Device is already locked. Can't update.\n", mImageIdName));
Status = EFI_UNSUPPORTED;
goto cleanup;
}
- //
- // Set check status to satisfied before CheckTheImage()
- //
- mDependenciesCheckStatus = DEPENDENCIES_SATISFIED;
-
//
// Call check image to verify the image
//
Status = CheckTheImage (This, ImageIndex, Image, ImageSize, &Updateable);
if (EFI_ERROR (Status)) {
@@ -1176,36 +1061,26 @@ SetTheImage (
LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_AUTH_ERROR;
}
goto cleanup;
}
+ //
+ // Get the dependency from Image.
+ //
+ Dependencies = GetImageDependency ((EFI_FIRMWARE_IMAGE_AUTHENTICATION *)Image, ImageSize, &DependenciesSize);
+
//
// No functional error in CheckTheImage. Attempt to get the Version to
// support better error reporting.
//
- FmpHeader = GetFmpHeader ( (EFI_FIRMWARE_IMAGE_AUTHENTICATION *)Image, ImageSize, &FmpPayloadSize );
+ FmpHeader = GetFmpHeader ( (EFI_FIRMWARE_IMAGE_AUTHENTICATION *)Image, ImageSize, DependenciesSize, &FmpPayloadSize );
if (FmpHeader == NULL) {
DEBUG ((DEBUG_ERROR, "FmpDxe(%s): SetTheImage() - GetFmpHeader failed.\n", mImageIdName));
Status = EFI_ABORTED;
goto cleanup;
}
Status = GetFmpPayloadHeaderVersion (FmpHeader, FmpPayloadSize, &IncomingFwVersion);
- if (EFI_ERROR (Status)) {
- //
- // Check if there is dependency expression
- //
- IsDepexValid = ValidateImageDepex ((EFI_FIRMWARE_IMAGE_DEP*) FmpHeader, FmpPayloadSize, &DependenciesSize);
- if (IsDepexValid && (DependenciesSize < FmpPayloadSize)) {
- //
- // Fmp payload is after dependency expression
- //
- Dependencies = (EFI_FIRMWARE_IMAGE_DEP*) FmpHeader;
- FmpHeader = (UINT8 *) FmpHeader + DependenciesSize;
- FmpPayloadSize = FmpPayloadSize - DependenciesSize;
- Status = GetFmpPayloadHeaderVersion (FmpHeader, FmpPayloadSize, &IncomingFwVersion);
- }
- }
if (!EFI_ERROR (Status)) {
//
// Set to actual value
//
SetLastAttemptVersionInVariable (Private, IncomingFwVersion);
@@ -1216,14 +1091,12 @@ SetTheImage (
DEBUG (
(DEBUG_ERROR,
"FmpDxe(%s): SetTheImage() - Check The Image returned that the Image was not valid for update. Updatable value = 0x%X.\n",
mImageIdName, Updateable)
);
- if (mDependenciesCheckStatus == DEPENDENCIES_UNSATISFIED) {
+ if (Private->DependenciesSatisfied == FALSE) {
LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_UNSATISFIED_DEPENDENCIES;
- } else if (mDependenciesCheckStatus == DEPENDENCIES_INVALID) {
- LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_INVALID_FORMAT;
}
Status = EFI_ABORTED;
goto cleanup;
}
@@ -1321,59 +1194,41 @@ SetTheImage (
DEBUG ((DEBUG_ERROR, "FmpDxe(%s): SetTheImage() - GetAllHeaderSize failed.\n", mImageIdName));
Status = EFI_ABORTED;
goto cleanup;
}
- //
- // Check the attribute IMAGE_ATTRIBUTE_DEPENDENCY
- //
- if (Private->Descriptor.AttributesSetting & IMAGE_ATTRIBUTE_DEPENDENCY) {
- //
- // To support saving dependency, extend param "Image" of FmpDeviceSetImage() to
- // contain the dependency inside. FmpDeviceSetImage() is responsible for saving
- // the dependency which can be used for future dependency check.
- //
- ImageBufferSize = DependenciesSize + ImageSize - AllHeaderSize;
- ImageBuffer = AllocatePool (ImageBufferSize);
- if (ImageBuffer == NULL) {
- DEBUG ((DEBUG_ERROR, "FmpDxe(%s): SetTheImage() - AllocatePool failed.\n", mImageIdName));
- Status = EFI_ABORTED;
- goto cleanup;
- }
- CopyMem (ImageBuffer, Dependencies->Dependencies, DependenciesSize);
- CopyMem (ImageBuffer + DependenciesSize, (UINT8 *)Image + AllHeaderSize, ImageBufferSize - DependenciesSize);
- } else {
- ImageBufferSize = ImageSize - AllHeaderSize;
- ImageBuffer = AllocateCopyPool(ImageBufferSize, (UINT8 *)Image + AllHeaderSize);
- if (ImageBuffer == NULL) {
- DEBUG ((DEBUG_ERROR, "FmpDxe(%s): SetTheImage() - AllocatePool failed.\n", mImageIdName));
- Status = EFI_ABORTED;
- goto cleanup;
- }
- }
-
//
// Indicate that control is handed off to FmpDeviceLib
//
Progress (5);
//
//Copy the requested image to the firmware using the FmpDeviceLib
//
Status = FmpDeviceSetImage (
- ImageBuffer,
- ImageBufferSize,
+ (((UINT8 *)Image) + AllHeaderSize),
+ ImageSize - AllHeaderSize,
VendorCode,
FmpDxeProgress,
IncomingFwVersion,
AbortReason
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "FmpDxe(%s): SetTheImage() SetImage from FmpDeviceLib failed. Status = %r.\n", mImageIdName, Status));
goto cleanup;
}
+ //
+ // Store the dependency
+ //
+ if (Private->Descriptor.AttributesSetting & IMAGE_ATTRIBUTE_DEPENDENCY) {
+ Status = SaveFmpDependency (Dependencies, DependenciesSize);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): SetTheImage() SaveFmpDependency from FmpDependencyCheckLib failed. (%r)\n", mImageIdName, Status));
+ }
+ Status = EFI_SUCCESS;
+ }
//
// Finished the update without error
// Indicate that control has been returned from FmpDeviceLib
//
@@ -1396,14 +1251,10 @@ SetTheImage (
SetLowestSupportedVersionInVariable (Private, LowestSupportedVersion);
LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS;
cleanup:
- if (ImageBuffer != NULL) {
- FreePool (ImageBuffer);
- }
-
mProgressFunc = NULL;
SetLastAttemptStatusInVariable (Private, LastAttemptStatus);
if (Progress != NULL) {
//
diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.h b/FmpDevicePkg/FmpDxe/FmpDxe.h
index 150f18b656..5f0643204f 100644
--- a/FmpDevicePkg/FmpDxe/FmpDxe.h
+++ b/FmpDevicePkg/FmpDxe/FmpDxe.h
@@ -26,10 +26,12 @@
#include <Library/PrintLib.h>
#include <Library/FmpAuthenticationLib.h>
#include <Library/FmpDeviceLib.h>
#include <Library/FmpPayloadHeaderLib.h>
#include <Library/CapsuleUpdatePolicyLib.h>
+#include <Library/FmpDependencyLib.h>
+#include <Library/FmpDependencyCheckLib.h>
#include <Protocol/FirmwareManagement.h>
#include <Protocol/FirmwareManagementProgress.h>
#include <Protocol/VariableLock.h>
#include <Guid/SystemResourceTable.h>
#include <Guid/EventGroup.h>
@@ -64,10 +66,11 @@ typedef struct {
CHAR16 *VersionVariableName;
CHAR16 *LsvVariableName;
CHAR16 *LastAttemptStatusVariableName;
CHAR16 *LastAttemptVersionVariableName;
CHAR16 *FmpStateVariableName;
+ BOOLEAN DependenciesSatisfied;
} FIRMWARE_MANAGEMENT_PRIVATE_DATA;
///
///
///
diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.inf b/FmpDevicePkg/FmpDxe/FmpDxe.inf
index 97b6518fa1..b42d6e5c01 100644
--- a/FmpDevicePkg/FmpDxe/FmpDxe.inf
+++ b/FmpDevicePkg/FmpDxe/FmpDxe.inf
@@ -26,12 +26,10 @@
#
[Sources]
FmpDxe.c
FmpDxe.h
- Dependency.c
- Dependency.h
DetectTestKey.c
VariableSupport.h
VariableSupport.c
[Packages]
@@ -52,10 +50,12 @@
BaseCryptLib
FmpAuthenticationLib
FmpDeviceLib
FmpPayloadHeaderLib
CapsuleUpdatePolicyLib
+ FmpDependencyLib
+ FmpDependencyCheckLib
[Guids]
gEfiEndOfDxeEventGroupGuid
[Protocols]
diff --git a/FmpDevicePkg/FmpDxe/FmpDxeLib.inf b/FmpDevicePkg/FmpDxe/FmpDxeLib.inf
index de005b6892..c309841e99 100644
--- a/FmpDevicePkg/FmpDxe/FmpDxeLib.inf
+++ b/FmpDevicePkg/FmpDxe/FmpDxeLib.inf
@@ -27,12 +27,10 @@
#
[Sources]
FmpDxe.c
FmpDxe.h
- Dependency.c
- Dependency.h
DetectTestKey.c
VariableSupport.h
VariableSupport.c
[Packages]
@@ -52,10 +50,12 @@
BaseCryptLib
FmpAuthenticationLib
FmpDeviceLib
FmpPayloadHeaderLib
CapsuleUpdatePolicyLib
+ FmpDependencyLib
+ FmpDependencyCheckLib
[Guids]
gEfiEndOfDxeEventGroupGuid
[Protocols]
--
2.16.2.windows.1
next prev parent reply other threads:[~2020-04-28 13:25 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-28 13:25 [edk2-devel] [PATCH 0/4] FmpDevicePkg: Move capsule dependency implement to library Xu, Wei6
2020-04-28 13:25 ` [edk2-devel] [PATCH 1/4] FmpDevicePkg: Add FmpDependency library class and BASE instance Xu, Wei6
2020-04-28 13:25 ` [edk2-devel] [PATCH 2/4] FmpDevicePkg/Test: Add FmpDependencyLib unit test Xu, Wei6
2020-04-28 13:25 ` [edk2-devel] [PATCH 3/4] FmpDevicePkg: Add FmpDependencyCheck library class and instances Xu, Wei6
2020-04-28 13:25 ` Xu, Wei6 [this message]
2020-05-06 14:08 ` [edk2-devel] [PATCH 0/4] FmpDevicePkg: Move capsule dependency implement to library Liming Gao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200428132530.4068-5-wei6.xu@intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox