Implement the ARM version of a NULL class library that can be overlaid on top of the DXE core to equip it right from its launch with an implementation of the CPU arch protocol member that sets type and permission attributes on memory regions.
This bridges the gap between dispatch of DXE core and dispatch of the DXE driver that implements the CPU arch protocol, removing the need to rely on memory mappings that are writable and executable at the same time. Signed-off-by: Ard Biesheuvel <a...@kernel.org> --- ArmPkg/Library/ArmSetMemoryOverrideLib/ArmSetMemoryOverrideLib.c | 56 ++++++++++++++++++++ ArmPkg/Library/ArmSetMemoryOverrideLib/ArmSetMemoryOverrideLib.inf | 25 +++++++++ 2 files changed, 81 insertions(+) diff --git a/ArmPkg/Library/ArmSetMemoryOverrideLib/ArmSetMemoryOverrideLib.c b/ArmPkg/Library/ArmSetMemoryOverrideLib/ArmSetMemoryOverrideLib.c new file mode 100644 index 000000000000..d2a9bc96be35 --- /dev/null +++ b/ArmPkg/Library/ArmSetMemoryOverrideLib/ArmSetMemoryOverrideLib.c @@ -0,0 +1,56 @@ +/** @file + Copyright (c) 2023, Google LLC. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include <PiDxe.h> + +#include <Library/ArmMmuLib.h> +#include <Library/DebugLib.h> +#include <Protocol/Cpu.h> + +extern EFI_CPU_SET_MEMORY_ATTRIBUTES gCpuSetMemoryAttributes; + +STATIC UINTN mRecursionLevel; + +STATIC +EFI_STATUS +EFIAPI +EarlyArmSetMemoryAttributes ( + IN EFI_CPU_ARCH_PROTOCOL *This, + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINT64 Length, + IN UINT64 Attributes + ) +{ + EFI_STATUS Status; + + // There are cases where the use of strict memory permissions may trigger + // unbounded recursion in the page table code. This happens when setting + // memory permissions results in a page table split and therefore a page + // allocation, which could trigger a recursive invocation of this function. + ASSERT (mRecursionLevel < 2); + + mRecursionLevel++; + + Status = ArmSetMemoryAttributes ( + BaseAddress, + Length, + Attributes + ); + + mRecursionLevel--; + return Status; +} + +RETURN_STATUS +EFIAPI +ArmSetMemoryOverrideLibConstructor ( + VOID + ) +{ + gCpuSetMemoryAttributes = EarlyArmSetMemoryAttributes; + + return RETURN_SUCCESS; +} diff --git a/ArmPkg/Library/ArmSetMemoryOverrideLib/ArmSetMemoryOverrideLib.inf b/ArmPkg/Library/ArmSetMemoryOverrideLib/ArmSetMemoryOverrideLib.inf new file mode 100644 index 000000000000..f07da3dd2d15 --- /dev/null +++ b/ArmPkg/Library/ArmSetMemoryOverrideLib/ArmSetMemoryOverrideLib.inf @@ -0,0 +1,25 @@ +#/** @file +# Copyright (c) 2023, Google LLC. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +#**/ + +[Defines] + INF_VERSION = 1.29 + BASE_NAME = ArmSetMemoryOverrideLib + FILE_GUID = 849a43c0-6ad9-428e-8a5a-e090f7853bd3 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NULL|DXE_CORE + CONSTRUCTOR = ArmSetMemoryOverrideLibConstructor + +[Sources.common] + ArmSetMemoryOverrideLib.c + +[Packages] + ArmPkg/ArmPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + ArmMmuLib + DebugLib -- 2.39.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100095): https://edk2.groups.io/g/devel/message/100095 Mute This Topic: https://groups.io/mt/96937487/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-