/** @file\r
Esrt management implementation.\r
\r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
#include "EsrtImpl.h"\r
\r
/**\r
- Find Esrt Entry stored in ESRT repository. \r
+ Find Esrt Entry stored in ESRT repository.\r
\r
@param[in] FwClass Firmware class guid in Esrt entry\r
@param[in] Attribute Esrt from Non FMP or FMP instance\r
@param[out] Entry Esrt entry returned\r
- \r
+\r
@retval EFI_SUCCESS Successfully find an Esrt entry\r
@retval EF_NOT_FOUND No Esrt entry found\r
\r
} else {\r
VariableName = EFI_ESRT_NONFMP_VARIABLE_NAME;\r
}\r
- \r
+\r
Status = GetVariable2 (\r
VariableName,\r
&gEfiCallerIdGuid,\r
\r
@param[in] Entry Esrt entry to be set\r
@param[in] Attribute Esrt from Esrt private protocol or FMP instance\r
- \r
+\r
@retval EFI_SUCCESS Successfully set a variable.\r
\r
**/\r
goto EXIT;\r
}\r
\r
- if (RepositorySize != 0) {\r
+ if (RepositorySize != 0 && EsrtRepository != NULL) {\r
CopyMem(EsrtRepositoryNew, EsrtRepository, RepositorySize);\r
}\r
CopyMem((UINT8 *)EsrtRepositoryNew + RepositorySize, Entry, sizeof(EFI_SYSTEM_RESOURCE_ENTRY));\r
}\r
\r
/**\r
- Delete ESRT Entry from ESRT repository. \r
+ Delete ESRT Entry from ESRT repository.\r
\r
- @param[in] FwClass FwClass of Esrt entry to delete \r
+ @param[in] FwClass FwClass of Esrt entry to delete\r
@param[in] Attribute Esrt from Esrt private protocol or FMP instance\r
- \r
- @retval EFI_SUCCESS Insert all entries Successfully \r
+\r
+ @retval EFI_SUCCESS Insert all entries Successfully\r
@retval EFI_NOT_FOUND ESRT entry with FwClass doesn't exsit\r
- \r
+\r
**/\r
EFI_STATUS\r
DeleteEsrtEntry(\r
IN EFI_GUID *FwClass,\r
IN UINTN Attribute\r
)\r
-{ \r
+{\r
EFI_STATUS Status;\r
CHAR16 *VariableName;\r
EFI_SYSTEM_RESOURCE_ENTRY *EsrtRepository;\r
UINTN EsrtNum;\r
\r
EsrtRepository = NULL;\r
- \r
+\r
//\r
// Get Esrt index buffer\r
//\r
} else {\r
VariableName = EFI_ESRT_NONFMP_VARIABLE_NAME;\r
}\r
- \r
+\r
Status = GetVariable2 (\r
VariableName,\r
&gEfiCallerIdGuid,\r
\r
@param[in] Entry Esrt entry to be set\r
@param[in] Attribute Esrt from Non Esrt or FMP instance\r
- \r
+\r
@retval EFI_SUCCESS Successfully Update a variable.\r
@retval EFI_NOT_FOUND The Esrt enry doesn't exist\r
\r
return Status;\r
}\r
\r
+/**\r
+ Return if this FMP is a system FMP or a device FMP, based upon FmpImageInfo.\r
+\r
+ @param[in] FmpImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR\r
+\r
+ @return TRUE It is a system FMP.\r
+ @return FALSE It is a device FMP.\r
+**/\r
+BOOLEAN\r
+IsSystemFmp (\r
+ IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfo\r
+ )\r
+{\r
+ GUID *Guid;\r
+ UINTN Count;\r
+ UINTN Index;\r
+\r
+ Guid = PcdGetPtr(PcdSystemFmpCapsuleImageTypeIdGuid);\r
+ Count = PcdGetSize(PcdSystemFmpCapsuleImageTypeIdGuid)/sizeof(GUID);\r
+\r
+ for (Index = 0; Index < Count; Index++, Guid++) {\r
+ if (CompareGuid(&FmpImageInfo->ImageTypeId, Guid)) {\r
+ return TRUE;\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
/**\r
Init one ESRT entry according to input FmpImageInfo (V1, V2, V3) .\r
\r
- @param[in] EsrtEntry Esrt entry to be Init\r
- @param[in] FmpImageInfo FMP image info descriptor\r
- @param[in] DescriptorVersion FMP Image info descriptor version\r
- \r
+ @param[in, out] EsrtEntry Esrt entry to be Init\r
+ @param[in] FmpImageInfo FMP image info descriptor\r
+ @param[in] DescriptorVersion FMP Image info descriptor version\r
+\r
**/\r
-VOID \r
+VOID\r
SetEsrtEntryFromFmpInfo (\r
IN OUT EFI_SYSTEM_RESOURCE_ENTRY *EsrtEntry,\r
IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfo,\r
{\r
EsrtEntry->FwVersion = FmpImageInfo->Version;\r
EsrtEntry->FwClass = FmpImageInfo->ImageTypeId;\r
- EsrtEntry->FwType = ESRT_FW_TYPE_DEVICEFIRMWARE;\r
+ if (IsSystemFmp(FmpImageInfo)) {\r
+ EsrtEntry->FwType = ESRT_FW_TYPE_SYSTEMFIRMWARE;\r
+ } else {\r
+ EsrtEntry->FwType = ESRT_FW_TYPE_DEVICEFIRMWARE;\r
+ }\r
EsrtEntry->LowestSupportedFwVersion = 0;\r
EsrtEntry->CapsuleFlags = 0;\r
EsrtEntry->LastAttemptVersion = 0;\r
// LowestSupportedImageVersion only available in FMP V2 or higher\r
//\r
EsrtEntry->LowestSupportedFwVersion = FmpImageInfo->LowestSupportedImageVersion;\r
- } \r
+ }\r
\r
if (DescriptorVersion >= 3) {\r
//\r
//\r
EsrtEntry->LastAttemptVersion = FmpImageInfo->LastAttemptVersion;\r
EsrtEntry->LastAttemptStatus = FmpImageInfo->LastAttemptStatus;\r
- } \r
+ }\r
\r
//\r
// Set capsule customized flag\r