From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anup Patel Date: Thu, 24 Nov 2022 18:59:05 +0530 Subject: [PATCH v3 5/6] lib: sbi: Add console_puts() callback in the console device In-Reply-To: <20221124132906.257732-1-apatel@ventanamicro.com> References: <20221124132906.257732-1-apatel@ventanamicro.com> Message-ID: <20221124132906.257732-6-apatel@ventanamicro.com> List-Id: To: opensbi@lists.infradead.org MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit We add console_puts() callback in the console device which allows console drivers (such as semihosting) to implement a specialized way to output character string. Signed-off-by: Anup Patel --- include/sbi/sbi_console.h | 3 +++ lib/sbi/sbi_console.c | 19 ++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/include/sbi/sbi_console.h b/include/sbi/sbi_console.h index 1bdeeb9..7e757a7 100644 --- a/include/sbi/sbi_console.h +++ b/include/sbi/sbi_console.h @@ -19,6 +19,9 @@ struct sbi_console_device { /** Write a character to the console output */ void (*console_putc)(char ch); + /** Write a character string to the console output */ + void (*console_puts)(const char *str, unsigned long len); + /** Read a character from the console input */ int (*console_getc)(void); }; diff --git a/lib/sbi/sbi_console.c b/lib/sbi/sbi_console.c index a975708..3c98f4e 100644 --- a/lib/sbi/sbi_console.c +++ b/lib/sbi/sbi_console.c @@ -12,6 +12,7 @@ #include #include #include +#include static const struct sbi_console_device *console_dev = NULL; static spinlock_t console_out_lock = SPIN_LOCK_INITIALIZER; @@ -44,9 +45,13 @@ void sbi_putc(char ch) void sbi_puts(const char *str) { spin_lock(&console_out_lock); - while (*str) { - sbi_putc(*str); - str++; + if (console_dev && console_dev->console_puts) { + console_dev->console_puts(str, sbi_strlen(str)); + } else { + while (*str) { + sbi_putc(*str); + str++; + } } spin_unlock(&console_out_lock); } @@ -56,8 +61,12 @@ void sbi_nputs(const char *str, unsigned long len) unsigned long i; spin_lock(&console_out_lock); - for (i = 0; i < len; i++) - sbi_putc(str[i]); + if (console_dev && console_dev->console_puts) { + console_dev->console_puts(str, len); + } else { + for (i = 0; i < len; i++) + sbi_putc(str[i]); + } spin_unlock(&console_out_lock); } -- 2.34.1