]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c
MdeModulePkg DxeCore: Enhance MemoryAttributesTable installation
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Misc / MemoryAttributesTable.c
index 0362212c8b0b2c45aa9b6ef69b8c8addea9772be..3706b232472a9b60f8820177214b65837f7486ab 100644 (file)
@@ -71,18 +71,16 @@ CoreGetMemoryMapPropertiesTable (
   );\r
 \r
 extern EFI_PROPERTIES_TABLE  mPropertiesTable;\r
+EFI_MEMORY_ATTRIBUTES_TABLE  *mMemoryAttributesTable = NULL;\r
+BOOLEAN                      mMemoryAttributesTableReadyToBoot = FALSE;\r
 \r
 /**\r
   Install MemoryAttributesTable.\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
 InstallMemoryAttributesTable (\r
-  EFI_EVENT                               Event,\r
-  VOID                                    *Context\r
+  VOID\r
   )\r
 {\r
   UINTN                          MemoryMapSize;\r
@@ -97,12 +95,29 @@ InstallMemoryAttributesTable (
   EFI_MEMORY_ATTRIBUTES_TABLE    *MemoryAttributesTable;\r
   EFI_MEMORY_DESCRIPTOR          *MemoryAttributesEntry;\r
 \r
+  if (gMemoryMapTerminated) {\r
+    //\r
+    // Directly return after MemoryMap terminated.\r
+    //\r
+    return;\r
+  }\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
     return ;\r
   }\r
 \r
+  if (mMemoryAttributesTable == NULL) {\r
+    //\r
+    // InstallConfigurationTable here to occupy one entry for MemoryAttributesTable\r
+    // before GetMemoryMap below, as InstallConfigurationTable may allocate runtime\r
+    // memory for the new entry.\r
+    //\r
+    Status = gBS->InstallConfigurationTable (&gEfiMemoryAttributesTableGuid, (VOID *) (UINTN) MAX_ADDRESS);\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+\r
   MemoryMapSize = 0;\r
   MemoryMap = NULL;\r
   Status = CoreGetMemoryMapPropertiesTable (\r
@@ -177,8 +192,52 @@ InstallMemoryAttributesTable (
   MemoryMap = MemoryMapStart;\r
   FreePool (MemoryMap);\r
 \r
+  //\r
+  // Update configuratoin table for MemoryAttributesTable.\r
+  //\r
   Status = gBS->InstallConfigurationTable (&gEfiMemoryAttributesTableGuid, MemoryAttributesTable);\r
   ASSERT_EFI_ERROR (Status);\r
+\r
+  if (mMemoryAttributesTable != NULL) {\r
+    FreePool (mMemoryAttributesTable);\r
+  }\r
+  mMemoryAttributesTable = MemoryAttributesTable; \r
+}\r
+\r
+/**\r
+  Install MemoryAttributesTable on memory allocation.\r
+\r
+  @param[in] MemoryType EFI memory type.\r
+**/\r
+VOID\r
+InstallMemoryAttributesTableOnMemoryAllocation (\r
+  IN EFI_MEMORY_TYPE    MemoryType\r
+  )\r
+{\r
+  //\r
+  // Install MemoryAttributesTable after ReadyToBoot on runtime memory allocation.\r
+  //\r
+  if (mMemoryAttributesTableReadyToBoot &&\r
+      ((MemoryType == EfiRuntimeServicesCode) || (MemoryType == EfiRuntimeServicesData))) {\r
+    InstallMemoryAttributesTable ();\r
+  }\r
+}\r
+\r
+/**\r
+  Install MemoryAttributesTable on ReadyToBoot.\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
+InstallMemoryAttributesTableOnReadyToBoot (\r
+  IN EFI_EVENT          Event,\r
+  IN VOID               *Context\r
+  )\r
+{\r
+  InstallMemoryAttributesTable ();\r
+  mMemoryAttributesTableReadyToBoot = TRUE; \r
 }\r
 \r
 /**\r
@@ -194,17 +253,16 @@ CoreInitializeMemoryAttributesTable (
   EFI_EVENT   ReadyToBootEvent;\r
 \r
   //\r
-  // Construct the table at ReadyToBoot, because this should be\r
-  // last point to allocate RuntimeCode/RuntimeData.\r
+  // Construct the table at ReadyToBoot.\r
   //\r
-  Status = gBS->CreateEventEx (\r
-                  EVT_NOTIFY_SIGNAL,\r
-                  TPL_NOTIFY,\r
-                  InstallMemoryAttributesTable,\r
-                  NULL,\r
-                  &gEfiEventReadyToBootGuid,\r
-                  &ReadyToBootEvent\r
-                  );\r
+  Status = CoreCreateEventInternal (\r
+             EVT_NOTIFY_SIGNAL,\r
+             TPL_CALLBACK - 1,\r
+             InstallMemoryAttributesTableOnReadyToBoot,\r
+             NULL,\r
+             &gEfiEventReadyToBootGuid,\r
+             &ReadyToBootEvent\r
+             );\r
   ASSERT_EFI_ERROR (Status);\r
   return ;\r
 }\r