Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Cleanup and sanity-checking of before/after null-check and copy+paste errors (Coverit...
[palacios.git] / palacios / src / palacios / vmm_paging.c
index dc7aa97..85c0874 100644 (file)
@@ -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
@@ -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(VM_NONE, VCORE_NONE, "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(VM_NONE, VCORE_NONE, "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(VM_NONE, VCORE_NONE, "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(VM_NONE, VCORE_NONE,"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);
 }
 
 
@@ -101,7 +162,7 @@ static int translate_pt_32_cb(struct guest_info * info, page_type_t type, addr_t
            *paddr = page_pa + PAGE_OFFSET_4KB(vaddr);
            return 0;
        default: 
-           PrintError("Inavlid page type (%s) in tranlate pt 32 callback\n", v3_page_type_to_str(type));
+           PrintError(info->vm_info, info, "Inavlid page type (%s) in tranlate pt 32 callback\n", v3_page_type_to_str(type));
            return -1;
     }
 }
@@ -121,7 +182,7 @@ static int translate_pt_32pae_cb(struct guest_info * info, page_type_t type, add
            *paddr = page_pa + PAGE_OFFSET_4KB(vaddr);
            return 0;
        default:
-           PrintError("Inavlid page type (%s) in translate pt 32pae callback\n", v3_page_type_to_str(type));
+           PrintError(info->vm_info, info, "Inavlid page type (%s) in translate pt 32pae callback\n", v3_page_type_to_str(type));
            return -1;
     }
 }
@@ -145,7 +206,7 @@ static int translate_pt_64_cb(struct guest_info * info, page_type_t type, addr_t
            *paddr = page_pa + PAGE_OFFSET_4KB(vaddr);
            return 0;
        default:
-           PrintError("Inavlid page type (%s) in translate pt 64 callback\n", v3_page_type_to_str(type));
+           PrintError(info->vm_info, info, "Inavlid page type (%s) in translate pt 64 callback\n", v3_page_type_to_str(type));
            return -1;
     }
 }
