On 10/9/23 02:07, Taylor Beebe wrote: > Use SetMemoryProtectionsLib to set the memory protections for > the platform in both normal and PEI-less boot. The protections > set are equivalent to the PCD settings and the ability to set > NxForStack via QemuCfg is preserved. Once the transition to use > SetMemoryProtectionsLib and GetMemoryProtectionsLib is complete > in the rest of EDK2, the mechanics of setting protections in > OvmfPkg will be updated and the memory protection PCDs will > be deleted. > > 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> > --- > OvmfPkg/Library/PeilessStartupLib/PeilessStartup.c | 15 +++++++++++++-- > OvmfPkg/PlatformPei/Platform.c | 15 +++++++++++++-- > OvmfPkg/Library/PeilessStartupLib/PeilessStartupLib.inf | 3 +++ > OvmfPkg/PlatformPei/PlatformPei.inf | 1 + > 4 files changed, 30 insertions(+), 4 deletions(-)
This should be two patches; the audiences for both modules (PeilessStartupLib vs. PlatformPei) are nearly distinct. I surely don't care for PeilessStartupLib. > > diff --git a/OvmfPkg/Library/PeilessStartupLib/PeilessStartup.c > b/OvmfPkg/Library/PeilessStartupLib/PeilessStartup.c > index 1632a2317718..cf645aad3246 100644 > --- a/OvmfPkg/Library/PeilessStartupLib/PeilessStartup.c > +++ b/OvmfPkg/Library/PeilessStartupLib/PeilessStartup.c > @@ -14,10 +14,13 @@ > #include <Protocol/DebugSupport.h> > #include <Library/TdxLib.h> > #include <IndustryStandard/Tdx.h> > +#include <Library/PcdLib.h> > #include <Library/PrePiLib.h> > #include <Library/PeilessStartupLib.h> > #include <Library/PlatformInitLib.h> > #include <Library/TdxHelperLib.h> > +#include <Library/SetMemoryProtectionsLib.h> > +#include <Library/QemuFwCfgSimpleParserLib.h> > #include <ConfidentialComputingGuestAttr.h> > #include <Guid/MemoryTypeInformation.h> > #include <OvmfPlatforms.h> > @@ -42,7 +45,9 @@ InitializePlatform ( > EFI_HOB_PLATFORM_INFO *PlatformInfoHob > ) > { > - VOID *VariableStore; > + VOID *VariableStore; > + DXE_MEMORY_PROTECTION_SETTINGS DxeSettings; > + MM_MEMORY_PROTECTION_SETTINGS MmSettings; > > DEBUG ((DEBUG_INFO, "InitializePlatform in Pei-less boot\n")); > PlatformDebugDumpCmos (); > @@ -104,7 +109,13 @@ InitializePlatform ( > > PlatformMemMapInitialization (PlatformInfoHob); > > - PlatformNoexecDxeInitialization (PlatformInfoHob); > + DxeSettings = > DxeMemoryProtectionProfiles[DxeMemoryProtectionSettingsPcd].Settings; > + MmSettings = > MmMemoryProtectionProfiles[MmMemoryProtectionSettingsPcd].Settings; > + DxeSettings.StackExecutionProtectionEnabled = PcdGetBool > (PcdSetNxForStack); > + QemuFwCfgParseBool ("opt/ovmf/PcdSetNxForStack", > &DxeSettings.StackExecutionProtectionEnabled); > + > + SetDxeMemoryProtectionSettings (&DxeSettings, > DxeMemoryProtectionSettingsPcd); > + SetMmMemoryProtectionSettings (&MmSettings, MmMemoryProtectionSettingsPcd); > > if (TdIsEnabled ()) { > PlatformInfoHob->PcdConfidentialComputingGuestAttr = CCAttrIntelTdx; > diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c > index f5dc41c3a8c4..bcd8d3a1be14 100644 > --- a/OvmfPkg/PlatformPei/Platform.c > +++ b/OvmfPkg/PlatformPei/Platform.c > @@ -38,6 +38,7 @@ > #include <IndustryStandard/QemuCpuHotplug.h> > #include <Library/MemEncryptSevLib.h> > #include <OvmfPlatforms.h> > +#include <Library/SetMemoryProtectionsLib.h> > > #include "Platform.h" > > @@ -304,8 +305,10 @@ InitializePlatform ( > IN CONST EFI_PEI_SERVICES **PeiServices > ) > { > - EFI_HOB_PLATFORM_INFO *PlatformInfoHob; > - EFI_STATUS Status; > + EFI_HOB_PLATFORM_INFO *PlatformInfoHob; > + EFI_STATUS Status; > + DXE_MEMORY_PROTECTION_SETTINGS DxeSettings; > + MM_MEMORY_PROTECTION_SETTINGS MmSettings; > > DEBUG ((DEBUG_INFO, "Platform PEIM Loaded\n")); > PlatformInfoHob = BuildPlatformInfoHob (); Can you check, in the OVMF debug log, the before-after temp stack usage? My build of OVMF logs: Temp Stack : BaseAddress=0x818000 Length=0x8000 Temp Heap : BaseAddress=0x810000 Length=0x8000 Total temporary memory: 65536 bytes. temporary memory stack ever used: 30112 bytes. temporary memory heap used for HobList: 7600 bytes. I wonder if your change above makes a difference for stack usage here. Point of interest: commit d41fd8e839a3 ("OvmfPkg: restore temporary SEC/PEI RAM size to 64KB", 2017-11-17). > @@ -342,6 +345,14 @@ InitializePlatform ( > > PublishPeiMemory (PlatformInfoHob); > > + DxeSettings = > DxeMemoryProtectionProfiles[DxeMemoryProtectionSettingsPcd].Settings; > + MmSettings = > MmMemoryProtectionProfiles[MmMemoryProtectionSettingsPcd].Settings; Can you perhaps rearrange the source code somehow in order to prevent uncrustify from turning these assignments into 110+ charater long lines? But more importantly, these are structure assignments, and (I think) structure assignments are (still) forbidden in edk2, because they can produce calls to compiler-intrinsic helper functions. So, please use CopyMem(). (And that should solve the line-too-long issue as well!) > + DxeSettings.StackExecutionProtectionEnabled = PcdGetBool > (PcdSetNxForStack); > + QemuFwCfgParseBool ("opt/ovmf/PcdSetNxForStack", > &DxeSettings.StackExecutionProtectionEnabled); > + > + SetDxeMemoryProtectionSettings (&DxeSettings, > DxeMemoryProtectionSettingsPcd); > + SetMmMemoryProtectionSettings (&MmSettings, MmMemoryProtectionSettingsPcd); > + > PlatformQemuUc32BaseInitialization (PlatformInfoHob); > > InitializeRamRegions (PlatformInfoHob); I don't like the placement of this logic (or minimally, I don't understand it). This logic is supposed to be a superset of NoexecDxeInitialization(), as the latter is what currently consumes the "opt/ovmf/PcdSetNxForStack" fw_cfg file, and sets PcdSetNxForStack accordingly. But NoexecDxeInitialization() is restricted to PlatformInfoHob->BootMode != BOOT_ON_S3_RESUME whereas the new logic appears to run regardless of boot mode. Did you test this series with ACPI S3 suspend/resume, both with and without SMM_REQUIRE? During S3 resume, there's not going to be a DXE phase, and so SMM is not loaded yet again (it just survives from the first, cold, boot). Therefore anything we expose (such as a HOB) that controls only DXE or SMM is irrelevant during S3. If there is at least one a setting in "DxeSettings" that *does* make a difference even during S3 resume (stack guard?), then I'd argue that the DXE settings are incorrectly structured / named. Laszlo > diff --git a/OvmfPkg/Library/PeilessStartupLib/PeilessStartupLib.inf > b/OvmfPkg/Library/PeilessStartupLib/PeilessStartupLib.inf > index 585d50463748..f0a8a5a56df4 100644 > --- a/OvmfPkg/Library/PeilessStartupLib/PeilessStartupLib.inf > +++ b/OvmfPkg/Library/PeilessStartupLib/PeilessStartupLib.inf > @@ -56,6 +56,8 @@ [LibraryClasses] > PrePiLib > QemuFwCfgLib > PlatformInitLib > + SetMemoryProtectionsLib > + QemuFwCfgSimpleParserLib > > [Guids] > gEfiHobMemoryAllocModuleGuid > @@ -81,6 +83,7 @@ [Pcd] > gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## > SOMETIMES_CONSUMES > gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask ## > CONSUMES > gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask ## > CONSUMES > + gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## > CONSUMES > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize > gUefiOvmfPkgTokenSpaceGuid.PcdSecureBootSupported > diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf > b/OvmfPkg/PlatformPei/PlatformPei.inf > index 3934aeed9514..6b8442d12b2c 100644 > --- a/OvmfPkg/PlatformPei/PlatformPei.inf > +++ b/OvmfPkg/PlatformPei/PlatformPei.inf > @@ -65,6 +65,7 @@ [LibraryClasses] > PcdLib > CcExitLib > PlatformInitLib > + SetMemoryProtectionsLib > > [Pcd] > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#109443): https://edk2.groups.io/g/devel/message/109443 Mute This Topic: https://groups.io/mt/101843353/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-