From c23f114d3cfbb29b8734b87213d1ec0de404197b Mon Sep 17 00:00:00 2001 From: Guo Mang Date: Thu, 27 Apr 2017 11:05:07 +0800 Subject: MdeModulePkg: Move to new location Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Guo Mang --- .../PropertiesTableAttributesDxe.c | 208 +++++++++++++++++++++ .../PropertiesTableAttributesDxe.inf | 56 ++++++ .../PropertiesTableAttributesDxe.uni | 23 +++ .../PropertiesTableAttributesDxeExtra.uni | 23 +++ 4 files changed, 310 insertions(+) create mode 100644 Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.c create mode 100644 Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.inf create mode 100644 Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.uni create mode 100644 Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxeExtra.uni (limited to 'Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe') diff --git a/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.c b/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.c new file mode 100644 index 0000000000..718c567346 --- /dev/null +++ b/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.c @@ -0,0 +1,208 @@ +/** @file + This module sets default policy for attributes of EfiACPIMemoryNVS and EfiReservedMemoryType. + + This module sets EFI_MEMORY_XP for attributes of EfiACPIMemoryNVS and EfiReservedMemoryType + in UEFI memory map, if and only of PropertiesTable is published and has BIT0 set. + +Copyright (c) 2015, Intel Corporation. All rights reserved.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +/** + Converts a number of EFI_PAGEs to a size in bytes. + + NOTE: Do not use EFI_PAGES_TO_SIZE because it handles UINTN only. + + @param Pages The number of EFI_PAGES. + + @return The number of bytes associated with the number of EFI_PAGEs specified + by Pages. +**/ +UINT64 +EfiPagesToSize ( + IN UINT64 Pages + ) +{ + return LShiftU64 (Pages, EFI_PAGE_SHIFT); +} + +/** + Set memory attributes according to default policy. + + @param MemoryMap A pointer to the buffer in which firmware places the current memory map. + @param MemoryMapSize Size, in bytes, of the MemoryMap buffer. + @param DescriptorSize size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR. +**/ +VOID +SetMemorySpaceAttributesDefault ( + IN EFI_MEMORY_DESCRIPTOR *MemoryMap, + IN UINTN MemoryMapSize, + IN UINTN DescriptorSize + ) +{ + EFI_MEMORY_DESCRIPTOR *MemoryMapEntry; + EFI_MEMORY_DESCRIPTOR *MemoryMapEnd; + EFI_STATUS Status; + + DEBUG ((EFI_D_INFO, "SetMemorySpaceAttributesDefault\n")); + + MemoryMapEntry = MemoryMap; + MemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) MemoryMap + MemoryMapSize); + while ((UINTN)MemoryMapEntry < (UINTN)MemoryMapEnd) { + if (MemoryMapEntry->PhysicalStart < BASE_1MB) { + // + // Do not touch memory space below 1MB + // + MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize); + continue; + } + switch (MemoryMapEntry->Type) { + case EfiRuntimeServicesCode: + case EfiRuntimeServicesData: + // + // should be handled later; + // + break; + case EfiReservedMemoryType: + case EfiACPIMemoryNVS: + // + // Handle EfiReservedMemoryType and EfiACPIMemoryNVS, because there might be firmware executable there. + // + DEBUG ((EFI_D_INFO, "SetMemorySpaceAttributes - %016lx - %016lx (%016lx) ...\n", + MemoryMapEntry->PhysicalStart, + MemoryMapEntry->PhysicalStart + EfiPagesToSize (MemoryMapEntry->NumberOfPages), + MemoryMapEntry->Attribute + )); + Status = gDS->SetMemorySpaceCapabilities ( + MemoryMapEntry->PhysicalStart, + EfiPagesToSize (MemoryMapEntry->NumberOfPages), + MemoryMapEntry->Attribute | EFI_MEMORY_XP + ); + DEBUG ((EFI_D_INFO, "SetMemorySpaceCapabilities - %r\n", Status)); + break; + } + + MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize); + } + + return ; +} + +/** + Update memory attributes according to default policy. + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Event. +**/ +VOID +EFIAPI +UpdateMemoryAttributesDefault ( + EFI_EVENT Event, + VOID *Context + ) +{ + EFI_STATUS Status; + EFI_MEMORY_DESCRIPTOR *MemoryMap; + UINTN MemoryMapSize; + UINTN MapKey; + UINTN DescriptorSize; + UINT32 DescriptorVersion; + EFI_PROPERTIES_TABLE *PropertiesTable; + + DEBUG ((EFI_D_INFO, "UpdateMemoryAttributesDefault\n")); + Status = EfiGetSystemConfigurationTable (&gEfiPropertiesTableGuid, (VOID **) &PropertiesTable); + if (EFI_ERROR (Status)) { + goto Done; + } + + ASSERT (PropertiesTable != NULL); + + DEBUG ((EFI_D_INFO, "MemoryProtectionAttribute - 0x%016lx\n", PropertiesTable->MemoryProtectionAttribute)); + if ((PropertiesTable->MemoryProtectionAttribute & EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA) == 0) { + goto Done; + } + + // + // Get the EFI memory map. + // + MemoryMapSize = 0; + MemoryMap = NULL; + Status = gBS->GetMemoryMap ( + &MemoryMapSize, + MemoryMap, + &MapKey, + &DescriptorSize, + &DescriptorVersion + ); + ASSERT (Status == EFI_BUFFER_TOO_SMALL); + do { + MemoryMap = (EFI_MEMORY_DESCRIPTOR *) AllocatePool (MemoryMapSize); + ASSERT (MemoryMap != NULL); + Status = gBS->GetMemoryMap ( + &MemoryMapSize, + MemoryMap, + &MapKey, + &DescriptorSize, + &DescriptorVersion + ); + if (EFI_ERROR (Status)) { + FreePool (MemoryMap); + } + } while (Status == EFI_BUFFER_TOO_SMALL); + ASSERT_EFI_ERROR (Status); + + SetMemorySpaceAttributesDefault (MemoryMap, MemoryMapSize, DescriptorSize); + +Done: + gBS->CloseEvent (Event); + + return ; +} + +/** + The entrypoint of properties table attribute driver. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS It always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +InitializePropertiesTableAttributesDxe ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_EVENT ReadyToBootEvent; + + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + UpdateMemoryAttributesDefault, + NULL, + &gEfiEventReadyToBootGuid, + &ReadyToBootEvent + ); + ASSERT_EFI_ERROR (Status); + + return EFI_SUCCESS; +} diff --git a/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.inf b/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.inf new file mode 100644 index 0000000000..3f699f6b5a --- /dev/null +++ b/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.inf @@ -0,0 +1,56 @@ +## @file +# This module sets default policy for attributes of EfiACPIMemoryNVS and EfiReservedMemoryType. +# +# This module sets EFI_MEMORY_XP for attributes of EfiACPIMemoryNVS and EfiReservedMemoryType +# in UEFI memory map, if and only of PropertiesTable is published and has BIT0 set. +# +# Copyright (c) 2015, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PropertiesTableAttributesDxe + MODULE_UNI_FILE = PropertiesTableAttributesDxe.uni + FILE_GUID = AA48FBB2-9F87-4DFD-B416-575938F0C8F4 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = InitializePropertiesTableAttributesDxe + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +[Sources] + PropertiesTableAttributesDxe.c + +[Packages] + MdePkg/MdePkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + UefiBootServicesTableLib + DxeServicesTableLib + DebugLib + UefiLib + MemoryAllocationLib + +[Guids] + gEfiEventReadyToBootGuid ## CONSUMES ## Event + gEfiPropertiesTableGuid ## CONSUMES ## SystemTable + +[Depex] + TRUE + +[UserExtensions.TianoCore."ExtraFiles"] + PropertiesTableAttributesDxeExtra.uni diff --git a/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.uni b/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.uni new file mode 100644 index 0000000000..9df097f7ce --- /dev/null +++ b/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxe.uni @@ -0,0 +1,23 @@ +// /** @file +// This module sets default policy for attributes of EfiACPIMemoryNVS and EfiReservedMemoryType. +// +// This module sets EFI_MEMORY_XP for attributes of EfiACPIMemoryNVS and EfiReservedMemoryType +// in UEFI memory map, if and only of PropertiesTable is published and has BIT0 set. +// +// Copyright (c) 2015, Intel Corporation. All rights reserved.
+// +// This program and the accompanying materials +// are licensed and made available under the terms and conditions of the BSD License +// which accompanies this distribution. The full text of the license may be found at +// http://opensource.org/licenses/bsd-license.php +// +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "This module sets default policy for attributes of EfiACPIMemoryNVS and EfiReservedMemoryType." + +#string STR_MODULE_DESCRIPTION #language en-US "This module sets EFI_MEMORY_XP for attributes of EfiACPIMemoryNVS and EfiReservedMemoryType in UEFI memory map, if and only of PropertiesTable is published and has BIT0 set." + diff --git a/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxeExtra.uni b/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxeExtra.uni new file mode 100644 index 0000000000..e107e78523 --- /dev/null +++ b/Core/MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttributesDxeExtra.uni @@ -0,0 +1,23 @@ +// /** @file +// This module sets default policy for attributes of EfiACPIMemoryNVS and EfiReservedMemoryType. +// +// This module sets EFI_MEMORY_XP for attributes of EfiACPIMemoryNVS and EfiReservedMemoryType +// in UEFI memory map, if and only of PropertiesTable is published and has BIT0 set. +// +// Copyright (c) 2015, Intel Corporation. All rights reserved.
+// +// This program and the accompanying materials +// are licensed and made available under the terms and conditions of the BSD License +// which accompanies this distribution. The full text of the license may be found at +// http://opensource.org/licenses/bsd-license.php +// +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +// +// **/ + +#string STR_PROPERTIES_MODULE_NAME +#language en-US +"PropertiesTable Attributes Setting DXE Driver" + + -- cgit v1.2.3