X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_paging.c;h=1030fe229d856e3092081945e8cb726c03ad5235;hb=39b4fae9c539fbd848edd786500e60aae17b84a0;hp=dc7aa97046242c7dbd3e379b7ce5d80c2466e593;hpb=266af4b5b19da7bee8e7445288c7c1cb3ee194c7;p=palacios.git diff --git a/palacios/src/palacios/vmm_paging.c b/palacios/src/palacios/vmm_paging.c index dc7aa97..1030fe2 100644 --- a/palacios/src/palacios/vmm_paging.c +++ b/palacios/src/palacios/vmm_paging.c @@ -46,7 +46,7 @@ static pt_entry_type_t pte64_lookup(pte64_t * pt, addr_t addr, addr_t * entry); -#ifndef DEBUG_SHADOW_PAGING +#ifndef CONFIG_DEBUG_SHADOW_PAGING #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -59,29 +59,90 @@ void delete_page_tables_32(pde32_t * pde) { 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_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[i].pt_base_addr)); } } - V3_FreePage(V3_PAddr(pde)); } -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_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[j].pt_base_addr)); + } + + V3_FreePage(V3_PAddr(pde)); + } + + V3_FreePage(V3_PAddr(pdpe)); } 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_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[k].pt_base_addr)); + } + + V3_FreePage(V3_PAddr(pde)); + } + + V3_FreePage(V3_PAddr(pdpe)); + } + + V3_FreePage(V3_PAddr(pml4)); } @@ -891,7 +952,7 @@ int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t va 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; @@ -909,7 +970,7 @@ int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t va 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) { + if (v3_gpa_to_hva(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; @@ -926,7 +987,7 @@ int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t va 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; @@ -941,7 +1002,7 @@ int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t va } else { addr_t page_va; - if (guest_pa_to_host_va(info, page_pa, &page_va) == -1) { + if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) { PrintError("Could not get virtual address of Guest Page 4KB (PA=%p)\n", (void *)page_pa); return -1; @@ -970,7 +1031,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t 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; @@ -989,7 +1050,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t 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; @@ -1008,7 +1069,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t 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) { + if (v3_gpa_to_hva(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); @@ -1024,7 +1085,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t 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; @@ -1039,7 +1100,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t } else { addr_t page_va; - if (guest_pa_to_host_va(info, page_pa, &page_va) == -1) { + if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) { PrintError("Could not get virtual address of Guest Page 4KB (PA=%p)\n", (void *)page_pa); return -1; @@ -1071,7 +1132,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va 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; @@ -1089,7 +1150,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va 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; @@ -1107,7 +1168,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va 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) { + if (v3_gpa_to_hva(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); @@ -1124,7 +1185,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va 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; @@ -1142,7 +1203,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va 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) { + if (v3_gpa_to_hva(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); @@ -1158,7 +1219,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va 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; @@ -1173,7 +1234,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va } else { addr_t page_va; - if (guest_pa_to_host_va(info, page_pa, &page_va) == -1) { + if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) { PrintError("Could not get virtual address of Guest Page 4KB (PA=%p)\n", (void *)page_pa); return -1; @@ -1216,7 +1277,7 @@ int v3_walk_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1233,7 +1294,7 @@ int v3_walk_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, 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 @@ -1249,7 +1310,7 @@ int v3_walk_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1264,7 +1325,7 @@ int v3_walk_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, 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 @@ -1301,7 +1362,7 @@ int v3_walk_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1317,7 +1378,7 @@ int v3_walk_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1334,7 +1395,7 @@ int v3_walk_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, 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 @@ -1350,7 +1411,7 @@ int v3_walk_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1365,7 +1426,7 @@ int v3_walk_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, 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 @@ -1408,7 +1469,7 @@ int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1425,7 +1486,7 @@ int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1442,7 +1503,7 @@ int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, 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 @@ -1458,7 +1519,7 @@ int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1475,7 +1536,7 @@ int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, 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 @@ -1491,7 +1552,7 @@ int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1506,7 +1567,7 @@ int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, 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