From: Jack Lange <jarusl@cs.northwestern.edu>
Date: Wed, 4 Feb 2009 04:40:25 +0000 (-0600)
Subject: fixed paging callbacks to normalize calling convention
X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=30379ff13457e9687c5ab5acb67e92a5757fb5c6;p=palacios.releases.git

fixed paging callbacks to normalize calling convention
---

diff --git a/palacios/include/palacios/vmm_paging.h b/palacios/include/palacios/vmm_paging.h
index 69989c4..22f956d 100644
--- a/palacios/include/palacios/vmm_paging.h
+++ b/palacios/include/palacios/vmm_paging.h
@@ -129,7 +129,6 @@ typedef enum {PAGE_4KB, PAGE_2MB, PAGE_4MB, PAGE_1GB,
 
 
 /* Gets the base address needed for a Page Table entry */
-
 #define PAGE_BASE_ADDR(x) ((x) >> 12)
 #define PAGE_BASE_ADDR_4KB(x) ((x) >> 12)
 #define PAGE_BASE_ADDR_2MB(x) ((x) >> 21)
@@ -190,6 +189,7 @@ typedef enum {PAGE_4KB, PAGE_2MB, PAGE_4MB, PAGE_1GB,
 
 /* Page Table Flag Values */
 #define PT32_HOOK 0x1
+#define PT32_GUEST_PT 0x2
 
 
 
@@ -462,23 +462,26 @@ int v3_translate_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_
 int v3_translate_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr);
 int v3_translate_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr);
 
-int v3_translate_host_pt_32(v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr);
-int v3_translate_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr);
-int v3_translate_host_pt_64(v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr);
+int v3_translate_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr);
+int v3_translate_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr);
+int v3_translate_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr);
 
 
-int v3_find_host_pt_32_page(v3_reg_t host_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr);
-int v3_find_host_pt_32pae_page(v3_reg_t host_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr);
-int v3_find_host_pt_64_page(v3_reg_t host_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr);
+int v3_find_host_pt_32_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr, 
+			    addr_t * page_ptr, addr_t * page_pa);
+int v3_find_host_pt_32pae_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr, 
+			       addr_t * page_ptr, addr_t * page_pa);
+int v3_find_host_pt_64_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr, 
+			    addr_t * page_ptr, addr_t * page_pa);
 int v3_find_guest_pt_32_page(struct guest_info * info, v3_reg_t guest_cr3, 
 			     page_type_t type, addr_t vaddr, 
-			     addr_t * page_addr);
+			     addr_t * page_ptr, addr_t * page_pa);
 int v3_find_guest_pt_32pae_page(struct guest_info * info, v3_reg_t guest_cr3, 
 				page_type_t type, addr_t vaddr, 
-				addr_t * page_addr);
+				addr_t * page_ptr, addr_t * page_pa);
 int v3_find_guest_pt_64_page(struct guest_info * info, v3_reg_t guest_cr3, 
 			     page_type_t type, addr_t vaddr, 
-			     addr_t * page_addr);
+			     addr_t * page_ptr, addr_t * page_pa);
 
 pt_access_status_t inline v3_can_access_pde32(pde32_t * pde, addr_t addr, pf_error_t access_type);
 pt_access_status_t inline v3_can_access_pte32(pte32_t * pte, addr_t addr, pf_error_t access_type);
@@ -493,11 +496,11 @@ pt_access_status_t inline v3_can_access_pde64(pde64_t * pde, addr_t addr, pf_err
 pt_access_status_t inline v3_can_access_pte64(pte64_t * pte, addr_t addr, pf_error_t access_type);
 
 
-int v3_check_host_pt_32(v3_reg_t host_cr3, addr_t vaddr, 
+int v3_check_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, 
 			pf_error_t access_type, pt_access_status_t * access_status);
-int v3_check_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr, 
+int v3_check_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, 
 			   pf_error_t access_type, pt_access_status_t * access_status);
-int v3_check_host_pt_64(v3_reg_t host_cr3, addr_t vaddr, 
+int v3_check_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, 
 			pf_error_t access_type, pt_access_status_t * access_status);
 int v3_check_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, 
 			 pf_error_t access_type, pt_access_status_t * access_status);
@@ -509,50 +512,50 @@ int v3_check_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
 
 
 
-int v3_drill_host_pt_32(v3_reg_t host_cr3, addr_t vaddr,
-			int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_drill_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+			int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			void * private_data);
-int v3_drill_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr,
-			   int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_drill_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+			   int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			   void * private_data);
-int v3_drill_host_pt_64(v3_reg_t host_cr3, addr_t vaddr,
-			int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_drill_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+			int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			void * private_data);
 
 int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
-			 int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+			 int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			 void * private_data);
 int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
-			    int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+			    int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			    void * private_data);
 int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
-			 int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+			 int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			 void * private_data);
 
 
 
