X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_paging.c;h=417c2f93515dea880cd57b1b2c2209dd56e7eca7;hb=1b9bba809bf9c1d6ada56c7e4f8910e7afb82557;hp=97a094b6ee650b865b1f8119566eb1b203f13602;hpb=6aa2eca43f93505afc3325016de689c056f8f08d;p=palacios.git diff --git a/palacios/src/palacios/vmm_paging.c b/palacios/src/palacios/vmm_paging.c index 97a094b..417c2f9 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 V3_CONFIG_DEBUG_SHADOW_PAGING #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -67,11 +67,11 @@ void delete_page_tables_32(pde32_t * pde) { // We double cast, first to an addr_t to handle 64 bit issues, then to the pointer 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_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) { @@ -96,13 +96,13 @@ void delete_page_tables_32pae(pdpe32pae_t * pdpe) { continue; } - V3_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[j].pt_base_addr)); + V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[j].pt_base_addr), 1); } - V3_FreePage(V3_PAddr(pde)); + V3_FreePages(V3_PAddr(pde), 1); } - V3_FreePage(V3_PAddr(pdpe)); + V3_FreePages(V3_PAddr(pdpe), 1); } void delete_page_tables_64(pml4e64_t * pml4) { @@ -133,16 +133,16 @@ void delete_page_tables_64(pml4e64_t * pml4) { continue; } - V3_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[k].pt_base_addr)); + V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[k].pt_base_addr), 1); } - V3_FreePage(V3_PAddr(pde)); + V3_FreePages(V3_PAddr(pde), 1); } - V3_FreePage(V3_PAddr(pdpe)); + V3_FreePages(V3_PAddr(pdpe), 1); } - V3_FreePage(V3_PAddr(pml4)); + V3_FreePages(V3_PAddr(pml4), 1); } @@ -656,9 +656,11 @@ static pt_entry_type_t pdpe64_lookup(pdpe64_t * pdp, addr_t addr, addr_t * entry *entry = 0; return PT_ENTRY_NOT_PRESENT; } else if (pdpe_entry->large_page) { - PrintError("1 Gigabyte pages not supported\n"); - V3_ASSERT(0); - return -1; + pdpe64_1GB_t * large_pdp = (pdpe64_1GB_t *)pdpe_entry; + + *entry = BASE_TO_PAGE_ADDR_1GB(large_pdp->page_base_addr); + + return PT_ENTRY_LARGE_PAGE; } else { *entry = BASE_TO_PAGE_ADDR(pdpe_entry->pd_base_addr); return PT_ENTRY_PAGE; @@ -952,7 +954,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; @@ -970,10 +972,8 @@ 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) { - 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 ; } @@ -987,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; @@ -1002,10 +1002,8 @@ 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) { - 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) { @@ -1031,7 +1029,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; @@ -1050,7 +1048,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; @@ -1069,10 +1067,8 @@ 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) { - 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) { @@ -1085,7 +1081,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; @@ -1100,10 +1096,8 @@ 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) { - 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) { @@ -1132,7 +1126,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; @@ -1150,7 +1144,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; @@ -1168,10 +1162,8 @@ 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) { - 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) { @@ -1185,7 +1177,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; @@ -1203,10 +1195,8 @@ 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) { - 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) { @@ -1219,7 +1209,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; @@ -1234,10 +1224,8 @@ 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) { - 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) { @@ -1277,7 +1265,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; @@ -1294,7 +1282,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 @@ -1310,7 +1298,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; @@ -1325,7 +1313,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 @@ -1362,7 +1350,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; @@ -1378,7 +1366,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; @@ -1395,7 +1383,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 @@ -1411,7 +1399,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; @@ -1426,7 +1414,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 @@ -1469,7 +1457,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; @@ -1486,7 +1474,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; @@ -1503,7 +1491,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 @@ -1519,7 +1507,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; @@ -1536,7 +1524,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 @@ -1552,7 +1540,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; @@ -1567,7 +1555,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