]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
s390/boot: Dump message ring buffer on crash with bootdebug
authorVasily Gorbik <gor@linux.ibm.com>
Wed, 20 Nov 2024 19:30:10 +0000 (20:30 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Sun, 26 Jan 2025 16:24:01 +0000 (17:24 +0100)
Dump the boot message ring buffer when a crash occurs during boot, but
only if bootdebug is enabled. This helps assist in analyzing boot-time
issues by providing additional debugging information.

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/boot.h
arch/s390/boot/pgm_check_info.c
arch/s390/boot/printk.c

index 688fa75f865168e34b27295474d24cd67ec8a2ac..0cfa84a42ec17e5054dfb1564816da9cfacd4589 100644 (file)
@@ -76,6 +76,7 @@ int __printf(1, 2) boot_printk(const char *fmt, ...);
 void print_stacktrace(unsigned long sp);
 void error(char *m);
 int get_random(unsigned long limit, unsigned long *value);
+void boot_rb_dump(void);
 
 #ifndef boot_fmt
 #define boot_fmt(fmt)  fmt
index e8a728c3db052e743301e5485d40fcb8ff5f0f30..633f11600aab3a0d2a0ba2c54dffab2d55497ea8 100644 (file)
@@ -37,6 +37,8 @@ void print_pgm_check_info(void)
        unsigned long *gpregs = (unsigned long *)get_lowcore()->gpregs_save_area;
        struct psw_bits *psw = &psw_bits(get_lowcore()->psw_save_area);
 
+       if (bootdebug)
+               boot_rb_dump();
        boot_emerg("Linux version %s\n", kernel_version);
        if (!is_prot_virt_guest() && early_command_line[0])
                boot_emerg("Kernel command line: %s\n", early_command_line);
index 092114e469376d47c7a74df08ccb0ee264a8471d..abfa05cf95624decb5a153731e18e21749ac0a4b 100644 (file)
@@ -32,6 +32,24 @@ static void boot_rb_add(const char *str, size_t len)
        boot_rb_off += len + 1;
 }
 
+static void print_rb_entry(const char *str)
+{
+       sclp_early_printk(printk_skip_level(str));
+}
+
+static bool debug_messages_printed(void)
+{
+       return boot_earlyprintk && (boot_ignore_loglevel || boot_console_loglevel > LOGLEVEL_DEBUG);
+}
+
+void boot_rb_dump(void)
+{
+       if (debug_messages_printed())
+               return;
+       sclp_early_printk("Boot messages ring buffer:\n");
+       boot_rb_foreach(print_rb_entry);
+}
+
 const char hex_asc[] = "0123456789abcdef";
 
 static char *as_hex(char *dst, unsigned long val, int pad)