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
// 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