-int v3_walk_host_pt_32(v3_reg_t host_cr3,
-		       int (*callback)(page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+int v3_walk_host_pt_32(struct guest_info * info, v3_reg_t host_cr3,
+		       int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
 		       void * private_data);
 
-int v3_walk_host_pt_32pae(v3_reg_t host_cr3,
-			  int (*callback)(page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+int v3_walk_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3,
+			  int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
 			  void * private_data);
 
-int v3_walk_host_pt_64(v3_reg_t host_cr3,
-		       int (*callback)(page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+int v3_walk_host_pt_64(struct guest_info * info, v3_reg_t host_cr3,
+		       int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
 		       void * private_data);
 
 int v3_walk_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3,
-			int (*callback)(page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+			int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
 			void * private_data);
 
 int v3_walk_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3,
-			   int (*callback)(page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+			   int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
 			   void * private_data);
 
 int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3,
-			int (*callback)(page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+			int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
 			void * private_data);
   
 
@@ -571,10 +574,10 @@ const uchar_t * v3_page_type_to_str(page_type_t type);
 
 
 
-void PrintPTEntry(page_type_t type, addr_t vaddr, void * entry);
-void PrintHostPageTables(v3_vm_cpu_mode_t cpu_mode, addr_t cr3);
+void PrintPTEntry(struct guest_info * info, page_type_t type, addr_t vaddr, void * entry);
+void PrintHostPageTables(struct guest_info * info,  addr_t cr3);
 void PrintGuestPageTables(struct guest_info * info, addr_t cr3);
-void PrintHostPageTree(v3_vm_cpu_mode_t cpu_mode, addr_t virtual_addr, addr_t cr3);
+void PrintHostPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3);
 void PrintGuestPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3);
 
 
diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c
index 68bb240..b13b761 100644
--- a/palacios/src/palacios/svm_handler.c
+++ b/palacios/src/palacios/svm_handler.c
@@ -366,8 +366,6 @@ int v3_handle_svm_exit(struct guest_info * info) {
   default: {
 
     addr_t rip_addr;
-    uchar_t buf[15];
-    addr_t host_addr;
 
     PrintDebug("Unhandled SVM Exit: %s\n", vmexit_code_to_str(exit_code));
 
diff --git a/palacios/src/palacios/vmm_paging.c b/palacios/src/palacios/vmm_paging.c
index 85c8d9e..6ad8e10 100644
--- a/palacios/src/palacios/vmm_paging.c
+++ b/palacios/src/palacios/vmm_paging.c
@@ -86,7 +86,7 @@ void delete_page_tables_64(pml4e64_t * pml4) {
 
 
 
-static int translate_pt_32_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int translate_pt_32_cb(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
   addr_t * paddr = (addr_t *)private_data;
 
   switch (type) {
@@ -105,7 +105,7 @@ static int translate_pt_32_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, a
   }
 }
 
-static int translate_pt_32pae_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int translate_pt_32pae_cb(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
   addr_t * paddr = (addr_t *)private_data;
   
   switch (type) {
@@ -125,7 +125,7 @@ static int translate_pt_32pae_cb(page_type_t type, addr_t vaddr, addr_t page_ptr
   }
 }
 
-static int translate_pt_64_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int translate_pt_64_cb(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
   addr_t * paddr = (addr_t *)private_data;
 
   switch (type) {
@@ -150,24 +150,24 @@ static int translate_pt_64_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, a
 }
 
 
-int v3_translate_host_pt_32(v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
-  return v3_drill_host_pt_32(host_cr3, vaddr, translate_pt_32_cb, paddr);
+int v3_translate_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
+  return v3_drill_host_pt_32(info, host_cr3, vaddr, translate_pt_32_cb, paddr);
 }
 int v3_translate_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr) {
   return v3_drill_guest_pt_32(info, guest_cr3, vaddr, translate_pt_32_cb, paddr);
 }
 
 
-int v3_translate_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
-  return v3_drill_host_pt_32pae(host_cr3, vaddr, translate_pt_32pae_cb, paddr);
+int v3_translate_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
+  return v3_drill_host_pt_32pae(info, host_cr3, vaddr, translate_pt_32pae_cb, paddr);
 }
 int v3_translate_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr) {
   return v3_drill_guest_pt_32pae(info, guest_cr3, vaddr, translate_pt_32pae_cb, paddr);
 }
 
 
-int v3_translate_host_pt_64(v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
-  return v3_drill_host_pt_64(host_cr3, vaddr, translate_pt_64_cb, paddr);
+int v3_translate_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
+  return v3_drill_host_pt_64(info, host_cr3, vaddr, translate_pt_64_cb, paddr);
 }
 int v3_translate_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr) {
   return v3_drill_guest_pt_64(info, guest_cr3, vaddr, translate_pt_64_cb, paddr);
@@ -177,14 +177,21 @@ int v3_translate_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_
 
 struct pt_find_data {
   page_type_t type;
-  addr_t * pt_page_addr;
+  addr_t * pt_page_ptr;
+  addr_t * pt_page_pa;
 };
 
-static int find_pt_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+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", 	     
+	     v3_page_type_to_str(type),
+	     (void *)page_pa);
+
   if (type == pt_data->type) {
-    *(pt_data->pt_page_addr) = page_ptr;
+    *(pt_data->pt_page_ptr) = page_ptr;
+    *(pt_data->pt_page_pa) = page_pa;
     return 1;
   }
 
@@ -192,55 +199,67 @@ static int find_pt_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t pa
 }
 
 
-int v3_find_host_pt_32_page(v3_reg_t host_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_host_pt_32_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr, 
+			    addr_t * page_ptr, addr_t * page_pa) {
   struct pt_find_data data;
 
   data.type = type;
-  data.pt_page_addr = page_addr;
+  data.pt_page_ptr = page_ptr;
+  data.pt_page_pa = page_pa;
   
-  return v3_drill_host_pt_32(host_cr3, vaddr, find_pt_cb, &data);
+  return v3_drill_host_pt_32(info, host_cr3, vaddr, find_pt_cb, &data);
 }
 
-int v3_find_host_pt_32pae_page(v3_reg_t host_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_host_pt_32pae_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr, 
+			       addr_t * page_ptr, addr_t * page_pa) {
   struct pt_find_data data;
 
   data.type = type;
-  data.pt_page_addr = page_addr;
-  
-  return v3_drill_host_pt_32pae(host_cr3, vaddr, find_pt_cb, &data);
+  data.pt_page_ptr = page_ptr;
+  data.pt_page_pa = page_pa;  
+
+  return v3_drill_host_pt_32pae(info, host_cr3, vaddr, find_pt_cb, &data);
 }
 
-int v3_find_host_pt_64_page(v3_reg_t host_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_host_pt_64_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr, 
+			    addr_t * page_ptr, addr_t * page_pa) {
   struct pt_find_data data;
 
   data.type = type;
-  data.pt_page_addr = page_addr;
-  
-  return v3_drill_host_pt_64(host_cr3, vaddr, find_pt_cb, &data);
+  data.pt_page_ptr = page_ptr;
+  data.pt_page_pa = page_pa;
+
+  return v3_drill_host_pt_64(info, host_cr3, vaddr, find_pt_cb, &data);
 }
-int v3_find_guest_pt_32_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_guest_pt_32_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr, 
+			     addr_t * page_ptr, addr_t * page_pa) {
   struct pt_find_data data;
 
   data.type = type;
-  data.pt_page_addr = page_addr;
+  data.pt_page_ptr = page_ptr;
+  data.pt_page_pa = page_pa;
   
   return v3_drill_guest_pt_32(info, guest_cr3, vaddr, find_pt_cb, &data);
 }
 
-int v3_find_guest_pt_32pae_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_guest_pt_32pae_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr, 
+				addr_t * page_ptr, addr_t * page_pa) {
   struct pt_find_data data;
 
   data.type = type;
-  data.pt_page_addr = page_addr;
+  data.pt_page_ptr = page_ptr;
+  data.pt_page_pa = page_pa;
   
   return v3_drill_guest_pt_32pae(info, guest_cr3, vaddr, find_pt_cb, &data);
 }
 
-int v3_find_guest_pt_64_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_guest_pt_64_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr, 
+			     addr_t * page_ptr, addr_t * page_pa) {
   struct pt_find_data data;
 
   data.type = type;
-  data.pt_page_addr = page_addr;
+  data.pt_page_ptr = page_ptr;
+  data.pt_page_pa = page_pa;
   
   return v3_drill_guest_pt_64(info, guest_cr3, vaddr, find_pt_cb, &data);
 }
@@ -258,7 +277,7 @@ struct pt_check_data {
   pt_access_status_t * access_status;
 };
 
-static int check_pt_32_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int check_pt_32_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_check_data * chk_data = (struct pt_check_data *)private_data;
 
   switch (type) {
@@ -284,7 +303,7 @@ static int check_pt_32_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_
 }
 
 
