]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c
ArmPkg/CpuDxe: Fixed AArch64 MMU/GCD synchronization
[mirror_edk2.git] / ArmPkg / Drivers / CpuDxe / AArch64 / Mmu.c
index da6e6225bed28751dc1c043261912232e422df4f..40a4c1b0aab170769f40daee29397ca4184e7de9 100644 (file)
@@ -89,7 +89,7 @@ GetNextEntryAttribute (
           // Update GCD with the last region\r
           SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,\r
               *StartGcdRegion,\r
-              (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel)) - 1) - *StartGcdRegion,\r
+              (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,\r
               PageAttributeToGcdAttribute (EntryAttribute));\r
         }\r
 \r
@@ -113,8 +113,8 @@ GetNextEntryAttribute (
         // Update GCD with the last region\r
         SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,\r
             *StartGcdRegion,\r
-            (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel)) - 1) - *StartGcdRegion,\r
-            PageAttributeToGcdAttribute (EntryAttribute));\r
+            (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,\r
+            PageAttributeToGcdAttribute (*PrevEntryAttribute));\r
 \r
         // Start of the new region\r
         *StartGcdRegion = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel));\r
@@ -182,11 +182,13 @@ SyncCacheConfig (
                                                BaseAddressGcdRegion,\r
                                                &PageAttribute, &BaseAddressGcdRegion);\r
 \r
-  // Update GCD with the last region\r
-  SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,\r
-      BaseAddressGcdRegion,\r
-      EndAddressGcdRegion - BaseAddressGcdRegion,\r
-      PageAttributeToGcdAttribute (PageAttribute));\r
+  // Update GCD with the last region if valid\r
+  if (PageAttribute != TT_ATTR_INDX_INVALID) {\r
+    SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,\r
+        BaseAddressGcdRegion,\r
+        EndAddressGcdRegion - BaseAddressGcdRegion,\r
+        PageAttributeToGcdAttribute (PageAttribute));\r
+  }\r
 \r
   FreePool (MemorySpaceMap);\r
 \r