+static void
+__free_hierarchy(ptr_t mnt, ptr_t va, int level)
+{
+ pte_t pte, *ptep, *ptep_next;
+
+ if (pt_last_level(level)) {
+ return;
+ }
+
+ __free_hierarchy(mnt, va, level + 1);
+
+ ptep = mklntep_va(level, mnt, va);
+ pte = pte_at(ptep);
+ if (pte_isnull(pte)) {
+ return;
+ }
+
+ ptep_next = ptep_step_into(ptep);
+ for (unsigned i = 0; i < LEVEL_SIZE; i++, ptep_next++)
+ {
+ if (!pte_isnull(pte_at(ptep_next))) {
+ return;
+ }
+ }
+
+ free_pagetable_trace(ptep, pte, level);
+}
+