x86: Support PAT bit in pagetable dump for lower levels
authorJuergen Gross <jgross@suse.com>
Mon, 3 Nov 2014 13:02:01 +0000 (14:02 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Sun, 16 Nov 2014 10:04:26 +0000 (11:04 +0100)
Dumping page table protection bits is not correct for entries on levels
2 and 3 regarding the PAT bit, which is at a different position as on
level 4.

Based-on-patch-by: Stefan Bader <stefan.bader@canonical.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Cc: stefan.bader@canonical.com
Cc: xen-devel@lists.xensource.com
Cc: konrad.wilk@oracle.com
Cc: ville.syrjala@linux.intel.com
Cc: david.vrabel@citrix.com
Cc: jbeulich@suse.com
Cc: toshi.kani@hp.com
Cc: plagnioj@jcrosoft.com
Cc: tomi.valkeinen@ti.com
Cc: bhelgaas@google.com
Link: http://lkml.kernel.org/r/1415019724-4317-16-git-send-email-jgross@suse.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/mm/dump_pagetables.c

index 95a427e57887a664af5f1f7d01df90a7a9dd7d34..6c2ca03a5346a7cce8de1bf8d7ea70490941cec9 100644 (file)
@@ -126,7 +126,7 @@ static void printk_prot(struct seq_file *m, pgprot_t prot, int level, bool dmsg)
 
        if (!pgprot_val(prot)) {
                /* Not present */
-               pt_dump_cont_printf(m, dmsg, "                          ");
+               pt_dump_cont_printf(m, dmsg, "                              ");
        } else {
                if (pr & _PAGE_USER)
                        pt_dump_cont_printf(m, dmsg, "USR ");
@@ -145,18 +145,16 @@ static void printk_prot(struct seq_file *m, pgprot_t prot, int level, bool dmsg)
                else
                        pt_dump_cont_printf(m, dmsg, "    ");
 
-               /* Bit 9 has a different meaning on level 3 vs 4 */
-               if (level <= 3) {
-                       if (pr & _PAGE_PSE)
-                               pt_dump_cont_printf(m, dmsg, "PSE ");
-                       else
-                               pt_dump_cont_printf(m, dmsg, "    ");
-               } else {
-                       if (pr & _PAGE_PAT)
-                               pt_dump_cont_printf(m, dmsg, "pat ");
-                       else
-                               pt_dump_cont_printf(m, dmsg, "    ");
-               }
+               /* Bit 7 has a different meaning on level 3 vs 4 */
+               if (level <= 3 && pr & _PAGE_PSE)
+                       pt_dump_cont_printf(m, dmsg, "PSE ");
+               else
+                       pt_dump_cont_printf(m, dmsg, "    ");
+               if ((level == 4 && pr & _PAGE_PAT) ||
+                   ((level == 3 || level == 2) && pr & _PAGE_PAT_LARGE))
+                       pt_dump_cont_printf(m, dmsg, "pat ");
+               else
+                       pt_dump_cont_printf(m, dmsg, "    ");
                if (pr & _PAGE_GLOBAL)
                        pt_dump_cont_printf(m, dmsg, "GLB ");
                else