- if (l1pte) {
- x86_page_table* l2pt = (x86_page_table*)(mnt | (l1_index << 12));
- x86_pte_t l2pte = l2pt->entry[l2_index];
+pte_t
+vmm_tryptep(pte_t* ptep, size_t lvl_size)
+{
+ ptr_t va = ptep_va(ptep, lvl_size);
+ pte_t* _ptep = mkl0tep(ptep);
+ pte_t pte;
+
+ if (pte_isnull(pte = *_ptep) || _ptep == ptep)
+ return pte;
+
+#if LnT_ENABLED(1)
+ _ptep = getl1tep(_ptep, va);
+ if (_ptep == ptep || pte_isnull(pte = *_ptep))
+ return pte;
+#endif
+#if LnT_ENABLED(2)
+ _ptep = getl2tep(_ptep, va);
+ if (_ptep == ptep || pte_isnull(pte = *_ptep))
+ return pte;
+#endif
+#if LnT_ENABLED(3)
+ _ptep = getl3tep(_ptep, va);
+ if (_ptep == ptep || pte_isnull(pte = *_ptep))
+ return pte;
+#endif
+ _ptep = getlftep(_ptep, va);
+ return *_ptep;
+}