]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c
ArmPkg/ArmMmuLib AARCH64: limit recursion when freeing page tables
[mirror_edk2.git] / ArmPkg / Library / ArmMmuLib / AArch64 / ArmMmuLibCore.c
index a43d468b73ca72adb9af58412a52c32cbbd9e992..d78918cf7ba80f0c0837aaddfee50b78fa2b36e6 100644 (file)
@@ -142,15 +142,21 @@ ReplaceTableEntry (
 STATIC\r
 VOID\r
 FreePageTablesRecursive (\r
-  IN  UINT64  *TranslationTable\r
+  IN  UINT64  *TranslationTable,\r
+  IN  UINTN   Level\r
   )\r
 {\r
   UINTN   Index;\r
 \r
-  for (Index = 0; Index < TT_ENTRY_COUNT; Index++) {\r
-    if ((TranslationTable[Index] & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) {\r
-      FreePageTablesRecursive ((VOID *)(UINTN)(TranslationTable[Index] &\r
-                                               TT_ADDRESS_MASK_BLOCK_ENTRY));\r
+  ASSERT (Level <= 3);\r
+\r
+  if (Level < 3) {\r
+    for (Index = 0; Index < TT_ENTRY_COUNT; Index++) {\r
+      if ((TranslationTable[Index] & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) {\r
+        FreePageTablesRecursive ((VOID *)(UINTN)(TranslationTable[Index] &\r
+                                                 TT_ADDRESS_MASK_BLOCK_ENTRY),\r
+                                 Level + 1);\r
+      }\r
     }\r
   }\r
   FreePages (TranslationTable, 1);\r
@@ -254,7 +260,7 @@ UpdateRegionMappingRecursive (
           // possible for existing table entries, since we cannot revert the\r
           // modifications we made to the subhierarchy it represents.)\r
           //\r
-          FreePageTablesRecursive (TranslationTable);\r
+          FreePageTablesRecursive (TranslationTable, Level + 1);\r
         }\r
         return Status;\r
       }\r