}\r
}\r
\r
-// Describe the T0SZ values for each translation table level\r
-typedef struct {\r
- UINTN MinT0SZ;\r
- UINTN MaxT0SZ;\r
- UINTN LargestT0SZ; // Generally (MaxT0SZ == LargestT0SZ) but at the Level3 Table\r
- // the MaxT0SZ is not at the boundary of the table\r
-} T0SZ_DESCRIPTION_PER_LEVEL;\r
-\r
-// Map table for the corresponding Level of Table\r
-STATIC CONST T0SZ_DESCRIPTION_PER_LEVEL T0SZPerTableLevel[] = {\r
- { 16, 24, 24 }, // Table Level 0\r
- { 25, 33, 33 }, // Table Level 1\r
- { 34, 39, 42 } // Table Level 2\r
-};\r
+#define MIN_T0SZ 16\r
+#define BITS_PER_LEVEL 9\r
\r
VOID\r
GetRootTranslationTableInfo (\r
OUT UINTN *TableEntryCount\r
)\r
{\r
- UINTN Index;\r
-\r
- // Identify the level of the root table from the given T0SZ\r
- for (Index = 0; Index < sizeof (T0SZPerTableLevel) / sizeof (T0SZ_DESCRIPTION_PER_LEVEL); Index++) {\r
- if (T0SZ <= T0SZPerTableLevel[Index].MaxT0SZ) {\r
- break;\r
- }\r
- }\r
-\r
- // If we have not found the corresponding maximum T0SZ then we use the last one\r
- if (Index == sizeof (T0SZPerTableLevel) / sizeof (T0SZ_DESCRIPTION_PER_LEVEL)) {\r
- Index--;\r
- }\r
-\r
// Get the level of the root table\r
if (TableLevel) {\r
- *TableLevel = Index;\r
+ *TableLevel = (T0SZ - MIN_T0SZ) / BITS_PER_LEVEL;\r
}\r
\r
- // The Size of the Table is 2^(T0SZ-LargestT0SZ)\r
if (TableEntryCount) {\r
- *TableEntryCount = 1 << (T0SZPerTableLevel[Index].LargestT0SZ - T0SZ + 1);\r
+ *TableEntryCount = 1UL << (BITS_PER_LEVEL - (T0SZ - MIN_T0SZ) % BITS_PER_LEVEL);\r
}\r
}\r
\r