Skip to content

Commit

Permalink
s390/boot: Add bootdebug option to control debug messages
Browse files Browse the repository at this point in the history
Suppress decompressor debug messages by default, similar to regular
kernel debug messages that require 'DEBUG' or 'dyndbg' to be enabled
(depending on CONFIG_DYNAMIC_DEBUG). Introduce a 'bootdebug' option to
enable printing these messages when needed.

All messages are still stored in the boot ring buffer regardless.

To enable boot debug messages:

  bootdebug debug

Or combine with 'earlyprintk' to print them without delay:

  bootdebug debug earlyprintk

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>
  • Loading branch information
Vasily Gorbik authored and Alexander Gordeev committed Jan 26, 2025
1 parent c09f8d0 commit d20d8e5
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 2 deletions.
2 changes: 2 additions & 0 deletions arch/s390/boot/ipl_parm.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ void parse_boot_command_line(void)
boot_earlyprintk = true;
if (!strcmp(param, "debug"))
boot_console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
if (!strcmp(param, "bootdebug"))
bootdebug = true;
if (!strcmp(param, "quiet"))
boot_console_loglevel = CONSOLE_LOGLEVEL_QUIET;
if (!strcmp(param, "ignore_loglevel"))
Expand Down
4 changes: 4 additions & 0 deletions arch/s390/boot/printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ bool boot_ignore_loglevel;
char __bootdata(boot_rb)[PAGE_SIZE * 2];
bool __bootdata(boot_earlyprintk);
size_t __bootdata(boot_rb_off);
bool __bootdata(bootdebug);

static void boot_rb_add(const char *str, size_t len)
{
Expand Down Expand Up @@ -168,6 +169,9 @@ static void boot_console_earlyprintk(const char *buf)
/* always print emergency messages */
if (level > LOGLEVEL_EMERG && !boot_earlyprintk)
return;
/* print debug messages only when bootdebug is enabled */
if (level == LOGLEVEL_DEBUG && !bootdebug)
return;
if (boot_ignore_loglevel || level < boot_console_loglevel)
sclp_early_printk(printk_skip_level(buf));
}
Expand Down
1 change: 1 addition & 0 deletions arch/s390/include/asm/boot_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ extern unsigned long early_ipl_comp_list_size;
extern char boot_rb[PAGE_SIZE * 2];
extern bool boot_earlyprintk;
extern size_t boot_rb_off;
extern bool bootdebug;

#define boot_rb_foreach(cb) \
do { \
Expand Down
1 change: 1 addition & 0 deletions arch/s390/kernel/early.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ decompressor_handled_param(facilities);
decompressor_handled_param(nokaslr);
decompressor_handled_param(cmma);
decompressor_handled_param(relocate_lowcore);
decompressor_handled_param(bootdebug);
#if IS_ENABLED(CONFIG_KVM)
decompressor_handled_param(prot_virt);
#endif
Expand Down
10 changes: 8 additions & 2 deletions arch/s390/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ struct oldmem_data __bootdata_preserved(oldmem_data);
char __bootdata(boot_rb)[PAGE_SIZE * 2];
bool __bootdata(boot_earlyprintk);
size_t __bootdata(boot_rb_off);
bool __bootdata(bootdebug);

unsigned long __bootdata_preserved(VMALLOC_START);
EXPORT_SYMBOL(VMALLOC_START);
Expand Down Expand Up @@ -882,13 +883,18 @@ static void __init log_component_list(void)
}

/*
* Print avoiding interpretation of % in buf
* Print avoiding interpretation of % in buf and taking bootdebug option
* into consideration.
*/
static void __init print_rb_entry(char *buf)
{
char fmt[] = KERN_SOH "0boot: %s";
int level = printk_get_level(buf);

fmt[1] = printk_get_level(buf);
if (level == KERN_DEBUG[1] && !bootdebug)
return;

fmt[1] = level;
printk(fmt, printk_skip_level(buf));
}

Expand Down

0 comments on commit d20d8e5

Please sign in to comment.