mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
bootm: Fix Linux silent console on newer kernels
Linux determines its console based on several sources:
1. the console command line parameter
2. device tree (e.g. /chosen/stdout-path)
3. various other board- and arch-specific sources
If the console parameter specifies a real console (e.g. ttyS0) then that is
used as /dev/console. However, if it does not specify a real console (e.g.
ttyDoesntExist) then *nothing* will be used as /dev/console.
Reading/writing it will return ENODEV. Additionally, no other source will
be used as a console source.
Linux commit ab4af56ae250 ("printk/console: Allow to disable console output
by using console="" or console=null") recently changed the semantics of the
parameter. Previously, specifying console="" would be treated like
specifying some other bad console. This commit changed things so that it
added /dev/ttynull as a console (if available). However, it also allows
for other console sources. If the device tree specifies a console (such as
if U-Boot and Linux share a device tree), then it will be used in addition
to /dev/ttynull. This can result in a non-silent console.
To avoid this, explicitly set ttynull as the console. This will disable
other console sources. If CONFIG_NULL_TTY is disabled, then this will have
the same behavior as in the past (no output, and writing /dev/console
returns ENODEV).
[1] and [2] have additional background on this kernel change.
[1] https://lore.kernel.org/all/20201006025935.GA597@jagdpanzerIV.localdomain/
[2] https://lore.kernel.org/all/20201111135450.11214-1-pmladek@suse.com/
Signed-off-by: Sean Anderson <sean.anderson@seco.com>
This commit is contained in:
16
boot/bootm.c
16
boot/bootm.c
@@ -498,7 +498,8 @@ ulong bootm_disable_interrupts(void)
|
||||
}
|
||||
|
||||
#define CONSOLE_ARG "console="
|
||||
#define CONSOLE_ARG_SIZE sizeof(CONSOLE_ARG)
|
||||
#define NULL_CONSOLE (CONSOLE_ARG "ttynull")
|
||||
#define CONSOLE_ARG_SIZE sizeof(NULL_CONSOLE)
|
||||
|
||||
/**
|
||||
* fixup_silent_linux() - Handle silencing the linux boot if required
|
||||
@@ -550,21 +551,22 @@ static int fixup_silent_linux(char *buf, int maxlen)
|
||||
char *end = strchr(start, ' ');
|
||||
int start_bytes;
|
||||
|
||||
start_bytes = start - cmdline + CONSOLE_ARG_SIZE - 1;
|
||||
start_bytes = start - cmdline;
|
||||
strncpy(buf, cmdline, start_bytes);
|
||||
strncpy(buf + start_bytes, NULL_CONSOLE, CONSOLE_ARG_SIZE);
|
||||
if (end)
|
||||
strcpy(buf + start_bytes, end);
|
||||
strcpy(buf + start_bytes + CONSOLE_ARG_SIZE - 1, end);
|
||||
else
|
||||
buf[start_bytes] = '\0';
|
||||
buf[start_bytes + CONSOLE_ARG_SIZE] = '\0';
|
||||
} else {
|
||||
sprintf(buf, "%s %s", cmdline, CONSOLE_ARG);
|
||||
sprintf(buf, "%s %s", cmdline, NULL_CONSOLE);
|
||||
}
|
||||
if (buf + strlen(buf) >= cmdline)
|
||||
return -ENOSPC;
|
||||
} else {
|
||||
if (maxlen < sizeof(CONSOLE_ARG))
|
||||
if (maxlen < CONSOLE_ARG_SIZE)
|
||||
return -ENOSPC;
|
||||
strcpy(buf, CONSOLE_ARG);
|
||||
strcpy(buf, NULL_CONSOLE);
|
||||
}
|
||||
debug("after silent fix-up: %s\n", buf);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user