]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/boot: Add vmem debugging support
authorVasily Gorbik <gor@linux.ibm.com>
Wed, 11 Dec 2024 11:11:04 +0000 (12:11 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Sun, 26 Jan 2025 16:24:03 +0000 (17:24 +0100)
Introduce boot_debug() calls in vmem code to log page table mappings
including KASAN shadow mappings for improved early boot debugging.

Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/boot/vmem.c

index 47011b5a9e3d2935054f98a5318151905be04751..c8a2d517511433df470789b7fc761df8beac860e 100644 (file)
@@ -1,4 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
+#define boot_fmt(fmt) "vmem: " fmt
 #include <linux/sched/task.h>
 #include <linux/pgtable.h>
 #include <linux/kasan.h>
@@ -32,12 +33,42 @@ enum populate_mode {
        POPULATE_IDENTITY,
        POPULATE_KERNEL,
 #ifdef CONFIG_KASAN
+       /* KASAN modes should be last and grouped together, see is_kasan_populate_mode() */
        POPULATE_KASAN_MAP_SHADOW,
        POPULATE_KASAN_ZERO_SHADOW,
        POPULATE_KASAN_SHALLOW
 #endif
 };
 
+#define POPULATE_MODE_NAME(t) case POPULATE_ ## t: return #t
+static inline const char *get_populate_mode_name(enum populate_mode t)
+{
+       switch (t) {
+       POPULATE_MODE_NAME(NONE);
+       POPULATE_MODE_NAME(DIRECT);
+       POPULATE_MODE_NAME(LOWCORE);
+       POPULATE_MODE_NAME(ABS_LOWCORE);
+       POPULATE_MODE_NAME(IDENTITY);
+       POPULATE_MODE_NAME(KERNEL);
+#ifdef CONFIG_KASAN
+       POPULATE_MODE_NAME(KASAN_MAP_SHADOW);
+       POPULATE_MODE_NAME(KASAN_ZERO_SHADOW);
+       POPULATE_MODE_NAME(KASAN_SHALLOW);
+#endif
+       default:
+               return "UNKNOWN";
+       }
+}
+
+static bool is_kasan_populate_mode(enum populate_mode mode)
+{
+#ifdef CONFIG_KASAN
+       return mode >= POPULATE_KASAN_MAP_SHADOW;
+#else
+       return false;
+#endif
+}
+
 static void pgtable_populate(unsigned long addr, unsigned long end, enum populate_mode mode);
 
 #ifdef CONFIG_KASAN
@@ -53,9 +84,12 @@ static pte_t pte_z;
 
 static inline void kasan_populate(unsigned long start, unsigned long end, enum populate_mode mode)
 {
-       start = PAGE_ALIGN_DOWN(__sha(start));
-       end = PAGE_ALIGN(__sha(end));
-       pgtable_populate(start, end, mode);
+       unsigned long sha_start = PAGE_ALIGN_DOWN(__sha(start));
+       unsigned long sha_end = PAGE_ALIGN(__sha(end));
+
+       boot_debug("%-17s 0x%016lx-0x%016lx >> 0x%016lx-0x%016lx\n", get_populate_mode_name(mode),
+                  start, end, sha_start, sha_end);
+       pgtable_populate(sha_start, sha_end, mode);
 }
 
 static void kasan_populate_shadow(unsigned long kernel_start, unsigned long kernel_end)
@@ -418,6 +452,13 @@ static void pgtable_populate(unsigned long addr, unsigned long end, enum populat
        pgd_t *pgd;
        p4d_t *p4d;
 
+       if (!is_kasan_populate_mode(mode)) {
+               boot_debug("%-17s 0x%016lx-0x%016lx -> 0x%016lx-0x%016lx\n",
+                          get_populate_mode_name(mode), addr, end,
+                          resolve_pa_may_alloc(addr, 0, mode),
+                          resolve_pa_may_alloc(end - 1, 0, mode) + 1);
+       }
+
        pgd = pgd_offset(&init_mm, addr);
        for (; addr < end; addr = next, pgd++) {
                next = pgd_addr_end(addr, end);