On 10/9/23 02:07, Taylor Beebe wrote:
> Now that the EDK2 tree uses GetMemoryProtectionsLib to query
> the platform memory protection settings, OvmfPkg can be updated
> to use QemuCfg to set the entire memory protection profile instead
> of just SetNxForStack.

both the commit message and the subject say QemuCfg; should be QemuFwCfg 
perhaps.

> 
> For example, the following will set the DXE memory protection to
> the RELEASE preset.
> -fw_cfg name=opt/org.tianocore/DxeMemoryProtectionProfile,string=release
> 
> The following will set the MM memory protection to
> the RELEASE preset.
> -fw_cfg name=opt/org.tianocore/MmMemoryProtectionProfile,string=release
> 
> For users of Stuart, DXE_MEMORY_PROTECTION_PROFILE=release and
> MM_MEMORY_PROTECTION_PROFILE=release are equivalent to the above
> examples.

The lowercase "release" above does not match "Release" from patch 20 
(MdeModulePkg: Add Additional Profiles to SetMemoryProtectionsLib).

Which makes me notice that you used AsciiStr*i*Cmp() in patch 22.

... I think that's unfortunate; it guarantees that scripts passing in 
protection profile names will use inconsistent casing, so grepping for profile 
names will be limited (people will forget to grep case-insensitively). I'd 
rather be strict with profile names.

> 
> Signed-off-by: Taylor Beebe <taylor.d.be...@gmail.com>
> Cc: Ard Biesheuvel <ardb+tianoc...@kernel.org>
> Cc: Jiewen Yao <jiewen....@intel.com>
> Cc: Jordan Justen <jordan.l.jus...@intel.com>
> Cc: Gerd Hoffmann <kra...@redhat.com>
> Cc: Rebecca Cran <rebe...@bsdio.com>
> Cc: Peter Grehan <gre...@freebsd.org>
> Cc: Corvin Köhne <corv...@freebsd.org>
> ---
>  OvmfPkg/Library/PeilessStartupLib/PeilessStartup.c      | 21 ++++++++-----
>  OvmfPkg/Library/PeilessStartupLib/X64/VirtualMemory.c   | 13 +-------
>  OvmfPkg/Library/PlatformInitLib/Platform.c              | 15 ---------
>  OvmfPkg/PlatformPei/IntelTdx.c                          |  2 --
>  OvmfPkg/PlatformPei/Platform.c                          | 33 
> +++++++-------------
>  OvmfPkg/TdxDxe/TdxDxe.c                                 |  7 ++---
>  OvmfPkg/Include/Library/PlatformInitLib.h               | 13 --------
>  OvmfPkg/Library/PeilessStartupLib/PeilessStartupLib.inf |  2 +-
>  OvmfPkg/PlatformCI/PlatformBuildLib.py                  |  8 +++++
>  OvmfPkg/PlatformPei/PlatformPei.inf                     |  1 +
>  10 files changed, 37 insertions(+), 78 deletions(-)

This patch is way too big IMO, not by line count, but by number of actions 
taken.

[cut]

