Commit d20d8e51 authored by Vasily Gorbik's avatar Vasily Gorbik Committed by Alexander Gordeev
Browse files

s390/boot: Add bootdebug option to control debug messages



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: default avatarVasily Gorbik <gor@linux.ibm.com>
Acked-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
parent c09f8d0a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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"))
+4 −0
Original line number Diff line number Diff line
@@ -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)
{
@@ -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));
}
+1 −0
Original line number Diff line number Diff line
@@ -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 {									\
+1 −0
Original line number Diff line number Diff line
@@ -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
+8 −2
Original line number Diff line number Diff line
@@ -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);
@@ -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));
}