]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Gcd/Gcd.c
MdeModulePkg DxeCore: Add read only memory support.
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Gcd / Gcd.c
index 7268465f36584e1a60dd6f6af90cbcc1bbb07412..fdd2d40986b12216432936e779a3ba44e2f40c84 100644 (file)
@@ -3,7 +3,7 @@
   The GCD services are used to manage the memory and I/O regions that\r
   are accessible to the CPU that is executing the DXE core.\r
 \r
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2015, 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
@@ -25,9 +25,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
                                        EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED      | \\r
                                        EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED     | \\r
                                        EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED | \\r
+                                       EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED | \\r
                                        EFI_RESOURCE_ATTRIBUTE_16_BIT_IO           | \\r
                                        EFI_RESOURCE_ATTRIBUTE_32_BIT_IO           | \\r
-                                       EFI_RESOURCE_ATTRIBUTE_64_BIT_IO           )\r
+                                       EFI_RESOURCE_ATTRIBUTE_64_BIT_IO           | \\r
+                                       EFI_RESOURCE_ATTRIBUTE_PERSISTENT          )\r
 \r
 #define TESTED_MEMORY_ATTRIBUTES      (EFI_RESOURCE_ATTRIBUTE_PRESENT     | \\r
                                        EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \\r
@@ -89,9 +91,11 @@ GCD_ATTRIBUTE_CONVERSION_ENTRY mAttributeConversionTable[] = {
   { EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE,        EFI_MEMORY_RP,          TRUE  },\r
   { EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE,       EFI_MEMORY_WP,          TRUE  },\r
   { EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE,   EFI_MEMORY_XP,          TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE,   EFI_MEMORY_RO,          TRUE  },\r
   { EFI_RESOURCE_ATTRIBUTE_PRESENT,                 EFI_MEMORY_PRESENT,     FALSE },\r
   { EFI_RESOURCE_ATTRIBUTE_INITIALIZED,             EFI_MEMORY_INITIALIZED, FALSE },\r
   { EFI_RESOURCE_ATTRIBUTE_TESTED,                  EFI_MEMORY_TESTED,      FALSE },\r
+  { EFI_RESOURCE_ATTRIBUTE_PERSISTABLE,             EFI_MEMORY_NV,          TRUE  },\r
   { 0,                                              0,                      FALSE }\r
 };\r
 \r
@@ -103,6 +107,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *mGcdMemoryTypeNames[] = {
   "Reserved ",  // EfiGcdMemoryTypeReserved\r
   "SystemMem",  // EfiGcdMemoryTypeSystemMemory\r
   "MMIO     ",  // EfiGcdMemoryTypeMemoryMappedIo\r
+  "PersistentMem",// EfiGcdMemoryTypePersistentMemory\r
   "Unknown  "   // EfiGcdMemoryTypeMaximum\r
 };\r
 \r
@@ -231,6 +236,10 @@ CoreValidateResourceDescriptorHobAttributes (
           ((Attributes & EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE) != 0));\r
   ASSERT (((Attributes & EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED) == 0) ||\r
           ((Attributes & EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE) != 0));\r
+  ASSERT (((Attributes & EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED) == 0) ||\r
+          ((Attributes & EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE) != 0));\r
+  ASSERT (((Attributes & EFI_RESOURCE_ATTRIBUTE_PERSISTENT) == 0) ||\r
+          ((Attributes & EFI_RESOURCE_ATTRIBUTE_PERSISTABLE) != 0));\r
 }\r
 \r
 /**\r
@@ -812,22 +821,22 @@ CoreConvertSpace (
         goto Done;\r
       }\r
       break;\r
-    //
-    // Set capabilities operation
-    //
-    case GCD_SET_CAPABILITIES_MEMORY_OPERATION:
-      if ((BaseAddress & EFI_PAGE_MASK) != 0 || (Length & EFI_PAGE_MASK) != 0) {
-        Status = EFI_INVALID_PARAMETER;
-
-        goto Done;
+    //\r
+    // Set capabilities operation\r
+    //\r
+    case GCD_SET_CAPABILITIES_MEMORY_OPERATION:\r
+      if ((BaseAddress & EFI_PAGE_MASK) != 0 || (Length & EFI_PAGE_MASK) != 0) {\r
+        Status = EFI_INVALID_PARAMETER;\r
+\r
+        goto Done;\r
       }\r
-      //
+      //\r
       // Current attributes must still be supported with new capabilities\r
-      //
-      if ((Capabilities & Entry->Attributes) != Entry->Attributes) {
-        Status = EFI_UNSUPPORTED;
-        goto Done;
-      }
+      //\r
+      if ((Capabilities & Entry->Attributes) != Entry->Attributes) {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto Done;\r
+      }\r
       break;\r
     }\r
     Link = Link->ForwardLink;\r
@@ -916,8 +925,8 @@ CoreConvertSpace (
     //\r
     // Set capabilities operation\r
     //\r
-    case GCD_SET_CAPABILITIES_MEMORY_OPERATION:
-      Entry->Capabilities = Capabilities;
+    case GCD_SET_CAPABILITIES_MEMORY_OPERATION:\r
+      Entry->Capabilities = Capabilities;\r
       break;\r
     }\r
     Link = Link->ForwardLink;\r
@@ -1606,16 +1615,16 @@ CoreSetMemorySpaceCapabilities (
   IN UINT64                Capabilities\r
   )\r
 {\r
-  EFI_STATUS    Status;
-
+  EFI_STATUS    Status;\r
+\r
   DEBUG ((DEBUG_GCD, "GCD:CoreSetMemorySpaceCapabilities(Base=%016lx,Length=%016lx)\n", BaseAddress, Length));\r
-  DEBUG ((DEBUG_GCD, "  Capabilities  = %016lx\n", Capabilities));
-
-  Status = CoreConvertSpace (GCD_SET_CAPABILITIES_MEMORY_OPERATION, (EFI_GCD_MEMORY_TYPE) 0, (EFI_GCD_IO_TYPE) 0, BaseAddress, Length, Capabilities, 0);
+  DEBUG ((DEBUG_GCD, "  Capabilities  = %016lx\n", Capabilities));\r
+\r
+  Status = CoreConvertSpace (GCD_SET_CAPABILITIES_MEMORY_OPERATION, (EFI_GCD_MEMORY_TYPE) 0, (EFI_GCD_IO_TYPE) 0, BaseAddress, Length, Capabilities, 0);\r
   if (!EFI_ERROR(Status)) {\r
-    CoreUpdateMemoryAttributes(BaseAddress, RShiftU64(Length, EFI_PAGE_SHIFT), Capabilities);
-  }
-
+    CoreUpdateMemoryAttributes(BaseAddress, RShiftU64(Length, EFI_PAGE_SHIFT), Capabilities);\r
+  }\r
+\r
   return Status;\r
 }\r
 \r
@@ -2357,6 +2366,9 @@ CoreInitializeGcdServices (
         if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == PRESENT_MEMORY_ATTRIBUTES) {\r
           GcdMemoryType = EfiGcdMemoryTypeReserved;\r
         }\r
+        if ((ResourceHob->ResourceAttribute & EFI_RESOURCE_ATTRIBUTE_PERSISTENT) == EFI_RESOURCE_ATTRIBUTE_PERSISTENT) {\r
+          GcdMemoryType = EfiGcdMemoryTypePersistentMemory;\r
+        }\r
         break;\r
       case EFI_RESOURCE_MEMORY_MAPPED_IO:\r
       case EFI_RESOURCE_FIRMWARE_DEVICE:\r