Julius Werner has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/61613 )
Change subject: console: Add compile-time fast path when only CBMEM console is used ......................................................................
console: Add compile-time fast path when only CBMEM console is used
A common use case when running coreboot on production systems is that only the CBMEM console (the one with the least impact on boot speed) is enabled. In this case, some of the code in the console subsystem has no effect. Due to the way it's all genericized over multiple consoles and tied together with function pointers, not all of this can be compile-time eliminated automatically, so this patch adds a little helper to facilitate that. This results in roughly 200 (compressed) bytes of savings per stage on an arm64 system.
Signed-off-by: Julius Werner jwerner@chromium.org Change-Id: I1d5b8bda80d02a13ee0b7835e0805c4319fd21d8 --- M src/console/console.c M src/console/init.c M src/console/printk.c M src/include/console/console.h 4 files changed, 23 insertions(+), 5 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/13/61613/1
diff --git a/src/console/console.c b/src/console/console.c index 5b8a872..f37f120 100644 --- a/src/console/console.c +++ b/src/console/console.c @@ -11,6 +11,8 @@ #include <console/flash.h> #include <console/system76_ec.h>
+/* Note: when adding a new console, make sure you update the definition of + HAS_ONLY_FAST_CONSOLES in <console.h>! */ void console_hw_init(void) { __cbmemc_init(); diff --git a/src/console/init.c b/src/console/init.c index 4f93997..da8d8f7 100644 --- a/src/console/init.c +++ b/src/console/init.c @@ -37,6 +37,9 @@ if (log_level < 0) return CONSOLE_LOG_NONE;
+ if (HAS_ONLY_FAST_CONSOLES) + return CONSOLE_LOG_FAST; + if (msg_level <= log_level) return CONSOLE_LOG_ALL;
diff --git a/src/console/printk.c b/src/console/printk.c index d24dc9db..8db2c45 100644 --- a/src/console/printk.c +++ b/src/console/printk.c @@ -67,6 +67,8 @@ }; };
+#define LOG_FAST(state) (HAS_ONLY_FAST_CONSOLES || ((state).level == CONSOLE_LOG_FAST)) + static void wrap_interactive_printf(const char *fmt, ...) { va_list args; @@ -83,11 +85,11 @@ LOG_FAST mode, just write the marker to CBMC and exit -- the rest of this function implements the LOG_ALL case. */ unsigned char marker = BIOS_LOG_LEVEL_TO_MARKER(state.level); - if (state.speed == CONSOLE_LOG_FAST) { + if (LOG_FAST(state)) { __cbmemc_tx_byte(marker); return; } - console_stored_tx_byte(marker); + console_stored_tx_byte(marker, NULL);
/* Interactive consoles get a `[DEBUG] ` style readable prefix, and potentially an escape sequence for highlighting. */ @@ -98,7 +100,7 @@
static void line_end(union log_state state) { - if (CONFIG(CONSOLE_USE_ANSI_ESCAPES) && state.speed != CONSOLE_LOG_FAST) + if (CONFIG(CONSOLE_USE_ANSI_ESCAPES) && !LOG_FAST(state)) wrap_interactive_printf(BIOS_LOG_ESCAPE_RESET); }
@@ -115,7 +117,7 @@ line_started = true; }
- if (state.speed == CONSOLE_LOG_FAST) + if (LOG_FAST(state)) __cbmemc_tx_byte(byte); else console_tx_byte(byte); @@ -138,7 +140,7 @@ console_time_run();
i = vtxprintf(wrap_putchar, fmt, args, state.as_ptr); - if (state.speed != CONSOLE_LOG_FAST) + if (LOG_FAST(state)) console_tx_flush();
console_time_stop(); diff --git a/src/include/console/console.h b/src/include/console/console.h index 5546aa9..e4090af 100644 --- a/src/include/console/console.h +++ b/src/include/console/console.h @@ -61,7 +61,18 @@ long console_time_get_and_reset(void); void console_time_report(void);
+/* + * "Fast" basically means only the CBMEM console right now. This is used to still + * print debug messages there when loglevel disables the other consoles. It is also + * used to compile-time eliminate code paths that only affect "interactive" consoles + * (which are all "slow") when none of those are enabled. + */ enum { CONSOLE_LOG_NONE = 0, CONSOLE_LOG_FAST, CONSOLE_LOG_ALL }; +#define HAS_ONLY_FAST_CONSOLES !(CONFIG(SPKMODEM) || CONFIG(CONSOLE_QEMU_DEBUGCON) || \ + CONFIG(CONSOLE_SERIAL) || CONFIG(CONSOLE_NE2K) || CONFIG(CONSOLE_USB) || \ + CONFIG(EM100PRO_SPI_CONSOLE) || CONFIG(CONSOLE_SPI_FLASH) || \ + CONFIG(CONSOLE_SYSTEM76_EC)) + #else static inline int get_log_level(void) { return -1; } static inline void console_init(void) {}