Guomin:
  I add my comments. 

-----Original Message-----
From: Wang, Jian J <jian.j.w...@intel.com> 
Sent: 2020年7月22日 14:59
To: devel@edk2.groups.io; Jiang, Guomin <guomin.ji...@intel.com>
Cc: Wu, Hao A <hao.a...@intel.com>; Bi, Dandan <dandan...@intel.com>; Gao, 
Liming <liming....@intel.com>; De, Debkumar <debkumar...@intel.com>; Han, Harry 
<harry....@intel.com>; West, Catharine <catharine.w...@intel.com>
Subject: RE: [edk2-devel] [PATCH v6 10/10] MdeModulePkg/Core: Avoid redundant 
shadow when enable the Migrated PCD (CVE-2019-11098)

Guomin,

See my inline comments below.

> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Guomin 
> Jiang
> Sent: Monday, July 20, 2020 7:30 PM
> To: devel@edk2.groups.io
> Cc: Wang, Jian J <jian.j.w...@intel.com>; Wu, Hao A 
> <hao.a...@intel.com>; Bi, Dandan <dandan...@intel.com>; Gao, Liming 
> <liming....@intel.com>; De, Debkumar <debkumar...@intel.com>; Han, 
> Harry <harry....@intel.com>; West, Catharine 
> <catharine.w...@intel.com>
> Subject: [edk2-devel] [PATCH v6 10/10] MdeModulePkg/Core: Avoid 
> redundant shadow when enable the Migrated PCD (CVE-2019-11098)
> 
> REF:https://bugzilla.tianocore.org/show_bug.cgi?id=1614
> 
> When PcdMigrateTemporaryRamFirmwareVolumes is TRUE, it will shadow the 
> PEIMs, when it is disabled, PEIMs marked REGISTER_FOR_SHADOW will be 
> shadowed as well and it is controled by PcdShadowPeimOnBoot and 
> PcdShadowPeimOnS3Boot.
> 
> To cover the shadow behavior, the change will always shadow PEIMs when 
> enable PcdMigrateTemporaryRamFirmwareVolumes.
> 
> When PcdMigrateTemporaryRamFirmwareVolumes is true, if enable 
> PcdShadowPeiOnBoot, it will shadow some PEIMs twice and occupy more 
> memory and waste more boot time. it is unnecessary, so the only valid 
> choice is to enable PcdMigrateTemporaryRamFirmwareVolumes and disable 
> PcdShadowPeimOnBoot.

You could add similar clarification in dec where the new PCD is defined.

