X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_paging.c;h=b492d5bb4d854180c568ba07bc17eb02368a6586;hb=176328b42924a56b53e4c7255ef83acb5847c621;hp=6ad8e10497dad57bdc6ea55272f841d176d01c3d;hpb=30379ff13457e9687c5ab5acb67e92a5757fb5c6;p=palacios.git diff --git a/palacios/src/palacios/vmm_paging.c b/palacios/src/palacios/vmm_paging.c index 6ad8e10..b492d5b 100644 --- a/palacios/src/palacios/vmm_paging.c +++ b/palacios/src/palacios/vmm_paging.c @@ -59,19 +59,20 @@ 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 - PrintDebug("PTE base addr %x \n", pde[i].pt_base_addr); + pte32_t * pte = (pte32_t *)((addr_t)(uint_t)(pde[i].pt_base_addr << PAGE_POWER)); - PrintDebug("Deleting PTE %d (%p)\n", i, pte); + V3_FreePage(pte); } } - PrintDebug("Deleting PDE (%p)\n", pde); + V3_FreePage(V3_PAddr(pde)); } @@ -434,6 +435,40 @@ int v3_check_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va } +static int get_data_page_type_cb(struct guest_info * info, page_type_t type, + addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) { + switch (type) { + case PAGE_4KB: + case PAGE_2MB: + case PAGE_4MB: + case PAGE_1GB: + return 1; + default: + return 0; + } +} + + + +page_type_t v3_get_guest_data_page_type_32(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) { + return v3_drill_guest_pt_32(info, cr3, vaddr, get_data_page_type_cb, NULL); +} +page_type_t v3_get_guest_data_page_type_32pae(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) { + return v3_drill_guest_pt_32pae(info, cr3, vaddr, get_data_page_type_cb, NULL); +} +page_type_t v3_get_guest_data_page_type_64(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) { + return v3_drill_guest_pt_64(info, cr3, vaddr, get_data_page_type_cb, NULL); +} +page_type_t v3_get_host_data_page_type_32(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) { + return v3_drill_host_pt_32(info, cr3, vaddr, get_data_page_type_cb, NULL); +} +page_type_t v3_get_host_data_page_type_32pae(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) { + return v3_drill_host_pt_32pae(info, cr3, vaddr, get_data_page_type_cb, NULL); +} +page_type_t v3_get_host_data_page_type_64(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) { + return v3_drill_host_pt_64(info, cr3, vaddr, get_data_page_type_cb, NULL); +} + /* * PAGE TABLE LOOKUP FUNCTIONS @@ -663,7 +698,7 @@ pt_access_status_t inline v3_can_access_pdpe64(pdpe64_t * pdpe, addr_t addr, pf_ } pt_access_status_t inline v3_can_access_pde64(pde64_t * pde, addr_t addr, pf_error_t access_type) { - gen_pt_t * entry = (gen_pt_t *)&pde[PDE32_INDEX(addr)]; + gen_pt_t * entry = (gen_pt_t *)&pde[PDE64_INDEX(addr)]; return can_access_pt_entry(entry, access_type); }