diff --git a/common/console.c b/common/console.c index bde94122399..e783f309bf0 100644 --- a/common/console.c +++ b/common/console.c @@ -600,6 +600,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; @@ -609,13 +612,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; @@ -632,6 +638,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); @@ -640,6 +647,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 805a6fd6797..2a747d91e16 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 + * @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). */ - unsigned long precon_buf_idx; + long precon_buf_idx; #endif /** * @env_addr: address of environment structure