public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Taylor Beebe" <taylor.d.beebe@gmail.com>
To: devel@edk2.groups.io
Cc: Jian J Wang <jian.j.wang@intel.com>,
	Liming Gao <gaoliming@byosoft.com.cn>
Subject: [edk2-devel] [PATCH v3 02/26] MdeModulePkg: Define SetMemoryProtectionsLib and GetMemoryProtectionsLib
Date: Wed, 30 Aug 2023 16:18:10 -0700	[thread overview]
Message-ID: <20230830231851.779-3-taylor.d.beebe@gmail.com> (raw)
In-Reply-To: <20230830231851.779-1-taylor.d.beebe@gmail.com>

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 <taylor.d.beebe@gmail.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
---
 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/MdeModulePkg/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 <Library/BaseMemoryLib.h>
+#include <Guid/MemoryProtectionSettings.h>
+
+#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 == DXE_MEMORY_PROTECTION_SIGNATURE)
+#define MPS_IS_MM_SIGNATURE_VALID   (gMps.Mm.Signature == MM_MEMORY_PROTECTION_SIGNATURE)
+
+#define IS_DXE_PAGE_GUARD_ACTIVE  (MPS_IS_DXE_SIGNATURE_VALID                                                     &&  \
+                                  !IsZeroBuffer (&gMps.Dxe.PageGuard.EnabledForType, MPS_MEMORY_TYPE_BUFFER_SIZE) &&  \
+                                  gMps.Dxe.HeapGuard.PageGuardEnabled)
+
+#define IS_DXE_POOL_GUARD_ACTIVE  (MPS_IS_DXE_SIGNATURE_VALID                                                     &&  \
+                                  !IsZeroBuffer (&gMps.Dxe.PoolGuard.EnabledForType, MPS_MEMORY_TYPE_BUFFER_SIZE) &&  \
+                                  gMps.Dxe.HeapGuard.PoolGuardEnabled)
+
+#define IS_DXE_EXECUTION_PROTECTION_ACTIVE  (MPS_IS_DXE_SIGNATURE_VALID                                           &&  \
+                                            !IsZeroBuffer (&gMps.Dxe.ExecutionProtection.EnabledForType, MPS_MEMORY_TYPE_BUFFER_SIZE))
+
+#define IS_DXE_IMAGE_PROTECTION_ACTIVE  (MPS_IS_DXE_SIGNATURE_VALID                         &&  \
+                                        (gMps.Dxe.ImageProtection.ProtectImageFromFv        ||  \
+                                         gMps.Dxe.ImageProtection.ProtectImageFromUnknown))
+
+#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_ACTIVE          ||  \
+                                          IS_DXE_IMAGE_PROTECTION_ACTIVE              ||  \
+                                          gMps.Dxe.CpuStackGuardEnabled               ||  \
+                                          gMps.Dxe.StackExecutionProtectionEnabled    ||  \
+                                          gMps.Dxe.NullPointerDetection.Enabled       ||  \
+                                          gMps.Dxe.HeapGuard.FreedMemoryGuardEnabled))
+
+#define IS_MM_PAGE_GUARD_ACTIVE  (MPS_IS_MM_SIGNATURE_VALID                                                       &&  \
+                                   gMps.Mm.HeapGuard.PageGuardEnabled                                             &&  \
+                                   !IsZeroBuffer (&gMps.Mm.PageGuard.EnabledForType, MPS_MEMORY_TYPE_BUFFER_SIZE))
+
+#define IS_MM_POOL_GUARD_ACTIVE  (MPS_IS_MM_SIGNATURE_VALID                                                       &&  \
+                                  gMps.Mm.HeapGuard.PoolGuardEnabled                                              &&  \
+                                  !IsZeroBuffer (&gMps.Mm.PoolGuard.EnabledForType, 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.Enabled));
+
+/**
+  Populates gMps global. This function is invoked by the library constructor 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 protection settings was invalid.
+  @retval EFI_UNSUPPORTED   NULL implementation called.
+**/
+EFI_STATUS
+EFIAPI
+PopulateMpsGlobal (
+  VOID
+  );
+
+#endif
diff --git a/MdeModulePkg/Include/Library/SetMemoryProtectionsLib.h b/MdeModulePkg/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 <Guid/MemoryProtectionSettings.h>
+
+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[DxeMemoryProtectionSettingsMax];
+extern MM_MEMORY_PROTECTION_PROFILES   MmMemoryProtectionProfiles[MmMemoryProtectionSettingsMax];
+
+/**
+  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 publish. If NULL, the
+                           settings will be created based on ProfileIndex.
+  @param[in] ProfileIndex  The index of the memory protection profile to use if DxeMps is NULL.
+
+  @retval EFI_SUCCESS           The memory protection HOB was successfully created.
+  @retval EFI_INVALID_PARAMETER The ProfileIndex was invalid or the version 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 publish. If NULL, the
+                           settings will be created based on ProfileIndex.
+  @param[in] ProfileIndex  The index of the memory protection profile to use 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 the HOB.
+  @retval EFI_INVALID_PARAMETER The ProfileIndex was invalid or the version number of the
+                                input MmMps 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
+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
 
+  ## @libraryclass Provides a global for consuming memory protection settings
+  #
+  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
-- 
2.42.0.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
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/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



  parent reply	other threads:[~2023-08-30 23:19 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-30 23:18 [edk2-devel] [PATCH v3 00/26] Implement Dynamic Memory Protections Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 01/26] MdeModulePkg: Add DXE and MM Memory Protection Settings Definitions Taylor Beebe
2023-08-30 23:18 ` Taylor Beebe [this message]
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 03/26] MdeModulePkg: Add NULL Instances for Get/SetMemoryProtectionsLib Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 04/26] MdeModulePkg: Implement SetMemoryProtectionsLib and GetMemoryProtectionsLib Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 05/26] MdeModulePkg: Copy PEI PCD Database Into New Buffer Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 06/26] MdeModulePkg: Apply Protections to the HOB List Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 07/26] MdeModulePkg: Check Print Level Before Dumping GCD Memory Map Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 08/26] UefiCpuPkg: Always Set Stack Guard in MpPei Init Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 09/26] ArmVirtPkg: Add Memory Protection Library Definitions to Platforms Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 10/26] OvmfPkg: " Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 11/26] OvmfPkg: Apply Memory Protections via SetMemoryProtectionsLib Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 12/26] OvmfPkg: Update PeilessStartupLib to use SetMemoryProtectionsLib Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 13/26] UefiPayloadPkg: Update DXE Handoff " Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 14/26] MdeModulePkg: " Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 15/26] ArmPkg: Use GetMemoryProtectionsLib instead of Memory Protection PCDs Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 16/26] EmulatorPkg: " Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 17/26] OvmfPkg: " Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 18/26] UefiCpuPkg: " Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 19/26] MdeModulePkg: " Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 20/26] MdeModulePkg: Add Additional Profiles to SetMemoryProtectionsLib Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 21/26] OvmfPkg: Enable Choosing Memory Protection Profile via QemuCfg Taylor Beebe
2023-09-11 11:27   ` Gerd Hoffmann
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 22/26] ArmVirtPkg: Apply Memory Protections via SetMemoryProtectionsLib Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 23/26] MdeModulePkg: Delete PCD Profile from SetMemoryProtectionsLib Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 24/26] OvmfPkg: Delete Memory Protection PCDs Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 25/26] ArmVirtPkg: " Taylor Beebe
2023-08-30 23:18 ` [edk2-devel] [PATCH v3 26/26] MdeModulePkg: " Taylor Beebe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230830231851.779-3-taylor.d.beebe@gmail.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox