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.


Compile fixes for GCC 5.4+ (core VMM only)
[palacios.git] / palacios / src / palacios / vmm_paging_debug.h
index d3611d1..8ce5f87 100644 (file)
@@ -1,3 +1,21 @@
+/*
+ * This file is part of the Palacios Virtual Machine Monitor developed
+ * by the V3VEE Project with funding from the United States National 
+ * Science Foundation and the Department of Energy.  
+ *
+ * The V3VEE Project is a joint project between Northwestern University
+ * and the University of New Mexico.  You can find out more at 
+ * http://www.v3vee.org
+ *
+ * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> 
+ * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org> 
+ * All rights reserved.
+ *
+ * Author: Jack Lange <jarusl@cs.northwestern.edu>
+ *
+ * This is free software.  You are permitted to use,
+ * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
+ */
 
 #ifdef USE_VMM_PAGING_DEBUG
 
  */
 
 
-void PrintPDE32(addr_t virtual_address, pde32_t * pde)
+static void PrintPDE32(addr_t virtual_address, pde32_t * pde)
 {
-  PrintDebug("PDE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
-            (void *)virtual_address,
-            (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
-            pde->present,
-            pde->writable,
-            pde->user_page, 
-            pde->write_through,
-            pde->cache_disable,
-            pde->accessed,
-            pde->reserved,
-            pde->large_page,
-            pde->global_page,
-            pde->vmm_info);
+  PrintDebug(VM_NONE, VCORE_NONE, "PDE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
+              (void *)virtual_address,
+              (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
+              pde->present,
+              pde->writable,
+              pde->user_page, 
+              pde->write_through,
+              pde->cache_disable,
+              pde->accessed,
+              pde->reserved,
+              pde->large_page,
+              pde->global_page,
+              pde->vmm_info);
 }
 
   
-void PrintPTE32(addr_t virtual_address, pte32_t * pte)
+static void PrintPTE32(addr_t virtual_address, pte32_t * pte)
 {
-  PrintDebug("PTE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, dirty=%x, pteAttribute=%x, globalPage=%x, vmm_info=%x\n",
-            (void *)virtual_address,
-            (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
-            pte->present,
-            pte->writable,
-            pte->user_page,
-            pte->write_through,
-            pte->cache_disable,
-            pte->accessed,
-            pte->dirty,
-            pte->pte_attr,
-            pte->global_page,
-            pte->vmm_info);
+    PrintDebug(VM_NONE, VCORE_NONE, "PTE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, dirty=%x, pteAttribute=%x, globalPage=%x, vmm_info=%x\n",
+              (void *)virtual_address,
+              (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
+              pte->present,
+              pte->writable,
+              pte->user_page,
+              pte->write_through,
+              pte->cache_disable,
+              pte->accessed,
+              pte->dirty,
+              pte->pte_attr,
+              pte->global_page,
+              pte->vmm_info);
 }
 
 
@@ -50,52 +68,51 @@ void PrintPTE32(addr_t virtual_address, pte32_t * pte)
 
 
 
-
-
-void PrintPD32(pde32_t * pde)
+static void PrintPDPE32PAE(addr_t virtual_address, pdpe32pae_t * pdpe)
 {
-  int i;
-
-  PrintDebug("Page Directory at %p:\n", pde);
-  for (i = 0; (i < MAX_PDE32_ENTRIES); i++) { 
-    if ( pde[i].present) {
-      PrintPDE32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), &(pde[i]));
-    }
-  }
+    PrintDebug(VM_NONE, VCORE_NONE, "PDPE %p -> %p : present=%x, wt=%x, cd=%x, accessed=%x, kernelInfo=%x\n",
+              (void *)virtual_address,
+              (void *)(addr_t) (pdpe->pd_base_addr << PAGE_POWER),
+              pdpe->present,
+              pdpe->write_through,
+              pdpe->cache_disable,
+              pdpe->accessed,
+              pdpe->vmm_info);
 }
 
-void PrintPT32(addr_t starting_address, pte32_t * pte) 
+static void PrintPDE32PAE(addr_t virtual_address, pde32pae_t * pde)
 {
-  int i;
-
-  PrintDebug("Page Table at %p:\n", pte);
-  for (i = 0; (i < MAX_PTE32_ENTRIES) ; i++) { 
-    if (pte[i].present) {
-      PrintPTE32(starting_address + (PAGE_SIZE * i), &(pte[i]));
-    }
-  }
+    PrintDebug(VM_NONE, VCORE_NONE, "PDE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
+              (void *)virtual_address,
+              (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
+              pde->present,
+              pde->writable,
+              pde->user_page, 
+              pde->write_through,
+              pde->cache_disable,
+              pde->accessed,
+              pde->large_page,
+              pde->global_page,
+              pde->vmm_info);
 }
 
-
-
-
-
-
-
-void PrintDebugPageTables(pde32_t * pde)
-{
-  int i;
   
-  PrintDebug("Dumping the pages starting with the pde page at %p\n", pde);
-
-  for (i = 0; (i < MAX_PDE32_ENTRIES); i++) { 
-    if (pde[i].present) {
-      PrintPDE32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), &(pde[i]));
-      PrintPT32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), (pte32_t *)V3_VAddr((void *)(addr_t)(pde[i].pt_base_addr << PAGE_POWER)));
-    }
-  }
+static void PrintPTE32PAE(addr_t virtual_address, pte32pae_t * pte)
+{
+    PrintDebug(VM_NONE, VCORE_NONE, "PTE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, dirty=%x, pteAttribute=%x, globalPage=%x, vmm_info=%x\n",
+              (void *)virtual_address,
+              (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
+              pte->present,
+              pte->writable,
+              pte->user_page,
+              pte->write_through,
+              pte->cache_disable,
+              pte->accessed,
+              pte->dirty,
+              pte->pte_attr,
+              pte->global_page,
+              pte->vmm_info);
 }
-    
 
 
 
@@ -103,212 +120,376 @@ void PrintDebugPageTables(pde32_t * pde)
 
 
 
-void PrintPDPE32PAE(addr_t virtual_address, pdpe32pae_t * pdpe)
-{
-  PrintDebug("PDPE %p -> %p : present=%x, wt=%x, cd=%x, accessed=%x, kernelInfo=%x\n",
-            (void *)virtual_address,
-            (void *)(addr_t) (pdpe->pd_base_addr << PAGE_POWER),
-            pdpe->present,
-            pdpe->write_through,
-            pdpe->cache_disable,
-            pdpe->accessed,
-            pdpe->vmm_info);
-}
 
-void PrintPDE32PAE(addr_t virtual_address, pde32pae_t * pde)
+static void PrintPML4e64(addr_t virtual_address, pml4e64_t * pml)
 {
-  PrintDebug("PDE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
-            (void *)virtual_address,
-            (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
-            pde->present,
-            pde->writable,
-            pde->user_page, 
-            pde->write_through,
-            pde->cache_disable,
-            pde->accessed,
-            pde->large_page,
-            pde->global_page,
-            pde->vmm_info);
+    PrintDebug(VM_NONE, VCORE_NONE, "PML4e64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, kernelInfo=%x\n",
+              (void *)virtual_address,
+              (void *)(addr_t) (BASE_TO_PAGE_ADDR(pml->pdp_base_addr)),
+              pml->present,
+              pml->writable,
+              pml->user_page, 
+              pml->write_through,
+              pml->cache_disable,
+              pml->accessed,
+              pml->reserved,
+              pml->vmm_info);
 }
 
-  
-void PrintPTE32PAE(addr_t virtual_address, pte32pae_t * pte)
+static void PrintPDPE64(addr_t virtual_address, pdpe64_t * pdpe)
 {
-  PrintDebug("PTE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, dirty=%x, pteAttribute=%x, globalPage=%x, vmm_info=%x\n",
-            (void *)virtual_address,
-            (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
-            pte->present,
-            pte->writable,
-            pte->user_page,
-            pte->write_through,
-            pte->cache_disable,
-            pte->accessed,
-            pte->dirty,
-            pte->pte_attr,
-            pte->global_page,
-            pte->vmm_info);
+    PrintDebug(VM_NONE, VCORE_NONE, "PDPE64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, largePages=%x, globalPage/zero=%x, kernelInfo=%x\n",
+              (void *)virtual_address,
+              (void *)(addr_t) (BASE_TO_PAGE_ADDR(pdpe->pd_base_addr)),
+              pdpe->present,
+              pdpe->writable,
+              pdpe->user_page, 
+              pdpe->write_through,
+              pdpe->cache_disable,
+              pdpe->accessed,
+              pdpe->avail,
+              pdpe->large_page,
+              pdpe->zero,
+              pdpe->vmm_info);
 }
 
 
 
+static void PrintPDE64(addr_t virtual_address, pde64_t * pde)
+{
+    PrintDebug(VM_NONE, VCORE_NONE, "PDE64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
+              (void *)virtual_address,
+              (void *)(addr_t) (BASE_TO_PAGE_ADDR(pde->pt_base_addr)),
+              pde->present,
+              pde->writable,
+              pde->user_page, 
+              pde->write_through,
+              pde->cache_disable,
+              pde->accessed,
+              pde->avail,
+              pde->large_page,
+              pde->global_page,
+              pde->vmm_info);
+}
 
+  
+static void PrintPTE64(addr_t virtual_address, pte64_t * pte)
+{
+    PrintDebug(VM_NONE, VCORE_NONE, "PTE64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, dirty=%x, pteAttribute=%x, globalPage=%x, vmm_info=%x\n",
+              (void *)virtual_address,
+              (void*)(addr_t)(BASE_TO_PAGE_ADDR(pte->page_base_addr)),
+              pte->present,
+              pte->writable,
+              pte->user_page,
+              pte->write_through,
+              pte->cache_disable,
+              pte->accessed,
+              pte->dirty,
+              pte->pte_attr,
+              pte->global_page,
+              pte->vmm_info);
+}
 
+  
 
-void PrintDebugPageTables32PAE(pdpe32pae_t * pdpe)
-{
-  int i, j, k;
-  pde32pae_t * pde;
-  pte32pae_t * pte;
-  addr_t virtual_addr = 0;
 
-  PrintDebug("Dumping the pages starting with the pde page at %p\n", pdpe);
 
-  for (i = 0; (i < MAX_PDPE32PAE_ENTRIES); i++) { 
 
-    if (pdpe[i].present) {
-      pde = (pde32pae_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pdpe[i].pd_base_addr));
 
-      PrintPDPE32PAE(virtual_addr, &(pdpe[i]));
 
-      for (j = 0; j < MAX_PDE32PAE_ENTRIES; j++) {
+static int print_page_walk_cb(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+    int i = 0;
+    addr_t tmp_vaddr = 0;
+    switch (type) {
 
-       if (pde[j].present) {
-         pte = (pte32pae_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pde[j].pt_base_addr));
+       /* 64 Bit */
 
-         PrintPDE32PAE(virtual_addr, &(pde[j]));
+       case PAGE_PML464:
+           {
+               pml4e64_t * pml = (pml4e64_t *)page_ptr;
+               PrintDebug(info->vm_info, info, "PML4E64 Page\n");
+               for (i = 0; i < MAX_PML4E64_ENTRIES; i++) {
+                   tmp_vaddr = (4096 * MAX_PTE64_ENTRIES);
+                   tmp_vaddr *= (MAX_PDE64_ENTRIES * MAX_PDPE64_ENTRIES * i); // break apart to avoid int overflow compile errors
+                   tmp_vaddr += vaddr;
+                   if (pml[i].present) 
+                       PrintPML4e64(tmp_vaddr, &(pml[i]));
+               }
+               break;
+           }
+       case PAGE_PDP64:
+           {
+               pdpe64_t * pdp = (pdpe64_t *)page_ptr;
+               PrintDebug(info->vm_info, info, "PDPE64 Page\n");
+               for (i = 0; i < MAX_PDPE64_ENTRIES; i++) {
+                   tmp_vaddr = 4096UL * MAX_PTE64_ENTRIES * MAX_PDE64_ENTRIES * i; 
+                   tmp_vaddr += vaddr;
+                   if (pdp[i].present)
+                       PrintPDPE64(tmp_vaddr, &(pdp[i]));
+               }
+               break;
+           }
+       case PAGE_PD64:
+           {
+               pde64_t * pd = (pde64_t *)page_ptr;
+               PrintDebug(info->vm_info, info, "PDE64 Page\n");
+               for (i = 0; i < MAX_PDE64_ENTRIES; i++) {
+                   tmp_vaddr = 4096 * MAX_PTE64_ENTRIES * i; 
+                   tmp_vaddr += vaddr;
+                   if (pd[i].present)
+                       PrintPDE64(tmp_vaddr, &(pd[i]));
+               }
+               break;
+           }
+       case PAGE_PT64:
+           {
+               pte64_t * pt = (pte64_t *)page_ptr;
+               PrintDebug(info->vm_info, info, "PTE64 Page\n");
+               for (i = 0; i < MAX_PTE64_ENTRIES; i++) {
+                   tmp_vaddr = 4096 * i; 
+                   tmp_vaddr += vaddr;
+                   if (pt[i].present)
+                       PrintPTE64(tmp_vaddr, &(pt[i]));
+               }
+               break;
+           }
 
-         for (k = 0; k < MAX_PTE32PAE_ENTRIES; k++) {
-           if (pte[k].present) {
-             PrintPTE32PAE(virtual_addr, &(pte[k]));
+           /* 32 BIT PAE */
+    
+       case PAGE_PDP32PAE:
+           {
+               pdpe32pae_t * pdp = (pdpe32pae_t *)page_ptr;
+               PrintDebug(info->vm_info, info, "PDPE32PAE Page\n");
+               for (i = 0; i < MAX_PDPE32PAE_ENTRIES; i++) {
+                   tmp_vaddr = 4096UL * MAX_PTE32PAE_ENTRIES * MAX_PDE32PAE_ENTRIES * i; 
+                   tmp_vaddr += vaddr;
+                   if (pdp[i].present) 
+                       PrintPDPE32PAE(tmp_vaddr, &(pdp[i]));
+               }
+               break;
+           }
+       case PAGE_PD32PAE:
+           {
+               pde32pae_t * pd = (pde32pae_t *)page_ptr;
+               PrintDebug(info->vm_info, info, "PDE32PAE Page\n");
+               for (i = 0; i < MAX_PDE32PAE_ENTRIES; i++) {
+                   tmp_vaddr = 4096 * MAX_PTE32PAE_ENTRIES * i; 
+                   tmp_vaddr += vaddr;
+                   if (pd[i].present)
+                       PrintPDE32PAE(tmp_vaddr, &(pd[i]));
+               }
+               break;
+           }
+       case PAGE_PT32PAE:
+           {
+               pte32pae_t * pt = (pte32pae_t *)page_ptr;
+               PrintDebug(info->vm_info, info, "PTE32PAE Page\n");
+               for (i = 0; i < MAX_PTE32PAE_ENTRIES; i++) {
+                   tmp_vaddr = 4096 * i; 
+                   tmp_vaddr += vaddr;
+                   if (pt[i].present) 
+                       PrintPTE32PAE(tmp_vaddr, &(pt[i]));
+               }
+               break;
            }
 
-           virtual_addr += PAGE_SIZE;
-         }
-       } else {
-         virtual_addr += PAGE_SIZE * MAX_PTE32PAE_ENTRIES;
-       }
-      }
-    } else {
-      virtual_addr += PAGE_SIZE * MAX_PDE32PAE_ENTRIES * MAX_PTE32PAE_ENTRIES;
+           /* 32 Bit */
+
+       case PAGE_PD32:
+           {
+               pde32_t * pd = (pde32_t *)page_ptr;
+               PrintDebug(info->vm_info, info, "PDE32 Page\n");
+               for (i = 0; i < MAX_PTE32_ENTRIES; i++) {
+                   tmp_vaddr = 4096UL * MAX_PTE32_ENTRIES * i; 
+                   tmp_vaddr += vaddr;
+                   if (pd[i].present)
+                       PrintPDE32(tmp_vaddr, &(pd[i]));
+               }
+               break;
+           }
+       case PAGE_PT32:
+           {
+               pte32_t * pt = (pte32_t *)page_ptr;
+               PrintDebug(info->vm_info, info, "PTE32 Page\n");
+               for (i = 0; i < MAX_PTE32_ENTRIES; i++) {
+                   tmp_vaddr = 4096 * i; 
+                   tmp_vaddr += vaddr;
+                   if (pt[i].present)
+                       PrintPTE32(tmp_vaddr, &(pt[i]));
+               }
+               break;
+           }
+       default:
+           break;
     }
-  }
+
+    return 0;
 }
-    
 
 
-void PrintPML4e64(addr_t virtual_address, pml4e64_t * pml)
-{
-  PrintDebug("PML4e64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, kernelInfo=%x\n",
-            (void *)virtual_address,
-            (void *)(addr_t) (BASE_TO_PAGE_ADDR(pml->pdp_base_addr)),
-            pml->present,
-            pml->writable,
-            pml->user_page, 
-            pml->write_through,
-            pml->cache_disable,
-            pml->accessed,
-            pml->reserved,
-            pml->vmm_info);
-}
 
-void PrintPDPE64(addr_t virtual_address, pdpe64_t * pdpe)
-{
-  PrintDebug("PDPE64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
-            (void *)virtual_address,
-            (void *)(addr_t) (BASE_TO_PAGE_ADDR(pdpe->pd_base_addr)),
-            pdpe->present,
-            pdpe->writable,
-            pdpe->user_page, 
-            pdpe->write_through,
-            pdpe->cache_disable,
-            pdpe->accessed,
-            pdpe->reserved,
-            pdpe->large_page,
-            0,//pdpe->global_page,
-            pdpe->vmm_info);
-}
 
 
+static int print_page_tree_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) {
 
-void PrintPDE64(addr_t virtual_address, pde64_t * pde)
-{
-  PrintDebug("PDE64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
-            (void *)virtual_address,
-            (void *)(addr_t) (BASE_TO_PAGE_ADDR(pde->pt_base_addr)),
-            pde->present,
-            pde->writable,
-            pde->user_page, 
-            pde->write_through,
-            pde->cache_disable,
-            pde->accessed,
-            pde->reserved,
-            pde->large_page,
-            0,//pde->global_page,
-            pde->vmm_info);
-}
+       /* 64 Bit */
 
-  
-void PrintPTE64(addr_t virtual_address, pte64_t * pte)
-{
-  PrintDebug("PTE64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, dirty=%x, pteAttribute=%x, globalPage=%x, vmm_info=%x\n",
-            (void *)virtual_address,
-            (void*)(addr_t)(BASE_TO_PAGE_ADDR(pte->page_base_addr)),
-            pte->present,
-            pte->writable,
-            pte->user_page,
-            pte->write_through,
-            pte->cache_disable,
-            pte->accessed,
-            pte->dirty,
-            pte->pte_attr,
-            pte->global_page,
-            pte->vmm_info);
-}
+       case PAGE_PML464:
+           {
+               pml4e64_t * pml = (pml4e64_t *)page_ptr;
+               PrintPML4e64(vaddr, &(pml[PML4E64_INDEX(vaddr)]));
+               break;
+           }
+       case PAGE_PDP64:
+           {
+               pdpe64_t * pdp = (pdpe64_t *)page_ptr;
+               PrintPDPE64(vaddr, &(pdp[PDPE64_INDEX(vaddr)]));
+               break;
+           }
+       case PAGE_PD64:
+           {
+               pde64_t * pd = (pde64_t *)page_ptr;
+               PrintPDE64(vaddr, &(pd[PDE64_INDEX(vaddr)]));
+               break;
+           }
+       case PAGE_PT64:
+           {
+               pte64_t * pt = (pte64_t *)page_ptr;
+               PrintPTE64(vaddr, &(pt[PTE64_INDEX(vaddr)]));
+               break;
+           }
 
-  
+           /* 32 BIT PAE */
+    
+       case PAGE_PDP32PAE:
+           {
+               pdpe32pae_t * pdp = (pdpe32pae_t *)page_ptr;
+               PrintPDPE32PAE(vaddr, &(pdp[PDPE32PAE_INDEX(vaddr)]));
+               break;
+           }
+       case PAGE_PD32PAE:
+           {
+               pde32pae_t * pd = (pde32pae_t *)page_ptr;
+               PrintPDE32PAE(vaddr, &(pd[PDE32PAE_INDEX(vaddr)]));
+               break;
+           }
+       case PAGE_PT32PAE:
+           {
+               pte32pae_t * pt = (pte32pae_t *)page_ptr;
+               PrintPTE32PAE(vaddr, &(pt[PTE32PAE_INDEX(vaddr)]));
+               break;
+           }
 
+           /* 32 Bit */
 
+       case PAGE_PD32:
+           {
+               pde32_t * pd = (pde32_t *)page_ptr;
+               PrintPDE32(vaddr, &(pd[PDE32_INDEX(vaddr)]));
+               break;
+           }
+       case PAGE_PT32:
+           {
+               pte32_t * pt = (pte32_t *)page_ptr;
+               PrintPTE32(vaddr, &(pt[PTE32_INDEX(vaddr)]));
+               break;
+           }
+       default:
+           PrintDebug(info->vm_info, info, "%s %p->%p \n", v3_page_type_to_str(type), (void *)vaddr, (void *)page_pa);
+           break;
+    }
 
-void PrintPageTree_64(addr_t virtual_addr, pml4e64_t * pml) {
-  uint_t pml4_index = PML4E64_INDEX(virtual_addr);
-  uint_t pdpe_index = PDPE64_INDEX(virtual_addr);
-  uint_t pde_index = PDE64_INDEX(virtual_addr);
-  uint_t pte_index = PTE64_INDEX(virtual_addr);
+    return 0;
+}
 
-  PrintPML4e64(virtual_addr, &(pml[pml4_index]));
-  if (pml[pml4_index].present) {
-    pdpe64_t * pdpe = (pdpe64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pml[pml4_index].pdp_base_addr));
-    PrintPDPE64(virtual_addr, &(pdpe[pdpe_index]));
 
-    if (pdpe[pdpe_index].present) {
-      pde64_t * pde = (pde64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pdpe[pdpe_index].pd_base_addr));
-      PrintPDE64(virtual_addr, &(pde[pde_index]));
-      
-      if (pde[pde_index].present) {
-       pte64_t * pte = (pte64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pde[pde_index].pt_base_addr));
-       PrintPTE64(virtual_addr, &(pte[pte_index]));
-      }
 
-    }
+void PrintPTEntry(struct guest_info * info, page_type_t type, addr_t vaddr, void * entry) {
+    print_page_tree_cb(info, type, vaddr, PAGE_ADDR_4KB((addr_t)entry), 0, NULL);
+}
 
-  }
 
