x86_64: kernel: cleanup of page table dumping.
authorSimon Gerber <simon.gerber@hp.com>
Mon, 4 Aug 2014 22:52:02 +0000 (15:52 -0700)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Mon, 4 May 2015 09:28:14 +0000 (11:28 +0200)
paging_dump_tables now finds the first pml4 entry of the "identity"-mapped RAM
and stops displaying page tables for all of it based on the offset configured
in /kernel/include/arch/x86_64/offset_targets.h.

We now also properly cast the base addresses of large/huge pages to genpaddr_t
before bitshifting to avoid sign extending. This is necessary because
bitfield fields are implicitly plain ints.

Signed-off-by: Simon Gerber <simon.gerber@hp.com>

kernel/arch/x86_64/page_mappings_arch.c

index 4cfda58..03228ed 100644 (file)
@@ -482,8 +482,9 @@ void paging_dump_tables(struct dcb *dispatcher)
 {
     lvaddr_t root_pt = local_phys_to_mem(dispatcher->vspace);
     union x86_64_ptable_entry *pt;
-    // loop over pdpts (ignore kernel space 508--511)
-    for (int pdpt_index = 0; pdpt_index < X86_64_PTABLE_SIZE-4; pdpt_index++) {
+    // loop over pdpts (ignore kernel space)
+    int first_kernel_pml4e = X86_64_PML4_BASE(X86_64_MEMORY_OFFSET);
+    for (int pdpt_index = 0; pdpt_index < first_kernel_pml4e; pdpt_index++) {
 
         union x86_64_pdir_entry *pdpt = (union x86_64_pdir_entry *)root_pt + pdpt_index;
         if (!pdpt->raw) { continue; }
@@ -498,7 +499,7 @@ void paging_dump_tables(struct dcb *dispatcher)
             // check if pdir or huge page
             if (pt->huge.always1) {
                 // is huge page mapping
-                genpaddr_t paddr = pt->huge.base_addr << 30;
+                genpaddr_t paddr = (genpaddr_t)pt->huge.base_addr << HUGE_PAGE_BITS;
                 printf("%d.%d: 0x%"PRIxGENPADDR"\n", pdpt_index, pdir_index, paddr);
                 // goto next pdpt entry
                 continue;
@@ -511,10 +512,10 @@ void paging_dump_tables(struct dcb *dispatcher)
                 union x86_64_pdir_entry *ptable = (union x86_64_pdir_entry *)pdir_lv + ptable_index;
                 pt = (union x86_64_ptable_entry *)ptable;
                 if (!ptable->raw) { continue; }
-                // check if pdir or huge page
+                // check if ptable or large page
                 if (pt->large.always1) {
-                    // is huge page mapping
-                    genpaddr_t paddr = pt->large.base_addr << 21;
+                    // is large page mapping
+                    genpaddr_t paddr = (genpaddr_t)pt->large.base_addr << LARGE_PAGE_BITS;
                     printf("%d.%d.%d: 0x%"PRIxGENPADDR"\n", pdpt_index, pdir_index, ptable_index, paddr);
                     // goto next pdir entry
                     continue;