]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/ArmLib: mark all cached mappings as (inner) shareable
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Thu, 12 Nov 2015 11:40:57 +0000 (11:40 +0000)
committerabiesheuvel <abiesheuvel@Edk2>
Thu, 12 Nov 2015 11:40:57 +0000 (11:40 +0000)
Mark all cached memory mappings as shareable (or inner shareable on
AArch64) so that our view of memory is kept coherent by the hardware.

This is relevant for things like coherent DMA and virtualization (where
a guest may migrate to another core) but in general, since UEFI on ARM
is mostly used in a context where the secure firmware and possibly a
secure OS are already up and running, it is best to refrain from using
any non-shareable mappings.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18778 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Include/Chipset/AArch64Mmu.h
ArmPkg/Include/Chipset/ArmV7Mmu.h
ArmPkg/Library/ArmLib/AArch64/AArch64Mmu.c

index 22e492d61dc04489b63c7e3685efa3e4fe662946..3c3df6d9835cd9610c989232855faf68f29a38a4 100644 (file)
 #define TT_NS                                   BIT5\r
 #define TT_AF                                   BIT10\r
 \r
+#define TT_SH_NON_SHAREABLE                     (0x0 << 8)\r
+#define TT_SH_OUTER_SHAREABLE                   (0x2 << 8)\r
+#define TT_SH_INNER_SHAREABLE                   (0x3 << 8)\r
+#define TT_SH_MASK                              (0x3 << 8)\r
+\r
 #define TT_PXN_MASK                             BIT53\r
 #define TT_UXN_MASK                             BIT54   // EL1&0\r
 #define TT_XN_MASK                              BIT54   // EL2 / EL3\r
index 24ab1755faa73cb9cdba2fad6d1e4e9c2a5da1ba..aaa0977205fa8b4550721ec0ca3243a3c5ee950f 100644 (file)
 #define TT_DESCRIPTOR_SECTION_WRITE_BACK(NonSecure)         (TT_DESCRIPTOR_SECTION_TYPE_SECTION                                                           | \\r
                                                             ((NonSecure) ?  TT_DESCRIPTOR_SECTION_NS : 0)    | \\r
                                                             TT_DESCRIPTOR_SECTION_NG_GLOBAL                         | \\r
-                                                            TT_DESCRIPTOR_SECTION_S_NOT_SHARED                      | \\r
+                                                            TT_DESCRIPTOR_SECTION_S_SHARED                          | \\r
                                                             TT_DESCRIPTOR_SECTION_DOMAIN(0)                         | \\r
                                                             TT_DESCRIPTOR_SECTION_AP_RW_RW                          | \\r
                                                             TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC)\r
 #define TT_DESCRIPTOR_SECTION_WRITE_THROUGH(NonSecure)      (TT_DESCRIPTOR_SECTION_TYPE_SECTION                                                           | \\r
                                                             ((NonSecure) ?  TT_DESCRIPTOR_SECTION_NS : 0)    | \\r
                                                             TT_DESCRIPTOR_SECTION_NG_GLOBAL                         | \\r
-                                                            TT_DESCRIPTOR_SECTION_S_NOT_SHARED                      | \\r
+                                                            TT_DESCRIPTOR_SECTION_S_SHARED                          | \\r
                                                             TT_DESCRIPTOR_SECTION_DOMAIN(0)                         | \\r
                                                             TT_DESCRIPTOR_SECTION_AP_RW_RW                          | \\r
                                                             TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC)\r
 \r
 #define TT_DESCRIPTOR_PAGE_WRITE_BACK              (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           | \\r
                                                         TT_DESCRIPTOR_PAGE_NG_GLOBAL                                                      | \\r
-                                                        TT_DESCRIPTOR_PAGE_S_NOT_SHARED                                                   | \\r
+                                                        TT_DESCRIPTOR_PAGE_S_SHARED                                                       | \\r
                                                         TT_DESCRIPTOR_PAGE_AP_RW_RW                                                       | \\r
                                                         TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC)\r
 #define TT_DESCRIPTOR_PAGE_WRITE_THROUGH           (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           | \\r
                                                         TT_DESCRIPTOR_PAGE_NG_GLOBAL                                                      | \\r
-                                                        TT_DESCRIPTOR_PAGE_S_NOT_SHARED                                                   | \\r
+                                                        TT_DESCRIPTOR_PAGE_S_SHARED                                                       | \\r
                                                         TT_DESCRIPTOR_PAGE_AP_RW_RW                                                       | \\r
                                                         TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC)\r
 #define TT_DESCRIPTOR_PAGE_DEVICE                  (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           | \\r
index e40c09ae9685cdc8416b2e345a4e89f115a4dc00..8829c6286b3650d6bd314ca19ef9fccad5098fb4 100644 (file)
@@ -34,23 +34,22 @@ ArmMemoryAttributeToPageAttribute (
 {\r
   switch (Attributes) {\r
   case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK:\r
-    return TT_ATTR_INDX_MEMORY_WRITE_BACK;\r
-  case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH:\r
-    return TT_ATTR_INDX_MEMORY_WRITE_THROUGH;\r
-  case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE:\r
-    return TT_ATTR_INDX_DEVICE_MEMORY;\r
-  case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED:\r
-    return TT_ATTR_INDX_MEMORY_NON_CACHEABLE;\r
   case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK:\r
-    return TT_ATTR_INDX_MEMORY_WRITE_BACK;\r
+    return TT_ATTR_INDX_MEMORY_WRITE_BACK | TT_SH_INNER_SHAREABLE;\r
+\r
+  case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH:\r
   case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH:\r
-    return TT_ATTR_INDX_MEMORY_WRITE_THROUGH;\r
-  case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE:\r
-    return TT_ATTR_INDX_DEVICE_MEMORY;\r
+    return TT_ATTR_INDX_MEMORY_WRITE_THROUGH | TT_SH_INNER_SHAREABLE;\r
+\r
+  // Uncached and device mappings are treated as outer shareable by default,\r
+  case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED:\r
   case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED:\r
     return TT_ATTR_INDX_MEMORY_NON_CACHEABLE;\r
+\r
   default:\r
     ASSERT(0);\r
+  case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE:\r
+  case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE:\r
     return TT_ATTR_INDX_DEVICE_MEMORY;\r
   }\r
 }\r