+void PrintHostPageTables(struct guest_info * info, v3_cpu_mode_t cpu_mode, addr_t cr3) {
+    PrintDebug(info->vm_info, info, "CR3: %p\n", (void *)cr3);
+    switch (cpu_mode) {
+       case PROTECTED:
+           v3_walk_host_pt_32(info, cr3, print_page_walk_cb, NULL);
+           break;
+       case PROTECTED_PAE:
+           v3_walk_host_pt_32pae(info, cr3, print_page_walk_cb, NULL);
+           break;
+       case LONG:
+       case LONG_32_COMPAT:
+       case LONG_16_COMPAT:
+           v3_walk_host_pt_64(info, cr3, print_page_walk_cb, NULL);
+           break;
+       default:
+           PrintError(info->vm_info, info, "Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
+           break;
+    }
 }
 
 
+void PrintGuestPageTables(struct guest_info * info, addr_t cr3) {
+    PrintDebug(info->vm_info, info, "CR3: %p\n", (void *)cr3);
+    switch (info->cpu_mode) {
+       case REAL:
+       case PROTECTED:
+           v3_walk_guest_pt_32(info, cr3, print_page_walk_cb, NULL);
+           break;
+       case PROTECTED_PAE:
+           v3_walk_guest_pt_32pae(info, cr3, print_page_walk_cb, NULL);
+           break;
+       case LONG:
+       case LONG_32_COMPAT:
+       case LONG_16_COMPAT:
+           v3_walk_guest_pt_64(info, cr3, print_page_walk_cb, NULL);
+           break;
+       default:
+           PrintError(info->vm_info, info, "Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
+           break;
+    }
+}
 
+void PrintHostPageTree(struct guest_info * info,  addr_t virtual_addr, addr_t cr3) {
+    PrintDebug(info->vm_info, info, "CR3: %p\n, cpu mode is %x", (void *)cr3, info->cpu_mode);
+    switch (info->cpu_mode) {
+       case PROTECTED:
+           v3_drill_host_pt_32(info, cr3, virtual_addr, print_page_tree_cb, NULL);
+           break;
+       case PROTECTED_PAE:
+           v3_drill_host_pt_32pae(info, cr3, virtual_addr, print_page_tree_cb, NULL);
+           break;
+       case LONG:
+       case LONG_32_COMPAT:
+       case LONG_16_COMPAT:
+           v3_drill_host_pt_64(info, cr3, virtual_addr, print_page_tree_cb, NULL);
+           break;
+       default:
+           PrintError(info->vm_info, info, "Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
+           break;
+    }
+}
 
-void PrintPageTree(v3_vm_cpu_mode_t cpu_mode, addr_t virtual_addr, addr_t cr3) {
-  switch (cpu_mode) {
-  case LONG:
-  case LONG_32_COMPAT:
-  case LONG_16_COMPAT:
-    PrintPageTree_64(virtual_addr, CR3_TO_PML4E64_VA(cr3));
-    break;
-  default:
-    PrintError("Unsupported CPU MODE %d\n", cpu_mode);
-    break;
-  }
+void PrintGuestPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3) {
+    PrintDebug(info->vm_info, info, "CR3: %p\n", (void *)cr3);
+    switch (info->cpu_mode) {
+       case PROTECTED:
+           v3_drill_guest_pt_32(info, cr3, virtual_addr, print_page_tree_cb, NULL);
+           break;
+       case PROTECTED_PAE:
+           v3_drill_guest_pt_32pae(info, cr3, virtual_addr, print_page_tree_cb, NULL);
+           break;
+       case LONG:
+       case LONG_32_COMPAT:
+       case LONG_16_COMPAT:
+           v3_drill_guest_pt_64(info, cr3, virtual_addr, print_page_tree_cb, NULL);
+           break;
+       default:
+           PrintError(info->vm_info, info, "Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
+           break;
+    }
 }