[PATCH] common/console.c: prevent pre-console buffer contents from being added to itself

Rasmus Villemoes rasmus.villemoes at prevas.dk
Tue Aug 23 13:38:16 CEST 2022


Ping.

The previous patch has already been applied [cff29636933a,
common/console.c: use CONFIG_VAL() with PRE_CON_BUF_* variables], and I
realize this one might be more "controversial" in how it makes
gd->precon_buf_idx serve as a "flag" when negative, but I'd really like
to make progress towards making pre-console-buffering usable in SPL
(since I'm debugging yet another issue where I need to know what
happened very early).

On 03/05/2022 15.13, Rasmus Villemoes wrote:
> I do not have any non-serial output devices, so a
> print_pre_console_buffer(PRE_CONSOLE_FLUSHPOINT2_EVERYTHING_BUT_SERIAL)
> does nothing for me.
> 
> However, I was manually inspected the pre-console buffer using md.b,
> and I noticed that the early part of it was repeated. The reason is
> that the first call of print_pre_console_buffer(), from
> console_init_f(), ends up invoking puts() with the contents of the
> buffer at that point, and puts() at that point ends up in the else
> branch of
> 
> 	if (gd->flags & GD_FLG_DEVINIT) {
> 		/* Send to the standard output */
> 		fputs(stdout, s);
> 	} else {
> 		/* Send directly to the handler */
> 		pre_console_puts(s);
> 		serial_puts(s);
> 	}
> 
> so indeed the contents is added again.
> 
> That can be somewhat confusing (both when reading the buffer manually,
> but also if it did actually come out on some device). So disable all
> use of the pre-console buffer while print_pre_console_buffer() is
> emitting it.
> 
> Signed-off-by: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
> ---
>  common/console.c                  | 10 +++++++++-
>  include/asm-generic/global_data.h | 12 ++++++++----
>  2 files changed, 17 insertions(+), 5 deletions(-)
> 
> diff --git a/common/console.c b/common/console.c
> index dc071f1ed6..c5a72d9a2a 100644
> --- a/common/console.c
> +++ b/common/console.c
> @@ -599,6 +599,9 @@ static void pre_console_putc(const char c)
>  {
>  	char *buffer;
>  
> +	if (gd->precon_buf_idx < 0)
> +		return;
> +
>  	buffer = map_sysmem(CONFIG_VAL(PRE_CON_BUF_ADDR), CONFIG_VAL(PRE_CON_BUF_SZ));
>  
>  	buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
> @@ -608,13 +611,16 @@ static void pre_console_putc(const char c)
>  
>  static void pre_console_puts(const char *s)
>  {
> +	if (gd->precon_buf_idx < 0)
> +		return;
> +
>  	while (*s)
>  		pre_console_putc(*s++);
>  }
>  
>  static void print_pre_console_buffer(int flushpoint)
>  {
> -	unsigned long in = 0, out = 0;
> +	long in = 0, out = 0;
>  	char buf_out[CONFIG_VAL(PRE_CON_BUF_SZ) + 1];
>  	char *buf_in;
>  
> @@ -631,6 +637,7 @@ static void print_pre_console_buffer(int flushpoint)
>  
>  	buf_out[out] = 0;
>  
> +	gd->precon_buf_idx = -1;
>  	switch (flushpoint) {
>  	case PRE_CONSOLE_FLUSHPOINT1_SERIAL:
>  		puts(buf_out);
> @@ -639,6 +646,7 @@ static void print_pre_console_buffer(int flushpoint)
>  		console_puts_select(stdout, false, buf_out);
>  		break;
>  	}
> +	gd->precon_buf_idx = in;
>  }
>  #else
>  static inline void pre_console_putc(const char c) {}
> diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
> index 805a6fd679..2a747d91e1 100644
> --- a/include/asm-generic/global_data.h
> +++ b/include/asm-generic/global_data.h
> @@ -115,10 +115,14 @@ struct global_data {
>  	/**
>  	 * @precon_buf_idx: pre-console buffer index
>  	 *
> -	 * @precon_buf_idx indicates the current position of the buffer used to
> -	 * collect output before the console becomes available
> -	 */
> -	unsigned long precon_buf_idx;
> +	 * @precon_buf_idx indicates the current position of the
> +	 * buffer used to collect output before the console becomes
> +	 * available. When negative, the pre-console buffer is
> +	 * temporarily disabled (used when the pre-console buffer is
> +	 * being written out, to prevent adding its contents to
> +	 * itself).
> +	 */
> +	long precon_buf_idx;
>  #endif
>  	/**
>  	 * @env_addr: address of environment structure



More information about the U-Boot mailing list