2 #ifdef USE_VMM_PAGING_DEBUG
6 * This is an implementation file that gets included only in vmm_paging.c
11 static void PrintPDE32(addr_t virtual_address, pde32_t * pde)
13 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",
14 (void *)virtual_address,
15 (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
29 static void PrintPTE32(addr_t virtual_address, pte32_t * pte)
31 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",
32 (void *)virtual_address,
33 (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
53 static void PrintPDPE32PAE(addr_t virtual_address, pdpe32pae_t * pdpe)
55 PrintDebug("PDPE %p -> %p : present=%x, wt=%x, cd=%x, accessed=%x, kernelInfo=%x\n",
56 (void *)virtual_address,
57 (void *)(addr_t) (pdpe->pd_base_addr << PAGE_POWER),
65 static void PrintPDE32PAE(addr_t virtual_address, pde32pae_t * pde)
67 PrintDebug("PDE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
68 (void *)virtual_address,
69 (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
82 static void PrintPTE32PAE(addr_t virtual_address, pte32pae_t * pte)
84 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",
85 (void *)virtual_address,
86 (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
106 static void PrintPML4e64(addr_t virtual_address, pml4e64_t * pml)
108 PrintDebug("PML4e64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, kernelInfo=%x\n",
109 (void *)virtual_address,
110 (void *)(addr_t) (BASE_TO_PAGE_ADDR(pml->pdp_base_addr)),
121 static void PrintPDPE64(addr_t virtual_address, pdpe64_t * pdpe)
123 PrintDebug("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",
124 (void *)virtual_address,
125 (void *)(addr_t) (BASE_TO_PAGE_ADDR(pdpe->pd_base_addr)),
140 static void PrintPDE64(addr_t virtual_address, pde64_t * pde)
142 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",
143 (void *)virtual_address,
144 (void *)(addr_t) (BASE_TO_PAGE_ADDR(pde->pt_base_addr)),
158 static void PrintPTE64(addr_t virtual_address, pte64_t * pte)
160 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",
161 (void *)virtual_address,
162 (void*)(addr_t)(BASE_TO_PAGE_ADDR(pte->page_base_addr)),
188 static int print_page_tree_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
196 pml4e64_t * pml = (pml4e64_t *)page_ptr;
197 PrintPML4e64(vaddr, &(pml[PML4E64_INDEX(vaddr)]));
202 pdpe64_t * pdp = (pdpe64_t *)page_ptr;
203 PrintPDPE64(vaddr, &(pdp[PDPE64_INDEX(vaddr)]));
208 pde64_t * pd = (pde64_t *)page_ptr;
209 PrintPDE64(vaddr, &(pd[PDE64_INDEX(vaddr)]));
214 pte64_t * pt = (pte64_t *)page_ptr;
215 PrintPTE64(vaddr, &(pt[PTE64_INDEX(vaddr)]));
223 pdpe32pae_t * pdp = (pdpe32pae_t *)page_ptr;
224 PrintPDPE32PAE(vaddr, &(pdp[PDPE32PAE_INDEX(vaddr)]));
229 pde32pae_t * pd = (pde32pae_t *)page_ptr;
230 PrintPDE32PAE(vaddr, &(pd[PDE32PAE_INDEX(vaddr)]));
235 pte32pae_t * pt = (pte32pae_t *)page_ptr;
236 PrintPTE32PAE(vaddr, &(pt[PTE32PAE_INDEX(vaddr)]));
244 pde32_t * pd = (pde32_t *)page_ptr;
245 PrintPDE32(vaddr, &(pd[PDE32_INDEX(vaddr)]));
250 pte32_t * pt = (pte32_t *)page_ptr;
251 PrintPTE32(vaddr, &(pt[PTE32_INDEX(vaddr)]));
255 PrintDebug("%s %p->%p \n", v3_page_type_to_str(type), (void *)vaddr, (void *)page_pa);
264 void PrintPTEntry(page_type_t type, addr_t vaddr, void * entry) {
265 print_page_tree_cb(type, vaddr, PAGE_ADDR_4KB((addr_t)entry), 0, NULL);
269 void PrintHostPageTables(v3_vm_cpu_mode_t cpu_mode, addr_t cr3) {
272 v3_walk_host_pt_32(cr3, print_page_tree_cb, NULL);
274 v3_walk_host_pt_32pae(cr3, print_page_tree_cb, NULL);
278 v3_walk_host_pt_64(cr3, print_page_tree_cb, NULL);
281 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(cpu_mode));
287 void PrintGuestPageTables(struct guest_info * info, addr_t cr3) {
288 switch (info->cpu_mode) {
290 v3_walk_guest_pt_32(info, cr3, print_page_tree_cb, NULL);
292 v3_walk_guest_pt_32pae(info, cr3, print_page_tree_cb, NULL);
296 v3_walk_guest_pt_64(info, cr3, print_page_tree_cb, NULL);
299 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
304 void PrintHostPageTree(v3_vm_cpu_mode_t cpu_mode, addr_t virtual_addr, addr_t cr3) {
307 v3_drill_host_pt_32(cr3, virtual_addr, print_page_tree_cb, NULL);
309 v3_drill_host_pt_32pae(cr3, virtual_addr, print_page_tree_cb, NULL);
313 v3_drill_host_pt_64(cr3, virtual_addr, print_page_tree_cb, NULL);
316 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(cpu_mode));
321 void PrintGuestPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3) {
322 switch (info->cpu_mode) {
324 v3_drill_guest_pt_32(info, cr3, virtual_addr, print_page_tree_cb, NULL);
326 v3_drill_guest_pt_32pae(info, cr3, virtual_addr, print_page_tree_cb, NULL);
330 v3_drill_guest_pt_64(info, cr3, virtual_addr, print_page_tree_cb, NULL);
333 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));