> diff --git a/OvmfPkg/Include/Library/PlatformInitLib.h 
> b/OvmfPkg/Include/Library/PlatformInitLib.h
> index 57b18b94d9b8..b2468f206321 100644
> --- a/OvmfPkg/Include/Library/PlatformInitLib.h
> +++ b/OvmfPkg/Include/Library/PlatformInitLib.h
> @@ -32,7 +32,6 @@ typedef struct {
>    UINT32               Uc32Base;
>    UINT32               Uc32Size;
>  
> -  BOOLEAN              PcdSetNxForStack;
>    UINT64               PcdTdxSharedBitMask;
>  
>    UINT64               PcdPciMmio64Base;
> @@ -182,18 +181,6 @@ PlatformMemMapInitialization (
>    IN OUT EFI_HOB_PLATFORM_INFO  *PlatformInfoHob
>    );
>  
> -/**
> - * Fetch "opt/ovmf/PcdSetNxForStack" from QEMU
> - *
> - * @param Setting     The pointer to the setting of 
> "/opt/ovmf/PcdSetNxForStack".
> - * @return EFI_SUCCESS  Successfully fetch the settings.
> - */
> -EFI_STATUS
> -EFIAPI
> -PlatformNoexecDxeInitialization (
> -  IN OUT EFI_HOB_PLATFORM_INFO  *PlatformInfoHob
> -  );
> -
>  VOID
>  EFIAPI
>  PlatformMiscInitialization (


> diff --git a/OvmfPkg/Library/PlatformInitLib/Platform.c 
> b/OvmfPkg/Library/PlatformInitLib/Platform.c
> index f48bf16ae300..bc9becc4016e 100644
> --- a/OvmfPkg/Library/PlatformInitLib/Platform.c
> +++ b/OvmfPkg/Library/PlatformInitLib/Platform.c
> @@ -249,21 +249,6 @@ PlatformMemMapInitialization (
>    PlatformInfoHob->PcdPciIoSize = PciIoSize;
>  }
>  
> -/**
> - * Fetch "opt/ovmf/PcdSetNxForStack" from QEMU
> - *
> - * @param Setting     The pointer to the setting of 
> "/opt/ovmf/PcdSetNxForStack".
> - * @return EFI_SUCCESS  Successfully fetch the settings.
> - */
> -EFI_STATUS
> -EFIAPI
> -PlatformNoexecDxeInitialization (
> -  IN OUT EFI_HOB_PLATFORM_INFO  *PlatformInfoHob
> -  )
> -{
> -  return QemuFwCfgParseBool ("opt/ovmf/PcdSetNxForStack", 
> &PlatformInfoHob->PcdSetNxForStack);
> -}
> -
>  VOID
>  PciExBarInitialization (
>    VOID

One one hand: OK, these look consistent, they keep the HOB interface and the 
lib header minimal and in sync.

However, removing the "opt/ovmf/PcdSetNxForStack" fw_cfg knob is a compat 
breaking change. Do we have a plan for announcing that somehow?

[cut]

> diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c
> index bcd8d3a1be14..fa76ad2de202 100644
> --- a/OvmfPkg/PlatformPei/Platform.c
> +++ b/OvmfPkg/PlatformPei/Platform.c
> @@ -39,6 +39,7 @@
>  #include <Library/MemEncryptSevLib.h>
>  #include <OvmfPlatforms.h>
>  #include <Library/SetMemoryProtectionsLib.h>
> +#include <Library/MemoryProtectionConfigLib.h>
>  
>  #include "Platform.h"
>  
> @@ -74,21 +75,6 @@ MemMapInitialization (
>    ASSERT_RETURN_ERROR (PcdStatus);
>  }
>  
> -STATIC
> -VOID
> -NoexecDxeInitialization (
> -  IN OUT EFI_HOB_PLATFORM_INFO  *PlatformInfoHob
> -  )
> -{
> -  RETURN_STATUS  Status;
> -
> -  Status = PlatformNoexecDxeInitialization (PlatformInfoHob);
> -  if (!RETURN_ERROR (Status)) {
> -    Status = PcdSetBoolS (PcdSetNxForStack, 
> PlatformInfoHob->PcdSetNxForStack);
> -    ASSERT_RETURN_ERROR (Status);
> -  }
> -}
> -
>  static const UINT8  EmptyFdt[] = {
>    0xd0, 0x0d, 0xfe, 0xed, 0x00, 0x00, 0x00, 0x48,
>    0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x48,

OK

> @@ -345,13 +331,17 @@ InitializePlatform (
>  
>    PublishPeiMemory (PlatformInfoHob);
>  
> -  DxeSettings                                 = 
> DxeMemoryProtectionProfiles[DxeMemoryProtectionSettingsPcd].Settings;
> -  MmSettings                                  = 
> MmMemoryProtectionProfiles[MmMemoryProtectionSettingsPcd].Settings;
> -  DxeSettings.StackExecutionProtectionEnabled = PcdGetBool 
> (PcdSetNxForStack);
> -  QemuFwCfgParseBool ("opt/ovmf/PcdSetNxForStack", 
> &DxeSettings.StackExecutionProtectionEnabled);
> +  if (EFI_ERROR (ParseFwCfgDxeMemoryProtectionSettings (&DxeSettings))) {
> +    SetDxeMemoryProtectionSettings (NULL, 
> DxeMemoryProtectionSettingsGrubCompat);
> +  } else {
> +    SetDxeMemoryProtectionSettings (&DxeSettings, 
> DxeMemoryProtectionSettingsGrubCompat);
> +  }
>  
> -  SetDxeMemoryProtectionSettings (&DxeSettings, 
> DxeMemoryProtectionSettingsPcd);
> -  SetMmMemoryProtectionSettings (&MmSettings, MmMemoryProtectionSettingsPcd);
> +  if (EFI_ERROR (ParseFwCfgMmMemoryProtectionSettings (&MmSettings))) {
> +    SetMmMemoryProtectionSettings (NULL, MmMemoryProtectionSettingsOff);
> +  } else {
> +    SetMmMemoryProtectionSettings (&MmSettings, 
> MmMemoryProtectionSettingsOff);
> +  }
>  
>    PlatformQemuUc32BaseInitialization (PlatformInfoHob);
>  

OVMF can be built without SMM_REQUIRE; I think setting an MM profile in that 
case is wasteful (but minimally: confusing). What's more...

> @@ -365,7 +355,6 @@ InitializePlatform (
>      PeiFvInitialization (PlatformInfoHob);
>      MemTypeInfoInitialization (PlatformInfoHob);
>      MemMapInitialization (PlatformInfoHob);
> -    NoexecDxeInitialization (PlatformInfoHob);
>    }
>  
>    InstallClearCacheCallback ();

... your patch too shows that the new logic isn't truly compatible, or isn't 
*compatibly placed*, with the old logic; the old logic is restricted to non-S3 
boot paths (in effect just the boot with full config boot path).

> diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf 
> b/OvmfPkg/PlatformPei/PlatformPei.inf
> index 6b8442d12b2c..fbaa6bdc8ee5 100644
> --- a/OvmfPkg/PlatformPei/PlatformPei.inf
> +++ b/OvmfPkg/PlatformPei/PlatformPei.inf
> @@ -66,6 +66,7 @@ [LibraryClasses]
>    CcExitLib
>    PlatformInitLib
>    SetMemoryProtectionsLib
> +  MemoryProtectionConfigLib
>  
>  [Pcd]
>    gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase

Hmm. I would have expected the QemuFwCfgSimpleParserLib dependency to be 
removed here.

However, I realize: in patch v5 11/28 ("OvmfPkg: Apply Memory Protections via 
SetMemoryProtectionsLib"), you do *not* add QemuFwCfgSimpleParserLib to 
"PlatformPei.inf", even though you introduce a new QemuFwCfgParseBool() call. 
So it's only fair that, when you now remove the QemuFwCfgParseBool() call, you 
don't remove the QemuFwCfgSimpleParserLib dependency either.

But that only highlights a preexistent problem: even  before your patch set, 
"OvmfPkg/PlatformPei" doesn't depend on QemuFwCfgSimpleParserLib! There isn't a 
single QemuFwCfgParse*() call in it!

So that's a preexistent bug, namely from commit 96047b6663ab 
("OvmfPkg/PlatformInitLib: Move functions to Platform.c", 2022-04-02). That was 
when the last QemuFwCfgParse*() reference was removed from OvmfPkg/PlatformPei, 
but the lib class header inclusion and the lib class dependency weren't cleaned 
up. Splendid.

Laszlo



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#109449): https://edk2.groups.io/g/devel/message/109449
Mute This Topic: https://groups.io/mt/101843367/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: 
https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to