From nobody Sun Feb 8 18:30:20 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+108156+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+108156+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1693437546; cv=none; d=zohomail.com; s=zohoarc; b=EDYAH/I5B5tK7SpGtq4Dz6Dw2HH629AXJ4Ttn1wyjrHO3YFVe2Ck6tjjpEVxTQ3KfQEPgEnlRLC6ddMwzA3dorCPPHQ8M9K3kk6uFvA1n6MXbN+fMGUd5r9Ws6n4Pqs5F5csInfSmwDx77O7v0H4r+4evXhUetrN/NzTaS+12ts= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1693437546; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=dAybhmY0flYVrtodWPIV92C727rVaF9La4QVp31jmZs=; b=FIW+Vi115/ZWanf2oM6LI6Cyxm5vfeovMXWftPyiH1ZTabE7iSyitcdIjEkfwWlGxHeb6R7gXHikxrK37q5CF7JOuibZmafv4nNHq9zPS4AJzHAoRsZQZ1m8rO2T3jWeLu0MYxY8SaGV6oc1XkGM5hFkA3i8LAwtS+0vE0CkHH0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+108156+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1693437546281562.9581772441552; Wed, 30 Aug 2023 16:19:06 -0700 (PDT) Return-Path: DKIM-Signature: a=rsa-sha256; bh=6AdV9u2LWOieGs3dcqG64UQp/TIBETJk7e1vnmkku2s=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: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=1693437545; v=1; b=rpedEnvo11JcViuSwv8UVuTUT2sKh777U3hMLeRIGRRErFtsSMFByCQyBRrHnBIHQN211Lfj weRJD5eHsjpeVFgNQrqlvhzCa7vmrmwQ03yKOuzLnyTwsx8THSDZ3UzdmIR49jvbRziQ3PYdTA/ JUYMUzkqP5aIXwdFuVpDZEvM= X-Received: by 127.0.0.2 with SMTP id AID4YY1788612xN2stewEw5y; Wed, 30 Aug 2023 16:19:05 -0700 X-Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) by mx.groups.io with SMTP id smtpd.web11.4942.1693437545443788579 for ; Wed, 30 Aug 2023 16:19:05 -0700 X-Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-68a3082c771so125162b3a.0 for ; Wed, 30 Aug 2023 16:19:05 -0700 (PDT) X-Gm-Message-State: P1vOTklewsRnLev2of0kbkFfx1787277AA= X-Google-Smtp-Source: AGHT+IEze8nOLcmSEFfpjhVMAwI+UVtt3/ISbf2XUAAbw0bgLf31v19WB7h8IfTFtHmtKi8+ejD9rg== X-Received: by 2002:a05:6a00:2d16:b0:688:47d5:ede with SMTP id fa22-20020a056a002d1600b0068847d50edemr1543795pfb.6.1693437544513; Wed, 30 Aug 2023 16:19:04 -0700 (PDT) X-Received: from localhost.localdomain ([50.46.253.1]) by smtp.gmail.com with ESMTPSA id x16-20020a62fb10000000b0064398fe3451sm102550pfm.217.2023.08.30.16.19.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Aug 2023 16:19:03 -0700 (PDT) From: "Taylor Beebe" To: devel@edk2.groups.io Cc: Jian J Wang , Liming Gao Subject: [edk2-devel] [PATCH v3 02/26] MdeModulePkg: Define SetMemoryProtectionsLib and GetMemoryProtectionsLib Date: Wed, 30 Aug 2023 16:18:10 -0700 Message-ID: <20230830231851.779-3-taylor.d.beebe@gmail.com> In-Reply-To: <20230830231851.779-1-taylor.d.beebe@gmail.com> References: <20230830231851.779-1-taylor.d.beebe@gmail.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,taylor.d.beebe@gmail.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1693437547830100010 Content-Type: text/plain; charset="utf-8" SetMemoryProtectionsLib is a PEIM which allows platforms to apply memory protection settings to the current boot. GetMemoryProtectionsLib has DXE and MM implementations to allow platforms to query the current memory protection settings via a global variable populated by the library Implementations. The global variable is a union of the MM and DXE settings. the DXE struct is only valid in a DXE module and the MM struct is only valid in an SMM or Stanalone MM module. Signed-off-by: Taylor Beebe Cc: Jian J Wang Cc: Liming Gao --- MdeModulePkg/Include/Library/GetMemoryProtectionsLib.h | 83 +++++++++++ MdeModulePkg/Include/Library/SetMemoryProtectionsLib.h | 152 +++++++++++++= +++++++ MdeModulePkg/MdeModulePkg.dec | 8 ++ 3 files changed, 243 insertions(+) diff --git a/MdeModulePkg/Include/Library/GetMemoryProtectionsLib.h b/MdeMo= dulePkg/Include/Library/GetMemoryProtectionsLib.h new file mode 100644 index 000000000000..c8f7084e9c80 --- /dev/null +++ b/MdeModulePkg/Include/Library/GetMemoryProtectionsLib.h @@ -0,0 +1,83 @@ +/** @file +Library for accessing the platform memory protection settings. + +Copyright (c) Microsoft Corporation. +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef GET_MEMORY_PROTECTION_SETTINGS_LIB_H_ +#define GET_MEMORY_PROTECTION_SETTINGS_LIB_H_ + +#include +#include + +#pragma pack(1) + +typedef union { + DXE_MEMORY_PROTECTION_SETTINGS Dxe; + MM_MEMORY_PROTECTION_SETTINGS Mm; +} MEMORY_PROTECTION_SETTINGS_UNION; + +#pragma pack() + +// The global used to access current Memory Protection Settings +extern MEMORY_PROTECTION_SETTINGS_UNION gMps; + +#define MPS_IS_DXE_SIGNATURE_VALID (gMps.Dxe.Signature =3D=3D DXE_MEMORY_= PROTECTION_SIGNATURE) +#define MPS_IS_MM_SIGNATURE_VALID (gMps.Mm.Signature =3D=3D MM_MEMORY_PR= OTECTION_SIGNATURE) + +#define IS_DXE_PAGE_GUARD_ACTIVE (MPS_IS_DXE_SIGNATURE_VALID = && \ + !IsZeroBuffer (&gMps.Dxe.PageGuard.Enabl= edForType, MPS_MEMORY_TYPE_BUFFER_SIZE) && \ + gMps.Dxe.HeapGuard.PageGuardEnabled) + +#define IS_DXE_POOL_GUARD_ACTIVE (MPS_IS_DXE_SIGNATURE_VALID = && \ + !IsZeroBuffer (&gMps.Dxe.PoolGuard.Enabl= edForType, MPS_MEMORY_TYPE_BUFFER_SIZE) && \ + gMps.Dxe.HeapGuard.PoolGuardEnabled) + +#define IS_DXE_EXECUTION_PROTECTION_ACTIVE (MPS_IS_DXE_SIGNATURE_VALID = && \ + !IsZeroBuffer (&gMps.Dxe.Execu= tionProtection.EnabledForType, MPS_MEMORY_TYPE_BUFFER_SIZE)) + +#define IS_DXE_IMAGE_PROTECTION_ACTIVE (MPS_IS_DXE_SIGNATURE_VALID = && \ + (gMps.Dxe.ImageProtection.ProtectI= mageFromFv || \ + gMps.Dxe.ImageProtection.ProtectI= mageFromUnknown)) + +#define IS_DXE_MEMORY_PROTECTION_ACTIVE (MPS_IS_DXE_SIGNATURE_VALID = && \ + (IS_DXE_PAGE_GUARD_ACTIVE = || \ + IS_DXE_POOL_GUARD_ACTIVE = || \ + IS_DXE_EXECUTION_PROTECTION_ACTI= VE || \ + IS_DXE_IMAGE_PROTECTION_ACTIVE = || \ + gMps.Dxe.CpuStackGuardEnabled = || \ + gMps.Dxe.StackExecutionProtectio= nEnabled || \ + gMps.Dxe.NullPointerDetection.En= abled || \ + gMps.Dxe.HeapGuard.FreedMemoryGu= ardEnabled)) + +#define IS_MM_PAGE_GUARD_ACTIVE (MPS_IS_MM_SIGNATURE_VALID = && \ + gMps.Mm.HeapGuard.PageGuardEnabled = && \ + !IsZeroBuffer (&gMps.Mm.PageGuard.Enabl= edForType, MPS_MEMORY_TYPE_BUFFER_SIZE)) + +#define IS_MM_POOL_GUARD_ACTIVE (MPS_IS_MM_SIGNATURE_VALID = && \ + gMps.Mm.HeapGuard.PoolGuardEnabled = && \ + !IsZeroBuffer (&gMps.Mm.PoolGuard.Enable= dForType, MPS_MEMORY_TYPE_BUFFER_SIZE)) + +#define IS_MM_MEMORY_PROTECTION_ACTIVE (MPS_IS_MM_SIGNATURE_VALID = && \ + (IS_MM_PAGE_GUARD_ACTIVE = || \ + IS_MM_POOL_GUARD_ACTIVE = || \ + gMps.Mm.NullPointerDetection.Enab= led)); + +/** + Populates gMps global. This function is invoked by the library construct= or and only needs to be + called if library contructors have not yet been invoked. + + @retval EFI_SUCCESS gMps global was populated. + @retval EFI_NOT_FOUND The gMemoryProtectionSettingsGuid HOB was not = found. + @retval EFI_ABORTED The version number of the DXE or MM memory pro= tection settings was invalid. + @retval EFI_UNSUPPORTED NULL implementation called. +**/ +EFI_STATUS +EFIAPI +PopulateMpsGlobal ( + VOID + ); + +#endif diff --git a/MdeModulePkg/Include/Library/SetMemoryProtectionsLib.h b/MdeMo= dulePkg/Include/Library/SetMemoryProtectionsLib.h new file mode 100644 index 000000000000..023c987c3c7e --- /dev/null +++ b/MdeModulePkg/Include/Library/SetMemoryProtectionsLib.h @@ -0,0 +1,152 @@ +/** @file +Library for creating the MM and DXE memory protection HOB entries. + +Copyright (c) Microsoft Corporation. +SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef SET_MEMORY_PROTECTION_SETTINGS_LIB_H_ +#define SET_MEMORY_PROTECTION_SETTINGS_LIB_H_ + +#include + +typedef struct { + CHAR8 *Name; + CHAR8 *Description; + DXE_MEMORY_PROTECTION_SETTINGS Settings; +} DXE_MEMORY_PROTECTION_PROFILES; + +typedef enum { + DxeMemoryProtectionSettingsPcd, + DxeMemoryProtectionSettingsMax +} DXE_MEMORY_PROTECTION_PROFILE_INDEX; + +typedef struct { + CHAR8 *Name; + CHAR8 *Description; + MM_MEMORY_PROTECTION_SETTINGS Settings; +} MM_MEMORY_PROTECTION_PROFILES; + +typedef enum { + MmMemoryProtectionSettingsPcd, + MmMemoryProtectionSettingsMax +} MM_MEMORY_PROTECTION_PROFILE_INDEX; + +extern DXE_MEMORY_PROTECTION_PROFILES DxeMemoryProtectionProfiles[DxeMemo= ryProtectionSettingsMax]; +extern MM_MEMORY_PROTECTION_PROFILES MmMemoryProtectionProfiles[MmMemory= ProtectionSettingsMax]; + +/** + Prevent further changes to the memory protection settings via this + library API. + + @retval EFI_SUCCESS The memory protection settings are locked. + @retval EFI_ABORTED Unable to get/create the memory protection= settings. + @retval EFI_UNSUPPORTED NULL implementation called. +**/ +EFI_STATUS +EFIAPI +LockMemoryProtectionSettings ( + VOID + ); + +/** + Sets the DXE memory protection settings. If DxeMps is NULL, the settings= will be set based + on ProfileIndex. + + @param[in] DxeMps Pointer to the memory protection settings to pu= blish. If NULL, the + settings will be created based on ProfileIndex. + @param[in] ProfileIndex The index of the memory protection profile to u= se if DxeMps is NULL. + + @retval EFI_SUCCESS The memory protection HOB was successfully= created. + @retval EFI_INVALID_PARAMETER The ProfileIndex was invalid or the versio= n number of the + input DxeMps was not equal to the version = currently present + in the settings. + @retval EFI_ABORTED Unable to get/create the memory protection= settings. + @retval EFI_ACCESS_DENIED The memory protection settings are locked. + @retval EFI_UNSUPPORTED NULL implementation called. +**/ +EFI_STATUS +EFIAPI +SetDxeMemoryProtectionSettings ( + IN DXE_MEMORY_PROTECTION_SETTINGS *DxeMps OPTIONAL, + IN DXE_MEMORY_PROTECTION_PROFILE_INDEX ProfileIndex + ); + +/** + Sets the MM memory protection HOB entry. If MmMps is NULL, the settings = will be set based + on ProfileIndex. + + @param[in] MmMps Pointer to the memory protection settings to pu= blish. If NULL, the + settings will be created based on ProfileIndex. + @param[in] ProfileIndex The index of the memory protection profile to u= se if MmMps is NULL. + + @retval EFI_SUCCESS The memory protection HOB was successfully= created. + @retval EFI_OUT_OF_RESOURCES There was insufficient memory to create th= e HOB. + @retval EFI_INVALID_PARAMETER The ProfileIndex was invalid or the versio= n number of the + input MmMps was not equal to the version c= urrently present + in the settings. + @retval EFI_ABORTED Unable to get/create the memory protection= settings. + @retval EFI_ACCESS_DENIED The memory protection settings are locked. + @retval EFI_UNSUPPORTED NULL implementation called. +**/ +EFI_STATUS +EFIAPI +SetMmMemoryProtectionSettings ( + IN MM_MEMORY_PROTECTION_SETTINGS *MmMps OPTIONAL, + IN MM_MEMORY_PROTECTION_PROFILE_INDEX ProfileIndex + ); + +/** + Copies the current memory protection settings into the input buffer. + + NOTE: The returned settings may not be the final settings used by the + platform on this boot. Unless LockMemoryProtectionSettings() has + been called, settings may be modified by drivers until DXE handoff. + + @param[out] Mps The memory protection settings pointer to populate. + + @retval EFI_SUCCESS The memory protection settings were copied + into the input buffer. + @retval EFI_INVALID_PARAMETER Mps was NULL. + @retval EFI_ABORTED Unable to get/create the memory protection= settings. + @retval EFI_UNSUPPORTED NULL implementation called. +**/ +EFI_STATUS +EFIAPI +GetCurrentMemoryProtectionSettings ( + OUT MEMORY_PROTECTION_SETTINGS *Mps + ); + +/** + Returns TRUE any form of DXE memory protection is currently active. + + NOTE: The returned value may reflect the final settings used by the + platform on this boot. Unless LockMemoryProtectionSettings() has + been called, settings may be modified by drivers until DXE handoff. + + @retval TRUE DXE Memory protection is active. + @retval FALSE DXE Memory protection is not active. +**/ +BOOLEAN +EFIAPI +IsDxeMemoryProtectionActive ( + VOID + ); + +/** + Returns TRUE any form of MM memory protection is currently active. + + NOTE: The returned value may reflect the final settings used by the + platform on this boot. Unless LockMemoryProtectionSettings() has + been called, settings may be modified by drivers until DXE handoff. + + @retval TRUE MM Memory protection is active. + @retval FALSE MM Memory protection is not active. +**/ +BOOLEAN +EFIAPI +IsMmMemoryProtectionActive ( + VOID + ); + +#endif diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 624720c7bb40..50c26fedaf6f 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -164,6 +164,14 @@ [LibraryClasses] # VariableFlashInfoLib|Include/Library/VariableFlashInfoLib.h =20 + ## @libraryclass Provides a global for consuming memory protection setti= ngs + # + GetMemoryProtectionsLib|Include/Library/GetMemoryProtectionsLib.h + + ## @libraryclass Library for creating the memory protection settings HOB + # + SetMemoryProtectionsLib|Include/Library/SetMemoryProtectionsLib.h + [Guids] ## MdeModule package token space guid # Include/Guid/MdeModulePkgTokenSpace.h --=20 2.42.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#108156): https://edk2.groups.io/g/devel/message/108156 Mute This Topic: https://groups.io/mt/101064073/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-