2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jarusl@cs.northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
20 #ifdef USE_VMM_PAGING_DEBUG
24 * This is an implementation file that gets included only in vmm_paging.c
29 static void PrintPDE32(addr_t virtual_address, pde32_t * pde)
31 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",
32 (void *)virtual_address,
33 (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
47 static void PrintPTE32(addr_t virtual_address, pte32_t * pte)
49 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",
50 (void *)virtual_address,
51 (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
71 static void PrintPDPE32PAE(addr_t virtual_address, pdpe32pae_t * pdpe)
73 PrintDebug("PDPE %p -> %p : present=%x, wt=%x, cd=%x, accessed=%x, kernelInfo=%x\n",
74 (void *)virtual_address,
75 (void *)(addr_t) (pdpe->pd_base_addr << PAGE_POWER),
83 static void PrintPDE32PAE(addr_t virtual_address, pde32pae_t * pde)
85 PrintDebug("PDE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
86 (void *)virtual_address,
87 (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
100 static void PrintPTE32PAE(addr_t virtual_address, pte32pae_t * pte)
102 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",
103 (void *)virtual_address,
104 (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
124 static void PrintPML4e64(addr_t virtual_address, pml4e64_t * pml)
126 PrintDebug("PML4e64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, kernelInfo=%x\n",
127 (void *)virtual_address,
128 (void *)(addr_t) (BASE_TO_PAGE_ADDR(pml->pdp_base_addr)),
139 static void PrintPDPE64(addr_t virtual_address, pdpe64_t * pdpe)
141 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",
142 (void *)virtual_address,
143 (void *)(addr_t) (BASE_TO_PAGE_ADDR(pdpe->pd_base_addr)),
158 static void PrintPDE64(addr_t virtual_address, pde64_t * pde)
160 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",
161 (void *)virtual_address,
162 (void *)(addr_t) (BASE_TO_PAGE_ADDR(pde->pt_base_addr)),
176 static void PrintPTE64(addr_t virtual_address, pte64_t * pte)
178 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",
179 (void *)virtual_address,
180 (void*)(addr_t)(BASE_TO_PAGE_ADDR(pte->page_base_addr)),
206 static int print_page_tree_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
214 pml4e64_t * pml = (pml4e64_t *)page_ptr;
215 PrintPML4e64(vaddr, &(pml[PML4E64_INDEX(vaddr)]));
220 pdpe64_t * pdp = (pdpe64_t *)page_ptr;
221 PrintPDPE64(vaddr, &(pdp[PDPE64_INDEX(vaddr)]));
226 pde64_t * pd = (pde64_t *)page_ptr;
227 PrintPDE64(vaddr, &(pd[PDE64_INDEX(vaddr)]));
232 pte64_t * pt = (pte64_t *)page_ptr;
233 PrintPTE64(vaddr, &(pt[PTE64_INDEX(vaddr)]));
241 pdpe32pae_t * pdp = (pdpe32pae_t *)page_ptr;
242 PrintPDPE32PAE(vaddr, &(pdp[PDPE32PAE_INDEX(vaddr)]));
247 pde32pae_t * pd = (pde32pae_t *)page_ptr;
248 PrintPDE32PAE(vaddr, &(pd[PDE32PAE_INDEX(vaddr)]));
253 pte32pae_t * pt = (pte32pae_t *)page_ptr;
254 PrintPTE32PAE(vaddr, &(pt[PTE32PAE_INDEX(vaddr)]));
262 pde32_t * pd = (pde32_t *)page_ptr;
263 PrintPDE32(vaddr, &(pd[PDE32_INDEX(vaddr)]));
268 pte32_t * pt = (pte32_t *)page_ptr;
269 PrintPTE32(vaddr, &(pt[PTE32_INDEX(vaddr)]));
273 PrintDebug("%s %p->%p \n", v3_page_type_to_str(type), (void *)vaddr, (void *)page_pa);
282 void PrintPTEntry(page_type_t type, addr_t vaddr, void * entry) {
283 print_page_tree_cb(type, vaddr, PAGE_ADDR_4KB((addr_t)entry), 0, NULL);
287 void PrintHostPageTables(v3_vm_cpu_mode_t cpu_mode, addr_t cr3) {
290 v3_walk_host_pt_32(cr3, print_page_tree_cb, NULL);
292 v3_walk_host_pt_32pae(cr3, print_page_tree_cb, NULL);
296 v3_walk_host_pt_64(cr3, print_page_tree_cb, NULL);
299 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(cpu_mode));
305 void PrintGuestPageTables(struct guest_info * info, addr_t cr3) {
306 switch (info->cpu_mode) {
308 v3_walk_guest_pt_32(info, cr3, print_page_tree_cb, NULL);
310 v3_walk_guest_pt_32pae(info, cr3, print_page_tree_cb, NULL);
314 v3_walk_guest_pt_64(info, cr3, print_page_tree_cb, NULL);
317 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
322 void PrintHostPageTree(v3_vm_cpu_mode_t cpu_mode, addr_t virtual_addr, addr_t cr3) {
325 v3_drill_host_pt_32(cr3, virtual_addr, print_page_tree_cb, NULL);
327 v3_drill_host_pt_32pae(cr3, virtual_addr, print_page_tree_cb, NULL);
331 v3_drill_host_pt_64(cr3, virtual_addr, print_page_tree_cb, NULL);
334 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(cpu_mode));
339 void PrintGuestPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3) {
340 switch (info->cpu_mode) {
342 v3_drill_guest_pt_32(info, cr3, virtual_addr, print_page_tree_cb, NULL);
344 v3_drill_guest_pt_32pae(info, cr3, virtual_addr, print_page_tree_cb, NULL);
348 v3_drill_guest_pt_64(info, cr3, virtual_addr, print_page_tree_cb, NULL);
351 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));