]> git.proxmox.com Git - mirror_edk2.git/blobdiff - FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.c
FmpDevicePkg: Add Last Attempt Status support to dependency libs
[mirror_edk2.git] / FmpDevicePkg / Library / FmpDependencyCheckLib / FmpDependencyCheckLib.c
index 02ed600e0e95617ab570bf53e2b3067034930c56..cca83dbe4a149e1a7ce19523f104e7e1d1774341 100644 (file)
@@ -17,6 +17,9 @@
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/UefiLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
+#include <Guid/SystemResourceTable.h>\r
+#include <LastAttemptStatus.h>\r
+#include <FmpLastAttemptStatus.h>\r
 \r
 /**\r
   Check dependency for firmware update.\r
   @param[in]  Version            New version.\r
   @param[in]  Dependencies       Fmp dependency.\r
   @param[in]  DependenciesSize   Size, in bytes, of the Fmp dependency.\r
+  @param[out] LastAttemptStatus  An optional pointer to a UINT32 that holds the\r
+                                 last attempt status to report back to the caller.\r
+                                 This function will set the value to LAST_ATTEMPT_STATUS_SUCCESS\r
+                                 if an error code is not set.\r
 \r
   @retval  TRUE    Dependencies are satisfied.\r
   @retval  FALSE   Dependencies are unsatisfied or dependency check fails.\r
@@ -36,7 +43,8 @@ CheckFmpDependency (
   IN  EFI_GUID                ImageTypeId,\r
   IN  UINT32                  Version,\r
   IN  EFI_FIRMWARE_IMAGE_DEP  *Dependencies,    OPTIONAL\r
-  IN  UINT32                  DependenciesSize\r
+  IN  UINT32                  DependenciesSize,\r
+  OUT UINT32                  *LastAttemptStatus OPTIONAL\r
   )\r
 {\r
   EFI_STATUS                        Status;\r
@@ -44,6 +52,7 @@ CheckFmpDependency (
   UINTN                             Index;\r
   EFI_FIRMWARE_MANAGEMENT_PROTOCOL  *Fmp;\r
   UINTN                             ImageInfoSize;\r
+  UINT32                            LocalLastAttemptStatus;\r
   UINT32                            *DescriptorVer;\r
   UINT8                             FmpImageInfoCount;\r
   UINTN                             *DescriptorSize;\r
@@ -55,14 +64,15 @@ CheckFmpDependency (
   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
+  LocalLastAttemptStatus  = LAST_ATTEMPT_STATUS_SUCCESS;\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
@@ -77,30 +87,35 @@ CheckFmpDependency (
   if (EFI_ERROR (Status)) {\r
     DEBUG ((DEBUG_ERROR, "CheckFmpDependency: Get Firmware Management Protocol failed. (%r)", Status));\r
     IsSatisfied = FALSE;\r
+    LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_CHECK_LIB_ERROR_FMP_PROTOCOL_NOT_FOUND;\r
     goto cleanup;\r
   }\r
 \r
   FmpImageInfoBuf = AllocateZeroPool (sizeof(EFI_FIRMWARE_IMAGE_DESCRIPTOR *) * NumberOfFmpInstance);\r
   if (FmpImageInfoBuf == NULL) {\r
     IsSatisfied = FALSE;\r
+    LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_CHECK_LIB_ERROR_MEM_ALLOC_FMP_INFO_BUFFER_FAILED;\r
     goto cleanup;\r
   }\r
 \r
   DescriptorVer = AllocateZeroPool (sizeof(UINT32) * NumberOfFmpInstance);\r
   if (DescriptorVer == NULL ) {\r
     IsSatisfied = FALSE;\r
+    LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_CHECK_LIB_ERROR_MEM_ALLOC_DESC_VER_BUFFER_FAILED;\r
     goto cleanup;\r
   }\r
 \r
   DescriptorSize = AllocateZeroPool (sizeof(UINTN) * NumberOfFmpInstance);\r
   if (DescriptorSize == NULL ) {\r
     IsSatisfied = FALSE;\r
+    LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_CHECK_LIB_ERROR_MEM_ALLOC_DESC_SIZE_BUFFER_FAILED;\r
     goto cleanup;\r
   }\r
 \r
   FmpVersions = AllocateZeroPool (sizeof(FMP_DEPEX_CHECK_VERSION_DATA) * NumberOfFmpInstance);\r
   if (FmpVersions == NULL) {\r
     IsSatisfied = FALSE;\r
+    LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_CHECK_LIB_ERROR_MEM_ALLOC_FMP_VER_BUFFER_FAILED;\r
     goto cleanup;\r
   }\r
 \r
@@ -164,7 +179,7 @@ CheckFmpDependency (
   // 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
+    IsSatisfied = EvaluateDependency (Dependencies, DependenciesSize, FmpVersions, FmpVersionsCount, &LocalLastAttemptStatus);\r
   }\r
 \r
   if (!IsSatisfied) {\r
@@ -194,5 +209,9 @@ cleanup:
     FreePool (FmpVersions);\r
   }\r
 \r
+  if (LastAttemptStatus != NULL) {\r
+    *LastAttemptStatus = LocalLastAttemptStatus;\r
+  }\r
+\r
   return IsSatisfied;\r
 }\r