-static int check_pt_32pae_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int check_pt_32pae_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_check_data * chk_data = (struct pt_check_data *)private_data;
 
   switch (type) {
@@ -313,7 +332,7 @@ static int check_pt_32pae_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, ad
 }
 
 
-static int check_pt_64_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int check_pt_64_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_check_data * chk_data = (struct pt_check_data *)private_data;
 
   switch (type) {
@@ -347,33 +366,33 @@ static int check_pt_64_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_
 
 
 
-int v3_check_host_pt_32(v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
+int v3_check_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
   struct pt_check_data access_data;
 
   access_data.access_type = access_type;
   access_data.access_status = access_status;
 
-  return v3_drill_host_pt_32(host_cr3, vaddr, check_pt_32_cb, &access_data);
+  return v3_drill_host_pt_32(info, host_cr3, vaddr, check_pt_32_cb, &access_data);
 }
 
-int v3_check_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
+int v3_check_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
   struct pt_check_data access_data;
 
   access_data.access_type = access_type;
   access_data.access_status = access_status;
 
-  return v3_drill_host_pt_32pae(host_cr3, vaddr, check_pt_32pae_cb, &access_data);
+  return v3_drill_host_pt_32pae(info, host_cr3, vaddr, check_pt_32pae_cb, &access_data);
 }
 
 
 
-int v3_check_host_pt_64(v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
+int v3_check_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
   struct pt_check_data access_data;
 
   access_data.access_type = access_type;
   access_data.access_status = access_status;
 
-  return v3_drill_host_pt_64(host_cr3, vaddr, check_pt_64_cb, &access_data);
+  return v3_drill_host_pt_64(info, host_cr3, vaddr, check_pt_64_cb, &access_data);
 }
 
 
@@ -644,7 +663,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[PDE64_INDEX(addr)];
+  gen_pt_t * entry = (gen_pt_t *)&pde[PDE32_INDEX(addr)];
   return can_access_pt_entry(entry, access_type);
 }
 
@@ -1079,8 +1098,8 @@ pml4e64_t * create_passthrough_pts_64(struct guest_info * info) {
 }
 
 
