static int ept_clear_l2_epte(epte_t *epte) { int i, j; epte_t *pmd = (epte_t *) epte_page_vaddr(*epte); if (*epte == __EPTE_NONE) return 0; for (i = 0; i < PTRS_PER_PMD; i++) { epte_t *pte = (epte_t *) epte_page_vaddr(pmd[i]); if (!epte_present(pmd[i])) continue; if (epte_flags(pmd[i]) & __EPTE_SZ) { free_ept_page(pmd[i]); continue; } for (j = 0; j < PTRS_PER_PTE; j++) { if (!epte_present(pte[j])) continue; free_ept_page(pte[j]); } free_page((uintptr_t) pte); } free_page((uintptr_t) pmd); *epte = __EPTE_NONE; return 1; }
static void vmx_free_ept(unsigned long ept_root) { epte_t *pgd = (epte_t *) __va(ept_root); int i, j, k, l; for (i = 0; i < PTRS_PER_PGD; i++) { epte_t *pud = (epte_t *) epte_page_vaddr(pgd[i]); if (!epte_present(pgd[i])) continue; for (j = 0; j < PTRS_PER_PUD; j++) { epte_t *pmd = (epte_t *) epte_page_vaddr(pud[j]); if (!epte_present(pud[j])) continue; if (epte_flags(pud[j]) & __EPTE_SZ) { free_ept_page(pud[j]); continue; } for (k = 0; k < PTRS_PER_PMD; k++) { epte_t *pte = (epte_t *) epte_page_vaddr(pmd[k]); if (!epte_present(pmd[k])) continue; if (epte_flags(pmd[k]) & __EPTE_SZ) { free_ept_page(pmd[k]); continue; } for (l = 0; l < PTRS_PER_PTE; l++) { if (!epte_present(pte[l])) continue; free_ept_page(pte[l]); } free_page((unsigned long) pte); } free_page((unsigned long) pmd); } free_page((unsigned long) pud); } free_page((unsigned long) pgd); }
static int ept_clear_epte(epte_t *epte) { if (*epte == __EPTE_NONE) return 0; free_ept_page(*epte); *epte = __EPTE_NONE; return 1; }
static int ept_clear_l1_epte(epte_t *epte) { int i; epte_t *pte = (epte_t *) epte_page_vaddr(*epte); if (*epte == __EPTE_NONE) return 0; for (i = 0; i < PTRS_PER_PTE; i++) { if (!epte_present(pte[i])) continue; free_ept_page(pte[i]); } free_page((uintptr_t) pte); *epte = __EPTE_NONE; return 1; }