#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
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
UINTN Index;\r
EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp;\r
UINTN ImageInfoSize;\r
+ UINT32 LocalLastAttemptStatus;\r
UINT32 *DescriptorVer;\r
UINT8 FmpImageInfoCount;\r
UINTN *DescriptorSize;\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
+ 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
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
// 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
FreePool (FmpVersions);\r
}\r
\r
+ if (LastAttemptStatus != NULL) {\r
+ *LastAttemptStatus = LocalLastAttemptStatus;\r
+ }\r
+\r
return IsSatisfied;\r
}\r