From 5783a10f721d8f10d535dd2f69a9382c5ef7be7b Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 12 Jun 2025 12:57:26 +0100 Subject: [PATCH] [riscv] Write SBI console output to early UART, if enabled The early UART is an optional feature used to obtain debug output from the prefix before iPXE is able to parse the device tree. Extend this feature to also cover any console output that iPXE attempts to send to the SBI console, on the basis that the purpose of the early UART is to provide an output-only device for situations in which there is no functional SBI console. Signed-off-by: Michael Brown --- src/arch/riscv/interface/sbi/sbi_console.c | 5 +++++ src/arch/riscv/prefix/libprefix.S | 26 ++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/arch/riscv/interface/sbi/sbi_console.c b/src/arch/riscv/interface/sbi/sbi_console.c index c993ebc0a..afbe4286e 100644 --- a/src/arch/riscv/interface/sbi/sbi_console.c +++ b/src/arch/riscv/interface/sbi/sbi_console.c @@ -41,6 +41,8 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #define CONSOLE_SBI ( CONSOLE_USAGE_ALL & ~CONSOLE_USAGE_LOG ) #endif +extern void early_uart_putchar ( int character ); + /** Buffered input character (if any) */ static unsigned char sbi_console_input; @@ -52,6 +54,9 @@ static unsigned char sbi_console_input; static void sbi_putchar ( int character ) { struct sbi_return ret; + /* Write byte to early UART, if enabled */ + early_uart_putchar ( character ); + /* Write byte to console */ ret = sbi_ecall_1 ( SBI_DBCN, SBI_DBCN_WRITE_BYTE, character ); if ( ! ret.error ) diff --git a/src/arch/riscv/prefix/libprefix.S b/src/arch/riscv/prefix/libprefix.S index 41e63b3f1..cf62338b5 100644 --- a/src/arch/riscv/prefix/libprefix.S +++ b/src/arch/riscv/prefix/libprefix.S @@ -243,6 +243,32 @@ early_uart_sifive_wait_\@: bltz a1, early_uart_sifive_wait_\@ .endm +/***************************************************************************** + * + * Print single character to early UART (from C code) + * + ***************************************************************************** + * + * This function is called by the SBI console driver to output a + * character to the early UART (if enabled). + * + * The standard C ABI applies to this function. + * + * Parameters: + * + * a0 - Character to print + * + * Returns: none + * + */ + + .section ".prefix.early_uart_putchar", "ax", @progbits + .globl early_uart_putchar +early_uart_putchar: + print_char_uart + ret + .size early_uart_putchar, . - early_uart_putchar + /***************************************************************************** * * Print message to debug console -- 2.47.2