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)),
200 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) {
202 addr_t tmp_vaddr = 0;
209 pml4e64_t * pml = (pml4e64_t *)page_ptr;
210 PrintDebug("PML4E64 Page\n");
211 for (i = 0; i < MAX_PML4E64_ENTRIES; i++) {
212 tmp_vaddr = (4096 * MAX_PTE64_ENTRIES);
213 tmp_vaddr *= (MAX_PDE64_ENTRIES * MAX_PDPE64_ENTRIES * i); // break apart to avoid int overflow compile errors
216 PrintPML4e64(tmp_vaddr, &(pml[i]));
222 pdpe64_t * pdp = (pdpe64_t *)page_ptr;
223 PrintDebug("PDPE64 Page\n");
224 for (i = 0; i < MAX_PDPE64_ENTRIES; i++) {
225 tmp_vaddr = 4096 * MAX_PTE64_ENTRIES * MAX_PDE64_ENTRIES * i;
228 PrintPDPE64(tmp_vaddr, &(pdp[i]));
234 pde64_t * pd = (pde64_t *)page_ptr;
235 PrintDebug("PDE64 Page\n");
236 for (i = 0; i < MAX_PDE64_ENTRIES; i++) {
237 tmp_vaddr = 4096 * MAX_PTE64_ENTRIES * i;
240 PrintPDE64(tmp_vaddr, &(pd[i]));
246 pte64_t * pt = (pte64_t *)page_ptr;
247 PrintDebug("PTE64 Page\n");
248 for (i = 0; i < MAX_PTE64_ENTRIES; i++) {
249 tmp_vaddr = 4096 * i;
252 PrintPTE64(tmp_vaddr, &(pt[i]));
261 pdpe32pae_t * pdp = (pdpe32pae_t *)page_ptr;
262 PrintDebug("PDPE32PAE Page\n");
263 for (i = 0; i < MAX_PDPE32PAE_ENTRIES; i++) {
264 tmp_vaddr = 4096 * MAX_PTE32PAE_ENTRIES * MAX_PDE32PAE_ENTRIES * i;
267 PrintPDPE32PAE(tmp_vaddr, &(pdp[i]));
273 pde32pae_t * pd = (pde32pae_t *)page_ptr;
274 PrintDebug("PDE32PAE Page\n");
275 for (i = 0; i < MAX_PDE32PAE_ENTRIES; i++) {
276 tmp_vaddr = 4096 * MAX_PTE32PAE_ENTRIES * i;
279 PrintPDE32PAE(tmp_vaddr, &(pd[i]));
285 pte32pae_t * pt = (pte32pae_t *)page_ptr;
286 PrintDebug("PTE32PAE Page\n");
287 for (i = 0; i < MAX_PTE32PAE_ENTRIES; i++) {
288 tmp_vaddr = 4096 * i;
291 PrintPTE32PAE(tmp_vaddr, &(pt[i]));
300 pde32_t * pd = (pde32_t *)page_ptr;
301 PrintDebug("PDE32 Page\n");
302 for (i = 0; i < MAX_PTE32_ENTRIES; i++) {
303 tmp_vaddr = 4096 * MAX_PTE32_ENTRIES * i;
306 PrintPDE32(tmp_vaddr, &(pd[i]));
312 pte32_t * pt = (pte32_t *)page_ptr;
313 PrintDebug("PTE32 Page\n");
314 for (i = 0; i < MAX_PTE32_ENTRIES; i++) {
315 tmp_vaddr = 4096 * i;
318 PrintPTE32(tmp_vaddr, &(pt[i]));
333 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) {
340 pml4e64_t * pml = (pml4e64_t *)page_ptr;
341 PrintPML4e64(vaddr, &(pml[PML4E64_INDEX(vaddr)]));
346 pdpe64_t * pdp = (pdpe64_t *)page_ptr;
347 PrintPDPE64(vaddr, &(pdp[PDPE64_INDEX(vaddr)]));
352 pde64_t * pd = (pde64_t *)page_ptr;
353 PrintPDE64(vaddr, &(pd[PDE64_INDEX(vaddr)]));
358 pte64_t * pt = (pte64_t *)page_ptr;
359 PrintPTE64(vaddr, &(pt[PTE64_INDEX(vaddr)]));
367 pdpe32pae_t * pdp = (pdpe32pae_t *)page_ptr;
368 PrintPDPE32PAE(vaddr, &(pdp[PDPE32PAE_INDEX(vaddr)]));
373 pde32pae_t * pd = (pde32pae_t *)page_ptr;
374 PrintPDE32PAE(vaddr, &(pd[PDE32PAE_INDEX(vaddr)]));
379 pte32pae_t * pt = (pte32pae_t *)page_ptr;
380 PrintPTE32PAE(vaddr, &(pt[PTE32PAE_INDEX(vaddr)]));
388 pde32_t * pd = (pde32_t *)page_ptr;
389 PrintPDE32(vaddr, &(pd[PDE32_INDEX(vaddr)]));
394 pte32_t * pt = (pte32_t *)page_ptr;
395 PrintPTE32(vaddr, &(pt[PTE32_INDEX(vaddr)]));
399 PrintDebug("%s %p->%p \n", v3_page_type_to_str(type), (void *)vaddr, (void *)page_pa);
408 void PrintPTEntry(struct guest_info * info, page_type_t type, addr_t vaddr, void * entry) {
409 print_page_tree_cb(info, type, vaddr, PAGE_ADDR_4KB((addr_t)entry), 0, NULL);
413 void PrintHostPageTables(struct guest_info * info, addr_t cr3) {
414 PrintDebug("CR3: %p\n", (void *)cr3);
415 switch (info->cpu_mode) {
417 v3_walk_host_pt_32(info, cr3, print_page_walk_cb, NULL);
420 v3_walk_host_pt_32pae(info, cr3, print_page_walk_cb, NULL);
425 v3_walk_host_pt_64(info, cr3, print_page_walk_cb, NULL);
428 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
434 void PrintGuestPageTables(struct guest_info * info, addr_t cr3) {
435 PrintDebug("CR3: %p\n", (void *)cr3);
436 switch (info->cpu_mode) {
438 v3_walk_guest_pt_32(info, cr3, print_page_walk_cb, NULL);
441 v3_walk_guest_pt_32pae(info, cr3, print_page_walk_cb, NULL);
446 v3_walk_guest_pt_64(info, cr3, print_page_walk_cb, NULL);
449 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
454 void PrintHostPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3) {
455 PrintDebug("CR3: %p\n", (void *)cr3);
456 switch (info->cpu_mode) {
458 v3_drill_host_pt_32(info, cr3, virtual_addr, print_page_tree_cb, NULL);
461 v3_drill_host_pt_32pae(info, cr3, virtual_addr, print_page_tree_cb, NULL);
466 v3_drill_host_pt_64(info, cr3, virtual_addr, print_page_tree_cb, NULL);
469 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
474 void PrintGuestPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3) {
475 PrintDebug("CR3: %p\n", (void *)cr3);
476 switch (info->cpu_mode) {
478 v3_drill_guest_pt_32(info, cr3, virtual_addr, print_page_tree_cb, NULL);
481 v3_drill_guest_pt_32pae(info, cr3, virtual_addr, print_page_tree_cb, NULL);
486 v3_drill_guest_pt_64(info, cr3, virtual_addr, print_page_tree_cb, NULL);
489 PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));