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 60221AC0C63 for ; Fri, 27 Oct 2023 07:27:57 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=msKHtY4wqnrap/XyKmtTQtz+odL/qrG2TFrsAZSB1Os=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id: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=1698391675; v=1; b=NhKcX/rnfFqA42kR1p9fZ1vBmtTk4Uc8z6o7mpCg00x/nsuHOlLeyjXWhzKJEkqDy+bWKPqA NlzUMMuu7hKyKVOhZqjIUu1B2vXb3qCRzfUMLZi4+k5vHvF4n0sLeP7k5Km06E+r0Dc+nsh0qFg rVg7jKlWqDpJdPYdnW1Trpv0= X-Received: by 127.0.0.2 with SMTP id IpB8YY7687511xVCTYTUmAW7; Fri, 27 Oct 2023 00:27:55 -0700 X-Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.115]) by mx.groups.io with SMTP id smtpd.web11.1834.1698391675258467646 for ; Fri, 27 Oct 2023 00:27:55 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10875"; a="387541657" X-IronPort-AV: E=Sophos;i="6.03,255,1694761200"; d="scan'208";a="387541657" X-Received: from orviesa001.jf.intel.com ([10.64.159.141]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Oct 2023 00:27:53 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.03,255,1694761200"; d="scan'208";a="7143879" X-Received: from sh1gapp1015.ccr.corp.intel.com ([10.239.189.85]) by orviesa001.jf.intel.com with ESMTP; 27 Oct 2023 00:26:29 -0700 From: "Wang Fan" To: devel@edk2.groups.io Cc: Fan Wang , Michael D Kinney , Liming Gao , Guomin Jiang , Dandan Bi Subject: [edk2-devel] [PATCH v3 1/1] MdeModulePkg: Support customized FV Migration Information Date: Fri, 27 Oct 2023 15:27:48 +0800 Message-Id: <20231027072748.3755-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: pxR7nP5IyK6GQ3LO0a4ZRqAcx7686176AA= 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="NhKcX/rn"; 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 ToMigrateFvInfo 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 ToMigrateFvInfo hob before migration. If ToMigrateFvInfo hobs exists, only migrate FVs recorded by hobs. If ToMigrateFvInfo hobs not exists, migrate all FVs to permanent memory. Cc: Michael D Kinney Cc: Liming Gao Cc: Guomin Jiang Cc: Dandan Bi Signed-off-by: Fan Wang --- MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 79 +++++++++++++------ MdeModulePkg/Core/Pei/PeiMain.inf | 1 + MdeModulePkg/Include/Guid/MigratedFvInfo.h | 28 +++++++ MdeModulePkg/MdeModulePkg.dec | 3 +- 4 files changed, 84 insertions(+), 27 deletions(-) diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/C= ore/Pei/Dispatcher/Dispatcher.c index 5f32ebb560ae..a50fa1ad586f 100644 --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c @@ -1184,7 +1184,10 @@ EvacuateTempRam ( =0D PEI_CORE_FV_HANDLE PeiCoreFvHandle;=0D EFI_PEI_CORE_FV_LOCATION_PPI *PeiCoreFvLocationPpi;=0D + EDKII_TO_MIGRATE_FV_INFO *ToMigrateFvInfo;=0D EDKII_MIGRATED_FV_INFO MigratedFvInfo;=0D + EFI_PEI_HOB_POINTERS Hob;=0D + UINT32 MigrationFlags;=0D =0D ASSERT (Private->PeiMemoryInstalled);=0D =0D @@ -1225,7 +1228,32 @@ EvacuateTempRam ( )=0D {=0D //=0D - // Allocate page to save the rebased PEIMs, the PEIMs will get dispa= tched later.=0D + // Check if platform defined hobs to indicate which FVs are expected= to migrate or keep raw data.=0D + // If ToMigrateFvInfo hobs exists, only migrate FVs recorded by hobs= .=0D + // If ToMigrateFvInfo hobs not exists, migrate all FVs to permanent = memory.=0D + //=0D + Hob.Raw =3D GetFirstGuidHob (&gEdkiiToMigrateFvInfoGuid);=0D + if (Hob.Raw =3D=3D NULL) {=0D + MigrationFlags =3D 0;=0D + } else {=0D + while (Hob.Raw !=3D NULL) {=0D + ToMigrateFvInfo =3D GET_GUID_HOB_DATA (Hob);=0D + if (ToMigrateFvInfo->FvTemporaryRamBase =3D=3D (UINT32)(UINTN)Fv= Header) {=0D + MigrationFlags =3D ToMigrateFvInfo->MigrationFlags;=0D + break;=0D + }=0D +=0D + Hob.Raw =3D GET_NEXT_HOB (Hob);=0D + Hob.Raw =3D GetNextGuidHob (&gEdkiiToMigrateFvInfoGuid, Hob.Raw)= ;=0D + }=0D +=0D + if (Hob.Raw =3D=3D NULL) {=0D + continue;=0D + }=0D + }=0D +=0D + //=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 +1262,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,18 +1273,30 @@ 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 + // Copy the context to the raw pages and create hob to save the info= rmation. The MigratedFvInfo=0D + // HOB will never be produced when PcdMigrateTemporaryRamFirmwareVol= umes is FALSE, because the PCD=0D + // controls the feature. This copy can be skipped by FLAGS_SKIP_FV_R= AW_DATA_COPY flag to optimize=0D + // boot performance.=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.FvLength =3D (UINT32)(UINTN)FvHeader->FvLength;=0D - BuildGuidDataHob (&gEdkiiMigratedFvInfoGuid, &MigratedFvInfo, sizeof= (MigratedFvInfo));=0D + if ((MigrationFlags & FLAGS_SKIP_FV_RAW_DATA_COPY) !=3D FLAGS_SKIP_F= V_RAW_DATA_COPY) {=0D + //=0D + // Allocate pages to save the raw PEIMs, which is used to keep con= sistent context across=0D + // multiple boot and PCR0 will keep the same no matter if the addr= ess 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)FvHeaderA= ddress;=0D + CopyMem (RawDataFvHeader, MigratedFvHeader, (UINTN)FvHeader->FvLen= gth);=0D + MigratedFvInfo.FvOrgBase =3D (UINT32)(UINTN)FvHeader;=0D + MigratedFvInfo.FvNewBase =3D (UINT32)(UINTN)MigratedFvHeader;=0D + MigratedFvInfo.FvDataBase =3D (UINT32)(UINTN)RawDataFvHeader;=0D + MigratedFvInfo.FvLength =3D (UINT32)(UINTN)FvHeader->FvLength;=0D + BuildGuidDataHob (&gEdkiiMigratedFvInfoGuid, &MigratedFvInfo, size= of (MigratedFvInfo));=0D + }=0D =0D //=0D // Migrate any children for this FV now=0D @@ -1330,8 +1359,6 @@ EvacuateTempRam ( }=0D }=0D =0D - RemoveFvHobsInTemporaryMemory (Private);=0D -=0D return Status;=0D }=0D =0D diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf b/MdeModulePkg/Core/Pei/PeiM= ain.inf index 0cf357371a16..944b230b0e19 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 + gEdkiiToMigrateFvInfoGuid ## 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..b019e9f20df1 100644 --- a/MdeModulePkg/Include/Guid/MigratedFvInfo.h +++ b/MdeModulePkg/Include/Guid/MigratedFvInfo.h @@ -9,6 +9,33 @@ 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_SKIP_FV_RAW_DATA_COPY indicates FV raw data will be skipped copy = to permanent=0D +// memory or not. When FV is migrated to permanent memory, it will be reba= sed and raw=0D +// data will be lost. This bit can be configured as below values:=0D +// 0: FV raw data will be copied to permanent memory for later phase use.= =0D +// 1: FV raw data will not be consumed in later phase, and the copy will b= e skipped to=0D +// optimize boot performance.=0D +//=0D +#define FLAGS_SKIP_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_TO_MIGRATE_FV_INFO hob can be published by platform to ind= icate only selected=0D +/// FVs need migration, and other FVs should be skipped to optimize boot p= erformance.=0D +/// If no such hobs are published, PEI Core should still migrate all FVs o= n TempRam when this=0D +/// feature is enabled.=0D +///=0D +typedef struct {=0D + UINT32 FvTemporaryRamBase; // Original FV address on Temporary= Ram=0D + //=0D + // Migration Flags:=0D + // Bit0: Indicate to skip FV raw data copy or not=0D + // Others: Reserved bits=0D + //=0D + UINT32 MigrationFlags;=0D +} EDKII_TO_MIGRATE_FV_INFO;=0D +=0D typedef struct {=0D UINT32 FvOrgBase; // original FV address=0D UINT32 FvNewBase; // new FV address=0D @@ -16,6 +43,7 @@ typedef struct { UINT32 FvLength; // Fv Length=0D } EDKII_MIGRATED_FV_INFO;=0D =0D +extern EFI_GUID gEdkiiToMigrateFvInfoGuid;=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 dd182c02fdf6..d6cbcc721a5e 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -416,7 +416,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 + gEdkiiToMigrateFvInfoGuid =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 (#110197): https://edk2.groups.io/g/devel/message/110197 Mute This Topic: https://groups.io/mt/102216459/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-