This is a preparatory patch for sv48 support that will introduce
dynamic PAGE_OFFSET.

Dynamic PAGE_OFFSET implies that all zones (vmalloc, vmemmap, fixaddr...)
whose addresses depend on PAGE_OFFSET become dynamic and can't be used
to statically initialize the array used by ptdump to identify the
different zones of the vm layout.

Signed-off-by: Alexandre Ghiti <a...@ghiti.fr>
Reviewed-by: Anup Patel <a...@brainfault.org>
---
 arch/riscv/mm/ptdump.c | 67 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 55 insertions(+), 12 deletions(-)

diff --git a/arch/riscv/mm/ptdump.c b/arch/riscv/mm/ptdump.c
index ace74dec7492..aa1b3bce61ab 100644
--- a/arch/riscv/mm/ptdump.c
+++ b/arch/riscv/mm/ptdump.c
@@ -58,29 +58,52 @@ struct ptd_mm_info {
        unsigned long end;
 };
 
+enum address_markers_idx {
+#ifdef CONFIG_KASAN
+       KASAN_SHADOW_START_NR,
+       KASAN_SHADOW_END_NR,
+#endif
+       FIXMAP_START_NR,
+       FIXMAP_END_NR,
+       PCI_IO_START_NR,
+       PCI_IO_END_NR,
+#ifdef CONFIG_SPARSEMEM_VMEMMAP
+       VMEMMAP_START_NR,
+       VMEMMAP_END_NR,
+#endif
+       VMALLOC_START_NR,
+       VMALLOC_END_NR,
+       PAGE_OFFSET_NR,
+       MODULES_MAPPING_NR,
+       KERNEL_MAPPING_NR,
+       END_OF_SPACE_NR
+};
+
 static struct addr_marker address_markers[] = {
 #ifdef CONFIG_KASAN
-       {KASAN_SHADOW_START,    "Kasan shadow start"},
-       {KASAN_SHADOW_END,      "Kasan shadow end"},
+       {0, "Kasan shadow start"},
+       {0, "Kasan shadow end"},
 #endif
-       {FIXADDR_START,         "Fixmap start"},
-       {FIXADDR_TOP,           "Fixmap end"},
-       {PCI_IO_START,          "PCI I/O start"},
-       {PCI_IO_END,            "PCI I/O end"},
+       {0, "Fixmap start"},
+       {0, "Fixmap end"},
+       {0, "PCI I/O start"},
+       {0, "PCI I/O end"},
 #ifdef CONFIG_SPARSEMEM_VMEMMAP
-       {VMEMMAP_START,         "vmemmap start"},
-       {VMEMMAP_END,           "vmemmap end"},
+       {0, "vmemmap start"},
+       {0, "vmemmap end"},
 #endif
-       {VMALLOC_START,         "vmalloc() area"},
-       {VMALLOC_END,           "vmalloc() end"},
-       {PAGE_OFFSET,           "Linear mapping"},
+       {0, "vmalloc() area"},
+       {0, "vmalloc() end"},
+       {0, "Linear mapping"},
+       {0, "Modules mapping"},
+       {0, "Kernel mapping (kernel, BPF)"},
        {-1, NULL},
 };
 
 static struct ptd_mm_info kernel_ptd_info = {
        .mm             = &init_mm,
        .markers        = address_markers,
-       .base_addr      = KERN_VIRT_START,
+       .base_addr      = 0,
        .end            = ULONG_MAX,
 };
 
@@ -335,6 +358,26 @@ static int ptdump_init(void)
 {
        unsigned int i, j;
 
+#ifdef CONFIG_KASAN
+       address_markers[KASAN_SHADOW_START_NR].start_address = 
KASAN_SHADOW_START;
+       address_markers[KASAN_SHADOW_END_NR].start_address = KASAN_SHADOW_END;
+#endif
+       address_markers[FIXMAP_START_NR].start_address = FIXADDR_START;
+       address_markers[FIXMAP_END_NR].start_address = FIXADDR_TOP;
+       address_markers[PCI_IO_START_NR].start_address = PCI_IO_START;
+       address_markers[PCI_IO_END_NR].start_address = PCI_IO_END;
+#ifdef CONFIG_SPARSEMEM_VMEMMAP
+       address_markers[VMEMMAP_START_NR].start_address = VMEMMAP_START;
+       address_markers[VMEMMAP_END_NR].start_address = VMEMMAP_END;
+#endif
+       address_markers[VMALLOC_START_NR].start_address = VMALLOC_START;
+       address_markers[VMALLOC_END_NR].start_address = VMALLOC_END;
+       address_markers[PAGE_OFFSET_NR].start_address = PAGE_OFFSET;
+       address_markers[MODULES_MAPPING_NR].start_address = MODULES_VADDR;
+       address_markers[KERNEL_MAPPING_NR].start_address = kernel_virt_addr;
+
+       kernel_ptd_info.base_addr = KERN_VIRT_START;
+
        for (i = 0; i < ARRAY_SIZE(pg_level); i++)
                for (j = 0; j < ARRAY_SIZE(pte_bits); j++)
                        pg_level[i].mask |= pte_bits[j].mask;
-- 
2.20.1

Reply via email to