]> git.corax.cc Git - corax/commitdiff
Add code for debugging of PAE paging structures
authorMatthias Kruk <m@m10k.eu>
Fri, 20 Sep 2019 06:15:59 +0000 (15:15 +0900)
committerMatthias Kruk <m@m10k.eu>
Fri, 20 Sep 2019 06:15:59 +0000 (15:15 +0900)
kernel/arch/paging.c

index 8a9e0425e4e092cb46125d8b7c7876d132e4e6fb..ee1587bfa4421def52becbe61dd3291c2c4316c1 100644 (file)
@@ -179,10 +179,53 @@ static void _pg_dir_debug_arch(pg_dir_t *pd)
                break;
        }
 
-       case PG_MODE_PAE:
+       case PG_MODE_PAE: {
+               struct pdpt *dir;
+               u32_t i;
+
+               dir = (struct pdpt*)pd->pd_base;
+
+               for(i = 0; i < 4; i++) {
+                       struct pae_page_table *tbl;
+                       int j;
+
+                       if(!(dir->pdpt_entries[i] & PAGE_ATTR_PRESENT)) {
+                               continue;
+                       }
+
+                       dbg_printf("cr3[%01u]           = 0x%016llx\n", i, dir->pdpt_entries[i]);
+                       tbl = (struct pae_page_table*)((unsigned long)dir->pdpt_entries[i] & ~0xfff);
+
+                       for(j = 0; j < 512; j++) {
+                               struct pae_page_table *ttbl;
+                               int k;
+
+                               if(!(tbl->ppt_entries[j] & PAGE_ATTR_PRESENT)) {
+                                       continue;
+                               }
+
+                               dbg_printf("cr3[%01u][%03u]      = 0x%016llx\n", i, j, tbl->ppt_entries[j]);
+
+                               if(!(tbl->ppt_entries[j] & PAGE_ATTR_SIZE)) {
+                                       ttbl = (struct pae_page_table*)((unsigned long)tbl->ppt_entries[j] & ~0xfff);
+
+                                       for(k = 0; k < 512; k++) {
+                                               if(!(ttbl->ppt_entries[k] & PAGE_ATTR_PRESENT)) {
+                                                       continue;
+                                               }
+
+                                               dbg_printf("cr3[%01u][%03u][%03u] = 0x%016llx\n",
+                                                                  i, j, k, ttbl->ppt_entries[k]);
+                                       }
+                               }
+                       }
+               }
+
                break;
        }
 
+       }
+
        return;
 }
 #endif /* FEATURE(DEBUG) */