StandaloneMmPkg: Introduce a PCD to disable shadow boot FV

On some Arm platforms the boot firmware volume passed in the HOB
by the secure world firmware (TF-A) is never freed and is always
mapped as read-only.

On such platforms the heap memory can be saved by disabling the
shadow copy of the boot firmware volume. This is useful as on
some platforms the amount of memory available is limited.

Therefore, introduce a PCD PcdShadowBfv that platforms
can configure to disable the shadow boot FV. This PCD is set to
TRUE by default.

Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
This commit is contained in:
Levi Yun 2025-01-09 10:17:27 +00:00 committed by mergify[bot]
parent 2d2642f483
commit 2091e449f1
3 changed files with 40 additions and 10 deletions

View File

@ -270,6 +270,22 @@ MmDispatchFvs (
DEBUG ((DEBUG_INFO, "%a: FV[%d] address - 0x%x\n", __func__, Index, FvHob.FirmwareVolume->BaseAddress));
DEBUG ((DEBUG_INFO, "%a: FV[%d] size - 0x%x\n", __func__, Index, FvHob.FirmwareVolume->Length));
if (FvHob.FirmwareVolume->Length == 0x00) {
DEBUG ((
DEBUG_INFO,
"%a: Skip invalid FV[%d]- 0x%x/0x%x\n",
__func__,
Index,
FvHob.FirmwareVolume->BaseAddress,
FvHob.FirmwareVolume->Length
));
continue;
}
if (!FixedPcdGetBool (PcdShadowBfv)) {
Fv = (EFI_FIRMWARE_VOLUME_HEADER *)((UINTN)FvHob.FirmwareVolume->BaseAddress);
} else {
Fv = AllocatePool (FvHob.FirmwareVolume->Length);
if (Fv == NULL) {
DEBUG ((DEBUG_ERROR, "Fail to allocate memory for Fv\n"));
@ -282,6 +298,8 @@ MmDispatchFvs (
(VOID *)(UINTN)FvHob.FirmwareVolume->BaseAddress,
FvHob.FirmwareVolume->Length
);
}
MmCoreFfsFindMmDriver (Fv, 0);
mMmFv[Index++] = Fv;
@ -307,6 +325,10 @@ MmFreeShadowedFvs (
{
UINTN Index;
if (!FixedPcdGetBool (PcdShadowBfv)) {
return;
}
for (Index = 0; Index < ARRAY_SIZE (mMmFv); Index++) {
if (mMmFv[Index] != NULL) {
FreePool (mMmFv[Index]);

View File

@ -85,6 +85,7 @@
[Pcd]
gStandaloneMmPkgTokenSpaceGuid.PcdFwVolMmMaxEncapsulationDepth ##CONSUMES
gStandaloneMmPkgTokenSpaceGuid.PcdRestartMmDispatcherOnceMmEntryRegistered ##CONSUMES
gStandaloneMmPkgTokenSpaceGuid.PcdShadowBfv ##CONSUMES
#
# This configuration fails for CLANGPDB, which does not support PIE in the GCC

View File

@ -55,6 +55,13 @@
# @Prompt Maximum permitted FwVol section nesting depth (exclusive) in MM.
gStandaloneMmPkgTokenSpaceGuid.PcdFwVolMmMaxEncapsulationDepth|0x10|UINT32|0x00000001
## Option to make shadow copy of boot firmware volume while loading drivers.
# This options is useful when the BFV is not located in the Flash area
# but is in the RAM instead and therefore no shadow copy is needed.
# TRUE - Default. Make a shadow copy of the boot firmware volume.
# FALSE - Disable shadow copy of the boot firmware volume.
gStandaloneMmPkgTokenSpaceGuid.PcdShadowBfv|TRUE|BOOLEAN|0x00000003
[PcdsFeatureFlag]
## Indicates if restart MM Dispatcher once MM Entry Point is registered.<BR><BR>
# TRUE - Restart MM Dispatcher once MM Entry Point is registered.<BR>