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 F14CCAC180D for ; Mon, 21 Aug 2023 16:19:20 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=A/mFNmciqyKoJlXufxALxmenTLGvyqar7iGShNTVP+0=; c=relaxed/simple; d=groups.io; h=Message-ID:Date:MIME-Version:User-Agent:Subject:From:To:Cc:References:In-Reply-To:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Language:Content-Type:Content-Transfer-Encoding; s=20140610; t=1692634759; v=1; b=KaM6e3KJ1MPaugxpb4dbPPoN4jCS9IoRUET+lxGuLxIUnd/3Jx3jIOk8ZlqPDiT+W8HWqJto AoPRztjxMAN+h+sBbXjd/2us53xJWF8svSR+HB8yzmeefwWlBcpZwVO0ijK8yM1kkUD5eF6EW3z KVPm0wdqCFj0i8UdhOcMnyVE= X-Received: by 127.0.0.2 with SMTP id umCLYY7687511xGYIvKoQx22; Mon, 21 Aug 2023 09:19:19 -0700 X-Received: from mail-oa1-f47.google.com (mail-oa1-f47.google.com [209.85.160.47]) by mx.groups.io with SMTP id smtpd.web11.1248.1692634759021898567 for ; Mon, 21 Aug 2023 09:19:19 -0700 X-Received: by mail-oa1-f47.google.com with SMTP id 586e51a60fabf-1c26bb27feeso2309304fac.0 for ; Mon, 21 Aug 2023 09:19:18 -0700 (PDT) X-Gm-Message-State: IXtmQIWKzdaGPdVZ3p9W45jqx7686176AA= X-Google-Smtp-Source: AGHT+IFubtLKIFO2wK1P2kXQCyElOSd3YNioQB66ENg2rEpx1/10Yaoz7npdtCj+aOqyopU3S6x+TQ== X-Received: by 2002:a05:6871:707:b0:1be:dbd2:2bfa with SMTP id f7-20020a056871070700b001bedbd22bfamr8940209oap.20.1692634757903; Mon, 21 Aug 2023 09:19:17 -0700 (PDT) X-Received: from [192.168.0.233] ([50.46.253.1]) by smtp.gmail.com with ESMTPSA id b5-20020aa78705000000b0068746ab9aebsm6510587pfo.14.2023.08.21.09.19.16 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 21 Aug 2023 09:19:17 -0700 (PDT) Message-ID: Date: Mon, 21 Aug 2023 09:19:15 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [edk2-devel] [PATCH v2 00/25] Implement Dynamic Memory Protections From: "Taylor Beebe" To: devel@edk2.groups.io Cc: Abner Chang , Andrei Warkentin , Anatol Belski , Andrew Fish , Anthony Perard , Ard Biesheuvel , =?UTF-8?Q?Corvin_K=C3=B6hne?= , Dandan Bi , Eric Dong , Erdem Aktas , Gerd Hoffmann , Guo Dong , Gua Guo , James Bottomley , James Lu , Jian J Wang , Jianyong Wu , Jiewen Yao , Jordan Justen , Julien Grall , Leif Lindholm , Liming Gao , Michael Roth , Min Xu , Peter Grehan , Rahul Kumar , Ray Ni , Rebecca Cran , Sami Mujawar , Sean Rhodes , Sunil V L , Tom Lendacky References: <20230818223159.1073-1-taylor.d.beebe@gmail.com> In-Reply-To: <20230818223159.1073-1-taylor.d.beebe@gmail.com> 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,taylor.d.beebe@gmail.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=KaM6e3KJ; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=gmail.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 Here's a summmary of the v2 changes :) v2: - The previous version required the platform manage the HOB creation during PEI phase. v2 adds a new library, SetMemoryProtectionsLib, which offers an interface for setting, locking, and checking the memory protections for the boot. The settings are still backed by a HOB entry. SetMemoryProtectionsLib is a PEI/SEC only library as protections must be locked in by DxeHandoff(). - The previous version had a separate MM and DXE library for getting the platform memory protection settings and populating the global for access. v2 consolidates these two libraries into a single GetMemoryProtectionsLib which has DXE and MM instances. The global populated is a union of the MM and DXE settings. The first 4 bytes of the union is the signature used to identify whether the global contains the DXE or MM settings. - Add a patch to page-align the DXE allocated HOB list and apply RO and NX to it during memory protection initialization. - Add a patch which checks the debug print level before executing the memory map dump routine. This saves several seconds of boot time on debug builds with memory protections active. - Remove unnecessary code consolidation from the patch series to make it easier to review. The code consolidation will be in a future patch series. - Add the ability to set the memory protection profile via the fw_cfg QEMU interface on OvmfPkg platforms. The cfg parsing library needs to be ported to ArmVirtPkg to enable the same functionality on ARM virtual platforms. ArmVirtPkg will use the Release protection profile by default. - Restructure the patch series to ensure bisectability as the memory logic is transitioned to use the Get and Set libraries one package at a time. The memory protection PCDs are still removed in this patch series to avoid confusing the interface and remove the ties to the legacy implementation. On 8/18/23 3:31 PM, Taylor Beebe wrote: > In the past, memory protection settings were configured via FixedAtBuild PCDs, > which resulted in a build-time configuration of memory mitigations. This > approach limited the flexibility of applying mitigations to the > system and made it difficult to update or adjust the settings post-build. > > In a design, the configuration interface has been revised to allow for dynamic > configuration. This is achieved by setting memory protections via a library > interface which stores/updates the memory protection settings in > a GUIDed HOB, which is then consumed during and after DXE handoff. > > This patch series adds two libraries: > SetMemoryProtectionsLib: A PEIM that allows for setting/fetching memory > protections and "locking" to prevent further updates via the library interface. > The backing for the settings are a GUIDed HOB that is created by the library > whenever its API is invoked. > > GetMemoryProtectionsLib: A DXE library that allows for getting the memory > protection settings for the current boot. This library populates a global > with the settings from the HOB entry (if present) for access in the module. > Previous references to the PCDs are replaced with references to the global. > > OvmfPkg has been updated to allow the setting of the memory protection profile > via QemuCfg instead of just the NxForStack setting. If no profile is passed, > the platform will default to the Debug profile for DXE and Off profile for MM. > > ArmVirtPkg will use the Release profile. > > Reference: https://github.com/tianocore/edk2/pull/4566 > > Cc: Abner Chang > Cc: Andrei Warkentin > Cc: Anatol Belski > Cc: Andrew Fish > Cc: Anthony Perard > Cc: Ard Biesheuvel > Cc: Corvin Köhne > Cc: Dandan Bi > Cc: Eric Dong > Cc: Erdem Aktas > Cc: Gerd Hoffmann > Cc: Guo Dong > Cc: Gua Guo > Cc: James Bottomley > Cc: James Lu > Cc: Jian J Wang > Cc: Jianyong Wu > Cc: Jiewen Yao > Cc: Jordan Justen > Cc: Julien Grall > Cc: Leif Lindholm > Cc: Liming Gao > Cc: Michael Roth > Cc: Min Xu > Cc: Peter Grehan > Cc: Rahul Kumar > Cc: Ray Ni > Cc: Rebecca Cran > Cc: Sami Mujawar > Cc: Sean Rhodes > Cc: Sunil V L > Cc: Tom Lendacky > > Taylor Beebe (25): > MdeModulePkg: Add DXE and MM Memory Protection Settings Definitions > MdeModulePkg: Define SetMemoryProtectionsLib and > GetMemoryProtectionsLib > MdeModulePkg: Add NULL Instances for Get/SetMemoryProtectionsLib > MdeModulePkg: Implement SetMemoryProtectionsLib and > GetMemoryProtectionsLib > MdeModulePkg: Apply Protections to the HOB List > MdeModulePkg: Check Print Level Before Dumping GCD Memory Map > UefiCpuPkg: Always Set Stack Guard in MpPei Init > ArmVirtPkg: Add Memory Protection Library Definitions to Platforms > OvmfPkg: Add Memory Protection Library Definitions to Platforms > OvmfPkg: Apply Memory Protections via SetMemoryProtectionsLib > OvmfPkg: Update PeilessStartupLib to use SetMemoryProtectionsLib > UefiPayloadPkg: Update DXE Handoff to use SetMemoryProtectionsLib > MdeModulePkg: Update DXE Handoff to use SetMemoryProtectionsLib > ArmPkg: Use GetMemoryProtectionsLib instead of Memory Protection PCDs > EmulatorPkg: Use GetMemoryProtectionsLib instead of Memory Protection > PCDs > OvmfPkg: Use GetMemoryProtectionsLib instead of Memory Protection PCDs > UefiCpuPkg: Use GetMemoryProtectionsLib instead of Memory Protection > PCDs > MdeModulePkg: Use GetMemoryProtectionsLib instead of Memory Protection > PCDs > MdeModulePkg: Add Additional Profiles to SetMemoryProtectionsLib > OvmfPkg: Enable Choosing Memory Protection Profile via QemuCfg > ArmVirtPkg: Apply Memory Protections via SetMemoryProtectionsLib > MdeModulePkg: Delete PCD Profile from SetMemoryProtectionsLib > OvmfPkg: Delete Memory Protection PCDs > ArmVirtPkg: Delete Memory Protection PCDs > MdeModulePkg: Delete Memory Protection PCDs > > ArmPkg/Drivers/CpuDxe/CpuDxe.c | 5 +- > ArmVirtPkg/MemoryInitPei/MemoryInitPeim.c | 11 +- > MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c | 4 +- > MdeModulePkg/Core/Dxe/Gcd/Gcd.c | 22 +- > MdeModulePkg/Core/Dxe/Mem/HeapGuard.c | 46 +- > MdeModulePkg/Core/Dxe/Mem/Page.c | 2 +- > MdeModulePkg/Core/Dxe/Mem/Pool.c | 4 +- > MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c | 96 ++- > MdeModulePkg/Core/DxeIplPeim/DxeHandoff.c | 4 +- > MdeModulePkg/Core/DxeIplPeim/DxeLoad.c | 2 + > MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c | 9 +- > MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c | 6 +- > MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 16 +- > MdeModulePkg/Core/PiSmmCore/HeapGuard.c | 29 +- > MdeModulePkg/Core/PiSmmCore/Pool.c | 4 +- > MdeModulePkg/Library/GetMemoryProtectionsLib/DxeGetMemoryProtectionsLib.c | 158 ++++ > MdeModulePkg/Library/GetMemoryProtectionsLib/GetMemoryProtectionsLibNull.c | 29 + > MdeModulePkg/Library/GetMemoryProtectionsLib/MmGetMemoryProtectionsLib.c | 124 ++++ > MdeModulePkg/Library/SetMemoryProtectionsLib/SetMemoryProtectionsLib.c | 781 ++++++++++++++++++++ > MdeModulePkg/Library/SetMemoryProtectionsLib/SetMemoryProtectionsLibNull.c | 144 ++++ > OvmfPkg/Fdt/HighMemDxe/HighMemDxe.c | 5 +- > OvmfPkg/Library/PeilessStartupLib/DxeLoad.c | 6 +- > OvmfPkg/Library/PeilessStartupLib/PeilessStartup.c | 59 +- > OvmfPkg/Library/PeilessStartupLib/X64/VirtualMemory.c | 26 +- > OvmfPkg/Library/PlatformInitLib/Platform.c | 15 - > OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFwCfgSimpleParser.c | 11 + > OvmfPkg/PlatformPei/IntelTdx.c | 2 - > OvmfPkg/PlatformPei/Platform.c | 73 +- > OvmfPkg/QemuVideoDxe/VbeShim.c | 3 +- > OvmfPkg/TdxDxe/TdxDxe.c | 7 +- > UefiCpuPkg/CpuDxe/CpuDxe.c | 2 +- > UefiCpuPkg/CpuDxe/CpuMp.c | 2 +- > UefiCpuPkg/CpuMpPei/CpuMpPei.c | 8 +- > UefiCpuPkg/CpuMpPei/CpuPaging.c | 16 +- > UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/CpuExceptionHandlerTestCommon.c | 6 +- > UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerUnitTest.c | 15 + > UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/PeiCpuExceptionHandlerUnitTest.c | 21 + > UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 3 +- > UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c | 2 +- > UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c | 13 +- > UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c | 2 +- > UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c | 2 +- > UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c | 11 +- > UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c | 2 + > UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c | 8 +- > UefiPayloadPkg/UefiPayloadEntry/X64/VirtualMemory.c | 15 +- > ArmPkg/ArmPkg.dsc | 1 + > ArmPkg/Drivers/CpuDxe/CpuDxe.inf | 2 +- > ArmVirtPkg/ArmVirt.dsc.inc | 21 +- > ArmVirtPkg/ArmVirtCloudHv.dsc | 5 - > ArmVirtPkg/ArmVirtQemu.dsc | 5 - > ArmVirtPkg/MemoryInitPei/MemoryInitPeim.inf | 1 + > EmulatorPkg/EmulatorPkg.dsc | 3 +- > MdeModulePkg/Core/Dxe/DxeMain.h | 1 + > MdeModulePkg/Core/Dxe/DxeMain.inf | 9 +- > MdeModulePkg/Core/DxeIplPeim/DxeIpl.h | 3 + > MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf | 11 +- > MdeModulePkg/Core/PiSmmCore/PiSmmCore.h | 1 + > MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf | 4 +- > MdeModulePkg/Include/Guid/MemoryProtectionSettings.h | 216 ++++++ > MdeModulePkg/Include/Library/GetMemoryProtectionsLib.h | 83 +++ > MdeModulePkg/Include/Library/SetMemoryProtectionsLib.h | 157 ++++ > MdeModulePkg/Library/GetMemoryProtectionsLib/DxeGetMemoryProtectionsLib.inf | 34 + > MdeModulePkg/Library/GetMemoryProtectionsLib/GetMemoryProtectionsLibNull.inf | 25 + > MdeModulePkg/Library/GetMemoryProtectionsLib/MmGetMemoryProtectionsLib.inf | 34 + > MdeModulePkg/Library/SetMemoryProtectionsLib/SetMemoryProtectionsLib.inf | 37 + > MdeModulePkg/Library/SetMemoryProtectionsLib/SetMemoryProtectionsLibNull.inf | 25 + > MdeModulePkg/MdeModulePkg.dec | 182 +---- > MdeModulePkg/MdeModulePkg.dsc | 7 + > MdeModulePkg/MdeModulePkg.uni | 153 ---- > OvmfPkg/AmdSev/AmdSevX64.dsc | 4 +- > OvmfPkg/Bhyve/BhyveX64.dsc | 4 +- > OvmfPkg/Bhyve/PlatformPei/PlatformPei.inf | 1 - > OvmfPkg/CloudHv/CloudHvX64.dsc | 4 +- > OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf | 4 +- > OvmfPkg/Include/Dsc/MemoryProtectionLibraries.dsc.inc | 15 + > OvmfPkg/Include/Library/PlatformInitLib.h | 13 - > OvmfPkg/Include/Library/QemuFwCfgSimpleParserLib.h | 8 + > OvmfPkg/IntelTdx/IntelTdxX64.dsc | 5 +- > OvmfPkg/Library/PeilessStartupLib/PeilessStartupLib.inf | 6 +- > OvmfPkg/Microvm/MicrovmX64.dsc | 5 +- > OvmfPkg/OvmfPkgIa32.dsc | 4 +- > OvmfPkg/OvmfPkgIa32X64.dsc | 4 +- > OvmfPkg/OvmfPkgX64.dsc | 4 +- > OvmfPkg/OvmfXen.dsc | 5 +- > OvmfPkg/PlatformCI/PlatformBuildLib.py | 31 +- > OvmfPkg/PlatformPei/PlatformPei.inf | 2 +- > OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf | 2 +- > OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc | 13 - > OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 2 + > OvmfPkg/TdxDxe/TdxDxe.inf | 1 - > UefiCpuPkg/CpuDxe/CpuDxe.h | 11 +- > UefiCpuPkg/CpuDxe/CpuDxe.inf | 4 +- > UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf | 3 - > UefiCpuPkg/CpuMpPei/CpuMpPei.h | 3 +- > UefiCpuPkg/CpuMpPei/CpuMpPei.inf | 1 - > UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf | 1 - > UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf | 1 - > UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf | 1 - > UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf | 1 - > UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/CpuExceptionHandlerTest.h | 13 +- > UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerLibUnitTest.inf | 2 +- > UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/PeiCpuExceptionHandlerLibUnitTest.inf | 2 +- > UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf | 3 +- > UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf | 3 +- > UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfileInternal.h | 9 +- > UefiCpuPkg/UefiCpuPkg.dec | 7 +- > UefiCpuPkg/UefiCpuPkg.dsc | 2 + > UefiCpuPkg/UefiCpuPkg.uni | 10 +- > UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 1 + > UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf | 9 +- > UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 9 +- > UefiPayloadPkg/UefiPayloadPkg.dsc | 12 + > 113 files changed, 2404 insertions(+), 692 deletions(-) > create mode 100644 MdeModulePkg/Library/GetMemoryProtectionsLib/DxeGetMemoryProtectionsLib.c > create mode 100644 MdeModulePkg/Library/GetMemoryProtectionsLib/GetMemoryProtectionsLibNull.c > create mode 100644 MdeModulePkg/Library/GetMemoryProtectionsLib/MmGetMemoryProtectionsLib.c > create mode 100644 MdeModulePkg/Library/SetMemoryProtectionsLib/SetMemoryProtectionsLib.c > create mode 100644 MdeModulePkg/Library/SetMemoryProtectionsLib/SetMemoryProtectionsLibNull.c > create mode 100644 MdeModulePkg/Include/Guid/MemoryProtectionSettings.h > create mode 100644 MdeModulePkg/Include/Library/GetMemoryProtectionsLib.h > create mode 100644 MdeModulePkg/Include/Library/SetMemoryProtectionsLib.h > create mode 100644 MdeModulePkg/Library/GetMemoryProtectionsLib/DxeGetMemoryProtectionsLib.inf > create mode 100644 MdeModulePkg/Library/GetMemoryProtectionsLib/GetMemoryProtectionsLibNull.inf > create mode 100644 MdeModulePkg/Library/GetMemoryProtectionsLib/MmGetMemoryProtectionsLib.inf > create mode 100644 MdeModulePkg/Library/SetMemoryProtectionsLib/SetMemoryProtectionsLib.inf > create mode 100644 MdeModulePkg/Library/SetMemoryProtectionsLib/SetMemoryProtectionsLibNull.inf > create mode 100644 OvmfPkg/Include/Dsc/MemoryProtectionLibraries.dsc.inc > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#107928): https://edk2.groups.io/g/devel/message/107928 Mute This Topic: https://groups.io/mt/100830898/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-