summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c84
-rw-r--r--MdeModulePkg/Core/Pei/Memory/MemoryServices.c40
-rw-r--r--MdeModulePkg/Core/Pei/PeiMain.h11
-rw-r--r--MdeModulePkg/Core/Pei/PeiMain.inf1
-rw-r--r--MdeModulePkg/Include/Guid/MigratedFvInfo.h42
-rw-r--r--MdeModulePkg/MdeModulePkg.dec3
6 files changed, 106 insertions, 75 deletions
diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
index 5f32ebb560..4cd8c843cd 100644
--- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
+++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
@@ -1184,7 +1184,12 @@ EvacuateTempRam (
PEI_CORE_FV_HANDLE PeiCoreFvHandle;
EFI_PEI_CORE_FV_LOCATION_PPI *PeiCoreFvLocationPpi;
+ EFI_PEI_HOB_POINTERS Hob;
+ EDKII_MIGRATION_INFO *MigrationInfo;
+ TO_MIGRATE_FV_INFO *ToMigrateFvInfo;
+ UINT32 FvMigrationFlags;
EDKII_MIGRATED_FV_INFO MigratedFvInfo;
+ UINTN Index;
ASSERT (Private->PeiMemoryInstalled);
@@ -1211,6 +1216,13 @@ EvacuateTempRam (
ConvertPeiCorePpiPointers (Private, &PeiCoreFvHandle);
+ Hob.Raw = GetFirstGuidHob (&gEdkiiMigrationInfoGuid);
+ if (Hob.Raw != NULL) {
+ MigrationInfo = GET_GUID_HOB_DATA (Hob);
+ } else {
+ MigrationInfo = NULL;
+ }
+
for (FvIndex = 0; FvIndex < Private->FvCount; FvIndex++) {
FvHeader = Private->Fv[FvIndex].FvHeader;
ASSERT (FvHeader != NULL);
@@ -1224,20 +1236,33 @@ EvacuateTempRam (
)
)
{
- //
- // Allocate page to save the rebased PEIMs, the PEIMs will get dispatched later.
- //
- Status = PeiServicesAllocatePages (
- EfiBootServicesCode,
- EFI_SIZE_TO_PAGES ((UINTN)FvHeader->FvLength),
- &FvHeaderAddress
- );
- ASSERT_EFI_ERROR (Status);
- MigratedFvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvHeaderAddress;
+ if ((MigrationInfo == NULL) || (MigrationInfo->MigrateAll == TRUE)) {
+ //
+ // Migrate all FVs and copy raw data
+ //
+ FvMigrationFlags = FLAGS_FV_RAW_DATA_COPY;
+ } else {
+ for (Index = 0; Index < MigrationInfo->ToMigrateFvCount; Index++) {
+ ToMigrateFvInfo = ((TO_MIGRATE_FV_INFO *)(MigrationInfo + 1)) + Index;
+ if (ToMigrateFvInfo->FvOrgBaseOnTempRam == (UINT32)(UINTN)FvHeader) {
+ //
+ // This FV is to migrate
+ //
+ FvMigrationFlags = ToMigrateFvInfo->FvMigrationFlags;
+ break;
+ }
+ }
+
+ if (Index == MigrationInfo->ToMigrateFvCount) {
+ //
+ // This FV is not expected to migrate
+ //
+ continue;
+ }
+ }
//
- // Allocate pool to save the raw PEIMs, which is used to keep consistent context across
- // multiple boot and PCR0 will keep the same no matter if the address of allocated page is changed.
+ // Allocate pages to save the rebased PEIMs, the PEIMs will get dispatched later.
//
Status = PeiServicesAllocatePages (
EfiBootServicesCode,
@@ -1245,7 +1270,8 @@ EvacuateTempRam (
&FvHeaderAddress
);
ASSERT_EFI_ERROR (Status);
- RawDataFvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvHeaderAddress;
+ MigratedFvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvHeaderAddress;
+ CopyMem (MigratedFvHeader, FvHeader, (UINTN)FvHeader->FvLength);
DEBUG ((
DEBUG_VERBOSE,
@@ -1256,17 +1282,33 @@ EvacuateTempRam (
));
//
- // Copy the context to the rebased pages and raw pages, and create hob to save the
- // information. The MigratedFvInfo HOB will never be produced when
- // PcdMigrateTemporaryRamFirmwareVolumes is FALSE, because the PCD control the
- // feature.
+ // Create hob to save MigratedFvInfo, this hob will only be produced when
+ // Migration feature PCD PcdMigrateTemporaryRamFirmwareVolumes is set to TRUE.
//
- CopyMem (MigratedFvHeader, FvHeader, (UINTN)FvHeader->FvLength);
- CopyMem (RawDataFvHeader, MigratedFvHeader, (UINTN)FvHeader->FvLength);
MigratedFvInfo.FvOrgBase = (UINT32)(UINTN)FvHeader;
MigratedFvInfo.FvNewBase = (UINT32)(UINTN)MigratedFvHeader;
- MigratedFvInfo.FvDataBase = (UINT32)(UINTN)RawDataFvHeader;
+ MigratedFvInfo.FvDataBase = 0;
MigratedFvInfo.FvLength = (UINT32)(UINTN)FvHeader->FvLength;
+
+ //
+ // When FLAGS_FV_RAW_DATA_COPY bit is set, copy the context to the raw pages and
+ // reset raw data base address in MigratedFvInfo hob.
+ //
+ if ((FvMigrationFlags & FLAGS_FV_RAW_DATA_COPY) == FLAGS_FV_RAW_DATA_COPY) {
+ //
+ // Allocate pages to save the raw PEIMs
+ //
+ Status = PeiServicesAllocatePages (
+ EfiBootServicesCode,
+ EFI_SIZE_TO_PAGES ((UINTN)FvHeader->FvLength),
+ &FvHeaderAddress
+ );
+ ASSERT_EFI_ERROR (Status);
+ RawDataFvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvHeaderAddress;
+ CopyMem (RawDataFvHeader, MigratedFvHeader, (UINTN)FvHeader->FvLength);
+ MigratedFvInfo.FvDataBase = (UINT32)(UINTN)RawDataFvHeader;
+ }
+
BuildGuidDataHob (&gEdkiiMigratedFvInfoGuid, &MigratedFvInfo, sizeof (MigratedFvInfo));
//
@@ -1330,8 +1372,6 @@ EvacuateTempRam (
}
}
- RemoveFvHobsInTemporaryMemory (Private);
-
return Status;
}
diff --git a/MdeModulePkg/Core/Pei/Memory/MemoryServices.c b/MdeModulePkg/Core/Pei/Memory/MemoryServices.c
index 3b2e15699f..a30925da39 100644
--- a/MdeModulePkg/Core/Pei/Memory/MemoryServices.c
+++ b/MdeModulePkg/Core/Pei/Memory/MemoryServices.c
@@ -167,46 +167,6 @@ MigrateMemoryPages (
}
/**
- Removes any FV HOBs whose base address is not in PEI installed memory.
-
- @param[in] Private Pointer to PeiCore's private data structure.
-
-**/
-VOID
-RemoveFvHobsInTemporaryMemory (
- IN PEI_CORE_INSTANCE *Private
- )
-{
- EFI_PEI_HOB_POINTERS Hob;
- EFI_HOB_FIRMWARE_VOLUME *FirmwareVolumeHob;
-
- DEBUG ((DEBUG_INFO, "Removing FVs in FV HOB not already migrated to permanent memory.\n"));
-
- for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
- if ((GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV) || (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV2) || (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV3)) {
- FirmwareVolumeHob = Hob.FirmwareVolume;
- DEBUG ((DEBUG_INFO, " Found FV HOB.\n"));
- DEBUG ((
- DEBUG_INFO,
- " BA=%016lx L=%016lx\n",
- FirmwareVolumeHob->BaseAddress,
- FirmwareVolumeHob->Length
- ));
- if (
- !(
- ((EFI_PHYSICAL_ADDRESS)(UINTN)FirmwareVolumeHob->BaseAddress >= Private->PhysicalMemoryBegin) &&
- (((EFI_PHYSICAL_ADDRESS)(UINTN)FirmwareVolumeHob->BaseAddress + (FirmwareVolumeHob->Length - 1)) < Private->FreePhysicalMemoryTop)
- )
- )
- {
- DEBUG ((DEBUG_INFO, " Removing FV HOB to an FV in T-RAM (was not migrated).\n"));
- Hob.Header->HobType = EFI_HOB_TYPE_UNUSED;
- }
- }
- }
-}
-
-/**
Migrate the base address in firmware volume allocation HOBs
from temporary memory to PEI installed memory.
diff --git a/MdeModulePkg/Core/Pei/PeiMain.h b/MdeModulePkg/Core/Pei/PeiMain.h
index 556beddad5..46b6c23014 100644
--- a/MdeModulePkg/Core/Pei/PeiMain.h
+++ b/MdeModulePkg/Core/Pei/PeiMain.h
@@ -1047,17 +1047,6 @@ MigrateMemoryPages (
);
/**
- Removes any FV HOBs whose base address is not in PEI installed memory.
-
- @param[in] Private Pointer to PeiCore's private data structure.
-
-**/
-VOID
-RemoveFvHobsInTemporaryMemory (
- IN PEI_CORE_INSTANCE *Private
- );
-
-/**
Migrate the base address in firmware volume allocation HOBs
from temporary memory to PEI installed memory.
diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf b/MdeModulePkg/Core/Pei/PeiMain.inf
index 0cf357371a..893bdc0527 100644
--- a/MdeModulePkg/Core/Pei/PeiMain.inf
+++ b/MdeModulePkg/Core/Pei/PeiMain.inf
@@ -78,6 +78,7 @@
gEfiFirmwareFileSystem3Guid
gStatusCodeCallbackGuid
gEdkiiMigratedFvInfoGuid ## SOMETIMES_PRODUCES ## HOB
+ gEdkiiMigrationInfoGuid ## SOMETIMES_CONSUMES ## HOB
[Ppis]
gEfiPeiStatusCodePpiGuid ## SOMETIMES_CONSUMES # PeiReportStatusService is not ready if this PPI doesn't exist
diff --git a/MdeModulePkg/Include/Guid/MigratedFvInfo.h b/MdeModulePkg/Include/Guid/MigratedFvInfo.h
index aca2332a0e..1c8b0dfefc 100644
--- a/MdeModulePkg/Include/Guid/MigratedFvInfo.h
+++ b/MdeModulePkg/Include/Guid/MigratedFvInfo.h
@@ -9,13 +9,53 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef __EDKII_MIGRATED_FV_INFO_GUID_H__
#define __EDKII_MIGRATED_FV_INFO_GUID_H__
+//
+// FLAGS_FV_RAW_DATA_COPY indicates FV raw data will be copied to permanent memory
+// or not. When FV is migrated to permanent memory, it will be rebased and raw
+// data will be lost. This bit can be configured as below values:
+// 0: FV raw data will not be used in later phase, and the copy will be skipped to
+// optimize boot performance.
+// 1: FV raw data will be copied to permanent memory for later phase use (such as
+// FV measurement).
+//
+#define FLAGS_FV_RAW_DATA_COPY BIT0
+
+///
+/// In real use cases, not all FVs need migrate to permanent memory before TempRam tears
+/// down. EDKII_MIGRATION_INFO hob should be published by platform to indicate which
+/// FVs need migration to optimize boot performance. If this hob is not detected by Pei
+/// Core, all FVs on TempRam will be migrated and FV raw data will also be copied.
+/// Only one EDKII_MIGRATION_INFO hob should be published by platform, and this hob will
+/// take effect only when migration feature is enabled by PCD.
+///
+typedef struct {
+ UINT32 FvOrgBaseOnTempRam; // Original FV address on Temporary Ram
+ //
+ // FV Migration Flags:
+ // Bit0: Indicate to copy FV raw data or not
+ // Others: Reserved bits
+ //
+ UINT32 FvMigrationFlags;
+} TO_MIGRATE_FV_INFO;
+
+typedef struct {
+ BOOLEAN MigrateAll; // Migrate all FVs and also copy FV raw data
+ //
+ // ToMigrateFvCount and ToMigrateFvInfo array indicate which FVs need be migrated, and
+ // these info should be ignored when MigrateAll field is set to TRUE.
+ //
+ UINT32 ToMigrateFvCount;
+ // TO_MIGRATE_FV_INFO ToMigrateFvInfo[];
+} EDKII_MIGRATION_INFO;
+
typedef struct {
UINT32 FvOrgBase; // original FV address
UINT32 FvNewBase; // new FV address
- UINT32 FvDataBase; // original FV data
+ UINT32 FvDataBase; // original FV data, 0 means raw data is not copied
UINT32 FvLength; // Fv Length
} EDKII_MIGRATED_FV_INFO;
+extern EFI_GUID gEdkiiMigrationInfoGuid;
extern EFI_GUID gEdkiiMigratedFvInfoGuid;
#endif // #ifndef __EDKII_MIGRATED_FV_INFO_GUID_H__
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 1a162e97e6..a2cd83345f 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -421,7 +421,8 @@
gEdkiiCapsuleOnDiskNameGuid = { 0x98c80a4f, 0xe16b, 0x4d11, { 0x93, 0x9a, 0xab, 0xe5, 0x61, 0x26, 0x3, 0x30 } }
## Include/Guid/MigratedFvInfo.h
- gEdkiiMigratedFvInfoGuid = { 0xc1ab12f7, 0x74aa, 0x408d, { 0xa2, 0xf4, 0xc6, 0xce, 0xfd, 0x17, 0x98, 0x71 } }
+ gEdkiiMigrationInfoGuid = { 0xb4b140a5, 0x72f6, 0x4c21, { 0x93, 0xe4, 0xac, 0xc4, 0xec, 0xcb, 0x23, 0x23 } }
+ gEdkiiMigratedFvInfoGuid = { 0xc1ab12f7, 0x74aa, 0x408d, { 0xa2, 0xf4, 0xc6, 0xce, 0xfd, 0x17, 0x98, 0x71 } }
## Include/Guid/RngAlgorithm.h
gEdkiiRngAlgorithmUnSafe = { 0x869f728c, 0x409d, 0x4ab4, {0xac, 0x03, 0x71, 0xd3, 0x09, 0xc1, 0xb3, 0xf4 }}