/** @file\r
UEFI MemoryAttributesTable support\r
\r
-Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
-CoreGetMemoryMapPropertiesTable (\r
+CoreGetMemoryMapWithSeparatedImageSection (\r
IN OUT UINTN *MemoryMapSize,\r
IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,\r
OUT UINTN *MapKey,\r
\r
if ((mPropertiesTable.MemoryProtectionAttribute & EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA) == 0) {\r
DEBUG ((EFI_D_VERBOSE, "MemoryProtectionAttribute NON_EXECUTABLE_PE_DATA is not set, "));\r
- DEBUG ((EFI_D_VERBOSE, "because Runtime Driver Section Alignment is not %dK.\n", EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT >> 10));\r
+ DEBUG ((EFI_D_VERBOSE, "because Runtime Driver Section Alignment is not %dK.\n", RUNTIME_PAGE_ALLOCATION_GRANULARITY >> 10));\r
return ;\r
}\r
\r
\r
MemoryMapSize = 0;\r
MemoryMap = NULL;\r
- Status = CoreGetMemoryMapPropertiesTable (\r
+ Status = CoreGetMemoryMapWithSeparatedImageSection (\r
&MemoryMapSize,\r
MemoryMap,\r
&MapKey,\r
MemoryMap = AllocatePool (MemoryMapSize);\r
ASSERT (MemoryMap != NULL);\r
\r
- Status = CoreGetMemoryMapPropertiesTable (\r
+ Status = CoreGetMemoryMapWithSeparatedImageSection (\r
&MemoryMapSize,\r
MemoryMap,\r
&MapKey,\r
if (mMemoryAttributesTable != NULL) {\r
FreePool (mMemoryAttributesTable);\r
}\r
- mMemoryAttributesTable = MemoryAttributesTable; \r
+ mMemoryAttributesTable = MemoryAttributesTable;\r
}\r
\r
/**\r
)\r
{\r
InstallMemoryAttributesTable ();\r
- mMemoryAttributesTableReadyToBoot = TRUE; \r
+ mMemoryAttributesTableReadyToBoot = TRUE;\r
+}\r
+\r
+/**\r
+ Install initial MemoryAttributesTable on EndOfDxe.\r
+ Then SMM can consume this information.\r
+\r
+ @param[in] Event The Event this notify function registered to.\r
+ @param[in] Context Pointer to the context data registered to the Event.\r
+**/\r
+VOID\r
+EFIAPI\r
+InstallMemoryAttributesTableOnEndOfDxe (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ InstallMemoryAttributesTable ();\r
}\r
\r
/**\r
{\r
EFI_STATUS Status;\r
EFI_EVENT ReadyToBootEvent;\r
+ EFI_EVENT EndOfDxeEvent;\r
\r
//\r
// Construct the table at ReadyToBoot.\r
//\r
Status = CoreCreateEventInternal (\r
EVT_NOTIFY_SIGNAL,\r
- TPL_CALLBACK - 1,\r
+ TPL_CALLBACK,\r
InstallMemoryAttributesTableOnReadyToBoot,\r
NULL,\r
&gEfiEventReadyToBootGuid,\r
&ReadyToBootEvent\r
);\r
ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Construct the initial table at EndOfDxe,\r
+ // then SMM can consume this information.\r
+ // Use TPL_NOTIFY here, as such SMM code (TPL_CALLBACK)\r
+ // can run after it.\r
+ //\r
+ Status = CoreCreateEventInternal (\r
+ EVT_NOTIFY_SIGNAL,\r
+ TPL_NOTIFY,\r
+ InstallMemoryAttributesTableOnEndOfDxe,\r
+ NULL,\r
+ &gEfiEndOfDxeEventGroupGuid,\r
+ &EndOfDxeEvent\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
return ;\r
}\r