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

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@prevas.dk>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Rasmus Villemoes 2022-05-03 15:13:27 +02:00 committed by Tom Rini
parent 1573b6a869
commit 04a20ca5dc
2 changed files with 16 additions and 4 deletions

View File

@ -600,6 +600,9 @@ static void pre_console_putc(const char c)
{ {
char *buffer; 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 = map_sysmem(CONFIG_VAL(PRE_CON_BUF_ADDR), CONFIG_VAL(PRE_CON_BUF_SZ));
buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c; buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
@ -609,13 +612,16 @@ static void pre_console_putc(const char c)
static void pre_console_puts(const char *s) static void pre_console_puts(const char *s)
{ {
if (gd->precon_buf_idx < 0)
return;
while (*s) while (*s)
pre_console_putc(*s++); pre_console_putc(*s++);
} }
static void print_pre_console_buffer(int flushpoint) 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_out[CONFIG_VAL(PRE_CON_BUF_SZ) + 1];
char *buf_in; char *buf_in;
@ -632,6 +638,7 @@ static void print_pre_console_buffer(int flushpoint)
buf_out[out] = 0; buf_out[out] = 0;
gd->precon_buf_idx = -1;
switch (flushpoint) { switch (flushpoint) {
case PRE_CONSOLE_FLUSHPOINT1_SERIAL: case PRE_CONSOLE_FLUSHPOINT1_SERIAL:
puts(buf_out); puts(buf_out);
@ -640,6 +647,7 @@ static void print_pre_console_buffer(int flushpoint)
console_puts_select(stdout, false, buf_out); console_puts_select(stdout, false, buf_out);
break; break;
} }
gd->precon_buf_idx = in;
} }
#else #else
static inline void pre_console_putc(const char c) {} static inline void pre_console_putc(const char c) {}

View File

@ -115,10 +115,14 @@ struct global_data {
/** /**
* @precon_buf_idx: pre-console buffer index * @precon_buf_idx: pre-console buffer index
* *
* @precon_buf_idx indicates the current position of the buffer used to * @precon_buf_idx indicates the current position of the
* collect output before the console becomes available * 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).
*/ */
unsigned long precon_buf_idx; long precon_buf_idx;
#endif #endif
/** /**
* @env_addr: address of environment structure * @env_addr: address of environment structure