Exemple #1
0
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;
}
Exemple #2
0
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);
}
Exemple #3
0
static int ept_clear_epte(epte_t *epte)
{
	if (*epte == __EPTE_NONE)
		return 0;

	free_ept_page(*epte);
	*epte = __EPTE_NONE;

	return 1;
}
Exemple #4
0
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;
}