> 
> Signed-off-by: Guomin Jiang <guomin.ji...@intel.com>
> Cc: Jian J Wang <jian.j.w...@intel.com>
> Cc: Hao A Wu <hao.a...@intel.com>
> Cc: Dandan Bi <dandan...@intel.com>
> Cc: Liming Gao <liming....@intel.com>
> Cc: Debkumar De <debkumar...@intel.com>
> Cc: Harry Han <harry....@intel.com>
> Cc: Catharine West <catharine.w...@intel.com>
> ---
>  MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 11 +++++++++--
>  MdeModulePkg/Core/Pei/Image/Image.c           | 14 ++++++++++----
>  MdeModulePkg/Core/Pei/PeiMain/PeiMain.c       | 18 +++++++++++++-----
>  3 files changed, 32 insertions(+), 11 deletions(-)
> 
> diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
> b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
> index 210b5b22f727..74cd5387c158 100644
> --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
> +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
> @@ -1408,7 +1408,11 @@ PeiDispatcher (
>    PeimFileHandle = NULL;
>    EntryPoint     = 0;
> 
> -  if ((Private->PeiMemoryInstalled) && (Private-
> >HobList.HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME ||
> PcdGetBool (PcdShadowPeimOnS3Boot))) {
> +  if ((Private->PeiMemoryInstalled) &&
> +      (PcdGetBool (PcdMigrateTemporaryRamFirmwareVolumes)
> +       || (Private->HobList.HandoffInformationTable->BootMode !=
> BOOT_ON_S3_RESUME)
> +       || PcdGetBool (PcdShadowPeimOnS3Boot))
> +    ) {
>      //
>      // Once real memory is available, shadow the RegisterForShadow modules.
> And meanwhile
>      // update the modules' status from PEIM_STATE_REGISTER_FOR_SHADOW 
> to PEIM_STATE_DONE.
> @@ -1607,7 +1611,10 @@ PeiDispatcher (
>              PeiCheckAndSwitchStack (SecCoreData, Private);
> 
>              if ((Private->PeiMemoryInstalled) && (Private-
> >Fv[FvCount].PeimState[PeimCount] == PEIM_STATE_REGISTER_FOR_SHADOW)
> &&   \
> -                (Private->HobList.HandoffInformationTable->BootMode !=
> BOOT_ON_S3_RESUME || PcdGetBool (PcdShadowPeimOnS3Boot))) {
> +                (PcdGetBool (PcdMigrateTemporaryRamFirmwareVolumes)
> +                 || 
> + (Private->HobList.HandoffInformationTable->BootMode !=
> BOOT_ON_S3_RESUME)
> +                 || PcdGetBool (PcdShadowPeimOnS3Boot))
> +              ) {
>                //
>                // If memory is available we shadow images by default 
> for performance reasons.
>                // We call the entry point a 2nd time so the module knows it's 
> shadowed.


Below condition also needs to consider new PCD 
PcdMigrateTemporaryRamFirmwareVolumes. 

> diff --git a/MdeModulePkg/Core/Pei/Image/Image.c
> b/MdeModulePkg/Core/Pei/Image/Image.c
> index 0caeb63e26b4..85d1a84e4b67 100644
> --- a/MdeModulePkg/Core/Pei/Image/Image.c
> +++ b/MdeModulePkg/Core/Pei/Image/Image.c
> @@ -328,8 +328,11 @@ LoadAndRelocatePeCoffImage (
>    //
>    // When Image has no reloc section, it can't be relocated into memory.
>    //
> -  if (ImageContext.RelocationsStripped && 
> (Private->PeiMemoryInstalled) &&
> ((!IsPeiModule) ||
> -      (!IsS3Boot && (PcdGetBool (PcdShadowPeimOnBoot) ||
> IsRegisterForShadow)) || (IsS3Boot && PcdGetBool
> (PcdShadowPeimOnS3Boot)))) {
> +  if (ImageContext.RelocationsStripped && (Private->PeiMemoryInstalled)
> +      && ((!IsPeiModule) || PcdGetBool
> (PcdMigrateTemporaryRamFirmwareVolumes)
> +          || (!IsS3Boot && (PcdGetBool (PcdShadowPeimOnBoot) ||
> IsRegisterForShadow))
> +          || (IsS3Boot && PcdGetBool (PcdShadowPeimOnS3Boot)))
> +     ) {
>      DEBUG ((EFI_D_INFO|EFI_D_LOAD, "The image at 0x%08x without reloc 
> section can't be loaded into memory\n", (UINTN) Pe32Data));
>    }
> 

PcdMigrateTemporaryRamFirmwareVolumes is not required here, because FV has been 
shadow. 
PEIM is not required to shadow again. 

> @@ -343,8 +346,11 @@ LoadAndRelocatePeCoffImage (
>    // On normal boot, PcdShadowPeimOnBoot decides whether load PEIM or 
> PeiCore into memory.
>    // On S3 boot, PcdShadowPeimOnS3Boot decides whether load PEIM or 
> PeiCore into memory.
>    //
> -  if ((!ImageContext.RelocationsStripped) && 
> (Private->PeiMemoryInstalled) &&
> ((!IsPeiModule) ||
> -      (!IsS3Boot && (PcdGetBool (PcdShadowPeimOnBoot) ||
> IsRegisterForShadow)) || (IsS3Boot && PcdGetBool
> (PcdShadowPeimOnS3Boot)))) {
> +  if ((!ImageContext.RelocationsStripped) && (Private->PeiMemoryInstalled)
> +      && ((!IsPeiModule) || PcdGetBool
> (PcdMigrateTemporaryRamFirmwareVolumes)
> +          || (!IsS3Boot && (PcdGetBool (PcdShadowPeimOnBoot) ||
> IsRegisterForShadow))
> +          || (IsS3Boot && PcdGetBool (PcdShadowPeimOnS3Boot)))
> +     ) {
>      //
>      // Allocate more buffer to avoid buffer overflow.
>      //
> diff --git a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> index 48605eeada86..ce8649f954a8 100644
> --- a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> +++ b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> @@ -322,7 +322,8 @@ PeiCore (
>        // PEI Core and PEIMs to get high performance.
>        //
>        OldCoreData->ShadowedPeiCore = (PEICORE_FUNCTION_POINTER) 
> (UINTN) PeiCore;
> -      if ((HandoffInformationTable->BootMode == BOOT_ON_S3_RESUME &&
> PcdGetBool (PcdShadowPeimOnS3Boot))
> +      if (PcdGetBool (PcdMigrateTemporaryRamFirmwareVolumes)
> +          || (HandoffInformationTable->BootMode == BOOT_ON_S3_RESUME 
> + &&
> PcdGetBool (PcdShadowPeimOnS3Boot))
>            || (HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME 
> && PcdGetBool (PcdShadowPeimOnBoot))) {
>          OldCoreData->ShadowedPeiCore = ShadowPeiCore (OldCoreData);
>        }
> @@ -422,10 +423,17 @@ PeiCore (
>      }
>    } else {
>      if (PcdGetBool (PcdMigrateTemporaryRamFirmwareVolumes)) {
> -      if (PrivateData.HobList.HandoffInformationTable->BootMode ==
> BOOT_ON_S3_RESUME) {
> -        TempRamEvacuation = PcdGetBool (PcdShadowPeimOnS3Boot);
> -      } else {
> -        TempRamEvacuation = PcdGetBool (PcdShadowPeimOnBoot);
> +      TempRamEvacuation = TRUE;
> +
> +      //
> +      // When PcdMigrateTemporaryRamFirmwareVolumes is TRUE, it make
> sense only

make -> makes

> +      // when PcdShadowPeimOnBoot is FALSE. in this situation, all 
> + PEIMs will be
> copied

in -> In

> +      // and shadowed, and doesn't need shadow PEIMs again, it will 
> + occupy
> more
> +      // memory and waste more time if you enable it.
> +      //
> +      if (PcdGetBool (PcdShadowPeimOnBoot)) {
> +        DEBUG ((DEBUG_ERROR, "!!!IMPORTANT NOTICE!!!\nWhen you see 
> + the
> message, it mean that you enable the
> PcdMigrateTemporaryRamFirmwareVolumes and PcdShadowPeimOnBoot at the 
> same time\nIt make no sense because it will occupy more memory and 
> waste more time.\nYou must disable PcdShadowPeimOnBoot when you enable 
> PcdMigrateTemporaryRamFirmwareVolumes for performance reason.\n\n"));

Too long string literal. You can split it into more string literals separated 
by space.
For example,

DEBUG ((
  DEBUG_INFO,
  "String part 1"
  "String part 2"
  "String part 3"
  ));


> +        ASSERT ((PcdGetBool (PcdMigrateTemporaryRamFirmwareVolumes) 
> + ==
> TRUE) && (PcdGetBool (PcdShadowPeimOnBoot) == FALSE));
>        }
>      }
> 

ASSERT should also handle PcdShadowPeimOnS3Boot.

Thanks
Liming

> --
> 2.25.1.windows.1
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#63075): https://edk2.groups.io/g/devel/message/63075
Mute This Topic: https://groups.io/mt/75679712/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to