\r
// determine protection attributes\r
switch (SectionAttributes & TT_DESCRIPTOR_SECTION_AP_MASK) {\r
- case TT_DESCRIPTOR_SECTION_AP_NO_NO: // no read, no write\r
- // *GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_RP;\r
- break;\r
-\r
- case TT_DESCRIPTOR_SECTION_AP_RW_NO:\r
+ case TT_DESCRIPTOR_SECTION_AP_NO_RW:\r
case TT_DESCRIPTOR_SECTION_AP_RW_RW:\r
// normal read/write access, do not add additional attributes\r
break;\r
\r
// read only cases map to write-protect\r
- case TT_DESCRIPTOR_SECTION_AP_RO_NO:\r
+ case TT_DESCRIPTOR_SECTION_AP_NO_RO:\r
case TT_DESCRIPTOR_SECTION_AP_RO_RO:\r
*GcdAttributes |= EFI_MEMORY_RO;\r
break;\r
-\r
- default:\r
- return EFI_UNSUPPORTED;\r
}\r
\r
// now process eXectue Never attribute\r
- if ((SectionAttributes & TT_DESCRIPTOR_SECTION_XN_MASK) != 0 ) {\r
+ if ((SectionAttributes & TT_DESCRIPTOR_SECTION_XN_MASK) != 0) {\r
*GcdAttributes |= EFI_MEMORY_XP;\r
}\r
\r
+ if ((SectionAttributes & TT_DESCRIPTOR_SECTION_AF) == 0) {\r
+ *GcdAttributes |= EFI_MEMORY_RP;\r
+ }\r
+\r
return EFI_SUCCESS;\r
}\r
\r
\r
// determine protection attributes\r
switch (PageAttributes & TT_DESCRIPTOR_PAGE_AP_MASK) {\r
- case TT_DESCRIPTOR_PAGE_AP_NO_NO: // no read, no write\r
- // *GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_RP;\r
- break;\r
-\r
- case TT_DESCRIPTOR_PAGE_AP_RW_NO:\r
+ case TT_DESCRIPTOR_PAGE_AP_NO_RW:\r
case TT_DESCRIPTOR_PAGE_AP_RW_RW:\r
// normal read/write access, do not add additional attributes\r
break;\r
\r
// read only cases map to write-protect\r
- case TT_DESCRIPTOR_PAGE_AP_RO_NO:\r
+ case TT_DESCRIPTOR_PAGE_AP_NO_RO:\r
case TT_DESCRIPTOR_PAGE_AP_RO_RO:\r
*GcdAttributes |= EFI_MEMORY_RO;\r
break;\r
-\r
- default:\r
- return EFI_UNSUPPORTED;\r
}\r
\r
// now process eXectue Never attribute\r
- if ((PageAttributes & TT_DESCRIPTOR_PAGE_XN_MASK) != 0 ) {\r
+ if ((PageAttributes & TT_DESCRIPTOR_PAGE_XN_MASK) != 0) {\r
*GcdAttributes |= EFI_MEMORY_XP;\r
}\r
\r
+ if ((PageAttributes & TT_DESCRIPTOR_PAGE_AF) == 0) {\r
+ *GcdAttributes |= EFI_MEMORY_RP;\r
+ }\r
+\r
return EFI_SUCCESS;\r
}\r
\r
// Convert SectionAttributes into PageAttributes\r
NextPageAttributes =\r
TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY (*NextSectionAttributes) |\r
+ TT_DESCRIPTOR_CONVERT_TO_PAGE_AF (*NextSectionAttributes) |\r
TT_DESCRIPTOR_CONVERT_TO_PAGE_AP (*NextSectionAttributes);\r
\r
// obtain page table base\r
for (i = 0; i < TRANSLATION_TABLE_PAGE_COUNT; i++) {\r
if ((SecondLevelTable[i] & TT_DESCRIPTOR_PAGE_TYPE_MASK) == TT_DESCRIPTOR_PAGE_TYPE_PAGE) {\r
// extract attributes (cacheability and permissions)\r
- PageAttributes = SecondLevelTable[i] & (TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK | TT_DESCRIPTOR_PAGE_AP_MASK);\r
+ PageAttributes = SecondLevelTable[i] & (TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK | TT_DESCRIPTOR_PAGE_AP_MASK | TT_DESCRIPTOR_PAGE_AF);\r
\r
if (NextPageAttributes == 0) {\r
// start on a new region\r
// Convert back PageAttributes into SectionAttributes\r
*NextSectionAttributes =\r
TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY (NextPageAttributes) |\r
+ TT_DESCRIPTOR_CONVERT_TO_SECTION_AF (NextPageAttributes) |\r
TT_DESCRIPTOR_CONVERT_TO_SECTION_AP (NextPageAttributes);\r
\r
return EFI_SUCCESS;\r
FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)(ArmGetTTBR0BaseAddress ());\r
\r
// Get the first region\r
- NextSectionAttributes = FirstLevelTable[0] & (TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK | TT_DESCRIPTOR_SECTION_AP_MASK);\r
+ NextSectionAttributes = FirstLevelTable[0] & (TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK | TT_DESCRIPTOR_SECTION_AP_MASK | TT_DESCRIPTOR_SECTION_AF);\r
\r
// iterate through each 1MB descriptor\r
NextRegionBase = NextRegionLength = 0;\r
for (i = 0; i < TRANSLATION_TABLE_SECTION_COUNT; i++) {\r
if ((FirstLevelTable[i] & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) {\r
// extract attributes (cacheability and permissions)\r
- SectionAttributes = FirstLevelTable[i] & (TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK | TT_DESCRIPTOR_SECTION_AP_MASK);\r
+ SectionAttributes = FirstLevelTable[i] & (TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK | TT_DESCRIPTOR_SECTION_AP_MASK | TT_DESCRIPTOR_SECTION_AF);\r
\r
if (NextSectionAttributes == 0) {\r
// start on a new region\r
ArmAttributes |= TT_DESCRIPTOR_SECTION_XN_MASK;\r
}\r
\r
+ if ((EfiAttributes & EFI_MEMORY_RP) == 0) {\r
+ ArmAttributes |= TT_DESCRIPTOR_SECTION_AF;\r
+ }\r
+\r
return ArmAttributes;\r
}\r
\r
*RegionAttributes = TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY (PageAttributes) |\r
TT_DESCRIPTOR_CONVERT_TO_SECTION_S (PageAttributes) |\r
TT_DESCRIPTOR_CONVERT_TO_SECTION_XN (PageAttributes) |\r
+ TT_DESCRIPTOR_CONVERT_TO_SECTION_AF (PageAttributes) |\r
TT_DESCRIPTOR_CONVERT_TO_SECTION_AP (PageAttributes);\r
}\r
\r
#define TT_DESCRIPTOR_PAGE_S_NOT_SHARED (0UL << 10)\r
#define TT_DESCRIPTOR_PAGE_S_SHARED (1UL << 10)\r
\r
-#define TT_DESCRIPTOR_SECTION_AP_MASK ((1UL << 15) | (3UL << 10))\r
-#define TT_DESCRIPTOR_SECTION_AP_NO_NO ((0UL << 15) | (0UL << 10))\r
-#define TT_DESCRIPTOR_SECTION_AP_RW_NO ((0UL << 15) | (1UL << 10))\r
-#define TT_DESCRIPTOR_SECTION_AP_RW_RO ((0UL << 15) | (2UL << 10))\r
-#define TT_DESCRIPTOR_SECTION_AP_RW_RW ((0UL << 15) | (3UL << 10))\r
-#define TT_DESCRIPTOR_SECTION_AP_RO_NO ((1UL << 15) | (1UL << 10))\r
-#define TT_DESCRIPTOR_SECTION_AP_RO_RO ((1UL << 15) | (3UL << 10))\r
-\r
-#define TT_DESCRIPTOR_PAGE_AP_MASK ((1UL << 9) | (3UL << 4))\r
-#define TT_DESCRIPTOR_PAGE_AP_NO_NO ((0UL << 9) | (0UL << 4))\r
-#define TT_DESCRIPTOR_PAGE_AP_RW_NO ((0UL << 9) | (1UL << 4))\r
-#define TT_DESCRIPTOR_PAGE_AP_RW_RO ((0UL << 9) | (2UL << 4))\r
-#define TT_DESCRIPTOR_PAGE_AP_RW_RW ((0UL << 9) | (3UL << 4))\r
-#define TT_DESCRIPTOR_PAGE_AP_RO_NO ((1UL << 9) | (1UL << 4))\r
-#define TT_DESCRIPTOR_PAGE_AP_RO_RO ((1UL << 9) | (3UL << 4))\r
+#define TT_DESCRIPTOR_SECTION_AP_MASK ((1UL << 15) | (1UL << 11))\r
+#define TT_DESCRIPTOR_SECTION_AP_NO_RW ((0UL << 15) | (0UL << 11))\r
+#define TT_DESCRIPTOR_SECTION_AP_RW_RW ((0UL << 15) | (1UL << 11))\r
+#define TT_DESCRIPTOR_SECTION_AP_NO_RO ((1UL << 15) | (0UL << 11))\r
+#define TT_DESCRIPTOR_SECTION_AP_RO_RO ((1UL << 15) | (1UL << 11))\r
+\r
+#define TT_DESCRIPTOR_SECTION_AF (1UL << 10)\r
+\r
+#define TT_DESCRIPTOR_PAGE_AP_MASK ((1UL << 9) | (1UL << 5))\r
+#define TT_DESCRIPTOR_PAGE_AP_NO_RW ((0UL << 9) | (0UL << 5))\r
+#define TT_DESCRIPTOR_PAGE_AP_RW_RW ((0UL << 9) | (1UL << 5))\r
+#define TT_DESCRIPTOR_PAGE_AP_NO_RO ((1UL << 9) | (0UL << 5))\r
+#define TT_DESCRIPTOR_PAGE_AP_RO_RO ((1UL << 9) | (1UL << 5))\r
+\r
+#define TT_DESCRIPTOR_PAGE_AF (1UL << 4)\r
\r
#define TT_DESCRIPTOR_SECTION_XN_MASK (0x1UL << 4)\r
#define TT_DESCRIPTOR_PAGE_XN_MASK (0x1UL << 0)\r
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_AP(Desc) ((((Desc) & TT_DESCRIPTOR_SECTION_AP_MASK) >> 6) & TT_DESCRIPTOR_PAGE_AP_MASK)\r
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_NG(Desc) ((((Desc) & TT_DESCRIPTOR_SECTION_NG_MASK) >> 6) & TT_DESCRIPTOR_PAGE_NG_MASK)\r
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_S(Desc) ((((Desc) & TT_DESCRIPTOR_SECTION_S_MASK) >> 6) & TT_DESCRIPTOR_PAGE_S_MASK)\r
+#define TT_DESCRIPTOR_CONVERT_TO_PAGE_AF(Desc) ((((Desc) & TT_DESCRIPTOR_SECTION_AF) >> 6) & TT_DESCRIPTOR_PAGE_AF)\r
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_XN(Desc) ((((Desc) & TT_DESCRIPTOR_SECTION_XN_MASK) >> 4) & TT_DESCRIPTOR_PAGE_XN_MASK)\r
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY(Desc) ((((Desc) & (0x3 << 12)) >> 6) | (Desc & (0x3 << 2)))\r
\r
#define TT_DESCRIPTOR_CONVERT_TO_SECTION_AP(Desc) ((((Desc) & TT_DESCRIPTOR_PAGE_AP_MASK) << 6) & TT_DESCRIPTOR_SECTION_AP_MASK)\r
#define TT_DESCRIPTOR_CONVERT_TO_SECTION_S(Desc) ((((Desc) & TT_DESCRIPTOR_PAGE_S_MASK) << 6) & TT_DESCRIPTOR_SECTION_S_MASK)\r
+#define TT_DESCRIPTOR_CONVERT_TO_SECTION_AF(Desc) ((((Desc) & TT_DESCRIPTOR_PAGE_AF) << 6) & TT_DESCRIPTOR_SECTION_AF)\r
#define TT_DESCRIPTOR_CONVERT_TO_SECTION_XN(Desc) ((((Desc) & TT_DESCRIPTOR_PAGE_XN_MASK) << 4) & TT_DESCRIPTOR_SECTION_XN_MASK)\r
#define TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY(Desc) ((((Desc) & (0x3 << 6)) << 6) | (Desc & (0x3 << 2)))\r
\r
#define TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK (TT_DESCRIPTOR_SECTION_NS_MASK | TT_DESCRIPTOR_SECTION_NG_MASK | \\r
TT_DESCRIPTOR_SECTION_S_MASK | TT_DESCRIPTOR_SECTION_AP_MASK | \\r
+ TT_DESCRIPTOR_SECTION_AF | \\r
TT_DESCRIPTOR_SECTION_XN_MASK | TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK)\r
\r
#define TT_DESCRIPTOR_PAGE_ATTRIBUTE_MASK (TT_DESCRIPTOR_PAGE_NG_MASK | TT_DESCRIPTOR_PAGE_S_MASK | \\r
TT_DESCRIPTOR_PAGE_AP_MASK | TT_DESCRIPTOR_PAGE_XN_MASK | \\r
+ TT_DESCRIPTOR_PAGE_AF | \\r
TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK)\r
\r
#define TT_DESCRIPTOR_SECTION_DOMAIN_MASK (0x0FUL << 5)\r
TT_DESCRIPTOR_SECTION_S_SHARED | \\r
TT_DESCRIPTOR_SECTION_DOMAIN(0) | \\r
TT_DESCRIPTOR_SECTION_AP_RW_RW | \\r
+ TT_DESCRIPTOR_SECTION_AF | \\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_S_SHARED | \\r
TT_DESCRIPTOR_SECTION_DOMAIN(0) | \\r
TT_DESCRIPTOR_SECTION_AP_RW_RW | \\r
+ TT_DESCRIPTOR_SECTION_AF | \\r
TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC)\r
#define TT_DESCRIPTOR_SECTION_DEVICE(NonSecure) (TT_DESCRIPTOR_SECTION_TYPE_SECTION | \\r
((NonSecure) ? TT_DESCRIPTOR_SECTION_NS : 0) | \\r
TT_DESCRIPTOR_SECTION_DOMAIN(0) | \\r
TT_DESCRIPTOR_SECTION_AP_RW_RW | \\r
TT_DESCRIPTOR_SECTION_XN_MASK | \\r
+ TT_DESCRIPTOR_SECTION_AF | \\r
TT_DESCRIPTOR_SECTION_CACHE_POLICY_SHAREABLE_DEVICE)\r
#define TT_DESCRIPTOR_SECTION_UNCACHED(NonSecure) (TT_DESCRIPTOR_SECTION_TYPE_SECTION | \\r
((NonSecure) ? TT_DESCRIPTOR_SECTION_NS : 0) | \\r
TT_DESCRIPTOR_SECTION_S_NOT_SHARED | \\r
TT_DESCRIPTOR_SECTION_DOMAIN(0) | \\r
TT_DESCRIPTOR_SECTION_AP_RW_RW | \\r
+ TT_DESCRIPTOR_SECTION_AF | \\r
TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE)\r
\r
#define TT_DESCRIPTOR_PAGE_WRITE_BACK (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \\r
TT_DESCRIPTOR_PAGE_NG_GLOBAL | \\r
TT_DESCRIPTOR_PAGE_S_SHARED | \\r
TT_DESCRIPTOR_PAGE_AP_RW_RW | \\r
+ TT_DESCRIPTOR_PAGE_AF | \\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_SHARED | \\r
TT_DESCRIPTOR_PAGE_AP_RW_RW | \\r
+ TT_DESCRIPTOR_PAGE_AF | \\r
TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC)\r
#define TT_DESCRIPTOR_PAGE_DEVICE (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \\r
TT_DESCRIPTOR_PAGE_NG_GLOBAL | \\r
TT_DESCRIPTOR_PAGE_S_NOT_SHARED | \\r
TT_DESCRIPTOR_PAGE_AP_RW_RW | \\r
+ TT_DESCRIPTOR_PAGE_AF | \\r
TT_DESCRIPTOR_PAGE_XN_MASK | \\r
TT_DESCRIPTOR_PAGE_CACHE_POLICY_SHAREABLE_DEVICE)\r
#define TT_DESCRIPTOR_PAGE_UNCACHED (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \\r
TT_DESCRIPTOR_PAGE_NG_GLOBAL | \\r
TT_DESCRIPTOR_PAGE_S_NOT_SHARED | \\r
TT_DESCRIPTOR_PAGE_AP_RW_RW | \\r
+ TT_DESCRIPTOR_PAGE_AF | \\r
TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE)\r
\r
// First Level Descriptors\r
.set CTRL_C_BIT, (1 << 2)\r
.set CTRL_B_BIT, (1 << 7)\r
.set CTRL_I_BIT, (1 << 12)\r
+.set CTRL_AFE_BIT,(1 << 29)\r
\r
\r
ASM_FUNC(ArmInvalidateDataCacheEntryByMVA)\r
ASM_FUNC(ArmEnableMmu)\r
mrc p15,0,R0,c1,c0,0\r
orr R0,R0,#1\r
+ orr R0,R0,#CTRL_AFE_BIT\r
mcr p15,0,R0,c1,c0,0\r
dsb\r
isb\r
PageAttributes = 0;\r
PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY (SectionAttributes);\r
PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_AP (SectionAttributes);\r
+ PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_AF (SectionAttributes);\r
PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_XN (SectionAttributes);\r
PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_NG (SectionAttributes);\r
PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_S (SectionAttributes);\r
\r
// EntryMask: bitmask of values to change (1 = change this value, 0 = leave alone)\r
// EntryValue: values at bit positions specified by EntryMask\r
- EntryMask = TT_DESCRIPTOR_PAGE_TYPE_MASK | TT_DESCRIPTOR_PAGE_AP_MASK | TT_DESCRIPTOR_PAGE_XN_MASK;\r
+ EntryMask = TT_DESCRIPTOR_PAGE_TYPE_MASK | TT_DESCRIPTOR_PAGE_AP_MASK | TT_DESCRIPTOR_PAGE_XN_MASK | TT_DESCRIPTOR_PAGE_AF;\r
EntryValue = TT_DESCRIPTOR_PAGE_TYPE_PAGE;\r
\r
// Although the PI spec is unclear on this, the GCD guarantees that only\r
return EFI_UNSUPPORTED;\r
}\r
\r
+ if ((Attributes & EFI_MEMORY_RP) == 0) {\r
+ EntryValue |= TT_DESCRIPTOR_PAGE_AF;\r
+ }\r
+\r
if ((Attributes & EFI_MEMORY_RO) != 0) {\r
EntryValue |= TT_DESCRIPTOR_PAGE_AP_RO_RO;\r
} else {\r
\r
// Make sure we handle a section range that is unmapped\r
EntryMask = TT_DESCRIPTOR_SECTION_TYPE_MASK | TT_DESCRIPTOR_SECTION_XN_MASK |\r
- TT_DESCRIPTOR_SECTION_AP_MASK;\r
+ TT_DESCRIPTOR_SECTION_AP_MASK | TT_DESCRIPTOR_SECTION_AF;\r
EntryValue = TT_DESCRIPTOR_SECTION_TYPE_SECTION;\r
\r
// Although the PI spec is unclear on this, the GCD guarantees that only\r
EntryValue |= TT_DESCRIPTOR_SECTION_XN_MASK;\r
}\r
\r
+ if ((Attributes & EFI_MEMORY_RP) == 0) {\r
+ EntryValue |= TT_DESCRIPTOR_SECTION_AF;\r
+ }\r
+\r
// obtain page table base\r
FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)ArmGetTTBR0BaseAddress ();\r
\r