[PATCH v2] MdeModulePkg/DxeCapsuleLibFmp: Capsule on Disk file name capsule


Bob Morgan
 

Enhance RelocateCapsuleToRam() to skip creation of the Capsule on Disk
file name capsule if PcdSupportUpdateCapsuleReset feature is not enabled.
This avoids an EFI_UNSUPPORTED return status from UpdateCapsule() when the
file name capsule is encountered and PcdSupportUpdateCapsuleReset is FALSE.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Guomin Jiang <guomin.jiang@intel.com>
Signed-off-by: Bob Morgan <bobm@nvidia.com>
---
.../Library/DxeCapsuleLibFmp/CapsuleOnDisk.c | 19 ++++++++++++++++---
.../DxeCapsuleLibFmp/DxeCapsuleLib.inf | 3 +++
2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.c b/MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.c
index 4c32c6cdcf..814c5400fe 100644
--- a/MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.c
+++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.c
@@ -1739,6 +1739,7 @@ RelocateCapsuleToRam (
UINT8 *StringBuf;
UINTN StringSize;
UINTN TotalStringSize;
+ UINTN CapsulesToProcess;

CapsuleOnDiskBuf = NULL;
BlockDescriptors = NULL;
@@ -1778,6 +1779,13 @@ RelocateCapsuleToRam (
TotalStringSize += StrSize (CapsuleOnDiskBuf[Index].FileInfo->FileName);
}

+ // If Persist Across Reset isn't supported, skip the file name strings capsule
+ if (!FeaturePcdGet (PcdSupportUpdateCapsuleReset)) {
+ CapsulesToProcess = CapsuleOnDiskNum;
+ goto BuildGather;
+ }
+ CapsulesToProcess = CapsuleOnDiskNum + 1;
+
FileNameCapsule = AllocateZeroPool (sizeof (EFI_CAPSULE_HEADER) + TotalStringSize);
if (FileNameCapsule == NULL) {
DEBUG ((DEBUG_ERROR, "Fail to allocate memory for name capsule.\n"));
@@ -1804,18 +1812,23 @@ RelocateCapsuleToRam (
//
// 3. Build Gather list for the capsules
//
- Status = BuildGatherList (CapsuleBuffer, CapsuleSize, CapsuleOnDiskNum + 1, &BlockDescriptors);
+BuildGather:
+ Status = BuildGatherList (CapsuleBuffer, CapsuleSize, CapsulesToProcess, &BlockDescriptors);
if (EFI_ERROR (Status) || BlockDescriptors == NULL) {
FreePool (CapsuleBuffer);
FreePool (CapsuleSize);
- FreePool (FileNameCapsule);
+ if (FileNameCapsule != NULL) {
+ FreePool (FileNameCapsule);
+ }
return EFI_OUT_OF_RESOURCES;
}

//
// 4. Call UpdateCapsule() service
//
- Status = gRT->UpdateCapsule((EFI_CAPSULE_HEADER **) CapsuleBuffer, CapsuleOnDiskNum + 1, (UINTN) BlockDescriptors);
+ Status = gRT->UpdateCapsule ((EFI_CAPSULE_HEADER **) CapsuleBuffer,
+ CapsulesToProcess,
+ (UINTN) BlockDescriptors);

return Status;
}
diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
index 05de4299fb..4932479d42 100644
--- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
+++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
@@ -68,6 +68,9 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdCodRelocationDevPath ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdCoDRelocationFileName ## CONSUMES

+[FeaturePcd]
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset ## CONSUMES
+
[Protocols]
gEsrtManagementProtocolGuid ## CONSUMES
gEfiFirmwareManagementProtocolGuid ## CONSUMES
--
2.17.1