{ "ASCE", "PGD", "PUD", "PMD", "PTE" };
 
        seq_printf(m, "%s ", level_name[level]);
-       if (pr & _PAGE_INVALID)
+       if (pr & _PAGE_INVALID) {
                seq_printf(m, "I\n");
-       else
-               seq_printf(m, "%s\n", pr & _PAGE_RO ? "RO" : "RW");
+               return;
+       }
+       seq_printf(m, "%s", pr & _PAGE_RO ? "RO " : "RW ");
+       seq_printf(m, "%s", pr & _PAGE_CO ? "CO " : "   ");
+       seq_putc(m, '\n');
 }
 
 static void note_page(struct seq_file *m, struct pg_state *st,
        }
 }
 
+#ifdef CONFIG_64BIT
+#define _PMD_PROT_MASK (_SEGMENT_ENTRY_RO | _SEGMENT_ENTRY_CO)
+#else
+#define _PMD_PROT_MASK 0
+#endif
+
 static void walk_pmd_level(struct seq_file *m, struct pg_state *st,
                           pud_t *pud, unsigned long addr)
 {
                pmd = pmd_offset(pud, addr);
                if (!pmd_none(*pmd)) {
                        if (pmd_large(*pmd)) {
-                               prot = pmd_val(*pmd) & _SEGMENT_ENTRY_RO;
+                               prot = pmd_val(*pmd) & _PMD_PROT_MASK;
                                note_page(m, st, prot, 3);
                        } else
                                walk_pte_level(m, st, pmd, addr);
        }
 }
 
+#ifdef CONFIG_64BIT
+#define _PUD_PROT_MASK (_REGION3_ENTRY_RO | _REGION3_ENTRY_CO)
+#else
+#define _PUD_PROT_MASK 0
+#endif
+
 static void walk_pud_level(struct seq_file *m, struct pg_state *st,
                           pgd_t *pgd, unsigned long addr)
 {
                pud = pud_offset(pgd, addr);
                if (!pud_none(*pud))
                        if (pud_large(*pud)) {
-                               prot = pud_val(*pud) & _PAGE_RO;
+                               prot = pud_val(*pud) & _PUD_PROT_MASK;
                                note_page(m, st, prot, 2);
                        } else
                                walk_pmd_level(m, st, pud, addr);