@@ -186,7 +247,7 @@ static int find_pt_cb(struct guest_info * info, page_type_t type, addr_t vaddr,
                      addr_t page_ptr, addr_t page_pa, void * private_data) {
     struct pt_find_data * pt_data = (struct pt_find_data *)private_data;
 
-    PrintDebug("FIND_PT Type=%s, page_pa = %p\n",           
+    PrintDebug(info->vm_info, info, "FIND_PT Type=%s, page_pa = %p\n",              
               v3_page_type_to_str(type),
               (void *)page_pa);
 
@@ -292,11 +353,11 @@ static int check_pt_32_cb(struct guest_info * info, page_type_t type, addr_t vad
        case PAGE_4KB:
            return 0;
        default: 
-           PrintError("Inavlid page type (%s) in check pt 32 callback\n", v3_page_type_to_str(type));
+           PrintError(info->vm_info, info, "Inavlid page type (%s) in check pt 32 callback\n", v3_page_type_to_str(type));
            return -1;
     }
 
-    if (chk_data->access_status != PT_ACCESS_OK) {
+    if (*(chk_data->access_status) != PT_ACCESS_OK) {
        return 1;
     }
 
@@ -321,11 +382,11 @@ static int check_pt_32pae_cb(struct guest_info * info, page_type_t type, addr_t
        case PAGE_4KB:
            return 0;
        default: 
-           PrintError("Inavlid page type (%s) in check pt 32pae callback\n", v3_page_type_to_str(type));
+           PrintError(info->vm_info, info, "Inavlid page type (%s) in check pt 32pae callback\n", v3_page_type_to_str(type));
            return -1;
     }
 
-    if (chk_data->access_status != PT_ACCESS_OK) {
+    if (*(chk_data->access_status) != PT_ACCESS_OK) {
        return 1;
     }
 
@@ -354,11 +415,11 @@ static int check_pt_64_cb(struct guest_info * info, page_type_t type, addr_t vad
        case PAGE_4KB:
            return 0;
        default: 
-           PrintError("Inavlid page type (%s) in check pt 64 callback\n", v3_page_type_to_str(type));
+           PrintError(info->vm_info, info, "Inavlid page type (%s) in check pt 64 callback\n", v3_page_type_to_str(type));
            return -1;
     }
 
-    if (chk_data->access_status != PT_ACCESS_OK) {
+    if (*(chk_data->access_status) != PT_ACCESS_OK) {
        return 1;
     }
 
@@ -510,7 +571,7 @@ static pt_entry_type_t pte32_lookup(pte32_t * pt, addr_t addr, addr_t * entry) {
 
     if (!pte_entry->present) {
        *entry = 0;
-       //    PrintDebug("Lookup at non present page (index=%d)\n", PTE32_INDEX(addr));
+       //    PrintDebug(VM_NONE, VCORE_NONE, "Lookup at non present page (index=%d)\n", PTE32_INDEX(addr));
        return PT_ENTRY_NOT_PRESENT;
     } else {
        *entry = BASE_TO_PAGE_ADDR(pte_entry->page_base_addr);
@@ -595,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;
@@ -734,7 +797,7 @@ int v3_drill_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vadd
            }
            return 0;
        case PT_ENTRY_PAGE:
-           if ((ret = callback(info, PAGE_PT32, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data) != 0)) {
+           if ((ret = callback(info, PAGE_PT32, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
                return (ret == -1) ? -1 : PAGE_PT32;
            }
     
@@ -771,7 +834,7 @@ int v3_drill_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t v
            return -1;
        case PT_ENTRY_PAGE:
 
-           if ((ret = callback(info, PAGE_PD32PAE, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data) != 0)) {
+           if ((ret = callback(info, PAGE_PD32PAE, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data)) != 0) {
                return (ret == -1) ? -1 : PAGE_PD32PAE;
            }
       
@@ -784,7 +847,7 @@ int v3_drill_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t v
                    }
                    return 0;
                case PT_ENTRY_PAGE:
-                   if ((ret = callback(info, PAGE_PT32PAE, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data) != 0)) {
+                   if ((ret = callback(info, PAGE_PT32PAE, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
                        return (ret == -1) ? -1 : PAGE_PT32PAE;
                    }
 
@@ -837,11 +900,11 @@ int v3_drill_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vadd
                    if ((ret == callback(info, PAGE_1GB, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data)) != 0) {
                        return (ret == -1) ? -1 : PAGE_1GB;
                    }
-                   PrintError("1 Gigabyte Pages not supported\n");
+                   PrintError(info->vm_info, info, "1 Gigabyte Pages not supported\n");
                    return 0;
                case PT_ENTRY_PAGE:
 
-                   if ((ret = callback(info, PAGE_PD64, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data) != 0)) {
+                   if ((ret = callback(info, PAGE_PD64, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data)) != 0) {
                        return (ret == -1) ? -1 : PAGE_PD64;
                    }
 
@@ -855,7 +918,7 @@ int v3_drill_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vadd
                            return 0;
                        case PT_ENTRY_PAGE:
 
-                           if ((ret = callback(info, PAGE_PT64, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data) != 0)) {
+                           if ((ret = callback(info, PAGE_PT64, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
                                return (ret == -1) ? -1 : PAGE_PT64;
                            }
 
@@ -891,8 +954,8 @@ 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) {
-       PrintError("Could not get virtual address of Guest PDE32 (PA=%p)\n", 
+    if (v3_gpa_to_hva(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
+       PrintError(info->vm_info, info, "Could not get virtual address of Guest PDE32 (PA=%p)\n", 
                   (void *)guest_pde_pa);
        return -1;
     }
@@ -909,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 ;
                }
 
 
@@ -926,13 +987,13 @@ 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) {
-                   PrintError("Could not get virtual address of Guest PTE32 (PA=%p)\n", 
+               if (v3_gpa_to_hva(info, guest_pte_pa, (addr_t*)&guest_pte) == -1) {
+                   PrintError(info->vm_info, info, "Could not get virtual address of Guest PTE32 (PA=%p)\n", 
                               (void *)guest_pte_pa);
                    return -1;
                }
 
-               if ((ret = callback(info, PAGE_PT32, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data) != 0)) {
+               if ((ret = callback(info, PAGE_PT32, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data)) != 0) {
                    return (ret == -1) ? -1 : PAGE_PT32;
                }
 
@@ -941,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) {
@@ -956,7 +1015,7 @@ int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
     }
 
     // should never get here
-    PrintError("End of drill function (guest 32)... Should never have gotten here...\n");
+    PrintError(info->vm_info, info, "End of drill function (guest 32)... Should never have gotten here...\n");
     return -1;
 }
 
@@ -970,8 +1029,8 @@ 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) {
-       PrintError("Could not get virtual address of Guest PDPE32PAE (PA=%p)\n",
+    if (v3_gpa_to_hva(info, guest_pdpe_pa, (addr_t*)&guest_pdpe) == -1) {
+       PrintError(info->vm_info, info, "Could not get virtual address of Guest PDPE32PAE (PA=%p)\n",
                   (void *)guest_pdpe_pa);
        return -1;
     }
@@ -989,8 +1048,8 @@ 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) {
-                       PrintError("Could not get virtual Address of Guest PDE32PAE (PA=%p)\n", 
+                   if (v3_gpa_to_hva(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
+                       PrintError(info->vm_info, info, "Could not get virtual Address of Guest PDE32PAE (PA=%p)\n", 
                                   (void *)guest_pde_pa);
                        return -1;
                    }
@@ -1008,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) {
@@ -1024,13 +1081,13 @@ 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) {
-                                       PrintError("Could not get virtual Address of Guest PTE32PAE (PA=%p)\n", 
+                                   if (v3_gpa_to_hva(info, guest_pte_pa, (addr_t *)&guest_pte) == -1) {
+                                       PrintError(info->vm_info, info, "Could not get virtual Address of Guest PTE32PAE (PA=%p)\n", 
                                                   (void *)guest_pte_pa);
                                        return -1;
                                    }
 
-                                   if ((ret = callback(info, PAGE_PT32PAE, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data) != 0)) {
+                                   if ((ret = callback(info, PAGE_PT32PAE, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data)) != 0) {
                                        return (ret == -1) ? -1 : PAGE_PT32PAE;
                                    }
 
@@ -1039,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) {
@@ -1054,12 +1109,12 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t
                        }
                }
            default:
-               PrintError("Invalid page type for PD32PAE\n");
+               PrintError(info->vm_info, info, "Invalid page type for PD32PAE\n");
                return -1;
        }
 
     // should never get here
-    PrintError("End of drill function (guest 32pae)... Should never have gotten here...\n");
+    PrintError(info->vm_info, info, "End of drill function (guest 32pae)... Should never have gotten here...\n");
     return -1;
 }
 
@@ -1071,8 +1126,8 @@ 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) {
-       PrintError("Could not get virtual address of Guest PML4E64 (PA=%p)\n", 
+    if (v3_gpa_to_hva(info, guest_pml4_pa, (addr_t*)&guest_pmle) == -1) {
+       PrintError(info->vm_info, info, "Could not get virtual address of Guest PML4E64 (PA=%p)\n", 
                   (void *)guest_pml4_pa);
        return -1;
     }
@@ -1089,8 +1144,8 @@ 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) {
-                   PrintError("Could not get virtual address of Guest PDPE64 (PA=%p)\n", 
+               if (v3_gpa_to_hva(info, guest_pdpe_pa, (addr_t *)&guest_pdp) == -1) {
+                   PrintError(info->vm_info, info, "Could not get virtual address of Guest PDPE64 (PA=%p)\n", 
                               (void *)guest_pdpe_pa);
                    return -1;
                }
@@ -1107,16 +1162,14 @@ 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) {
                                return (ret == -1) ? -1 : PAGE_1GB;
                            }
-                           PrintError("1 Gigabyte Pages not supported\n");
+                           PrintError(info->vm_info, info, "1 Gigabyte Pages not supported\n");
                            return 0;
                        }
                    case PT_ENTRY_PAGE:
@@ -1124,8 +1177,8 @@ 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) {
-                               PrintError("Could not get virtual address of guest PDE64 (PA=%p)\n", 
+                           if (v3_gpa_to_hva(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
+                               PrintError(info->vm_info, info, "Could not get virtual address of guest PDE64 (PA=%p)\n", 
                                           (void *)guest_pde_pa);
                                return -1;
                            }
@@ -1142,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) {
@@ -1158,13 +1209,13 @@ 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) {
-                                           PrintError("Could not get virtual address of guest PTE64 (PA=%p)\n", 
+                                       if (v3_gpa_to_hva(info, guest_pte_pa, (addr_t *)&guest_pte) == -1) {
+                                           PrintError(info->vm_info, info, "Could not get virtual address of guest PTE64 (PA=%p)\n", 
                                                       (void *)guest_pte_pa);
                                            return -1;
                                        }
 
-                                       if ((ret = callback(info, PAGE_PT64, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data) != 0)) {
+                                       if ((ret = callback(info, PAGE_PT64, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data)) != 0) {
                                            return (ret == -1) ? -1 : PAGE_PT64;
                                        }
                
@@ -1173,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) {
@@ -1195,7 +1244,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
     }
 
     // should never get here
-    PrintError("End of drill function (guest 64)... Should never have gotten here...\n");
+    PrintError(info->vm_info, info, "End of drill function (guest 64)... Should never have gotten here...\n");
     return -1;
 }
 
@@ -1212,12 +1261,12 @@ int v3_walk_guest_pt_32(struct guest_info * info,  v3_reg_t guest_cr3,
     int ret = 0;
 
     if (!callback) {
-       PrintError("Call back was not specified\n");
+       PrintError(info->vm_info, info, "Call back was not specified\n");
        return -1;
     }
 
-    if (guest_pa_to_host_va(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
-       PrintError("Could not get virtual address of Guest PDE32 (PA=%p)\n", 
+    if (v3_gpa_to_hva(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
+       PrintError(info->vm_info, info, "Could not get virtual address of Guest PDE32 (PA=%p)\n", 
                   (void *)guest_pde_pa);
        return -1;
     }
@@ -1233,8 +1282,8 @@ 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) {
-                   PrintDebug("Could not get virtual address of Guest 4MB Page (PA=%p)\n", 
+               if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
+                   PrintDebug(info->vm_info, info,"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
                    large_page_va = 0;
@@ -1249,8 +1298,8 @@ 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) {
-                   PrintError("Could not get virtual address of Guest PTE32 (PA=%p)\n", 
+               if (v3_gpa_to_hva(info, pte_pa, (addr_t *)&tmp_pte) == -1) {
+                   PrintError(info->vm_info, info, "Could not get virtual address of Guest PTE32 (PA=%p)\n", 
                               (void *)pte_pa);
                    return -1;
                }
@@ -1264,8 +1313,8 @@ 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) {
-                           PrintDebug("Could not get virtual address of Guest 4KB Page (PA=%p)\n", 
+                       if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) {
+                           PrintDebug(info->vm_info, info, "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
                            page_va = 0;
@@ -1297,12 +1346,12 @@ int v3_walk_guest_pt_32pae(struct guest_info * info,  v3_reg_t guest_cr3,
     int ret = 0;
 
     if (!callback) {
-       PrintError("Call back was not specified\n");
+       PrintError(info->vm_info, info, "Call back was not specified\n");
        return -1;
     }
 
-    if (guest_pa_to_host_va(info, guest_pdpe_pa, (addr_t *)&guest_pdpe) == -1) {
-       PrintError("Could not get virtual address of Guest PDPE32PAE (PA=%p)\n", 
+    if (v3_gpa_to_hva(info, guest_pdpe_pa, (addr_t *)&guest_pdpe) == -1) {
+       PrintError(info->vm_info, info, "Could not get virtual address of Guest PDPE32PAE (PA=%p)\n", 
                   (void *)guest_pdpe_pa);
        return -1;
     }
@@ -1317,8 +1366,8 @@ 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) {
-               PrintError("Could not get virtual address of Guest PDE32PAE (PA=%p)\n", 
+           if (v3_gpa_to_hva(info, pde_pa, (addr_t *)&tmp_pde) == -1) {
+               PrintError(info->vm_info, info, "Could not get virtual address of Guest PDE32PAE (PA=%p)\n", 
                           (void *)pde_pa);
                return -1;
            }
@@ -1334,8 +1383,8 @@ 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) {
-                           PrintDebug("Could not get virtual address of Guest 2MB Page (PA=%p)\n", 
+                       if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
+                           PrintDebug(info->vm_info, info,"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
                            large_page_va = 0;
@@ -1350,8 +1399,8 @@ 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) {
-                           PrintError("Could not get virtual address of Guest PTE32PAE (PA=%p)\n", 
+                       if (v3_gpa_to_hva(info, pte_pa, (addr_t *)&tmp_pte) == -1) {
+                           PrintError(info->vm_info, info, "Could not get virtual address of Guest PTE32PAE (PA=%p)\n", 
                                       (void *)pte_pa);
                            return -1;
                        }
@@ -1365,8 +1414,8 @@ 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) {
-                                   PrintDebug("Could not get virtual address of Guest 4KB Page (PA=%p)\n", 
+                               if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) {
+                                   PrintDebug(info->vm_info, info,"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
                                    page_va = 0;
@@ -1404,12 +1453,12 @@ int v3_walk_guest_pt_64(struct guest_info * info,  v3_reg_t guest_cr3,
     int ret = 0;
 
     if (!callback) {
-       PrintError("Call back was not specified\n");
+       PrintError(info->vm_info, info, "Call back was not specified\n");
        return -1;
     }
 
-    if (guest_pa_to_host_va(info, guest_pml_pa, (addr_t *)&guest_pml) == -1) {
-       PrintError("Could not get virtual address of Guest PML464 (PA=%p)\n", 
+    if (v3_gpa_to_hva(info, guest_pml_pa, (addr_t *)&guest_pml) == -1) {
+       PrintError(info->vm_info, info, "Could not get virtual address of Guest PML464 (PA=%p)\n", 
                   (void *)guest_pml);
        return -1;
     }
@@ -1425,8 +1474,8 @@ 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) {
-               PrintError("Could not get virtual address of Guest PDPE64 (PA=%p)\n", 
+           if (v3_gpa_to_hva(info, pdpe_pa, (addr_t *)&tmp_pdpe) == -1) {
+               PrintError(info->vm_info, info, "Could not get virtual address of Guest PDPE64 (PA=%p)\n", 
                           (void *)pdpe_pa);
                return -1;
            }
@@ -1442,8 +1491,8 @@ 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) {
-                           PrintDebug("Could not get virtual address of Guest 1GB page (PA=%p)\n", 
+                       if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
+                           PrintDebug(info->vm_info, info,"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
                            large_page_va = 0;
@@ -1458,8 +1507,8 @@ 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) {
-                           PrintError("Could not get virtual address of Guest PDE64 (PA=%p)\n", 
+                       if (v3_gpa_to_hva(info, pde_pa, (addr_t *)&tmp_pde) == -1) {
+                           PrintError(info->vm_info, info, "Could not get virtual address of Guest PDE64 (PA=%p)\n", 
                                       (void *)pde_pa);
                            return -1;
                        }
@@ -1475,8 +1524,8 @@ 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) {
-                                       PrintDebug("Could not get virtual address of Guest 2MB page (PA=%p)\n", 
+                                   if (v3_gpa_to_hva(info, large_page_pa, &large_page_va) == -1) {
+                                       PrintDebug(info->vm_info, info,"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
                                        large_page_va = 0;
@@ -1491,8 +1540,8 @@ 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) {
-                                       PrintError("Could not get virtual address of Guest PTE64 (PA=%p)\n", 
+                                   if (v3_gpa_to_hva(info, pte_pa, (addr_t *)&tmp_pte) == -1) {
+                                       PrintError(info->vm_info, info, "Could not get virtual address of Guest PTE64 (PA=%p)\n", 
                                                   (void *)pte_pa);
                                        return -1;
                                    }
@@ -1506,8 +1555,8 @@ 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) {
-                                               PrintDebug("Could not get virtual address of Guest 4KB Page (PA=%p)\n", 
+                                           if (v3_gpa_to_hva(info, page_pa, &page_va) == -1) {
+                                               PrintDebug(info->vm_info, info,"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
                                                page_va = 0;
@@ -1547,7 +1596,7 @@ int v3_walk_host_pt_32(struct guest_info * info, v3_reg_t host_cr3,
     int ret = 0;
 
     if (!callback) {
-       PrintError("Call back was not specified\n");
+       PrintError(info->vm_info, info, "Call back was not specified\n");
        return -1;
     }
 
@@ -1606,7 +1655,7 @@ int v3_walk_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3,
     int ret = 0;
 
     if (!callback) {
-       PrintError("Callback was not specified\n");
+       PrintError(info->vm_info, info, "Callback was not specified\n");
        return -1;
     }
   
@@ -1676,7 +1725,7 @@ int v3_walk_host_pt_64(struct guest_info * info, v3_reg_t host_cr3,
     int ret = 0;
 
     if (!callback) {
-       PrintError("Callback was not specified\n");
+       PrintError(info->vm_info, info, "Callback was not specified\n");
        return -1;
     }