powerpc/mm: Split dump_pagelinuxtables flag_array table
authorChristophe Leroy <christophe.leroy@c-s.fr>
Tue, 9 Oct 2018 13:51:58 +0000 (13:51 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 14 Oct 2018 07:04:09 +0000 (18:04 +1100)
To reduce the complexity of flag_array, and allow the removal of
default 0 value of non existing flags, lets have one flag_array
table for each platform family with only the really existing flags.

Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/Makefile
arch/powerpc/mm/dump_linuxpagetables-8xx.c [new file with mode: 0644]
arch/powerpc/mm/dump_linuxpagetables-book3s64.c [new file with mode: 0644]
arch/powerpc/mm/dump_linuxpagetables-generic.c [new file with mode: 0644]
arch/powerpc/mm/dump_linuxpagetables.c
arch/powerpc/mm/dump_linuxpagetables.h [new file with mode: 0644]

index cdf6a996004655d51dbe452bc90af86d11335f7a..3c844bdd16c4ee4e59656cf89f34364543fb9a82 100644 (file)
@@ -43,5 +43,12 @@ obj-$(CONFIG_HIGHMEM)                += highmem.o
 obj-$(CONFIG_PPC_COPRO_BASE)   += copro_fault.o
 obj-$(CONFIG_SPAPR_TCE_IOMMU)  += mmu_context_iommu.o
 obj-$(CONFIG_PPC_PTDUMP)       += dump_linuxpagetables.o
+ifdef CONFIG_PPC_PTDUMP
+obj-$(CONFIG_4xx)              += dump_linuxpagetables-generic.o
+obj-$(CONFIG_PPC_8xx)          += dump_linuxpagetables-8xx.o
+obj-$(CONFIG_PPC_BOOK3E_MMU)   += dump_linuxpagetables-generic.o
+obj-$(CONFIG_PPC_BOOK3S_32)    += dump_linuxpagetables-generic.o
+obj-$(CONFIG_PPC_BOOK3S_64)    += dump_linuxpagetables-book3s64.o
+endif
 obj-$(CONFIG_PPC_HTDUMP)       += dump_hashpagetable.o
 obj-$(CONFIG_PPC_MEM_KEYS)     += pkeys.o
diff --git a/arch/powerpc/mm/dump_linuxpagetables-8xx.c b/arch/powerpc/mm/dump_linuxpagetables-8xx.c
new file mode 100644 (file)
index 0000000..33f52a9
--- /dev/null
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * From split of dump_linuxpagetables.c
+ * Copyright 2016, Rashmica Gupta, IBM Corp.
+ *
+ */
+#include <linux/kernel.h>
+#include <asm/pgtable.h>
+
+#include "dump_linuxpagetables.h"
+
+static const struct flag_info flag_array[] = {
+       {
+               .mask   = _PAGE_PRIVILEGED,
+               .val    = 0,
+               .set    = "user",
+               .clear  = "    ",
+       }, {
+               .mask   = _PAGE_RO | _PAGE_NA,
+               .val    = 0,
+               .set    = "rw",
+       }, {
+               .mask   = _PAGE_RO | _PAGE_NA,
+               .val    = _PAGE_RO,
+               .set    = "r ",
+       }, {
+               .mask   = _PAGE_RO | _PAGE_NA,
+               .val    = _PAGE_NA,
+               .set    = "  ",
+       }, {
+               .mask   = _PAGE_EXEC,
+               .val    = _PAGE_EXEC,
+               .set    = " X ",
+               .clear  = "   ",
+       }, {
+               .mask   = _PAGE_PRESENT,
+               .val    = _PAGE_PRESENT,
+               .set    = "present",
+               .clear  = "       ",
+       }, {
+               .mask   = _PAGE_GUARDED,
+               .val    = _PAGE_GUARDED,
+               .set    = "guarded",
+               .clear  = "       ",
+       }, {
+               .mask   = _PAGE_DIRTY,
+               .val    = _PAGE_DIRTY,
+               .set    = "dirty",
+               .clear  = "     ",
+       }, {
+               .mask   = _PAGE_ACCESSED,
+               .val    = _PAGE_ACCESSED,
+               .set    = "accessed",
+               .clear  = "        ",
+       }, {
+               .mask   = _PAGE_NO_CACHE,
+               .val    = _PAGE_NO_CACHE,
+               .set    = "no cache",
+               .clear  = "        ",
+       }, {
+               .mask   = _PAGE_SPECIAL,
+               .val    = _PAGE_SPECIAL,
+               .set    = "special",
+       }
+};
+
+struct pgtable_level pg_level[5] = {
+       {
+       }, { /* pgd */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       }, { /* pud */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       }, { /* pmd */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       }, { /* pte */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       },
+};
diff --git a/arch/powerpc/mm/dump_linuxpagetables-book3s64.c b/arch/powerpc/mm/dump_linuxpagetables-book3s64.c
new file mode 100644 (file)
index 0000000..a637e61
--- /dev/null
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * From split of dump_linuxpagetables.c
+ * Copyright 2016, Rashmica Gupta, IBM Corp.
+ *
+ */
+#include <linux/kernel.h>
+#include <asm/pgtable.h>
+
+#include "dump_linuxpagetables.h"
+
+static const struct flag_info flag_array[] = {
+       {
+               .mask   = _PAGE_PRIVILEGED,
+               .val    = 0,
+               .set    = "user",
+               .clear  = "    ",
+       }, {
+               .mask   = _PAGE_READ,
+               .val    = _PAGE_READ,
+               .set    = "r",
+               .clear  = " ",
+       }, {
+               .mask   = _PAGE_WRITE,
+               .val    = _PAGE_WRITE,
+               .set    = "w",
+               .clear  = " ",
+       }, {
+               .mask   = _PAGE_EXEC,
+               .val    = _PAGE_EXEC,
+               .set    = " X ",
+               .clear  = "   ",
+       }, {
+               .mask   = _PAGE_PTE,
+               .val    = _PAGE_PTE,
+               .set    = "pte",
+               .clear  = "   ",
+       }, {
+               .mask   = _PAGE_PRESENT,
+               .val    = _PAGE_PRESENT,
+               .set    = "present",
+               .clear  = "       ",
+       }, {
+               .mask   = H_PAGE_HASHPTE,
+               .val    = H_PAGE_HASHPTE,
+               .set    = "hpte",
+               .clear  = "    ",
+       }, {
+               .mask   = _PAGE_DIRTY,
+               .val    = _PAGE_DIRTY,
+               .set    = "dirty",
+               .clear  = "     ",
+       }, {
+               .mask   = _PAGE_ACCESSED,
+               .val    = _PAGE_ACCESSED,
+               .set    = "accessed",
+               .clear  = "        ",
+       }, {
+               .mask   = _PAGE_NON_IDEMPOTENT,
+               .val    = _PAGE_NON_IDEMPOTENT,
+               .set    = "non-idempotent",
+               .clear  = "              ",
+       }, {
+               .mask   = _PAGE_TOLERANT,
+               .val    = _PAGE_TOLERANT,
+               .set    = "tolerant",
+               .clear  = "        ",
+       }, {
+               .mask   = H_PAGE_BUSY,
+               .val    = H_PAGE_BUSY,
+               .set    = "busy",
+       }, {
+#ifdef CONFIG_PPC_64K_PAGES
+               .mask   = H_PAGE_COMBO,
+               .val    = H_PAGE_COMBO,
+               .set    = "combo",
+       }, {
+               .mask   = H_PAGE_4K_PFN,
+               .val    = H_PAGE_4K_PFN,
+               .set    = "4K_pfn",
+       }, {
+#else /* CONFIG_PPC_64K_PAGES */
+               .mask   = H_PAGE_F_GIX,
+               .val    = H_PAGE_F_GIX,
+               .set    = "f_gix",
+               .is_val = true,
+               .shift  = H_PAGE_F_GIX_SHIFT,
+       }, {
+               .mask   = H_PAGE_F_SECOND,
+               .val    = H_PAGE_F_SECOND,
+               .set    = "f_second",
+       }, {
+#endif /* CONFIG_PPC_64K_PAGES */
+               .mask   = _PAGE_SPECIAL,
+               .val    = _PAGE_SPECIAL,
+               .set    = "special",
+       }
+};
+
+struct pgtable_level pg_level[5] = {
+       {
+       }, { /* pgd */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       }, { /* pud */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       }, { /* pmd */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       }, { /* pte */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       },
+};
diff --git a/arch/powerpc/mm/dump_linuxpagetables-generic.c b/arch/powerpc/mm/dump_linuxpagetables-generic.c
new file mode 100644 (file)
index 0000000..1e3829e
--- /dev/null
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * From split of dump_linuxpagetables.c
+ * Copyright 2016, Rashmica Gupta, IBM Corp.
+ *
+ */
+#include <linux/kernel.h>
+#include <asm/pgtable.h>
+
+#include "dump_linuxpagetables.h"
+
+static const struct flag_info flag_array[] = {
+       {
+               .mask   = _PAGE_USER,
+               .val    = _PAGE_USER,
+               .set    = "user",
+               .clear  = "    ",
+       }, {
+               .mask   = _PAGE_RW,
+               .val    = _PAGE_RW,
+               .set    = "rw",
+               .clear  = "r ",
+       }, {
+#ifndef CONFIG_PPC_BOOK3S_32
+               .mask   = _PAGE_EXEC,
+               .val    = _PAGE_EXEC,
+               .set    = " X ",
+               .clear  = "   ",
+       }, {
+#endif
+               .mask   = _PAGE_PRESENT,
+               .val    = _PAGE_PRESENT,
+               .set    = "present",
+               .clear  = "       ",
+       }, {
+               .mask   = _PAGE_GUARDED,
+               .val    = _PAGE_GUARDED,
+               .set    = "guarded",
+               .clear  = "       ",
+       }, {
+               .mask   = _PAGE_DIRTY,
+               .val    = _PAGE_DIRTY,
+               .set    = "dirty",
+               .clear  = "     ",
+       }, {
+               .mask   = _PAGE_ACCESSED,
+               .val    = _PAGE_ACCESSED,
+               .set    = "accessed",
+               .clear  = "        ",
+       }, {
+               .mask   = _PAGE_WRITETHRU,
+               .val    = _PAGE_WRITETHRU,
+               .set    = "write through",
+               .clear  = "             ",
+       }, {
+               .mask   = _PAGE_NO_CACHE,
+               .val    = _PAGE_NO_CACHE,
+               .set    = "no cache",
+               .clear  = "        ",
+       }, {
+               .mask   = _PAGE_SPECIAL,
+               .val    = _PAGE_SPECIAL,
+               .set    = "special",
+       }
+};
+
+struct pgtable_level pg_level[5] = {
+       {
+       }, { /* pgd */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       }, { /* pud */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       }, { /* pmd */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       }, { /* pte */
+               .flag   = flag_array,
+               .num    = ARRAY_SIZE(flag_array),
+       },
+};
index 876e2a3c79f201eb1a86187814efdf35d911e00b..e60aa6d7456d933c285c165fb97153e50db95016 100644 (file)
@@ -27,6 +27,8 @@
 #include <asm/page.h>
 #include <asm/pgalloc.h>
 
+#include "dump_linuxpagetables.h"
+
 #ifdef CONFIG_PPC32
 #define KERN_VIRT_START        0
 #endif
@@ -101,159 +103,6 @@ static struct addr_marker address_markers[] = {
        { -1,   NULL },
 };
 
-struct flag_info {
-       u64             mask;
-       u64             val;
-       const char      *set;
-       const char      *clear;
-       bool            is_val;
-       int             shift;
-};
-
-static const struct flag_info flag_array[] = {
-       {
-               .mask   = _PAGE_USER | _PAGE_PRIVILEGED,
-               .val    = _PAGE_USER,
-               .set    = "user",
-               .clear  = "    ",
-       }, {
-               .mask   = _PAGE_RW | _PAGE_RO | _PAGE_NA,
-               .val    = _PAGE_RW,
-               .set    = "rw",
-       }, {
-               .mask   = _PAGE_RW | _PAGE_RO | _PAGE_NA,
-               .val    = _PAGE_RO,
-               .set    = "ro",
-       }, {
-#if _PAGE_NA != 0
-               .mask   = _PAGE_RW | _PAGE_RO | _PAGE_NA,
-               .val    = _PAGE_RO,
-               .set    = "na",
-       }, {
-#endif
-               .mask   = _PAGE_EXEC,
-               .val    = _PAGE_EXEC,
-               .set    = " X ",
-               .clear  = "   ",
-       }, {
-               .mask   = _PAGE_PTE,
-               .val    = _PAGE_PTE,
-               .set    = "pte",
-               .clear  = "   ",
-       }, {
-               .mask   = _PAGE_PRESENT,
-               .val    = _PAGE_PRESENT,
-               .set    = "present",
-               .clear  = "       ",
-       }, {
-#ifdef CONFIG_PPC_BOOK3S_64
-               .mask   = H_PAGE_HASHPTE,
-               .val    = H_PAGE_HASHPTE,
-#else
-               .mask   = _PAGE_HASHPTE,
-               .val    = _PAGE_HASHPTE,
-#endif
-               .set    = "hpte",
-               .clear  = "    ",
-       }, {
-#ifndef CONFIG_PPC_BOOK3S_64
-               .mask   = _PAGE_GUARDED,
-               .val    = _PAGE_GUARDED,
-               .set    = "guarded",
-               .clear  = "       ",
-       }, {
-#endif
-               .mask   = _PAGE_DIRTY,
-               .val    = _PAGE_DIRTY,
-               .set    = "dirty",
-               .clear  = "     ",
-       }, {
-               .mask   = _PAGE_ACCESSED,
-               .val    = _PAGE_ACCESSED,
-               .set    = "accessed",
-               .clear  = "        ",
-       }, {
-#ifndef CONFIG_PPC_BOOK3S_64
-               .mask   = _PAGE_WRITETHRU,
-               .val    = _PAGE_WRITETHRU,
-               .set    = "write through",
-               .clear  = "             ",
-       }, {
-#endif
-#ifndef CONFIG_PPC_BOOK3S_64
-               .mask   = _PAGE_NO_CACHE,
-               .val    = _PAGE_NO_CACHE,
-               .set    = "no cache",
-               .clear  = "        ",
-       }, {
-#else
-               .mask   = _PAGE_NON_IDEMPOTENT,
-               .val    = _PAGE_NON_IDEMPOTENT,
-               .set    = "non-idempotent",
-               .clear  = "              ",
-       }, {
-               .mask   = _PAGE_TOLERANT,
-               .val    = _PAGE_TOLERANT,
-               .set    = "tolerant",
-               .clear  = "        ",
-       }, {
-#endif
-#ifdef CONFIG_PPC_BOOK3S_64
-               .mask   = H_PAGE_BUSY,
-               .val    = H_PAGE_BUSY,
-               .set    = "busy",
-       }, {
-#ifdef CONFIG_PPC_64K_PAGES
-               .mask   = H_PAGE_COMBO,
-               .val    = H_PAGE_COMBO,
-               .set    = "combo",
-       }, {
-               .mask   = H_PAGE_4K_PFN,
-               .val    = H_PAGE_4K_PFN,
-               .set    = "4K_pfn",
-       }, {
-#else /* CONFIG_PPC_64K_PAGES */
-               .mask   = H_PAGE_F_GIX,
-               .val    = H_PAGE_F_GIX,
-               .set    = "f_gix",
-               .is_val = true,
-               .shift  = H_PAGE_F_GIX_SHIFT,
-       }, {
-               .mask   = H_PAGE_F_SECOND,
-               .val    = H_PAGE_F_SECOND,
-               .set    = "f_second",
-       }, {
-#endif /* CONFIG_PPC_64K_PAGES */
-#endif
-               .mask   = _PAGE_SPECIAL,
-               .val    = _PAGE_SPECIAL,
-               .set    = "special",
-       }
-};
-
-struct pgtable_level {
-       const struct flag_info *flag;
-       size_t num;
-       u64 mask;
-};
-
-static struct pgtable_level pg_level[] = {
-       {
-       }, { /* pgd */
-               .flag   = flag_array,
-               .num    = ARRAY_SIZE(flag_array),
-       }, { /* pud */
-               .flag   = flag_array,
-               .num    = ARRAY_SIZE(flag_array),
-       }, { /* pmd */
-               .flag   = flag_array,
-               .num    = ARRAY_SIZE(flag_array),
-       }, { /* pte */
-               .flag   = flag_array,
-               .num    = ARRAY_SIZE(flag_array),
-       },
-};
-
 static void dump_flag_info(struct pg_state *st, const struct flag_info
                *flag, u64 pte, int num)
 {
diff --git a/arch/powerpc/mm/dump_linuxpagetables.h b/arch/powerpc/mm/dump_linuxpagetables.h
new file mode 100644 (file)
index 0000000..5d51363
--- /dev/null
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#include <linux/types.h>
+
+struct flag_info {
+       u64             mask;
+       u64             val;
+       const char      *set;
+       const char      *clear;
+       bool            is_val;
+       int             shift;
+};
+
+struct pgtable_level {
+       const struct flag_info *flag;
+       size_t num;
+       u64 mask;
+};
+
+extern struct pgtable_level pg_level[5];