Revision: 18896
          http://sourceforge.net/p/edk2/code/18896
Author:   abiesheuvel
Date:     2015-11-18 15:59:04 +0000 (Wed, 18 Nov 2015)
Log Message:
-----------
ArmPkg/ArmV7Mmu: make cached translation table accesses shareable

To align with the way normal cacheable memory is mapped, set the
shareable bit for cached accesses performed by the page table walker.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <[email protected]>
Reviewed-by: Leif Lindholm <[email protected]>

Modified Paths:
--------------
    trunk/edk2/ArmPkg/Include/Chipset/ArmV7Mmu.h
    trunk/edk2/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c

Modified: trunk/edk2/ArmPkg/Include/Chipset/ArmV7Mmu.h
===================================================================
--- trunk/edk2/ArmPkg/Include/Chipset/ArmV7Mmu.h        2015-11-18 15:58:46 UTC 
(rev 18895)
+++ trunk/edk2/ArmPkg/Include/Chipset/ArmV7Mmu.h        2015-11-18 15:59:04 UTC 
(rev 18896)
@@ -29,10 +29,10 @@
 #define TTBR_RGN_INNER_WRITE_THROUGH         BIT0
 #define TTBR_RGN_INNER_WRITE_BACK_NO_ALLOC   (BIT0|BIT6)
 
-#define TTBR_WRITE_THROUGH              ( TTBR_RGN_OUTER_WRITE_THROUGH | 
TTBR_RGN_INNER_WRITE_THROUGH )
-#define TTBR_WRITE_BACK_NO_ALLOC        ( TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC | 
TTBR_RGN_INNER_WRITE_BACK_NO_ALLOC )
+#define TTBR_WRITE_THROUGH              ( TTBR_RGN_OUTER_WRITE_THROUGH | 
TTBR_RGN_INNER_WRITE_THROUGH | TTBR_SHAREABLE)
+#define TTBR_WRITE_BACK_NO_ALLOC        ( TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC | 
TTBR_RGN_INNER_WRITE_BACK_NO_ALLOC | TTBR_SHAREABLE)
 #define TTBR_NON_CACHEABLE              ( TTBR_RGN_OUTER_NON_CACHEABLE | 
TTBR_RGN_INNER_NON_CACHEABLE )
-#define TTBR_WRITE_BACK_ALLOC           ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | 
TTBR_RGN_INNER_WRITE_BACK_ALLOC )
+#define TTBR_WRITE_BACK_ALLOC           ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | 
TTBR_RGN_INNER_WRITE_BACK_ALLOC | TTBR_SHAREABLE)
 
 
 #define TRANSLATION_TABLE_SECTION_COUNT                 4096

Modified: trunk/edk2/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c
===================================================================
--- trunk/edk2/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c   2015-11-18 15:58:46 UTC 
(rev 18895)
+++ trunk/edk2/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c   2015-11-18 15:59:04 UTC 
(rev 18896)
@@ -265,6 +265,19 @@
     return RETURN_UNSUPPORTED;
   }
 
+  if (TTBRAttributes & TTBR_SHAREABLE) {
+    //
+    // Unlike the S bit in the short descriptors, which implies inner shareable
+    // on an implementation that supports two levels, the meaning of the S bit
+    // in the TTBR depends on the NOS bit, which defaults to Outer Shareable.
+    // However, we should only set this bit after we have confirmed that the
+    // implementation supports multiple levels, or else the NOS bit is UNK/SBZP
+    //
+    if (((ArmReadIdMmfr0 () >> 12) & 0xf) != 0) {
+      TTBRAttributes |= TTBR_NOT_OUTER_SHAREABLE;
+    }
+  }
+
   ArmCleanInvalidateDataCache ();
   ArmInvalidateInstructionCache ();
 


------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to