Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/page table dumper: add support for change-recording override bit

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

authored by

Heiko Carstens and committed by
Martin Schwidefsky
1819ed1f 2a7d2b96

+22 -5
+2
arch/s390/include/asm/pgtable.h
··· 340 340 #define _REGION3_ENTRY_EMPTY (_REGION_ENTRY_TYPE_R3 | _REGION_ENTRY_INV) 341 341 342 342 #define _REGION3_ENTRY_LARGE 0x400 /* RTTE-format control, large page */ 343 + #define _REGION3_ENTRY_RO 0x200 /* page protection bit */ 344 + #define _REGION3_ENTRY_CO 0x100 /* change-recording override */ 343 345 344 346 /* Bits in the segment table entry */ 345 347 #define _SEGMENT_ENTRY_ORIGIN ~0x7ffUL/* segment table origin */
+20 -5
arch/s390/mm/dump_pagetables.c
··· 49 49 { "ASCE", "PGD", "PUD", "PMD", "PTE" }; 50 50 51 51 seq_printf(m, "%s ", level_name[level]); 52 - if (pr & _PAGE_INVALID) 52 + if (pr & _PAGE_INVALID) { 53 53 seq_printf(m, "I\n"); 54 - else 55 - seq_printf(m, "%s\n", pr & _PAGE_RO ? "RO" : "RW"); 54 + return; 55 + } 56 + seq_printf(m, "%s", pr & _PAGE_RO ? "RO " : "RW "); 57 + seq_printf(m, "%s", pr & _PAGE_CO ? "CO " : " "); 58 + seq_putc(m, '\n'); 56 59 } 57 60 58 61 static void note_page(struct seq_file *m, struct pg_state *st, ··· 128 125 } 129 126 } 130 127 128 + #ifdef CONFIG_64BIT 129 + #define _PMD_PROT_MASK (_SEGMENT_ENTRY_RO | _SEGMENT_ENTRY_CO) 130 + #else 131 + #define _PMD_PROT_MASK 0 132 + #endif 133 + 131 134 static void walk_pmd_level(struct seq_file *m, struct pg_state *st, 132 135 pud_t *pud, unsigned long addr) 133 136 { ··· 146 137 pmd = pmd_offset(pud, addr); 147 138 if (!pmd_none(*pmd)) { 148 139 if (pmd_large(*pmd)) { 149 - prot = pmd_val(*pmd) & _SEGMENT_ENTRY_RO; 140 + prot = pmd_val(*pmd) & _PMD_PROT_MASK; 150 141 note_page(m, st, prot, 3); 151 142 } else 152 143 walk_pte_level(m, st, pmd, addr); ··· 155 146 addr += PMD_SIZE; 156 147 } 157 148 } 149 + 150 + #ifdef CONFIG_64BIT 151 + #define _PUD_PROT_MASK (_REGION3_ENTRY_RO | _REGION3_ENTRY_CO) 152 + #else 153 + #define _PUD_PROT_MASK 0 154 + #endif 158 155 159 156 static void walk_pud_level(struct seq_file *m, struct pg_state *st, 160 157 pgd_t *pgd, unsigned long addr) ··· 174 159 pud = pud_offset(pgd, addr); 175 160 if (!pud_none(*pud)) 176 161 if (pud_large(*pud)) { 177 - prot = pud_val(*pud) & _PAGE_RO; 162 + prot = pud_val(*pud) & _PUD_PROT_MASK; 178 163 note_page(m, st, prot, 2); 179 164 } else 180 165 walk_pmd_level(m, st, pud, addr);