]> git.proxmox.com Git - mirror_edk2.git/commitdiff
FmpDevicePkg: Add FmpDependencyCheck library class and instances
authorWei6 Xu <wei6.xu@intel.com>
Tue, 12 May 2020 05:27:34 +0000 (13:27 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 15 May 2020 06:11:44 +0000 (06:11 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2696

* This library class provides platform specific services to support
dependency check during updating firmware image. Platform can perform
dependency check in platform specific manner by implementing its own
FmpDependencyCheckLib.
* Add FmpDependencyCheck instance to provide a sample of dependency
check. The sample instance only checks the dependency from capsule
image. The dependency from other FMP instances isn't checked here.
* Add NULL instance as an option to skip the dependency check.

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>
Reviewed-by: Sean Brogan <sean.brogan@microsoft.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
FmpDevicePkg/FmpDevicePkg.dec
FmpDevicePkg/FmpDevicePkg.dsc
FmpDevicePkg/Include/Library/FmpDependencyCheckLib.h [new file with mode: 0644]
FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.c [new file with mode: 0644]
FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.inf [new file with mode: 0644]
FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.uni [new file with mode: 0644]
FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.c [new file with mode: 0644]
FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf [new file with mode: 0644]
FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.uni [new file with mode: 0644]

index 49470083468e951f6457996f672b2e979aa1de66..871d5ce89004b13f70130f214cdbb73a015ce748 100644 (file)
   #                  expression evaluation.\r
   FmpDependencyLib|Include/Library/FmpDependencyLib.h\r
 \r
+  ##  @libraryclass  Provides platform specific services to support dependency\r
+  #                  check during update of firmware image.\r
+  FmpDependencyCheckLib|Include/Library/FmpDependencyCheckLib.h\r
+\r
 [LibraryClasses.Common.Private]\r
   ##  @libraryclass  Provides services to retrieve values from a capsule's FMP\r
   #                  Payload Header.  The structure is not included in the\r
index 49c6ff3a30307e69804b64cd7763f422f2d0a484..7e8080617120d85ff9c37c81106fbfafede883af 100644 (file)
@@ -63,6 +63,7 @@
   FmpPayloadHeaderLib|FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf\r
   FmpDeviceLib|FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf\r
   FmpDependencyLib|FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.inf\r
+  FmpDependencyCheckLib|FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf\r
   TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf\r
 \r
 [LibraryClasses.ARM, LibraryClasses.AARCH64]\r
@@ -92,6 +93,8 @@
   FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf\r
   FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf\r
   FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.inf\r
+  FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.inf\r
+  FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf\r
   FmpDevicePkg/FmpDxe/FmpDxeLib.inf\r
 \r
   #\r
diff --git a/FmpDevicePkg/Include/Library/FmpDependencyCheckLib.h b/FmpDevicePkg/Include/Library/FmpDependencyCheckLib.h
new file mode 100644 (file)
index 0000000..ec380c4
--- /dev/null
@@ -0,0 +1,38 @@
+/** @file\r
+  Fmp Capsule Dependency check functions for Firmware Management Protocol based\r
+  firmware updates.\r
+\r
+  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef __FMP_DEPENDENCY_CHECK_LIB__\r
+#define __FMP_DEPENDENCY_CHECK_LIB__\r
+\r
+#include <PiDxe.h>\r
+#include <Protocol/FirmwareManagement.h>\r
+\r
+/**\r
+  Check dependency for firmware update.\r
+\r
+  @param[in]  ImageTypeId        Image Type Id.\r
+  @param[in]  Version            New version.\r
+  @param[in]  Dependencies       Fmp dependency.\r
+  @param[in]  DependenciesSize   Size, in bytes, of the Fmp dependency.\r
+\r
+  @retval  TRUE    Dependencies are satisfied.\r
+  @retval  FALSE   Dependencies are unsatisfied or dependency check fails.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CheckFmpDependency (\r
+  IN  EFI_GUID                ImageTypeId,\r
+  IN  UINT32                  Version,\r
+  IN  EFI_FIRMWARE_IMAGE_DEP  *Dependencies,    OPTIONAL\r
+  IN  UINT32                  DependenciesSize\r
+  );\r
+\r
+#endif\r
diff --git a/FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.c b/FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.c
new file mode 100644 (file)
index 0000000..5e0241b
--- /dev/null
@@ -0,0 +1,196 @@
+/** @file\r
+  Provides FMP capsule dependency check services when updating the firmware\r
+  image of a FMP device.\r
+\r
+  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+#include <PiDxe.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/FmpDependencyLib.h>\r
+#include <Library/FmpDependencyCheckLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+/**\r
+  Check dependency for firmware update.\r
+\r
+  @param[in]  ImageTypeId        Image Type Id.\r
+  @param[in]  Version            New version.\r
+  @param[in]  Dependencies       Fmp dependency.\r
+  @param[in]  DependenciesSize   Size, in bytes, of the Fmp dependency.\r
+\r
+  @retval  TRUE    Dependencies are satisfied.\r
+  @retval  FALSE   Dependencies are unsatisfied or dependency check fails.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CheckFmpDependency (\r
+  IN  EFI_GUID                ImageTypeId,\r
+  IN  UINT32                  Version,\r
+  IN  EFI_FIRMWARE_IMAGE_DEP  *Dependencies,    OPTIONAL\r
+  IN  UINT32                  DependenciesSize\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  EFI_HANDLE                        *HandleBuffer;\r
+  UINTN                             Index;\r
+  EFI_FIRMWARE_MANAGEMENT_PROTOCOL  *Fmp;\r
+  UINTN                             ImageInfoSize;\r
+  UINT32                            *DescriptorVer;\r
+  UINT8                             FmpImageInfoCount;\r
+  UINTN                             *DescriptorSize;\r
+  UINT32                            PackageVersion;\r
+  CHAR16                            *PackageVersionName;\r
+  UINTN                             NumberOfFmpInstance;\r
+  EFI_FIRMWARE_IMAGE_DESCRIPTOR     **FmpImageInfoBuf;\r
+  FMP_DEPEX_CHECK_VERSION_DATA      *FmpVersions;\r
+  UINTN                             FmpVersionsCount;\r
+  BOOLEAN                           IsSatisfied;\r
+\r
+  FmpImageInfoBuf     = NULL;\r
+  DescriptorVer       = NULL;\r
+  DescriptorSize      = NULL;\r
+  NumberOfFmpInstance = 0;\r
+  FmpVersions         = NULL;\r
+  FmpVersionsCount    = 0;\r
+  IsSatisfied         = TRUE;\r
+  PackageVersionName  = NULL;\r
+\r
+  //\r
+  // Get ImageDescriptors of all FMP instances, and archive them for dependency evaluation.\r
+  //\r
+  Status = gBS->LocateHandleBuffer (\r
+                ByProtocol,\r
+                &gEfiFirmwareManagementProtocolGuid,\r
+                NULL,\r
+                &NumberOfFmpInstance,\r
+                &HandleBuffer\r
+                );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_ERROR, "CheckFmpDependency: Get Firmware Management Protocol failed. (%r)", Status));\r
+    goto cleanup;\r
+  }\r
+\r
+  FmpImageInfoBuf = AllocateZeroPool (sizeof(EFI_FIRMWARE_IMAGE_DESCRIPTOR *) * NumberOfFmpInstance);\r
+  if (FmpImageInfoBuf == NULL) {\r
+    IsSatisfied = FALSE;\r
+    goto cleanup;\r
+  }\r
+\r
+  DescriptorVer = AllocateZeroPool (sizeof(UINT32) * NumberOfFmpInstance);\r
+  if (DescriptorVer == NULL ) {\r
+    IsSatisfied = FALSE;\r
+    goto cleanup;\r
+  }\r
+\r
+  DescriptorSize = AllocateZeroPool (sizeof(UINTN) * NumberOfFmpInstance);\r
+  if (DescriptorSize == NULL ) {\r
+    IsSatisfied = FALSE;\r
+    goto cleanup;\r
+  }\r
+\r
+  FmpVersions = AllocateZeroPool (sizeof(FMP_DEPEX_CHECK_VERSION_DATA) * NumberOfFmpInstance);\r
+  if (FmpVersions == NULL) {\r
+    IsSatisfied = FALSE;\r
+    goto cleanup;\r
+  }\r
+\r
+  for (Index = 0; Index < NumberOfFmpInstance; Index ++) {\r
+    Status = gBS->HandleProtocol (\r
+                    HandleBuffer[Index],\r
+                    &gEfiFirmwareManagementProtocolGuid,\r
+                    (VOID **) &Fmp\r
+                    );\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
+    if (Status != EFI_BUFFER_TOO_SMALL) {\r
+      continue;\r
+    }\r
+\r
+    FmpImageInfoBuf[Index] = AllocateZeroPool (ImageInfoSize);\r
+    if (FmpImageInfoBuf[Index] == NULL) {\r
+      continue;\r
+    }\r
+\r
+    Status = Fmp->GetImageInfo (\r
+                    Fmp,\r
+                    &ImageInfoSize,               // ImageInfoSize\r
+                    FmpImageInfoBuf[Index],       // ImageInfo\r
+                    &DescriptorVer[Index],        // DescriptorVersion\r
+                    &FmpImageInfoCount,           // DescriptorCount\r
+                    &DescriptorSize[Index],       // DescriptorSize\r
+                    &PackageVersion,              // PackageVersion\r
+                    &PackageVersionName           // PackageVersionName\r
+                    );\r
+    if (EFI_ERROR(Status)) {\r
+      FreePool (FmpImageInfoBuf[Index]);\r
+      FmpImageInfoBuf[Index] = NULL;\r
+      continue;\r
+    }\r
+\r
+    if (PackageVersionName != NULL) {\r
+      FreePool (PackageVersionName);\r
+      PackageVersionName = NULL;\r
+    }\r
+\r
+    CopyGuid (&FmpVersions[FmpVersionsCount].ImageTypeId, &FmpImageInfoBuf[Index]->ImageTypeId);\r
+    FmpVersions[FmpVersionsCount].Version = FmpImageInfoBuf[Index]->Version;\r
+    FmpVersionsCount ++;\r
+  }\r
+\r
+  //\r
+  // Evaluate firmware image's depex, against the version of other Fmp instances.\r
+  //\r
+  if (Dependencies != NULL) {\r
+    IsSatisfied = EvaluateDependency (Dependencies, DependenciesSize, FmpVersions, FmpVersionsCount);\r
+  }\r
+\r
+  if (!IsSatisfied) {\r
+    DEBUG ((DEBUG_ERROR, "CheckFmpDependency: %g\'s dependency is not satisfied!\n", ImageTypeId));\r
+    goto cleanup;\r
+  }\r
+\r
+cleanup:\r
+  if (FmpImageInfoBuf != NULL) {\r
+    for (Index = 0; Index < NumberOfFmpInstance; Index ++) {\r
+      if (FmpImageInfoBuf[Index] != NULL) {\r
+        FreePool (FmpImageInfoBuf[Index]);\r
+      }\r
+    }\r
+    FreePool (FmpImageInfoBuf);\r
+  }\r
+\r
+  if (DescriptorVer != NULL) {\r
+    FreePool (DescriptorVer);\r
+  }\r
+\r
+  if (DescriptorSize != NULL) {\r
+    FreePool (DescriptorSize);\r
+  }\r
+\r
+  if (FmpVersions != NULL) {\r
+    FreePool (FmpVersions);\r
+  }\r
+\r
+  return IsSatisfied;\r
+}\r
diff --git a/FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.inf b/FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.inf
new file mode 100644 (file)
index 0000000..2050cc6
--- /dev/null
@@ -0,0 +1,43 @@
+## @file\r
+#  Provides FMP capsule dependency check services when updating the firmware\r
+#  image of a FMP device.\r
+#\r
+#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION     = 0x00010005\r
+  BASE_NAME       = FmpDependencyCheckLib\r
+  MODULE_UNI_FILE = FmpDependencyCheckLib.uni\r
+  FILE_GUID       = 8296D425-3095-4CFE-88D8-B0A44DB174A8\r
+  MODULE_TYPE     = DXE_DRIVER\r
+  VERSION_STRING  = 1.0\r
+  LIBRARY_CLASS   = FmpDependencyCheckLib|DXE_DRIVER UEFI_DRIVER UEFI_APPLICATION\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 ARM AARCH64\r
+#\r
+\r
+[Sources]\r
+  FmpDependencyCheckLib.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
+  FmpDevicePkg/FmpDevicePkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+  BaseMemoryLib\r
+  DebugLib\r
+  FmpDependencyLib\r
+  MemoryAllocationLib\r
+  UefiLib\r
+  UefiBootServicesTableLib\r
+\r
+[Protocols]\r
+  gEfiFirmwareManagementProtocolGuid  ## CONSUMES\r
diff --git a/FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.uni b/FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.uni
new file mode 100644 (file)
index 0000000..c6369e2
--- /dev/null
@@ -0,0 +1,13 @@
+// /** @file\r
+// Provides FMP capsule dependency check services when updating the firmware\r
+// image of a FMP device.\r
+//\r
+// Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+//\r
+// SPDX-License-Identifier: BSD-2-Clause-Patent\r
+//\r
+// **/\r
+\r
+#string STR_MODULE_ABSTRACT     #language en-US  "FMP Dependency Check Lib"\r
+\r
+#string STR_MODULE_DESCRIPTION  #language en-US  "Provides FMP capsule dependency check services when updating the firmware image of a FMP device."\r
diff --git a/FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.c b/FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.c
new file mode 100644 (file)
index 0000000..55e9af2
--- /dev/null
@@ -0,0 +1,34 @@
+/** @file\r
+  Null instance of FmpDependencyCheckLib.\r
+\r
+  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+#include <PiDxe.h>\r
+#include <Library/FmpDependencyCheckLib.h>\r
+\r
+/**\r
+  Check dependency for firmware update.\r
+\r
+  @param[in]  ImageTypeId        Image Type Id.\r
+  @param[in]  Version            New version.\r
+  @param[in]  Dependencies       Fmp dependency.\r
+  @param[in]  DependenciesSize   Size, in bytes, of the Fmp dependency.\r
+\r
+  @retval  TRUE    Dependencies are satisfied.\r
+  @retval  FALSE   Dependencies are unsatisfied or dependency check fails.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CheckFmpDependency (\r
+  IN  EFI_GUID                ImageTypeId,\r
+  IN  UINT32                  Version,\r
+  IN  EFI_FIRMWARE_IMAGE_DEP  *Dependencies,    OPTIONAL\r
+  IN  UINT32                  DependenciesSize\r
+  )\r
+{\r
+  return TRUE;\r
+}\r
diff --git a/FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf b/FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf
new file mode 100644 (file)
index 0000000..5794d89
--- /dev/null
@@ -0,0 +1,30 @@
+## @file\r
+#  Null instance of FmpDependencyCheckLib as an option to skip the dependency\r
+#  check when updating the firmware image of a FMP device.\r
+#\r
+#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION     = 0x00010005\r
+  BASE_NAME       = FmpDependencyCheckLibNull\r
+  MODULE_UNI_FILE = FmpDependencyCheckLibNull.uni\r
+  FILE_GUID       = D63F3166-9CBC-4AC2-8F23-8818E42EA2BD\r
+  MODULE_TYPE     = DXE_DRIVER\r
+  VERSION_STRING  = 1.0\r
+  LIBRARY_CLASS   = FmpDependencyCheckLib|DXE_DRIVER UEFI_DRIVER UEFI_APPLICATION\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 ARM AARCH64\r
+#\r
+\r
+[Sources]\r
+  FmpDependencyCheckLibNull.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  FmpDevicePkg/FmpDevicePkg.dec\r
diff --git a/FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.uni b/FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.uni
new file mode 100644 (file)
index 0000000..7942d08
--- /dev/null
@@ -0,0 +1,13 @@
+// /** @file\r
+// Null instance of FmpDependencyCheckLib as an option to skip the dependency\r
+// check when updating the firmware image of a FMP device.\r
+//\r
+// Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+//\r
+// SPDX-License-Identifier: BSD-2-Clause-Patent\r
+//\r
+// **/\r
+\r
+#string STR_MODULE_ABSTRACT     #language en-US  "FMP Dependency Check Library NULL instance"\r
+\r
+#string STR_MODULE_DESCRIPTION  #language en-US  "Null instance of FmpDependencyCheckLib as an option to skip the dependency check when updating the firmware image of a FMP device."\r