-int v3_drill_host_pt_32(v3_reg_t host_cr3, addr_t vaddr, 
-			int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_drill_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, 
+			int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			void * private_data) {
   pde32_t * host_pde = (pde32_t *)CR3_TO_PDE32_VA(host_cr3);
   addr_t host_pde_pa = CR3_TO_PDE32_PA(host_cr3);
@@ -1088,7 +1107,7 @@ int v3_drill_host_pt_32(v3_reg_t host_cr3, addr_t vaddr,
   addr_t page_pa = 0;
   int ret;
 
-  if ((ret = callback(PAGE_PD32, vaddr, (addr_t)host_pde, host_pde_pa, private_data)) != 0) {
+  if ((ret = callback(info, PAGE_PD32, vaddr, (addr_t)host_pde, host_pde_pa, private_data)) != 0) {
     return (ret == -1) ? -1 : PAGE_PD32;
   }
 
@@ -1096,19 +1115,19 @@ int v3_drill_host_pt_32(v3_reg_t host_cr3, addr_t vaddr,
   case PT_ENTRY_NOT_PRESENT:
     return -1;
   case PT_ENTRY_LARGE_PAGE:
-    if ((ret == callback(PAGE_4MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
+    if ((ret == callback(info, PAGE_4MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
       return (ret == -1) ? -1 : PAGE_4MB;
     }
     return 0;
   case PT_ENTRY_PAGE:
-    if ((ret = callback(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;
     }
     
     if (pte32_lookup(V3_VAddr((void *)host_pte_pa), vaddr, &page_pa) == PT_ENTRY_NOT_PRESENT) {
       return -1;
     } else {
-      if ((ret = callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
+      if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
 	return (ret == -1) ? -1 : PAGE_4KB;
       }
       return 0;
@@ -1119,8 +1138,8 @@ int v3_drill_host_pt_32(v3_reg_t host_cr3, addr_t vaddr,
 
 
 
-int v3_drill_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr,
-			   int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_drill_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+			   int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			   void * private_data) {
   pdpe32pae_t * host_pdpe = (pdpe32pae_t *)CR3_TO_PDPE32PAE_VA(host_cr3);
   addr_t host_pdpe_pa = CR3_TO_PDPE32PAE_PA(host_cr3);
@@ -1129,7 +1148,7 @@ int v3_drill_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr,
   addr_t page_pa = 0;
   int ret;
 
-  if ((ret = callback(PAGE_PDP32PAE, vaddr, (addr_t)host_pdpe, host_pdpe_pa, private_data)) != 0) {
+  if ((ret = callback(info, PAGE_PDP32PAE, vaddr, (addr_t)host_pdpe, host_pdpe_pa, private_data)) != 0) {
     return (ret == -1) ? -1 : PAGE_PDP32PAE;
   }
 
@@ -1138,7 +1157,7 @@ int v3_drill_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr,
     return -1;
   case PT_ENTRY_PAGE:
 
-    if ((ret = callback(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;
     }
       
@@ -1146,19 +1165,19 @@ int v3_drill_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr,
     case PT_ENTRY_NOT_PRESENT:
       return -1;
     case PT_ENTRY_LARGE_PAGE:
-      if ((ret == callback(PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
+      if ((ret == callback(info, PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
 	return (ret == -1) ? -1 : PAGE_2MB;
       }
       return 0;
     case PT_ENTRY_PAGE:
-      if ((ret = callback(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;
       }
 
       if (pte32pae_lookup(V3_VAddr((void *)host_pte_pa), vaddr, &page_pa) == PT_ENTRY_NOT_PRESENT) {
 	return -1;
       } else {
-	if ((ret = callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
+	if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
 	  return (ret == -1) ? -1 : PAGE_4KB;
 	}
 	return 0;
@@ -1173,8 +1192,8 @@ int v3_drill_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr,
 }
 
 
-int v3_drill_host_pt_64(v3_reg_t host_cr3, addr_t vaddr,
-			int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_drill_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+			int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			void * private_data) {
   pml4e64_t * host_pmle = (pml4e64_t *)CR3_TO_PML4E64_VA(host_cr3);
   addr_t host_pmle_pa = CR3_TO_PML4E64_PA(host_cr3);
@@ -1184,7 +1203,7 @@ int v3_drill_host_pt_64(v3_reg_t host_cr3, addr_t vaddr,
   addr_t page_pa = 0;
   int ret;
 
-  if ((ret = callback(PAGE_PML464, vaddr, (addr_t)host_pmle, host_pmle_pa, private_data)) != 0) {
+  if ((ret = callback(info, PAGE_PML464, vaddr, (addr_t)host_pmle, host_pmle_pa, private_data)) != 0) {
     return (ret == -1) ? -1 : PAGE_PML464;
   }
 
@@ -1193,7 +1212,7 @@ int v3_drill_host_pt_64(v3_reg_t host_cr3, addr_t vaddr,
     return -1;
   case PT_ENTRY_PAGE:
 
-    if ((ret = callback(PAGE_PDP64, vaddr, (addr_t)V3_VAddr((void *)host_pdpe_pa), host_pdpe_pa, private_data)) != 0) {
+    if ((ret = callback(info, PAGE_PDP64, vaddr, (addr_t)V3_VAddr((void *)host_pdpe_pa), host_pdpe_pa, private_data)) != 0) {
       return (ret == -1) ? -1 : PAGE_PDP64;
     }
 
@@ -1201,14 +1220,14 @@ int v3_drill_host_pt_64(v3_reg_t host_cr3, addr_t vaddr,
     case PT_ENTRY_NOT_PRESENT:
       return -1;
     case PT_ENTRY_LARGE_PAGE:
-      if ((ret == callback(PAGE_1GB, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data)) != 0) {
+      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");
       return 0;
     case PT_ENTRY_PAGE:
 
-      if ((ret = callback(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;
       }
 
@@ -1216,20 +1235,20 @@ int v3_drill_host_pt_64(v3_reg_t host_cr3, addr_t vaddr,
       case PT_ENTRY_NOT_PRESENT:
 	return -1;
       case PT_ENTRY_LARGE_PAGE:
-	if ((ret == callback(PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
+	if ((ret == callback(info, PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
 	  return (ret == -1) ? -1 : PAGE_2MB;
 	}
 	return 0;
       case PT_ENTRY_PAGE:
 
-	if ((ret = callback(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;
 	}
 
 	if (pte64_lookup(V3_VAddr((void *)host_pte_pa), vaddr, &page_pa) == PT_ENTRY_NOT_PRESENT) {
 	  return -1;
 	} else {
-	  if ((ret = callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
+	  if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
 	    return (ret == -1) ? -1 : PAGE_4KB;
 	  }
 	  return 0;
@@ -1250,7 +1269,7 @@ int v3_drill_host_pt_64(v3_reg_t host_cr3, addr_t vaddr,
 
 
 int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, 
-			 int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+			 int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			 void * private_data) {
   addr_t guest_pde_pa = CR3_TO_PDE32_PA(guest_cr3);
   pde32_t * guest_pde = NULL;
@@ -1258,13 +1277,13 @@ 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 (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", 
                (void *)guest_pde_pa);
     return -1;
   }
   
-  if ((ret = callback(PAGE_PD32, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
+  if ((ret = callback(info, PAGE_PD32, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
     return (ret == -1) ? -1 : PAGE_PD32;
   }
   
@@ -1283,7 +1302,7 @@ int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
       }
 
 
-      if ((ret == callback(PAGE_4MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+      if ((ret == callback(info, PAGE_4MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
 	return (ret == -1) ? -1 : PAGE_4MB;
       }
       return 0;
@@ -1299,7 +1318,7 @@ int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
         return -1;
       }
 
-      if ((ret = callback(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;
       }
 
@@ -1314,7 +1333,7 @@ int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
 	  return -1;
 	}
 
-	if ((ret = callback(PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+	if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
 	  return (ret == -1) ? -1 : PAGE_4KB;
 	}
 	return 0;
@@ -1330,7 +1349,7 @@ int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
 
 
 int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
-				int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+				int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 				void * private_data) {			
   addr_t guest_pdpe_pa = CR3_TO_PDPE32PAE_PA(guest_cr3);
   pdpe32pae_t * guest_pdpe = 0;
@@ -1343,7 +1362,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t
     return -1;
   }
 
-  if ((ret = callback(PAGE_PDP32PAE, vaddr, (addr_t)guest_pdpe, guest_pdpe_pa, private_data)) != 0) {
+  if ((ret = callback(info, PAGE_PDP32PAE, vaddr, (addr_t)guest_pdpe, guest_pdpe_pa, private_data)) != 0) {
     return (ret == -1) ? -1 : PAGE_PDP32PAE;
   }
 
@@ -1362,7 +1381,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t
 	  return -1;
 	}
 
-	if ((ret = callback(PAGE_PD32PAE, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
+	if ((ret = callback(info, PAGE_PD32PAE, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
 	  return (ret == -1) ? -1 : PAGE_PD32PAE;
 	}
 	
@@ -1381,7 +1400,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t
 
 	      }
 	      
-	      if ((ret == callback(PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+	      if ((ret == callback(info, PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
 		return (ret == -1) ? -1 : PAGE_2MB;
 	      }
 	      return 0;
@@ -1397,7 +1416,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t
 		return -1;
 	      }
 
-	      if ((ret = callback(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;
 	      }
 
@@ -1412,7 +1431,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t
 		  return -1;
 		}
 		
-		if ((ret = callback(PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+		if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
 		  return (ret == -1) ? -1 : PAGE_4KB;
 		}
 		return 0;
@@ -1431,7 +1450,7 @@ int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t
 }
 
 int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, 
-				int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+				int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 				void * private_data) {	
   addr_t guest_pml4_pa = CR3_TO_PML4E64_PA(guest_cr3);
   pml4e64_t * guest_pmle = 0;
@@ -1444,7 +1463,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
     return -1;
   }
   
-  if ((ret = callback(PAGE_PML464, vaddr, (addr_t)guest_pmle, guest_pml4_pa, private_data)) != 0) {
+  if ((ret = callback(info, PAGE_PML464, vaddr, (addr_t)guest_pmle, guest_pml4_pa, private_data)) != 0) {
     return (ret == -1) ? -1 : PAGE_PML464;
   }
 
@@ -1462,7 +1481,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
 	return -1;
       }
 
-      if ((ret = callback(PAGE_PDP64, vaddr, (addr_t)guest_pdp, guest_pdpe_pa, private_data)) != 0) {
+      if ((ret = callback(info, PAGE_PDP64, vaddr, (addr_t)guest_pdp, guest_pdpe_pa, private_data)) != 0) {
 	return (ret == -1) ? -1 : PAGE_PDP64;
       }
 
@@ -1480,7 +1499,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
 	    
 	  }
 	  
-	  if ((ret == callback(PAGE_1GB, vaddr, large_page_va, large_page_pa, private_data)) != 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");
@@ -1497,7 +1516,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
 	    return -1;
 	  }
 	
-	  if ((ret = callback(PAGE_PD64, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
+	  if ((ret = callback(info, PAGE_PD64, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
 	    return (ret == -1) ? -1 : PAGE_PD64;
 	  }
 
@@ -1515,7 +1534,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
 
 	      }
 	      
-	      if ((ret == callback(PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+	      if ((ret == callback(info, PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
 		return (ret == -1) ? -1 : PAGE_2MB;
 	      }
 	      return 0;
@@ -1531,7 +1550,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
 		return -1;
 	      }
 
-	      if ((ret = callback(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;
 	      }
 		
@@ -1546,7 +1565,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
 		  return -1;
 		}
 		
-		if ((ret = callback(PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+		if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
 		  return (ret == -1) ? -1 : PAGE_4KB;
 		}
 
@@ -1570,12 +1589,13 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va
 
 
 int v3_walk_guest_pt_32(struct guest_info * info,  v3_reg_t guest_cr3,
-			int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+			int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			void * private_data) {
   addr_t guest_pde_pa = CR3_TO_PDE32_PA(guest_cr3);
   pde32_t * guest_pde = NULL;
   int i, j;
   addr_t vaddr = 0;
+  int ret = 0;
 
   if (!callback) {
     PrintError("Call back was not specified\n");
@@ -1588,7 +1608,9 @@ int v3_walk_guest_pt_32(struct guest_info * info,  v3_reg_t guest_cr3,
     return -1;
   }
 
-  callback(PAGE_PD32, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data);
+  if ((ret = callback(info, PAGE_PD32, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
+    return ret;
+  }
 
   for (i = 0; i < MAX_PDE32_ENTRIES; i++) {
     if (guest_pde[i].present) {
@@ -1604,7 +1626,9 @@ int v3_walk_guest_pt_32(struct guest_info * info,  v3_reg_t guest_cr3,
 	  large_page_va = 0;
 	}
 
-	callback(PAGE_4MB, vaddr, large_page_va, large_page_pa, private_data);
+	if ((ret = callback(info, PAGE_4MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+	  return ret;
+	}
 
 	vaddr += PAGE_SIZE_4MB;
       } else {
@@ -1617,7 +1641,9 @@ int v3_walk_guest_pt_32(struct guest_info * info,  v3_reg_t guest_cr3,
 	  return -1;
 	}
 
-	callback(PAGE_PT32, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+	if ((ret = callback(info, PAGE_PT32, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+	  return ret;
+	}
 
 	for (j = 0; j < MAX_PTE32_ENTRIES; j++) {
 	  if (tmp_pte[j].present) {
@@ -1631,7 +1657,9 @@ int v3_walk_guest_pt_32(struct guest_info * info,  v3_reg_t guest_cr3,
 	      page_va = 0;
 	    }
 	    
-	    callback(PAGE_4KB, vaddr, page_va, page_pa, private_data);
+	    if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+	      return ret;
+	    }
 	  }
 
 	  vaddr += PAGE_SIZE_4KB;
@@ -1646,12 +1674,13 @@ int v3_walk_guest_pt_32(struct guest_info * info,  v3_reg_t guest_cr3,
 
 
 int v3_walk_guest_pt_32pae(struct guest_info * info,  v3_reg_t guest_cr3,
-			   int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+			   int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			   void * private_data) {
   addr_t guest_pdpe_pa = CR3_TO_PDPE32PAE_PA(guest_cr3);
   pdpe32pae_t * guest_pdpe = NULL;
   int i, j, k;
   addr_t vaddr = 0;
+  int ret = 0;
 
   if (!callback) {
     PrintError("Call back was not specified\n");
@@ -1665,8 +1694,9 @@ int v3_walk_guest_pt_32pae(struct guest_info * info,  v3_reg_t guest_cr3,
   }
 
   
-
-  callback(PAGE_PDP32PAE, vaddr, (addr_t)guest_pdpe, guest_pdpe_pa, private_data);
+  if ((ret = callback(info, PAGE_PDP32PAE, vaddr, (addr_t)guest_pdpe, guest_pdpe_pa, private_data)) != 0) {
+    return ret;
+  }
 
   for (i = 0; i < MAX_PDPE32PAE_ENTRIES; i++) {
     if (guest_pdpe[i].present) {
@@ -1679,7 +1709,9 @@ int v3_walk_guest_pt_32pae(struct guest_info * info,  v3_reg_t guest_cr3,
 	return -1;
       }
 
-      callback(PAGE_PD32PAE, vaddr, (addr_t)tmp_pde, pde_pa, private_data);
+      if ((ret = callback(info, PAGE_PD32PAE, vaddr, (addr_t)tmp_pde, pde_pa, private_data)) != 0) {
+	return ret;
+      }
       
       for (j = 0; j < MAX_PDE32PAE_ENTRIES; j++) {
 	if (tmp_pde[j].present) {
@@ -1695,7 +1727,9 @@ int v3_walk_guest_pt_32pae(struct guest_info * info,  v3_reg_t guest_cr3,
 	      large_page_va = 0;
 	    }
 	    
-	    callback(PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data);
+	    if ((ret = callback(info, PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+	      return ret;
+	    }
 
 	    vaddr += PAGE_SIZE_2MB;
 	  } else {
@@ -1708,7 +1742,9 @@ int v3_walk_guest_pt_32pae(struct guest_info * info,  v3_reg_t guest_cr3,
 	      return -1;
 	    }
 	    
-	    callback(PAGE_PT32PAE, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+	    if ((ret = callback(info, PAGE_PT32PAE, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+	      return ret;
+	    }
 	    
 	    for (k = 0; k < MAX_PTE32PAE_ENTRIES; k++) {
 	      if (tmp_pte[k].present) {
@@ -1722,7 +1758,9 @@ int v3_walk_guest_pt_32pae(struct guest_info * info,  v3_reg_t guest_cr3,
 		  page_va = 0;
 		}
 		
-		callback(PAGE_4KB, vaddr, page_va, page_pa, private_data);
+		if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+		  return ret;
+		}
 	      }
 	      
 	      vaddr += PAGE_SIZE_4KB;
@@ -1743,12 +1781,13 @@ int v3_walk_guest_pt_32pae(struct guest_info * info,  v3_reg_t guest_cr3,
 
 
 int v3_walk_guest_pt_64(struct guest_info * info,  v3_reg_t guest_cr3,
-			int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+			int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			void * private_data) {
   addr_t guest_pml_pa = CR3_TO_PML4E64_PA(guest_cr3);
   pml4e64_t * guest_pml = NULL;
   int i, j, k, m;
   addr_t vaddr = 0;
+  int ret = 0;
 
   if (!callback) {
     PrintError("Call back was not specified\n");
@@ -1762,7 +1801,9 @@ int v3_walk_guest_pt_64(struct guest_info * info,  v3_reg_t guest_cr3,
   }
 
 
-  callback(PAGE_PML464, vaddr, (addr_t)guest_pml, guest_pml_pa, private_data);
+  if ((ret = callback(info, PAGE_PML464, vaddr, (addr_t)guest_pml, guest_pml_pa, private_data)) != 0) {
+    return ret;
+  }
 
   for (i = 0; i < MAX_PML4E64_ENTRIES; i++) {
     if (guest_pml[i].present) {
@@ -1776,7 +1817,9 @@ int v3_walk_guest_pt_64(struct guest_info * info,  v3_reg_t guest_cr3,
 	return -1;
       }
       
-      callback(PAGE_PDP64, vaddr, (addr_t)tmp_pdpe, pdpe_pa, private_data);
+      if ((ret = callback(info, PAGE_PDP64, vaddr, (addr_t)tmp_pdpe, pdpe_pa, private_data)) != 0) {
+	return ret;
+      }
       
       for (j = 0; j < MAX_PDPE64_ENTRIES; j++) {
 	if (tmp_pdpe[j].present) {
@@ -1792,7 +1835,9 @@ int v3_walk_guest_pt_64(struct guest_info * info,  v3_reg_t guest_cr3,
 	      large_page_va = 0;
 	    }
 
-	    callback(PAGE_1GB, vaddr, (addr_t)large_page_va, large_page_pa, private_data);
+	    if ((ret = callback(info, PAGE_1GB, vaddr, (addr_t)large_page_va, large_page_pa, private_data)) != 0) {
+	      return ret;
+	    }
 
 	    vaddr += PAGE_SIZE_1GB;
 	  } else {
@@ -1805,7 +1850,9 @@ int v3_walk_guest_pt_64(struct guest_info * info,  v3_reg_t guest_cr3,
 	      return -1;
 	    }
 	    
-	    callback(PAGE_PD64, vaddr, (addr_t)tmp_pde, pde_pa, private_data);
+	    if ((ret = callback(info, PAGE_PD64, vaddr, (addr_t)tmp_pde, pde_pa, private_data)) != 0) {
+	      return ret;
+	    }
 	    
 	    for (k = 0; k < MAX_PDE64_ENTRIES; k++) {
 	      if (tmp_pde[k].present) {
@@ -1821,7 +1868,9 @@ int v3_walk_guest_pt_64(struct guest_info * info,  v3_reg_t guest_cr3,
 		    large_page_va = 0;
 		  }
 		  
-		  callback(PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data);
+		  if ((ret = callback(info, PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+		    return ret;
+		  }
 
 		  vaddr += PAGE_SIZE_2MB;
 		} else {
@@ -1834,7 +1883,9 @@ int v3_walk_guest_pt_64(struct guest_info * info,  v3_reg_t guest_cr3,
 		    return -1;
 		  }
 		  
-		  callback(PAGE_PT64, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+		  if ((ret = callback(info, PAGE_PT64, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+		    return ret;
+		  }
 		  
 		  for (m = 0; m < MAX_PTE64_ENTRIES; m++) {
 		    if (tmp_pte[m].present) {
@@ -1848,7 +1899,9 @@ int v3_walk_guest_pt_64(struct guest_info * info,  v3_reg_t guest_cr3,
 			page_va = 0;
 		      }
 		      
-		      callback(PAGE_4KB, vaddr, page_va, page_pa, private_data);
+		      if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+			return ret;
+		      }
 		    }
 
 		    vaddr += PAGE_SIZE_4KB;
@@ -1870,20 +1923,23 @@ int v3_walk_guest_pt_64(struct guest_info * info,  v3_reg_t guest_cr3,
   return 0;
 }
 
-int v3_walk_host_pt_32(v3_reg_t host_cr3,
-		       int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_walk_host_pt_32(struct guest_info * info, v3_reg_t host_cr3,
+		       int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 		       void * private_data) {
   pde32_t * host_pde = (pde32_t *)CR3_TO_PDE32_VA(host_cr3);
   addr_t pde_pa = CR3_TO_PDE32_PA(host_cr3);
   int i, j;
   addr_t vaddr = 0;
+  int ret = 0;
 
   if (!callback) {
     PrintError("Call back was not specified\n");
     return -1;
   }
 
-  callback(PAGE_PD32, vaddr, (addr_t)host_pde, pde_pa, private_data);
+  if ((ret = callback(info, PAGE_PD32, vaddr, (addr_t)host_pde, pde_pa, private_data)) != 0) {
+    return ret;
+  }
 
   for (i = 0; i < MAX_PDE32_ENTRIES; i++) {
     if (host_pde[i].present) {
@@ -1891,19 +1947,25 @@ int v3_walk_host_pt_32(v3_reg_t host_cr3,
 	pde32_4MB_t * large_pde = (pde32_4MB_t *)&(host_pde[i]);
 	addr_t large_page_pa = BASE_TO_PAGE_ADDR_4MB(large_pde->page_base_addr);
 
-	callback(PAGE_4MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data);
+	if ((ret = callback(info, PAGE_4MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data)) != 0) {
+	  return ret;
+	}
 
 	vaddr += PAGE_SIZE_4MB;
       } else {
 	addr_t pte_pa = BASE_TO_PAGE_ADDR(host_pde[i].pt_base_addr);
 	pte32_t * tmp_pte = (pte32_t *)V3_VAddr((void *)pte_pa);
 
-	callback(PAGE_PT32, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+	if ((ret = callback(info, PAGE_PT32, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+	  return ret;
+	}
 
 	for (j = 0; j < MAX_PTE32_ENTRIES; j++) {
 	  if (tmp_pte[j].present) {
 	    addr_t page_pa = BASE_TO_PAGE_ADDR(tmp_pte[j].page_base_addr);
-	    callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data);
+	    if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data)) != 0) {
+	      return ret;
+	    }
 	  }
 
 	  vaddr += PAGE_SIZE_4KB;
@@ -1920,27 +1982,32 @@ int v3_walk_host_pt_32(v3_reg_t host_cr3,
 
 
 
-int v3_walk_host_pt_32pae(v3_reg_t host_cr3,
-			  int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_walk_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3,
+			  int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 			  void * private_data) {
   pdpe32pae_t * host_pdpe = (pdpe32pae_t *)CR3_TO_PDPE32PAE_VA(host_cr3);
   addr_t pdpe_pa = CR3_TO_PDPE32PAE_PA(host_cr3);
   int i, j, k;
   addr_t vaddr = 0;
+  int ret = 0;
 
   if (!callback) {
     PrintError("Callback was not specified\n");
     return -1;
   }
   
-  callback(PAGE_PDP32PAE, vaddr, (addr_t)host_pdpe, pdpe_pa, private_data);
+  if ((ret = callback(info, PAGE_PDP32PAE, vaddr, (addr_t)host_pdpe, pdpe_pa, private_data)) != 0) {
+    return ret;
+  }
   
   for (i = 0; i < MAX_PDPE32PAE_ENTRIES; i++) {
     if (host_pdpe[i].present) {	
       addr_t pde_pa = BASE_TO_PAGE_ADDR(host_pdpe[i].pd_base_addr);
       pde32pae_t * tmp_pde = (pde32pae_t *)V3_VAddr((void *)pde_pa);
       
-      callback(PAGE_PD32PAE, vaddr, (addr_t)tmp_pde, pde_pa, private_data);
+      if ((ret = callback(info, PAGE_PD32PAE, vaddr, (addr_t)tmp_pde, pde_pa, private_data)) != 0) {
+	return ret;
+      }
       
       for (j = 0; j < MAX_PDE32PAE_ENTRIES; j++) {
 	if (tmp_pde[j].present) {
@@ -1949,19 +2016,25 @@ int v3_walk_host_pt_32pae(v3_reg_t host_cr3,
 	    pde32pae_2MB_t * large_pde = (pde32pae_2MB_t *)&(tmp_pde[j]);
 	    addr_t large_page_pa = BASE_TO_PAGE_ADDR_2MB(large_pde->page_base_addr);
 
-	    callback(PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data);
+	    if ((ret = callback(info, PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data)) != 0) {
+	      return ret;
+	    }
 
 	    vaddr += PAGE_SIZE_2MB;
 	  } else {
 	    addr_t pte_pa = BASE_TO_PAGE_ADDR(tmp_pde[j].pt_base_addr);
 	    pte32pae_t * tmp_pte = (pte32pae_t *)V3_VAddr((void *)pte_pa);
 	    
-	    callback(PAGE_PT32PAE, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+	    if ((ret = callback(info, PAGE_PT32PAE, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+	      return ret;
+	    }
 	    
 	    for (k = 0; k < MAX_PTE32PAE_ENTRIES; k++) {
 	      if (tmp_pte[k].present) {
 		addr_t page_pa = BASE_TO_PAGE_ADDR(tmp_pte[k].page_base_addr);
-		callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data);
+		if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data)) != 0) {
+		  return ret;
+		}
 	      }
 
 	      vaddr += PAGE_SIZE_4KB;
@@ -1979,27 +2052,32 @@ int v3_walk_host_pt_32pae(v3_reg_t host_cr3,
 }
 			
 
-int v3_walk_host_pt_64(v3_reg_t host_cr3,
-		       int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_walk_host_pt_64(struct guest_info * info, v3_reg_t host_cr3,
+		       int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
 		       void * private_data) {
   pml4e64_t * host_pml = (pml4e64_t *)CR3_TO_PML4E64_VA(host_cr3);
   addr_t pml_pa = CR3_TO_PML4E64_PA(host_cr3);
   int i, j, k, m;
   addr_t vaddr = 0;
+  int ret = 0;
 
   if (!callback) {
     PrintError("Callback was not specified\n");
     return -1;
   }
 
-  callback(PAGE_PML464, vaddr, (addr_t)host_pml, pml_pa, private_data);
+  if ((ret = callback(info, PAGE_PML464, vaddr, (addr_t)host_pml, pml_pa, private_data)) != 0) {
+    return ret;
+  }
 
   for (i = 0; i < MAX_PML4E64_ENTRIES; i++) {
     if (host_pml[i].present) {
       addr_t pdpe_pa = BASE_TO_PAGE_ADDR(host_pml[i].pdp_base_addr);
       pdpe64_t * tmp_pdpe = (pdpe64_t *)V3_VAddr((void *)pdpe_pa);
 
-      callback(PAGE_PDP64, vaddr, (addr_t)tmp_pdpe, pdpe_pa, private_data);
+      if ((ret = callback(info, PAGE_PDP64, vaddr, (addr_t)tmp_pdpe, pdpe_pa, private_data)) != 0) {
+	return ret;
+      }
 
       for (j = 0; j < MAX_PDPE64_ENTRIES; j++) {
 	if (tmp_pdpe[j].present) {
@@ -2007,14 +2085,18 @@ int v3_walk_host_pt_64(v3_reg_t host_cr3,
 	    pdpe64_1GB_t * large_pdp = (pdpe64_1GB_t *)&(tmp_pdpe[j]);
 	    addr_t large_page_pa = BASE_TO_PAGE_ADDR_1GB(large_pdp->page_base_addr);
 
-	    callback(PAGE_1GB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data);
+	    if ((ret = callback(info, PAGE_1GB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data)) != 0) {
+	      return ret;
+	    }
 
 	    vaddr += PAGE_SIZE_1GB;
 	  } else {
 	    addr_t pde_pa = BASE_TO_PAGE_ADDR(tmp_pdpe[j].pd_base_addr);
 	    pde64_t * tmp_pde = (pde64_t *)V3_VAddr((void *)pde_pa);
 
-	    callback(PAGE_PD64, vaddr, (addr_t)tmp_pde, pde_pa, private_data);
+	    if ((ret = callback(info, PAGE_PD64, vaddr, (addr_t)tmp_pde, pde_pa, private_data)) != 0) {
+	      return ret;
+	    }
 
 	    for (k = 0; k < MAX_PDE64_ENTRIES; k++) {
 	      if (tmp_pde[k].present) {
@@ -2022,19 +2104,25 @@ int v3_walk_host_pt_64(v3_reg_t host_cr3,
 		  pde64_2MB_t * large_pde = (pde64_2MB_t *)&(tmp_pde[k]);
 		  addr_t large_page_pa = BASE_TO_PAGE_ADDR_2MB(large_pde->page_base_addr);
 		  
-		  callback(PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data);
+		  if ((ret = callback(info, PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data)) != 0) {
+		    return ret;
+		  }
 		  
 		  vaddr += PAGE_SIZE_2MB;
 		} else {
 		  addr_t pte_pa = BASE_TO_PAGE_ADDR(tmp_pde[k].pt_base_addr);
 		  pte64_t * tmp_pte = (pte64_t *)V3_VAddr((void *)pte_pa);
 
-		  callback(PAGE_PT64, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+		  if ((ret = callback(info, PAGE_PT64, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+		    return ret;
+		  }
 
 		  for (m = 0; m < MAX_PTE64_ENTRIES; m++) {
 		    if (tmp_pte[m].present) {
 		      addr_t page_pa = BASE_TO_PAGE_ADDR(tmp_pte[m].page_base_addr);
-		      callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data);
+		      if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data)) != 0) {
+			return ret;
+		      }
 		    }
 		    vaddr += PAGE_SIZE_4KB;
 		  }
diff --git a/palacios/src/palacios/vmm_paging_debug.h b/palacios/src/palacios/vmm_paging_debug.h
index 21817a3..caaa549 100644
--- a/palacios/src/palacios/vmm_paging_debug.h
+++ b/palacios/src/palacios/vmm_paging_debug.h
@@ -197,14 +197,140 @@ static void PrintPTE64(addr_t virtual_address, pte64_t * pte)
 
 
 
+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) {
 
+    /* 64 Bit */
 
+  case PAGE_PML464:
+    {
+      pml4e64_t * pml = (pml4e64_t *)page_ptr;
+      PrintDebug("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("PDPE64 Page\n");
+      for (i = 0; i < MAX_PDPE64_ENTRIES; i++) {
+	tmp_vaddr = 4096 * 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("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("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;
+    }
+
+    /* 32 BIT PAE */
+    
+  case PAGE_PDP32PAE:
+    {
+      pdpe32pae_t * pdp = (pdpe32pae_t *)page_ptr;
+      PrintDebug("PDPE32PAE Page\n");
+      for (i = 0; i < MAX_PDPE32PAE_ENTRIES; i++) {
+	tmp_vaddr = 4096 * 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("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("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;
+    }
+
+    /* 32 Bit */
+
+  case PAGE_PD32:
+    {
+      pde32_t * pd = (pde32_t *)page_ptr;
+      PrintDebug("PDE32 Page\n");
+      for (i = 0; i < MAX_PTE32_ENTRIES; i++) {
+	tmp_vaddr = 4096 * 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("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;
+}
 
 
 
 
-static int print_page_tree_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
 
+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) {
 
     /* 64 Bit */
@@ -279,39 +405,45 @@ static int print_page_tree_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, a
 
 
 
-void PrintPTEntry(page_type_t type, addr_t vaddr, void * entry) {
-  print_page_tree_cb(type, vaddr, PAGE_ADDR_4KB((addr_t)entry), 0, NULL);
+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(v3_vm_cpu_mode_t cpu_mode, addr_t cr3) {
-  switch (cpu_mode) {
+void PrintHostPageTables(struct guest_info * info, addr_t cr3) {
+  PrintDebug("CR3: %p\n", (void *)cr3);
+  switch (info->cpu_mode) {
   case PROTECTED:
-    v3_walk_host_pt_32(cr3, print_page_tree_cb, NULL);
+    v3_walk_host_pt_32(info, cr3, print_page_walk_cb, NULL);
+    break;
   case PROTECTED_PAE:
-    v3_walk_host_pt_32pae(cr3, print_page_tree_cb, NULL);
+    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(cr3, print_page_tree_cb, NULL);
+    v3_walk_host_pt_64(info, cr3, print_page_walk_cb, NULL);
     break;
   default:
-    PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(cpu_mode));
+    PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
     break;
   }
 }
 
 
 void PrintGuestPageTables(struct guest_info * info, addr_t cr3) {
+  PrintDebug("CR3: %p\n", (void *)cr3);
   switch (info->cpu_mode) {
   case PROTECTED:
-    v3_walk_guest_pt_32(info, cr3, print_page_tree_cb, NULL);
+    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_tree_cb, NULL);
+    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_tree_cb, NULL);
+    v3_walk_guest_pt_64(info, cr3, print_page_walk_cb, NULL);
     break;
   default:
     PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
@@ -319,29 +451,35 @@ void PrintGuestPageTables(struct guest_info * info, addr_t cr3) {
   }
 }
 
-void PrintHostPageTree(v3_vm_cpu_mode_t cpu_mode, addr_t virtual_addr, addr_t cr3) {
-  switch (cpu_mode) {
+void PrintHostPageTree(struct guest_info * info,  addr_t virtual_addr, addr_t cr3) {
+  PrintDebug("CR3: %p\n", (void *)cr3);
+  switch (info->cpu_mode) {
   case PROTECTED:
-    v3_drill_host_pt_32(cr3, virtual_addr, print_page_tree_cb, NULL);
+    v3_drill_host_pt_32(info, cr3, virtual_addr, print_page_tree_cb, NULL);
+    break;
   case PROTECTED_PAE:
-    v3_drill_host_pt_32pae(cr3, virtual_addr, print_page_tree_cb, NULL);
+    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(cr3, virtual_addr, print_page_tree_cb, NULL);
+    v3_drill_host_pt_64(info, cr3, virtual_addr, print_page_tree_cb, NULL);
     break;
   default:
-    PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(cpu_mode));
+    PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
     break;
   }
 }
 
 void PrintGuestPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3) {
+  PrintDebug("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:
diff --git a/palacios/src/palacios/vmm_shadow_paging_32.h b/palacios/src/palacios/vmm_shadow_paging_32.h
index 6876649..c21b2f2 100644
--- a/palacios/src/palacios/vmm_shadow_paging_32.h
+++ b/palacios/src/palacios/vmm_shadow_paging_32.h
@@ -239,9 +239,9 @@ static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fa
       PrintDebug("Manual Says to inject page fault into guest\n");
 #ifdef DEBUG_SHADOW_PAGING
       PrintDebug("Guest PDE: (access=%d)\n\t", guest_pde_access);
-      PrintPTEntry(PAGE_PD32, fault_addr, guest_pde);
+      PrintPTEntry(info, PAGE_PD32, fault_addr, guest_pde);
       PrintDebug("Shadow PDE: (access=%d)\n\t", shadow_pde_access);
-      PrintPTEntry(PAGE_PD32, fault_addr, shadow_pde);
+      PrintPTEntry(info, PAGE_PD32, fault_addr, shadow_pde);
 #endif
 
       return 0; 
@@ -392,9 +392,9 @@ static int handle_shadow_pte32_fault(struct guest_info * info,
   
 #ifdef DEBUG_SHADOW_PAGING
   PrintDebug("Guest PTE: (access=%d)\n\t", guest_pte_access);
-  PrintPTEntry(PAGE_PT32, fault_addr, guest_pte);
+  PrintPTEntry(info, PAGE_PT32, fault_addr, guest_pte);
   PrintDebug("Shadow PTE: (access=%d)\n\t", shadow_pte_access);
-  PrintPTEntry(PAGE_PT32, fault_addr, shadow_pte);
+  PrintPTEntry(info, PAGE_PT32, fault_addr, shadow_pte);
 #endif
   
   /* Was the page fault caused by the Guest's page tables? */
diff --git a/palacios/src/palacios/vmm_shadow_paging_64.h b/palacios/src/palacios/vmm_shadow_paging_64.h
index fa1e7fe..0d45ca7 100644
--- a/palacios/src/palacios/vmm_shadow_paging_64.h
+++ b/palacios/src/palacios/vmm_shadow_paging_64.h
@@ -269,7 +269,7 @@ static int handle_pde_shadow_pagefault_64(struct guest_info * info, addr_t fault
     shadow_pde->writable = guest_pde->writable;
 
     PrintDebug("Returning due to large page Write Error\n");
-    PrintHostPageTree(info->cpu_mode, fault_addr, info->ctrl_regs.cr3);
+    PrintHostPageTree(info, fault_addr, info->ctrl_regs.cr3);
 
     return 0;
   } else if ((shadow_pde_access != PT_ACCESS_NOT_PRESENT) &&
@@ -506,7 +506,7 @@ static int handle_2MB_shadow_pagefault_64(struct guest_info * info,
     // Inconsistent state...
     // Guest Re-Entry will flush tables and everything should now workd
     PrintDebug("Inconsistent state... Guest re-entry should flush tlb\n");
-    PrintHostPageTree(info->cpu_mode, fault_addr, info->ctrl_regs.cr3);
+    PrintHostPageTree(info, fault_addr, info->ctrl_regs.cr3);
     return 0;
   }
 
@@ -583,7 +583,7 @@ static int handle_2MB_shadow_pagefault_64(struct guest_info * info,
     return -1;
   }
 
-  PrintHostPageTree(info->cpu_mode, fault_addr, info->ctrl_regs.cr3);
+  PrintHostPageTree(info, fault_addr, info->ctrl_regs.cr3);
   PrintDebug("Returning from large page fault handler\n");
   return 0;
 }