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

powerpc/ptdump: Dump PXX level info for kernel_page_tables

This patch adds PGD/PUD/PMD/PTE level information while dumping kernel
page tables. Before this patch it was hard to identify which entries
belongs to which page table level e.g.

~ # dmesg |grep -i radix
[0.000000] radix-mmu: Mapped 0x0000000000000000-0x0000000005400000 with 2.00 MiB pages (exec)
[0.000000] radix-mmu: Mapped 0x0000000005400000-0x0000000040000000 with 2.00 MiB pages
[0.000000] radix-mmu: Mapped 0x0000000040000000-0x0000000100000000 with 1.00 GiB pages
[0.000000] radix-mmu: Initializing Radix MMU

Before:
---[ Start of kernel VM ]---
0xc000000000000000-0xc000000003ffffff XXX 64M r X pte valid present dirty accessed
0xc000000004000000-0xc00000003fffffff XXX 960M r w pte valid present dirty accessed
0xc000000040000000-0xc0000000ffffffff XXX 3G r w pte valid present dirty accessed
...
---[ vmemmap start ]---
0xc00c000000000000-0xc00c0000003fffff XXX 4M r w pte valid present dirty accessed

After:
---[ Start of kernel VM ]---
0xc000000000000000-0xc000000003ffffff XXX 64M PMD r X pte valid present dirty accessed
0xc000000004000000-0xc00000003fffffff XXX 960M PMD r w pte valid present dirty accessed
0xc000000040000000-0xc0000000ffffffff XXX 3G PUD r w pte valid present dirty accessed
...
---[ vmemmap start ]---
0xc00c000000000000-0xc00c0000003fffff XXX 4M PMD r w pte valid present dirty accessed

Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/95defb675ee5607ef3923a1e6aeac39311b8fad4.1761834163.git.ritesh.list@gmail.com

authored by

Ritesh Harjani (IBM) and committed by
Madhavan Srinivasan
3d44be29 6394f0e8

+17
+5
arch/powerpc/mm/ptdump/8xx.c
··· 71 71 72 72 struct ptdump_pg_level pg_level[5] = { 73 73 { /* pgd */ 74 + .name = "PGD", 74 75 .flag = flag_array, 75 76 .num = ARRAY_SIZE(flag_array), 76 77 }, { /* p4d */ 78 + .name = "P4D", 77 79 .flag = flag_array, 78 80 .num = ARRAY_SIZE(flag_array), 79 81 }, { /* pud */ 82 + .name = "PUD", 80 83 .flag = flag_array, 81 84 .num = ARRAY_SIZE(flag_array), 82 85 }, { /* pmd */ 86 + .name = "PMD", 83 87 .flag = flag_array, 84 88 .num = ARRAY_SIZE(flag_array), 85 89 }, { /* pte */ 90 + .name = "PTE", 86 91 .flag = flag_array, 87 92 .num = ARRAY_SIZE(flag_array), 88 93 },
+5
arch/powerpc/mm/ptdump/book3s64.c
··· 104 104 105 105 struct ptdump_pg_level pg_level[5] = { 106 106 { /* pgd */ 107 + .name = "PGD", 107 108 .flag = flag_array, 108 109 .num = ARRAY_SIZE(flag_array), 109 110 }, { /* p4d */ 111 + .name = "P4D", 110 112 .flag = flag_array, 111 113 .num = ARRAY_SIZE(flag_array), 112 114 }, { /* pud */ 115 + .name = "PUD", 113 116 .flag = flag_array, 114 117 .num = ARRAY_SIZE(flag_array), 115 118 }, { /* pmd */ 119 + .name = "PMD", 116 120 .flag = flag_array, 117 121 .num = ARRAY_SIZE(flag_array), 118 122 }, { /* pte */ 123 + .name = "PTE", 119 124 .flag = flag_array, 120 125 .num = ARRAY_SIZE(flag_array), 121 126 },
+1
arch/powerpc/mm/ptdump/ptdump.c
··· 178 178 pt_dump_seq_printf(st->seq, REG "-" REG " ", st->start_address, addr - 1); 179 179 pt_dump_seq_printf(st->seq, " " REG " ", st->start_pa); 180 180 pt_dump_size(st->seq, addr - st->start_address); 181 + pt_dump_seq_printf(st->seq, "%s ", pg_level[st->level].name); 181 182 } 182 183 183 184 static void note_prot_wx(struct pg_state *st, unsigned long addr)
+1
arch/powerpc/mm/ptdump/ptdump.h
··· 13 13 14 14 struct ptdump_pg_level { 15 15 const struct flag_info *flag; 16 + char name[4]; 16 17 size_t num; 17 18 u64 mask; 18 19 };
+5
arch/powerpc/mm/ptdump/shared.c
··· 69 69 70 70 struct ptdump_pg_level pg_level[5] = { 71 71 { /* pgd */ 72 + .name = "PGD", 72 73 .flag = flag_array, 73 74 .num = ARRAY_SIZE(flag_array), 74 75 }, { /* p4d */ 76 + .name = "P4D", 75 77 .flag = flag_array, 76 78 .num = ARRAY_SIZE(flag_array), 77 79 }, { /* pud */ 80 + .name = "PUD", 78 81 .flag = flag_array, 79 82 .num = ARRAY_SIZE(flag_array), 80 83 }, { /* pmd */ 84 + .name = "PMD", 81 85 .flag = flag_array, 82 86 .num = ARRAY_SIZE(flag_array), 83 87 }, { /* pte */ 88 + .name = "PTE", 84 89 .flag = flag_array, 85 90 .num = ARRAY_SIZE(flag_array), 86 91 },