2 #ifdef USE_VMM_PAGING_DEBUG
6 * This is an implementation file that gets included only in vmm_paging.c
11 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 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 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 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 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 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 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 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 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)),
186 void PrintPD32(pde32_t * pde)
190 PrintDebug("Page Directory at %p:\n", pde);
191 for (i = 0; (i < MAX_PDE32_ENTRIES); i++) {
192 if ( pde[i].present) {
193 PrintPDE32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), &(pde[i]));
198 void PrintPT32(addr_t starting_address, pte32_t * pte)
202 PrintDebug("Page Table at %p:\n", pte);
203 for (i = 0; (i < MAX_PTE32_ENTRIES) ; i++) {
204 if (pte[i].present) {
205 PrintPTE32(starting_address + (PAGE_SIZE * i), &(pte[i]));
216 void PrintDebugPageTables(pde32_t * pde)
220 PrintDebug("Dumping the pages starting with the pde page at %p\n", pde);
222 for (i = 0; (i < MAX_PDE32_ENTRIES); i++) {
223 if (pde[i].present) {
224 PrintPDE32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), &(pde[i]));
225 PrintPT32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), (pte32_t *)V3_VAddr((void *)(addr_t)(pde[i].pt_base_addr << PAGE_POWER)));
233 void PrintDebugPageTables32PAE(pdpe32pae_t * pdpe)
238 addr_t virtual_addr = 0;
240 PrintDebug("Dumping the pages starting with the pde page at %p\n", pdpe);
242 for (i = 0; (i < MAX_PDPE32PAE_ENTRIES); i++) {
244 if (pdpe[i].present) {
245 pde = (pde32pae_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pdpe[i].pd_base_addr));
247 PrintPDPE32PAE(virtual_addr, &(pdpe[i]));
249 for (j = 0; j < MAX_PDE32PAE_ENTRIES; j++) {
251 if (pde[j].present) {
252 pte = (pte32pae_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pde[j].pt_base_addr));
254 PrintPDE32PAE(virtual_addr, &(pde[j]));
256 for (k = 0; k < MAX_PTE32PAE_ENTRIES; k++) {
257 if (pte[k].present) {
258 PrintPTE32PAE(virtual_addr, &(pte[k]));
261 virtual_addr += PAGE_SIZE;
264 virtual_addr += PAGE_SIZE * MAX_PTE32PAE_ENTRIES;
268 virtual_addr += PAGE_SIZE * MAX_PDE32PAE_ENTRIES * MAX_PTE32PAE_ENTRIES;
277 void PrintPageTree_64(addr_t virtual_addr, pml4e64_t * pml) {
278 uint_t pml4_index = PML4E64_INDEX(virtual_addr);
279 uint_t pdpe_index = PDPE64_INDEX(virtual_addr);
280 uint_t pde_index = PDE64_INDEX(virtual_addr);
281 uint_t pte_index = PTE64_INDEX(virtual_addr);
283 PrintPML4e64(virtual_addr, &(pml[pml4_index]));
284 if (pml[pml4_index].present) {
285 pdpe64_t * pdpe = (pdpe64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pml[pml4_index].pdp_base_addr));
286 PrintPDPE64(virtual_addr, &(pdpe[pdpe_index]));
288 if (pdpe[pdpe_index].present) {
289 pde64_t * pde = (pde64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pdpe[pdpe_index].pd_base_addr));
290 PrintPDE64(virtual_addr, &(pde[pde_index]));
292 if (pde[pde_index].present) {
293 pte64_t * pte = (pte64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pde[pde_index].pt_base_addr));
294 PrintPTE64(virtual_addr, &(pte[pte_index]));
306 void PrintPageTree(v3_vm_cpu_mode_t cpu_mode, addr_t virtual_addr, addr_t cr3) {
311 PrintPageTree_64(virtual_addr, CR3_TO_PML4E64_VA(cr3));
314 PrintError("Unsupported CPU MODE %d\n", cpu_mode);