]> git.baikalelectronics.ru Git - kernel.git/commitdiff
riscv: Improve virtual kernel memory layout dump
authorAlexandre Ghiti <alexandre.ghiti@canonical.com>
Mon, 6 Dec 2021 10:46:54 +0000 (11:46 +0100)
committerPalmer Dabbelt <palmer@rivosinc.com>
Thu, 2 Jun 2022 04:46:29 +0000 (21:46 -0700)
With the arrival of sv48 and its large address space, it would be
cumbersome to statically define the unit size to use to print the different
portions of the virtual memory layout: instead, determine it dynamically.

Signed-off-by: Alexandre Ghiti <alexandre.ghiti@canonical.com>
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/mm/init.c

index eed613599ba67a36490c6c4af13f502718ed75cc..7d8da6105b62395ba9f1caa6461b6908e1a164f8 100644 (file)
@@ -76,38 +76,74 @@ static void __init zone_sizes_init(void)
 }
 
 #if defined(CONFIG_MMU) && defined(CONFIG_DEBUG_VM)
+
+#define LOG2_SZ_1K  ilog2(SZ_1K)
+#define LOG2_SZ_1M  ilog2(SZ_1M)
+#define LOG2_SZ_1G  ilog2(SZ_1G)
+#define LOG2_SZ_1T  ilog2(SZ_1T)
+
 static inline void print_mlk(char *name, unsigned long b, unsigned long t)
 {
        pr_notice("%12s : 0x%08lx - 0x%08lx   (%4ld kB)\n", name, b, t,
-                 (((t) - (b)) >> 10));
+                 (((t) - (b)) >> LOG2_SZ_1K));
 }
 
 static inline void print_mlm(char *name, unsigned long b, unsigned long t)
 {
        pr_notice("%12s : 0x%08lx - 0x%08lx   (%4ld MB)\n", name, b, t,
-                 (((t) - (b)) >> 20));
+                 (((t) - (b)) >> LOG2_SZ_1M));
+}
+
+static inline void print_mlg(char *name, unsigned long b, unsigned long t)
+{
+       pr_notice("%12s : 0x%08lx - 0x%08lx   (%4ld GB)\n", name, b, t,
+                  (((t) - (b)) >> LOG2_SZ_1G));
+}
+
+#ifdef CONFIG_64BIT
+static inline void print_mlt(char *name, unsigned long b, unsigned long t)
+{
+       pr_notice("%12s : 0x%08lx - 0x%08lx   (%4ld TB)\n", name, b, t,
+                  (((t) - (b)) >> LOG2_SZ_1T));
+}
+#else
+#define print_mlt(n, b, t) do {} while (0)
+#endif
+
+static inline void print_ml(char *name, unsigned long b, unsigned long t)
+{
+       unsigned long diff = t - b;
+
+       if (IS_ENABLED(CONFIG_64BIT) && (diff >> LOG2_SZ_1T) >= 10)
+               print_mlt(name, b, t);
+       else if ((diff >> LOG2_SZ_1G) >= 10)
+               print_mlg(name, b, t);
+       else if ((diff >> LOG2_SZ_1M) >= 10)
+               print_mlm(name, b, t);
+       else
+               print_mlk(name, b, t);
 }
 
 static void __init print_vm_layout(void)
 {
        pr_notice("Virtual kernel memory layout:\n");
-       print_mlk("fixmap", (unsigned long)FIXADDR_START,
-                 (unsigned long)FIXADDR_TOP);
-       print_mlm("pci io", (unsigned long)PCI_IO_START,
-                 (unsigned long)PCI_IO_END);
-       print_mlm("vmemmap", (unsigned long)VMEMMAP_START,
-                 (unsigned long)VMEMMAP_END);
-       print_mlm("vmalloc", (unsigned long)VMALLOC_START,
-                 (unsigned long)VMALLOC_END);
-       print_mlm("lowmem", (unsigned long)PAGE_OFFSET,
-                 (unsigned long)high_memory);
+       print_ml("fixmap", (unsigned long)FIXADDR_START,
+               (unsigned long)FIXADDR_TOP);
+       print_ml("pci io", (unsigned long)PCI_IO_START,
+               (unsigned long)PCI_IO_END);
+       print_ml("vmemmap", (unsigned long)VMEMMAP_START,
+               (unsigned long)VMEMMAP_END);
+       print_ml("vmalloc", (unsigned long)VMALLOC_START,
+               (unsigned long)VMALLOC_END);
+       print_ml("lowmem", (unsigned long)PAGE_OFFSET,
+               (unsigned long)high_memory);
        if (IS_ENABLED(CONFIG_64BIT)) {
 #ifdef CONFIG_KASAN
-               print_mlm("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END);
+               print_ml("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END);
 #endif
 
-               print_mlm("kernel", (unsigned long)KERNEL_LINK_ADDR,
-                         (unsigned long)ADDRESS_SPACE_END);
+               print_ml("kernel", (unsigned long)KERNEL_LINK_ADDR,
+                        (unsigned long)ADDRESS_SPACE_END);
        }
 }
 #else