-#ifndef DEBUG_SHADOW_PAGING
+#ifndef V3_CONFIG_DEBUG_SHADOW_PAGING
#undef PrintDebug
#define PrintDebug(fmt, args...)
#endif
if (pde == NULL) {
return;
}
- PrintDebug("Deleting Page Tables -- PDE (%p)\n", pde);
- for (i = 0; (i < MAX_PDE32_ENTRIES); i++) {
- if (pde[i].present) {
- // We double cast, first to an addr_t to handle 64 bit issues, then to the pointer
-
- pte32_t * pte = (pte32_t *)((addr_t)(uint_t)(pde[i].pt_base_addr << PAGE_POWER));
+ PrintDebug("Deleting Page Tables (32) -- PDE (%p)\n", pde);
+ for (i = 0; i < MAX_PDE32_ENTRIES; i++) {
+ if ((pde[i].present == 1) && (pde[i].large_page == 0)) {
+ // We double cast, first to an addr_t to handle 64 bit issues, then to the pointer
- V3_FreePage(pte);
+ PrintDebug("Deleting PT Page %d (%p)\n", i, (void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[i].pt_base_addr));
+ V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[i].pt_base_addr), 1);
}
}
-
- V3_FreePage(V3_PAddr(pde));
+ V3_FreePages(V3_PAddr(pde), 1);
}
-void delete_page_tables_32PAE(pdpe32pae_t * pdpe) {
- PrintError("Unimplemented function\n");
+void delete_page_tables_32pae(pdpe32pae_t * pdpe) {
+ int i, j;
+
+ if (pdpe == NULL) {
+ return;
+ }
+
+ PrintDebug("Deleting Page Tables (32 PAE) -- PDPE (%p)\n", pdpe);
+
+ for (i = 0; i < MAX_PDPE32PAE_ENTRIES; i++) {
+ if (pdpe[i].present == 0) {
+ continue;
+ }
+
+ pde32pae_t * pde = (pde32pae_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pdpe[i].pd_base_addr));
+
+ for (j = 0; j < MAX_PDE32PAE_ENTRIES; j++) {
+
+ if ((pde[j].present == 0) || (pde[j].large_page == 1)) {
+ continue;
+ }
+
+ V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[j].pt_base_addr), 1);
+ }
+
+ V3_FreePages(V3_PAddr(pde), 1);
+ }
+
+ V3_FreePages(V3_PAddr(pdpe), 1);
}
void delete_page_tables_64(pml4e64_t * pml4) {
- PrintError("Unimplemented function\n");
+ int i, j, k;
+
+ if (pml4 == NULL) {
+ return;
+ }
+
+ PrintDebug("Deleting Page Tables (64) -- PML4 (%p)\n", pml4);
+
+ for (i = 0; i < MAX_PML4E64_ENTRIES; i++) {
+ if (pml4[i].present == 0) {
+ continue;
+ }
+
+ pdpe64_t * pdpe = (pdpe64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pml4[i].pdp_base_addr));
+
+ for (j = 0; j < MAX_PDPE64_ENTRIES; j++) {
+ if ((pdpe[j].present == 0) || (pdpe[j].large_page == 1)) {
+ continue;
+ }
+
+ pde64_t * pde = (pde64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pdpe[j].pd_base_addr));
+
+ for (k = 0; k < MAX_PDE64_ENTRIES; k++) {
+ if ((pde[k].present == 0) || (pde[k].large_page == 1)) {
+ continue;
+ }
+
+ V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[k].pt_base_addr), 1);
+ }
+
+ V3_FreePages(V3_PAddr(pde), 1);
+ }
+
+ V3_FreePages(V3_PAddr(pdpe), 1);
+ }
+
+ V3_FreePages(V3_PAddr(pml4), 1);
}
int ret;
- if (guest_pa_to_host_va(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
+ if (v3_gpa_to_hva(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
PrintError("Could not get virtual address of Guest PDE32 (PA=%p)\n",
(void *)guest_pde_pa);
return -1;
addr_t large_page_pa = (addr_t)guest_pte_pa;
addr_t large_page_va = 0;
- if (guest_pa_to_host_va(info, large_page_pa, &large_page_va) == -1) {
- PrintError("Could not get virtual address of Guest Page 4MB (PA=%p)\n",
- (void *)large_page_va);
- return -1;
+ if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
+ large_page_va = 0 ;
}
pte32_t * guest_pte = NULL;
addr_t page_pa;
- if (guest_pa_to_host_va(info, guest_pte_pa, (addr_t*)&guest_pte) == -1) {
+ if (v3_gpa_to_hva(info, guest_pte_pa, (addr_t*)&guest_pte) == -1) {
PrintError("Could not get virtual address of Guest PTE32 (PA=%p)\n",
(void *)guest_pte_pa);
return -1;
} else {
addr_t page_va;
- if (guest_pa_to_host_va(info, page_pa, &page_va) == -1) {
- PrintError("Could not get virtual address of Guest Page 4KB (PA=%p)\n",
- (void *)page_pa);
- return -1;
+ if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) {
+ page_va = 0;
}
if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
addr_t guest_pde_pa = 0;
int ret = 0;
- if (guest_pa_to_host_va(info, guest_pdpe_pa, (addr_t*)&guest_pdpe) == -1) {
+ if (v3_gpa_to_hva(info, guest_pdpe_pa, (addr_t*)&guest_pdpe) == -1) {
PrintError("Could not get virtual address of Guest PDPE32PAE (PA=%p)\n",
(void *)guest_pdpe_pa);
return -1;
pde32pae_t * guest_pde = NULL;
addr_t guest_pte_pa = 0;
- if (guest_pa_to_host_va(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
+ if (v3_gpa_to_hva(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
PrintError("Could not get virtual Address of Guest PDE32PAE (PA=%p)\n",
(void *)guest_pde_pa);
return -1;
addr_t large_page_pa = (addr_t)guest_pte_pa;
addr_t large_page_va = 0;
- if (guest_pa_to_host_va(info, large_page_pa, &large_page_va) == -1) {
- PrintDebug("Could not get virtual address of Guest Page 2MB (PA=%p)\n",
- (void *)large_page_va);
-
+ if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
+ large_page_va = 0;
}
if ((ret == callback(info, PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
pte32pae_t * guest_pte = NULL;
addr_t page_pa;
- if (guest_pa_to_host_va(info, guest_pte_pa, (addr_t *)&guest_pte) == -1) {
+ if (v3_gpa_to_hva(info, guest_pte_pa, (addr_t *)&guest_pte) == -1) {
PrintError("Could not get virtual Address of Guest PTE32PAE (PA=%p)\n",
(void *)guest_pte_pa);
return -1;
} else {
addr_t page_va;
- if (guest_pa_to_host_va(info, page_pa, &page_va) == -1) {
- PrintError("Could not get virtual address of Guest Page 4KB (PA=%p)\n",
- (void *)page_pa);
- return -1;
+ if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) {
+ page_va = 0;
}
if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
addr_t guest_pdpe_pa = 0;
int ret = 0;
- if (guest_pa_to_host_va(info, guest_pml4_pa, (addr_t*)&guest_pmle) == -1) {
+ if (v3_gpa_to_hva(info, guest_pml4_pa, (addr_t*)&guest_pmle) == -1) {
PrintError("Could not get virtual address of Guest PML4E64 (PA=%p)\n",
(void *)guest_pml4_pa);
return -1;
pdpe64_t * guest_pdp = NULL;
addr_t guest_pde_pa = 0;
- if (guest_pa_to_host_va(info, guest_pdpe_pa, (addr_t *)&guest_pdp) == -1) {
+ if (v3_gpa_to_hva(info, guest_pdpe_pa, (addr_t *)&guest_pdp) == -1) {
PrintError("Could not get virtual address of Guest PDPE64 (PA=%p)\n",
(void *)guest_pdpe_pa);
return -1;
addr_t large_page_pa = (addr_t)guest_pde_pa;
addr_t large_page_va = 0;
- if (guest_pa_to_host_va(info, large_page_pa, &large_page_va) == -1) {
- PrintDebug("Could not get virtual address of Guest Page 1GB (PA=%p)\n",
- (void *)large_page_va);
-
+ if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
+ large_page_va = 0;
}
if ((ret == callback(info, PAGE_1GB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
pde64_t * guest_pde = NULL;
addr_t guest_pte_pa = 0;
- if (guest_pa_to_host_va(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
+ if (v3_gpa_to_hva(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
PrintError("Could not get virtual address of guest PDE64 (PA=%p)\n",
(void *)guest_pde_pa);
return -1;
addr_t large_page_pa = (addr_t)guest_pte_pa;
addr_t large_page_va = 0;
- if (guest_pa_to_host_va(info, large_page_pa, &large_page_va) == -1) {
- PrintDebug("Could not get virtual address of Guest Page 2MB (PA=%p)\n",
- (void *)large_page_va);
-
+ if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
+ large_page_va = 0;
}
if ((ret == callback(info, PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
pte64_t * guest_pte = NULL;
addr_t page_pa;
- if (guest_pa_to_host_va(info, guest_pte_pa, (addr_t *)&guest_pte) == -1) {
+ if (v3_gpa_to_hva(info, guest_pte_pa, (addr_t *)&guest_pte) == -1) {
PrintError("Could not get virtual address of guest PTE64 (PA=%p)\n",
(void *)guest_pte_pa);
return -1;
} else {
addr_t page_va;
- if (guest_pa_to_host_va(info, page_pa, &page_va) == -1) {
- PrintError("Could not get virtual address of Guest Page 4KB (PA=%p)\n",
- (void *)page_pa);
- return -1;
+ if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) {
+ page_va = 0;
}
if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
return -1;
}
- if (guest_pa_to_host_va(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
+ if (v3_gpa_to_hva(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
PrintError("Could not get virtual address of Guest PDE32 (PA=%p)\n",
(void *)guest_pde_pa);
return -1;
addr_t large_page_pa = BASE_TO_PAGE_ADDR_4MB(large_pde->page_base_addr);
addr_t large_page_va = 0;
- if (guest_pa_to_host_va(info, large_page_pa, &large_page_va) == -1) {
+ if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
PrintDebug("Could not get virtual address of Guest 4MB Page (PA=%p)\n",
(void *)large_page_pa);
// We'll let it through for data pages because they may be unmapped or hooked
addr_t pte_pa = BASE_TO_PAGE_ADDR(guest_pde[i].pt_base_addr);
pte32_t * tmp_pte = NULL;
- if (guest_pa_to_host_va(info, pte_pa, (addr_t *)&tmp_pte) == -1) {
+ if (v3_gpa_to_hva(info, pte_pa, (addr_t *)&tmp_pte) == -1) {
PrintError("Could not get virtual address of Guest PTE32 (PA=%p)\n",
(void *)pte_pa);
return -1;
addr_t page_pa = BASE_TO_PAGE_ADDR(tmp_pte[j].page_base_addr);
addr_t page_va = 0;
- if (guest_pa_to_host_va(info, page_pa, &page_va) == -1) {
+ if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) {
PrintDebug("Could not get virtual address of Guest 4KB Page (PA=%p)\n",
(void *)page_pa);
// We'll let it through for data pages because they may be unmapped or hooked
return -1;
}
- if (guest_pa_to_host_va(info, guest_pdpe_pa, (addr_t *)&guest_pdpe) == -1) {
+ if (v3_gpa_to_hva(info, guest_pdpe_pa, (addr_t *)&guest_pdpe) == -1) {
PrintError("Could not get virtual address of Guest PDPE32PAE (PA=%p)\n",
(void *)guest_pdpe_pa);
return -1;
addr_t pde_pa = BASE_TO_PAGE_ADDR(guest_pdpe[i].pd_base_addr);
pde32pae_t * tmp_pde = NULL;
- if (guest_pa_to_host_va(info, pde_pa, (addr_t *)&tmp_pde) == -1) {
+ if (v3_gpa_to_hva(info, pde_pa, (addr_t *)&tmp_pde) == -1) {
PrintError("Could not get virtual address of Guest PDE32PAE (PA=%p)\n",
(void *)pde_pa);
return -1;
addr_t large_page_pa = BASE_TO_PAGE_ADDR_2MB(large_pde->page_base_addr);
addr_t large_page_va = 0;
- if (guest_pa_to_host_va(info, large_page_pa, &large_page_va) == -1) {
+ if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
PrintDebug("Could not get virtual address of Guest 2MB Page (PA=%p)\n",
(void *)large_page_pa);
// We'll let it through for data pages because they may be unmapped or hooked
addr_t pte_pa = BASE_TO_PAGE_ADDR(tmp_pde[j].pt_base_addr);
pte32pae_t * tmp_pte = NULL;
- if (guest_pa_to_host_va(info, pte_pa, (addr_t *)&tmp_pte) == -1) {
+ if (v3_gpa_to_hva(info, pte_pa, (addr_t *)&tmp_pte) == -1) {
PrintError("Could not get virtual address of Guest PTE32PAE (PA=%p)\n",
(void *)pte_pa);
return -1;
addr_t page_pa = BASE_TO_PAGE_ADDR(tmp_pte[k].page_base_addr);
addr_t page_va = 0;
- if (guest_pa_to_host_va(info, page_pa, &page_va) == -1) {
+ if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) {
PrintDebug("Could not get virtual address of Guest 4KB Page (PA=%p)\n",
(void *)page_pa);
// We'll let it through for data pages because they may be unmapped or hooked
return -1;
}
- if (guest_pa_to_host_va(info, guest_pml_pa, (addr_t *)&guest_pml) == -1) {
+ if (v3_gpa_to_hva(info, guest_pml_pa, (addr_t *)&guest_pml) == -1) {
PrintError("Could not get virtual address of Guest PML464 (PA=%p)\n",
(void *)guest_pml);
return -1;
pdpe64_t * tmp_pdpe = NULL;
- if (guest_pa_to_host_va(info, pdpe_pa, (addr_t *)&tmp_pdpe) == -1) {
+ if (v3_gpa_to_hva(info, pdpe_pa, (addr_t *)&tmp_pdpe) == -1) {
PrintError("Could not get virtual address of Guest PDPE64 (PA=%p)\n",
(void *)pdpe_pa);
return -1;
addr_t large_page_pa = BASE_TO_PAGE_ADDR_1GB(large_pdpe->page_base_addr);
addr_t large_page_va = 0;
- if (guest_pa_to_host_va(info, large_page_pa, &large_page_va) == -1) {
+ if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
PrintDebug("Could not get virtual address of Guest 1GB page (PA=%p)\n",
(void *)large_page_pa);
// We'll let it through for data pages because they may be unmapped or hooked
addr_t pde_pa = BASE_TO_PAGE_ADDR(tmp_pdpe[j].pd_base_addr);
pde64_t * tmp_pde = NULL;
- if (guest_pa_to_host_va(info, pde_pa, (addr_t *)&tmp_pde) == -1) {
+ if (v3_gpa_to_hva(info, pde_pa, (addr_t *)&tmp_pde) == -1) {
PrintError("Could not get virtual address of Guest PDE64 (PA=%p)\n",
(void *)pde_pa);
return -1;
addr_t large_page_pa = BASE_TO_PAGE_ADDR_2MB(large_pde->page_base_addr);
addr_t large_page_va = 0;
- if (guest_pa_to_host_va(info, large_page_pa, &large_page_va) == -1) {
+ if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
PrintDebug("Could not get virtual address of Guest 2MB page (PA=%p)\n",
(void *)large_page_pa);
// We'll let it through for data pages because they may be unmapped or hooked
addr_t pte_pa = BASE_TO_PAGE_ADDR(tmp_pde[k].pt_base_addr);
pte64_t * tmp_pte = NULL;
- if (guest_pa_to_host_va(info, pte_pa, (addr_t *)&tmp_pte) == -1) {
+ if (v3_gpa_to_hva(info, pte_pa, (addr_t *)&tmp_pte) == -1) {
PrintError("Could not get virtual address of Guest PTE64 (PA=%p)\n",
(void *)pte_pa);
return -1;
addr_t page_pa = BASE_TO_PAGE_ADDR(tmp_pte[m].page_base_addr);
addr_t page_va = 0;
- if (guest_pa_to_host_va(info, page_pa, &page_va) == -1) {
+ if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) {
PrintDebug("Could not get virtual address of Guest 4KB Page (PA=%p)\n",
(void *)page_pa);
// We'll let it through for data pages because they may be unmapped or hooked