.../Library/DxeCapsuleLibFmp/CapsuleOnDisk.c | 19 ++++++++++++++++--- .../DxeCapsuleLibFmp/DxeCapsuleLib.inf | 3 +++ 2 files changed, 19 insertions(+), 3 deletions(-)
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
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#83178): https://edk2.groups.io/g/devel/message/83178
Mute This Topic: https://groups.io/mt/86776499/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> > -----邮件原件----- > 发件人: Bob Morgan <bobm@nvidia.com> > 发送时间: 2021年11月3日 4:40 > 收件人: devel@edk2.groups.io > 抄送: Bob Morgan <bobm@nvidia.com>; Jian J Wang > <jian.j.wang@intel.com>; Liming Gao <gaoliming@byosoft.com.cn>; Guomin > Jiang <guomin.jiang@intel.com> > 主题: [PATCH v2] MdeModulePkg/DxeCapsuleLibFmp: Capsule on Disk file > name capsule > > 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 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#83201): https://edk2.groups.io/g/devel/message/83201 Mute This Topic: https://groups.io/mt/86782778/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
© 2016 - 2024 Red Hat, Inc.