From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 3E6D594151E for ; Thu, 14 Dec 2023 13:53:30 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=ObvMAbm4y9XJzDFpMZws1BPnAFgogNImQav7LOxjPEA=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20140610; t=1702562008; v=1; b=DHzcB1leiIdVC2PsUqZsVGfAbs6ycy+1C7syjyqsirvf/jlB9baTWdZ/IhBvVk9kU8Tkr3Bw 56yFUL2rGn/VmLJErYHWD/BWz8uA3haRSGBEYAkC96WyWXapomN/g+hlSSrniIQOAEWjLn0fiOW le8D3wHYd3jQjwhyg08FyX/c= X-Received: by 127.0.0.2 with SMTP id y7uVYY7687511x8KpjyUmrVl; Thu, 14 Dec 2023 05:53:28 -0800 X-Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.11]) by mx.groups.io with SMTP id smtpd.web10.22605.1702562004503781636 for ; Thu, 14 Dec 2023 05:53:28 -0800 X-IronPort-AV: E=McAfee;i="6600,9927,10924"; a="1957345" X-IronPort-AV: E=Sophos;i="6.04,275,1695711600"; d="scan'208";a="1957345" X-Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orvoesa103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Dec 2023 05:53:28 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10924"; a="947581769" X-IronPort-AV: E=Sophos;i="6.04,275,1695711600"; d="scan'208";a="947581769" X-Received: from sh1gapp1015.ccr.corp.intel.com ([10.239.189.85]) by orsmga005.jf.intel.com with ESMTP; 14 Dec 2023 05:53:26 -0800 From: "Wang Fan" To: devel@edk2.groups.io Cc: Fan Wang , Michael D Kinney , Liming Gao , Ray Ni , Guomin Jiang Subject: [edk2-devel] [PATCH v5 1/2] MdeModulePkg: Support customized FV Migration Information Date: Thu, 14 Dec 2023 21:53:18 +0800 Message-Id: <20231214135319.3986-2-fan.wang@intel.com> In-Reply-To: <20231214135319.3986-1-fan.wang@intel.com> References: <20231214135319.3986-1-fan.wang@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,fan.wang@intel.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: JZ2YAgGGdR7qHKH9PdbUV0fgx7686176AA= Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=DHzcB1le; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=intel.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4533 There are use cases which not all FVs need be migrated from TempRam to permanent memory before TempRam tears down. This new guid is introduced to avoid unnecessary FV migration to improve boot performance. Platform can publish MigrationInfo hob with this guid to customize FV migration info, and PeiCore will only migrate FVs indicated by this Hob info. This is a backwards compatible change, PeiCore will check MigrationInfo hob before migration. If MigrationInfo hobs exists, only migrate FVs recorded by hobs. If MigrationInfo hobs not exists, migrate all FVs to permanent memory. Cc: Michael D Kinney Cc: Liming Gao Cc: Ray Ni Cc: Guomin Jiang Signed-off-by: Fan Wang --- MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 84 ++++++++++++++----- MdeModulePkg/Core/Pei/Memory/MemoryServices.c | 40 --------- MdeModulePkg/Core/Pei/PeiMain.h | 11 --- MdeModulePkg/Core/Pei/PeiMain.inf | 1 + MdeModulePkg/Include/Guid/MigratedFvInfo.h | 42 +++++++++- MdeModulePkg/MdeModulePkg.dec | 3 +- 6 files changed, 106 insertions(+), 75 deletions(-) diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/C= ore/Pei/Dispatcher/Dispatcher.c index 5f32ebb560ae..4cd8c843cd92 100644 --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c @@ -1184,7 +1184,12 @@ EvacuateTempRam ( =0D PEI_CORE_FV_HANDLE PeiCoreFvHandle;=0D EFI_PEI_CORE_FV_LOCATION_PPI *PeiCoreFvLocationPpi;=0D + EFI_PEI_HOB_POINTERS Hob;=0D + EDKII_MIGRATION_INFO *MigrationInfo;=0D + TO_MIGRATE_FV_INFO *ToMigrateFvInfo;=0D + UINT32 FvMigrationFlags;=0D EDKII_MIGRATED_FV_INFO MigratedFvInfo;=0D + UINTN Index;=0D =0D ASSERT (Private->PeiMemoryInstalled);=0D =0D @@ -1211,6 +1216,13 @@ EvacuateTempRam ( =0D ConvertPeiCorePpiPointers (Private, &PeiCoreFvHandle);=0D =0D + Hob.Raw =3D GetFirstGuidHob (&gEdkiiMigrationInfoGuid);=0D + if (Hob.Raw !=3D NULL) {=0D + MigrationInfo =3D GET_GUID_HOB_DATA (Hob);=0D + } else {=0D + MigrationInfo =3D NULL;=0D + }=0D +=0D for (FvIndex =3D 0; FvIndex < Private->FvCount; FvIndex++) {=0D FvHeader =3D Private->Fv[FvIndex].FvHeader;=0D ASSERT (FvHeader !=3D NULL);=0D @@ -1224,8 +1236,33 @@ EvacuateTempRam ( )=0D )=0D {=0D + if ((MigrationInfo =3D=3D NULL) || (MigrationInfo->MigrateAll =3D=3D= TRUE)) {=0D + //=0D + // Migrate all FVs and copy raw data=0D + //=0D + FvMigrationFlags =3D FLAGS_FV_RAW_DATA_COPY;=0D + } else {=0D + for (Index =3D 0; Index < MigrationInfo->ToMigrateFvCount; Index++= ) {=0D + ToMigrateFvInfo =3D ((TO_MIGRATE_FV_INFO *)(MigrationInfo + 1)) = + Index;=0D + if (ToMigrateFvInfo->FvOrgBaseOnTempRam =3D=3D (UINT32)(UINTN)Fv= Header) {=0D + //=0D + // This FV is to migrate=0D + //=0D + FvMigrationFlags =3D ToMigrateFvInfo->FvMigrationFlags;=0D + break;=0D + }=0D + }=0D +=0D + if (Index =3D=3D MigrationInfo->ToMigrateFvCount) {=0D + //=0D + // This FV is not expected to migrate=0D + //=0D + continue;=0D + }=0D + }=0D +=0D //=0D - // Allocate page to save the rebased PEIMs, the PEIMs will get dispa= tched later.=0D + // Allocate pages to save the rebased PEIMs, the PEIMs will get disp= atched later.=0D //=0D Status =3D PeiServicesAllocatePages (=0D EfiBootServicesCode,=0D @@ -1234,18 +1271,7 @@ EvacuateTempRam ( );=0D ASSERT_EFI_ERROR (Status);=0D MigratedFvHeader =3D (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvHeaderAd= dress;=0D -=0D - //=0D - // Allocate pool to save the raw PEIMs, which is used to keep consis= tent context across=0D - // multiple boot and PCR0 will keep the same no matter if the addres= s of allocated page is changed.=0D - //=0D - Status =3D PeiServicesAllocatePages (=0D - EfiBootServicesCode,=0D - EFI_SIZE_TO_PAGES ((UINTN)FvHeader->FvLength),=0D - &FvHeaderAddress=0D - );=0D - ASSERT_EFI_ERROR (Status);=0D - RawDataFvHeader =3D (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvHeaderAdd= ress;=0D + CopyMem (MigratedFvHeader, FvHeader, (UINTN)FvHeader->FvLength);=0D =0D DEBUG ((=0D DEBUG_VERBOSE,=0D @@ -1256,17 +1282,33 @@ EvacuateTempRam ( ));=0D =0D //=0D - // Copy the context to the rebased pages and raw pages, and create h= ob to save the=0D - // information. The MigratedFvInfo HOB will never be produced when=0D - // PcdMigrateTemporaryRamFirmwareVolumes is FALSE, because the PCD c= ontrol the=0D - // feature.=0D + // Create hob to save MigratedFvInfo, this hob will only be produced= when=0D + // Migration feature PCD PcdMigrateTemporaryRamFirmwareVolumes is se= t to TRUE.=0D //=0D - CopyMem (MigratedFvHeader, FvHeader, (UINTN)FvHeader->FvLength);=0D - CopyMem (RawDataFvHeader, MigratedFvHeader, (UINTN)FvHeader->FvLengt= h);=0D MigratedFvInfo.FvOrgBase =3D (UINT32)(UINTN)FvHeader;=0D MigratedFvInfo.FvNewBase =3D (UINT32)(UINTN)MigratedFvHeader;=0D - MigratedFvInfo.FvDataBase =3D (UINT32)(UINTN)RawDataFvHeader;=0D + MigratedFvInfo.FvDataBase =3D 0;=0D MigratedFvInfo.FvLength =3D (UINT32)(UINTN)FvHeader->FvLength;=0D +=0D + //=0D + // When FLAGS_FV_RAW_DATA_COPY bit is set, copy the context to the r= aw pages and=0D + // reset raw data base address in MigratedFvInfo hob.=0D + //=0D + if ((FvMigrationFlags & FLAGS_FV_RAW_DATA_COPY) =3D=3D FLAGS_FV_RAW_= DATA_COPY) {=0D + //=0D + // Allocate pages to save the raw PEIMs=0D + //=0D + Status =3D PeiServicesAllocatePages (=0D + EfiBootServicesCode,=0D + EFI_SIZE_TO_PAGES ((UINTN)FvHeader->FvLength),=0D + &FvHeaderAddress=0D + );=0D + ASSERT_EFI_ERROR (Status);=0D + RawDataFvHeader =3D (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvHeaderA= ddress;=0D + CopyMem (RawDataFvHeader, MigratedFvHeader, (UINTN)FvHeader->FvLen= gth);=0D + MigratedFvInfo.FvDataBase =3D (UINT32)(UINTN)RawDataFvHeader;=0D + }=0D +=0D BuildGuidDataHob (&gEdkiiMigratedFvInfoGuid, &MigratedFvInfo, sizeof= (MigratedFvInfo));=0D =0D //=0D @@ -1330,8 +1372,6 @@ EvacuateTempRam ( }=0D }=0D =0D - RemoveFvHobsInTemporaryMemory (Private);=0D -=0D return Status;=0D }=0D =0D diff --git a/MdeModulePkg/Core/Pei/Memory/MemoryServices.c b/MdeModulePkg/C= ore/Pei/Memory/MemoryServices.c index 3b2e15699fc3..a30925da39ee 100644 --- a/MdeModulePkg/Core/Pei/Memory/MemoryServices.c +++ b/MdeModulePkg/Core/Pei/Memory/MemoryServices.c @@ -166,46 +166,6 @@ MigrateMemoryPages ( Private->FreePhysicalMemoryTop =3D NewMemPagesBase;=0D }=0D =0D -/**=0D - Removes any FV HOBs whose base address is not in PEI installed memory.=0D -=0D - @param[in] Private Pointer to PeiCore's private data structure.= =0D -=0D -**/=0D -VOID=0D -RemoveFvHobsInTemporaryMemory (=0D - IN PEI_CORE_INSTANCE *Private=0D - )=0D -{=0D - EFI_PEI_HOB_POINTERS Hob;=0D - EFI_HOB_FIRMWARE_VOLUME *FirmwareVolumeHob;=0D -=0D - DEBUG ((DEBUG_INFO, "Removing FVs in FV HOB not already migrated to perm= anent memory.\n"));=0D -=0D - for (Hob.Raw =3D GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw =3D GET_= NEXT_HOB (Hob)) {=0D - if ((GET_HOB_TYPE (Hob) =3D=3D EFI_HOB_TYPE_FV) || (GET_HOB_TYPE (Hob)= =3D=3D EFI_HOB_TYPE_FV2) || (GET_HOB_TYPE (Hob) =3D=3D EFI_HOB_TYPE_FV3)) = {=0D - FirmwareVolumeHob =3D Hob.FirmwareVolume;=0D - DEBUG ((DEBUG_INFO, " Found FV HOB.\n"));=0D - DEBUG ((=0D - DEBUG_INFO,=0D - " BA=3D%016lx L=3D%016lx\n",=0D - FirmwareVolumeHob->BaseAddress,=0D - FirmwareVolumeHob->Length=0D - ));=0D - if (=0D - !(=0D - ((EFI_PHYSICAL_ADDRESS)(UINTN)FirmwareVolumeHob->BaseAddress >= =3D Private->PhysicalMemoryBegin) &&=0D - (((EFI_PHYSICAL_ADDRESS)(UINTN)FirmwareVolumeHob->BaseAddress = + (FirmwareVolumeHob->Length - 1)) < Private->FreePhysicalMemoryTop)=0D - )=0D - )=0D - {=0D - DEBUG ((DEBUG_INFO, " Removing FV HOB to an FV in T-RAM (was = not migrated).\n"));=0D - Hob.Header->HobType =3D EFI_HOB_TYPE_UNUSED;=0D - }=0D - }=0D - }=0D -}=0D -=0D /**=0D Migrate the base address in firmware volume allocation HOBs=0D from temporary memory to PEI installed memory.=0D diff --git a/MdeModulePkg/Core/Pei/PeiMain.h b/MdeModulePkg/Core/Pei/PeiMai= n.h index 556beddad533..46b6c23014a3 100644 --- a/MdeModulePkg/Core/Pei/PeiMain.h +++ b/MdeModulePkg/Core/Pei/PeiMain.h @@ -1046,17 +1046,6 @@ MigrateMemoryPages ( IN BOOLEAN TemporaryRamMigrated=0D );=0D =0D -/**=0D - Removes any FV HOBs whose base address is not in PEI installed memory.=0D -=0D - @param[in] Private Pointer to PeiCore's private data structure.= =0D -=0D -**/=0D -VOID=0D -RemoveFvHobsInTemporaryMemory (=0D - IN PEI_CORE_INSTANCE *Private=0D - );=0D -=0D /**=0D Migrate the base address in firmware volume allocation HOBs=0D from temporary memory to PEI installed memory.=0D diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf b/MdeModulePkg/Core/Pei/PeiM= ain.inf index 0cf357371a16..893bdc052798 100644 --- a/MdeModulePkg/Core/Pei/PeiMain.inf +++ b/MdeModulePkg/Core/Pei/PeiMain.inf @@ -78,6 +78,7 @@ gEfiFirmwareFileSystem3Guid=0D gStatusCodeCallbackGuid=0D gEdkiiMigratedFvInfoGuid ## SOMETIMES_PRODUCES = ## HOB=0D + gEdkiiMigrationInfoGuid ## SOMETIMES_CONSUMES = ## HOB=0D =0D [Ppis]=0D gEfiPeiStatusCodePpiGuid ## SOMETIMES_CONSUMES # Pe= iReportStatusService is not ready if this PPI doesn't exist=0D diff --git a/MdeModulePkg/Include/Guid/MigratedFvInfo.h b/MdeModulePkg/Incl= ude/Guid/MigratedFvInfo.h index aca2332a0ec6..1c8b0dfefc49 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__=0D #define __EDKII_MIGRATED_FV_INFO_GUID_H__=0D =0D +//=0D +// FLAGS_FV_RAW_DATA_COPY indicates FV raw data will be copied to permanen= t memory=0D +// or not. When FV is migrated to permanent memory, it will be rebased and= raw=0D +// data will be lost. This bit can be configured as below values:=0D +// 0: FV raw data will not be used in later phase, and the copy will be sk= ipped to=0D +// optimize boot performance.=0D +// 1: FV raw data will be copied to permanent memory for later phase use (= such as=0D +// FV measurement).=0D +//=0D +#define FLAGS_FV_RAW_DATA_COPY BIT0=0D +=0D +///=0D +/// In real use cases, not all FVs need migrate to permanent memory before= TempRam tears=0D +/// down. EDKII_MIGRATION_INFO hob should be published by platform to indi= cate which=0D +/// FVs need migration to optimize boot performance. If this hob is not de= tected by Pei=0D +/// Core, all FVs on TempRam will be migrated and FV raw data will also be= copied.=0D +/// Only one EDKII_MIGRATION_INFO hob should be published by platform, and= this hob will=0D +/// take effect only when migration feature is enabled by PCD.=0D +///=0D +typedef struct {=0D + UINT32 FvOrgBaseOnTempRam; // Original FV address on Temporary= Ram=0D + //=0D + // FV Migration Flags:=0D + // Bit0: Indicate to copy FV raw data or not=0D + // Others: Reserved bits=0D + //=0D + UINT32 FvMigrationFlags;=0D +} TO_MIGRATE_FV_INFO;=0D +=0D +typedef struct {=0D + BOOLEAN MigrateAll; // Migrate all FVs and also co= py FV raw data=0D + //=0D + // ToMigrateFvCount and ToMigrateFvInfo array indicate which FVs need be= migrated, and=0D + // these info should be ignored when MigrateAll field is set to TRUE.=0D + //=0D + UINT32 ToMigrateFvCount;=0D + // TO_MIGRATE_FV_INFO ToMigrateFvInfo[];=0D +} EDKII_MIGRATION_INFO;=0D +=0D typedef struct {=0D UINT32 FvOrgBase; // original FV address=0D UINT32 FvNewBase; // new FV address=0D - UINT32 FvDataBase; // original FV data=0D + UINT32 FvDataBase; // original FV data, 0 means raw data is no= t copied=0D UINT32 FvLength; // Fv Length=0D } EDKII_MIGRATED_FV_INFO;=0D =0D +extern EFI_GUID gEdkiiMigrationInfoGuid;=0D extern EFI_GUID gEdkiiMigratedFvInfoGuid;=0D =0D #endif // #ifndef __EDKII_MIGRATED_FV_INFO_GUID_H__=0D diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 1a162e97e6fb..a2cd83345f5b 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -421,7 +421,8 @@ gEdkiiCapsuleOnDiskNameGuid =3D { 0x98c80a4f, 0xe16b, 0x4d11, { 0x93, 0x= 9a, 0xab, 0xe5, 0x61, 0x26, 0x3, 0x30 } }=0D =0D ## Include/Guid/MigratedFvInfo.h=0D - gEdkiiMigratedFvInfoGuid =3D { 0xc1ab12f7, 0x74aa, 0x408d, { 0xa2, 0xf4,= 0xc6, 0xce, 0xfd, 0x17, 0x98, 0x71 } }=0D + gEdkiiMigrationInfoGuid =3D { 0xb4b140a5, 0x72f6, 0x4c21, { 0x93, 0xe4= , 0xac, 0xc4, 0xec, 0xcb, 0x23, 0x23 } }=0D + gEdkiiMigratedFvInfoGuid =3D { 0xc1ab12f7, 0x74aa, 0x408d, { 0xa2, 0xf4= , 0xc6, 0xce, 0xfd, 0x17, 0x98, 0x71 } }=0D =0D ## Include/Guid/RngAlgorithm.h=0D gEdkiiRngAlgorithmUnSafe =3D { 0x869f728c, 0x409d, 0x4ab4, {0xac, 0x03, = 0x71, 0xd3, 0x09, 0xc1, 0xb3, 0xf4 }}=0D --=20 2.29.2.windows.2 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#112531): https://edk2.groups.io/g/devel/message/112531 Mute This Topic: https://groups.io/mt/103169823/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-