Commit 26b8f69e authored by Alexandre Ghiti's avatar Alexandre Ghiti Committed by Palmer Dabbelt

riscv: Improve virtual kernel memory layout dump

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: default avatarAlexandre Ghiti <alexandre.ghiti@canonical.com>
Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 35d33c76
...@@ -76,37 +76,73 @@ static void __init zone_sizes_init(void) ...@@ -76,37 +76,73 @@ static void __init zone_sizes_init(void)
} }
#if defined(CONFIG_MMU) && defined(CONFIG_DEBUG_VM) #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) 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, 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) 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, 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) static void __init print_vm_layout(void)
{ {
pr_notice("Virtual kernel memory layout:\n"); pr_notice("Virtual kernel memory layout:\n");
print_mlk("fixmap", (unsigned long)FIXADDR_START, print_ml("fixmap", (unsigned long)FIXADDR_START,
(unsigned long)FIXADDR_TOP); (unsigned long)FIXADDR_TOP);
print_mlm("pci io", (unsigned long)PCI_IO_START, print_ml("pci io", (unsigned long)PCI_IO_START,
(unsigned long)PCI_IO_END); (unsigned long)PCI_IO_END);
print_mlm("vmemmap", (unsigned long)VMEMMAP_START, print_ml("vmemmap", (unsigned long)VMEMMAP_START,
(unsigned long)VMEMMAP_END); (unsigned long)VMEMMAP_END);
print_mlm("vmalloc", (unsigned long)VMALLOC_START, print_ml("vmalloc", (unsigned long)VMALLOC_START,
(unsigned long)VMALLOC_END); (unsigned long)VMALLOC_END);
print_mlm("lowmem", (unsigned long)PAGE_OFFSET, print_ml("lowmem", (unsigned long)PAGE_OFFSET,
(unsigned long)high_memory); (unsigned long)high_memory);
if (IS_ENABLED(CONFIG_64BIT)) { if (IS_ENABLED(CONFIG_64BIT)) {
#ifdef CONFIG_KASAN #ifdef CONFIG_KASAN
print_mlm("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END); print_ml("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END);
#endif #endif
print_mlm("kernel", (unsigned long)KERNEL_LINK_ADDR, print_ml("kernel", (unsigned long)KERNEL_LINK_ADDR,
(unsigned long)ADDRESS_SPACE_END); (unsigned long)ADDRESS_SPACE_END);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment