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),
55 void PrintPD32(pde32_t * pde)
59 PrintDebug("Page Directory at %p:\n", pde);
60 for (i = 0; (i < MAX_PDE32_ENTRIES); i++) {
61 if ( pde[i].present) {
62 PrintPDE32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), &(pde[i]));
67 void PrintPT32(addr_t starting_address, pte32_t * pte)
71 PrintDebug("Page Table at %p:\n", pte);
72 for (i = 0; (i < MAX_PTE32_ENTRIES) ; i++) {
74 PrintPTE32(starting_address + (PAGE_SIZE * i), &(pte[i]));
85 void PrintDebugPageTables(pde32_t * pde)
89 PrintDebug("Dumping the pages starting with the pde page at %p\n", pde);
91 for (i = 0; (i < MAX_PDE32_ENTRIES); i++) {
93 PrintPDE32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), &(pde[i]));
94 PrintPT32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), (pte32_t *)V3_VAddr((void *)(addr_t)(pde[i].pt_base_addr << PAGE_POWER)));
106 void PrintPDPE32PAE(addr_t virtual_address, pdpe32pae_t * pdpe)
108 PrintDebug("PDPE %p -> %p : present=%x, wt=%x, cd=%x, accessed=%x, kernelInfo=%x\n",
109 (void *)virtual_address,
110 (void *)(addr_t) (pdpe->pd_base_addr << PAGE_POWER),
118 void PrintPDE32PAE(addr_t virtual_address, pde32pae_t * pde)
120 PrintDebug("PDE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
121 (void *)virtual_address,
122 (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
135 void PrintPTE32PAE(addr_t virtual_address, pte32pae_t * pte)
137 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",
138 (void *)virtual_address,
139 (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
157 void PrintDebugPageTables32PAE(pdpe32pae_t * pdpe)
162 addr_t virtual_addr = 0;
164 PrintDebug("Dumping the pages starting with the pde page at %p\n", pdpe);
166 for (i = 0; (i < MAX_PDPE32PAE_ENTRIES); i++) {
168 if (pdpe[i].present) {
169 pde = (pde32pae_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pdpe[i].pd_base_addr));
171 PrintPDPE32PAE(virtual_addr, &(pdpe[i]));
173 for (j = 0; j < MAX_PDE32PAE_ENTRIES; j++) {
175 if (pde[j].present) {
176 pte = (pte32pae_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pde[j].pt_base_addr));
178 PrintPDE32PAE(virtual_addr, &(pde[j]));
180 for (k = 0; k < MAX_PTE32PAE_ENTRIES; k++) {
181 if (pte[k].present) {
182 PrintPTE32PAE(virtual_addr, &(pte[k]));
185 virtual_addr += PAGE_SIZE;
188 virtual_addr += PAGE_SIZE * MAX_PTE32PAE_ENTRIES;
192 virtual_addr += PAGE_SIZE * MAX_PDE32PAE_ENTRIES * MAX_PTE32PAE_ENTRIES;
199 void PrintPML4e64(addr_t virtual_address, pml4e64_t * pml)
201 PrintDebug("PML4e64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, kernelInfo=%x\n",
202 (void *)virtual_address,
203 (void *)(addr_t) (BASE_TO_PAGE_ADDR(pml->pdp_base_addr)),
214 void PrintPDPE64(addr_t virtual_address, pdpe64_t * pdpe)
216 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",
217 (void *)virtual_address,
218 (void *)(addr_t) (BASE_TO_PAGE_ADDR(pdpe->pd_base_addr)),
233 void PrintPDE64(addr_t virtual_address, pde64_t * pde)
235 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",
236 (void *)virtual_address,
237 (void *)(addr_t) (BASE_TO_PAGE_ADDR(pde->pt_base_addr)),
251 void PrintPTE64(addr_t virtual_address, pte64_t * pte)
253 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",
254 (void *)virtual_address,
255 (void*)(addr_t)(BASE_TO_PAGE_ADDR(pte->page_base_addr)),
272 void PrintPageTree_64(addr_t virtual_addr, pml4e64_t * pml) {
273 uint_t pml4_index = PML4E64_INDEX(virtual_addr);
274 uint_t pdpe_index = PDPE64_INDEX(virtual_addr);
275 uint_t pde_index = PDE64_INDEX(virtual_addr);
276 uint_t pte_index = PTE64_INDEX(virtual_addr);
278 PrintPML4e64(virtual_addr, &(pml[pml4_index]));
279 if (pml[pml4_index].present) {
280 pdpe64_t * pdpe = (pdpe64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pml[pml4_index].pdp_base_addr));
281 PrintPDPE64(virtual_addr, &(pdpe[pdpe_index]));
283 if (pdpe[pdpe_index].present) {
284 pde64_t * pde = (pde64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pdpe[pdpe_index].pd_base_addr));
285 PrintPDE64(virtual_addr, &(pde[pde_index]));
287 if (pde[pde_index].present) {
288 pte64_t * pte = (pte64_t *)V3_VAddr((void *)(addr_t)BASE_TO_PAGE_ADDR(pde[pde_index].pt_base_addr));
289 PrintPTE64(virtual_addr, &(pte[pte_index]));
301 void PrintPageTree(v3_vm_cpu_mode_t cpu_mode, addr_t virtual_addr, addr_t cr3) {
306 PrintPageTree_64(virtual_addr, CR3_TO_PML4E64_VA(cr3));
309 PrintError("Unsupported CPU MODE %d\n", cpu_mode);