]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
powerpc/ptdump: Dump PXX level info for kernel_page_tables
authorRitesh Harjani (IBM) <ritesh.list@gmail.com>
Thu, 30 Oct 2025 14:57:34 +0000 (20:27 +0530)
committerMadhavan Srinivasan <maddy@linux.ibm.com>
Tue, 18 Nov 2025 07:05:53 +0000 (12:35 +0530)
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
arch/powerpc/mm/ptdump/8xx.c
arch/powerpc/mm/ptdump/book3s64.c
arch/powerpc/mm/ptdump/ptdump.c
arch/powerpc/mm/ptdump/ptdump.h
arch/powerpc/mm/ptdump/shared.c

index 4ca9cf7a90c9eb45718856b2eaaeef8541c0ffba..ff845f25172443e71d28b55c6bb55a5d92158d22 100644 (file)
@@ -71,18 +71,23 @@ static const struct flag_info flag_array[] = {
 
 struct ptdump_pg_level pg_level[5] = {
        { /* pgd */
+               .name   = "PGD",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* p4d */
+               .name   = "P4D",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* pud */
+               .name   = "PUD",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* pmd */
+               .name   = "PMD",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* pte */
+               .name   = "PTE",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        },
index 6b2da9241d4c48b2a76e97ce451911da2364b3d6..e8a21c6dc32e46c7fcb7bc5db7bdb8667042e73a 100644 (file)
@@ -104,18 +104,23 @@ static const struct flag_info flag_array[] = {
 
 struct ptdump_pg_level pg_level[5] = {
        { /* pgd */
+               .name   = "PGD",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* p4d */
+               .name   = "P4D",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* pud */
+               .name   = "PUD",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* pmd */
+               .name   = "PMD",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* pte */
+               .name   = "PTE",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        },
index b2358d794855caea08abafbafcd854ab678504eb..0d499aebee72fff4e448348fd610eb48c62628e5 100644 (file)
@@ -178,6 +178,7 @@ static void dump_addr(struct pg_state *st, unsigned long addr)
        pt_dump_seq_printf(st->seq, REG "-" REG " ", st->start_address, addr - 1);
        pt_dump_seq_printf(st->seq, " " REG " ", st->start_pa);
        pt_dump_size(st->seq, addr - st->start_address);
+       pt_dump_seq_printf(st->seq, "%s ", pg_level[st->level].name);
 }
 
 static void note_prot_wx(struct pg_state *st, unsigned long addr)
index 4232aa4b57eae2c3fa63de8ebc70a26229f02cc4..12aa9eca8b0cc896bf5a5438c95d7277d00002be 100644 (file)
@@ -13,6 +13,7 @@ struct flag_info {
 
 struct ptdump_pg_level {
        const struct flag_info *flag;
+       char name[4];
        size_t num;
        u64 mask;
 };
index 58998960eb9a4fbc4502ed67dd650ca0ae693750..edc69da19b853e484c6e601bdc96949f03265eb8 100644 (file)
@@ -69,18 +69,23 @@ static const struct flag_info flag_array[] = {
 
 struct ptdump_pg_level pg_level[5] = {
        { /* pgd */
+               .name   = "PGD",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* p4d */
+               .name   = "P4D",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* pud */
+               .name   = "PUD",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* pmd */
+               .name   = "PMD",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        }, { /* pte */
+               .name   = "PTE",
                .flag   = flag_array,
                .num    = ARRAY_SIZE(flag_array),
        },