return GcdAttributes;\r
}\r
\r
-ARM_MEMORY_REGION_ATTRIBUTES\r
-GcdAttributeToArmAttribute (\r
- IN UINT64 GcdAttributes\r
- )\r
-{\r
- switch (GcdAttributes & 0xFF) {\r
- case EFI_MEMORY_UC:\r
- return ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;\r
- case EFI_MEMORY_WC:\r
- return ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED;\r
- case EFI_MEMORY_WT:\r
- return ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH;\r
- case EFI_MEMORY_WB:\r
- return ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;\r
- default:\r
- DEBUG ((EFI_D_ERROR, "GcdAttributeToArmAttribute: 0x%lX attributes is not supported.\n", GcdAttributes));\r
- ASSERT (0);\r
- return ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;\r
- }\r
-}\r
-\r
#define MIN_T0SZ 16\r
#define BITS_PER_LEVEL 9\r
\r
);\r
}\r
\r
+STATIC\r
+UINT64\r
+GcdAttributeToPageAttribute (\r
+ IN UINT64 GcdAttributes\r
+ )\r
+{\r
+ UINT64 PageAttributes;\r
+\r
+ switch (GcdAttributes & EFI_MEMORY_CACHETYPE_MASK) {\r
+ case EFI_MEMORY_UC:\r
+ PageAttributes = TT_ATTR_INDX_DEVICE_MEMORY;\r
+ break;\r
+ case EFI_MEMORY_WC:\r
+ PageAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;\r
+ break;\r
+ case EFI_MEMORY_WT:\r
+ PageAttributes = TT_ATTR_INDX_MEMORY_WRITE_THROUGH | TT_SH_INNER_SHAREABLE;\r
+ break;\r
+ case EFI_MEMORY_WB:\r
+ PageAttributes = TT_ATTR_INDX_MEMORY_WRITE_BACK | TT_SH_INNER_SHAREABLE;\r
+ break;\r
+ default:\r
+ PageAttributes = TT_ATTR_INDX_MASK;\r
+ break;\r
+ }\r
+\r
+ if ((GcdAttributes & EFI_MEMORY_XP) != 0 ||\r
+ (GcdAttributes & EFI_MEMORY_CACHETYPE_MASK) == EFI_MEMORY_UC) {\r
+ if (ArmReadCurrentEL () == AARCH64_EL2) {\r
+ PageAttributes |= TT_XN_MASK;\r
+ } else {\r
+ PageAttributes |= TT_UXN_MASK | TT_PXN_MASK;\r
+ }\r
+ }\r
+\r
+ if ((GcdAttributes & EFI_MEMORY_RO) != 0) {\r
+ PageAttributes |= TT_AP_RO_RO;\r
+ }\r
+\r
+ return PageAttributes | TT_AF;\r
+}\r
+\r
RETURN_STATUS\r
SetMemoryAttributes (\r
IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
)\r
{\r
RETURN_STATUS Status;\r
- ARM_MEMORY_REGION_DESCRIPTOR MemoryRegion;\r
UINT64 *TranslationTable;\r
-\r
- MemoryRegion.PhysicalBase = BaseAddress;\r
- MemoryRegion.VirtualBase = BaseAddress;\r
- MemoryRegion.Length = Length;\r
- MemoryRegion.Attributes = GcdAttributeToArmAttribute (Attributes);\r
+ UINT64 PageAttributes;\r
+ UINT64 PageAttributeMask;\r
+\r
+ PageAttributes = GcdAttributeToPageAttribute (Attributes);\r
+ PageAttributeMask = 0;\r
+\r
+ if ((Attributes & EFI_MEMORY_CACHETYPE_MASK) == 0) {\r
+ //\r
+ // No memory type was set in Attributes, so we are going to update the\r
+ // permissions only.\r
+ //\r
+ PageAttributes &= TT_AP_MASK | TT_UXN_MASK | TT_PXN_MASK;\r
+ PageAttributeMask = ~(TT_ADDRESS_MASK_BLOCK_ENTRY | TT_AP_MASK |\r
+ TT_PXN_MASK | TT_XN_MASK);\r
+ }\r
\r
TranslationTable = ArmGetTTBR0BaseAddress ();\r
\r
- Status = FillTranslationTable (TranslationTable, &MemoryRegion);\r
+ Status = UpdateRegionMapping (\r
+ TranslationTable,\r
+ BaseAddress,\r
+ Length,\r
+ PageAttributes,\r
+ PageAttributeMask);\r
if (RETURN_ERROR (Status)) {\r
return Status;\r
}\r