[RFC PATCH 3/3] lib: sbi: Implement SBI debug console extension
Anup Patel
apatel at ventanamicro.com
Thu Nov 10 09:00:16 PST 2022
We implement SBI debug console extension as one of the replacement
SBI extensions. This extension is only available when OpenSBI platform
provides a console device to generic library.
Signed-off-by: Anup Patel <apatel at ventanamicro.com>
---
lib/sbi/Kconfig | 4 ++++
lib/sbi/objects.mk | 1 +
lib/sbi/sbi_ecall_replace.c | 30 ++++++++++++++++++++++++++++++
3 files changed, 35 insertions(+)
diff --git a/lib/sbi/Kconfig b/lib/sbi/Kconfig
index df74bba..ef6728b 100644
--- a/lib/sbi/Kconfig
+++ b/lib/sbi/Kconfig
@@ -26,6 +26,10 @@ config SBI_ECALL_PMU
bool "Performance Monitoring Unit extension"
default y
+config SBI_ECALL_DBCN
+ bool "Debug Console extension"
+ default y
+
config SBI_ECALL_LEGACY
bool "SBI v0.1 legacy extensions"
default y
diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk
index 783c46d..7ccad52 100644
--- a/lib/sbi/objects.mk
+++ b/lib/sbi/objects.mk
@@ -23,6 +23,7 @@ carray-sbi_ecall_exts-y += ecall_base
carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_HSM) += ecall_hsm
carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_SRST) += ecall_srst
carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_PMU) += ecall_pmu
+carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_DBCN) += ecall_dbcn
carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_LEGACY) += ecall_legacy
carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_VENDOR) += ecall_vendor
diff --git a/lib/sbi/sbi_ecall_replace.c b/lib/sbi/sbi_ecall_replace.c
index 0ea00d6..a092e2f 100644
--- a/lib/sbi/sbi_ecall_replace.c
+++ b/lib/sbi/sbi_ecall_replace.c
@@ -9,6 +9,7 @@
*/
#include <sbi/riscv_asm.h>
+#include <sbi/sbi_console.h>
#include <sbi/sbi_ecall.h>
#include <sbi/sbi_ecall_interface.h>
#include <sbi/sbi_error.h>
@@ -202,3 +203,32 @@ struct sbi_ecall_extension ecall_srst = {
.probe = sbi_ecall_srst_probe,
};
#endif
+
+#ifdef CONFIG_SBI_ECALL_DBCN
+static int sbi_ecall_dbcn_handler(unsigned long extid, unsigned long funcid,
+ const struct sbi_trap_regs *regs,
+ unsigned long *out_val,
+ struct sbi_trap_info *out_trap)
+{
+ if (funcid == SBI_EXT_DBCN_CONSOLE_PUTS) {
+ /* TODO: sanity check on the physical address range */
+ sbi_nputs((const char *)regs->a1, regs->a0);
+ return 0;
+ }
+
+ return SBI_ENOTSUPP;
+}
+
+static int sbi_ecall_dbcn_probe(unsigned long extid, unsigned long *out_val)
+{
+ *out_val = (sbi_console_get_device()) ? 1 : 0;
+ return 0;
+}
+
+struct sbi_ecall_extension ecall_dbcn = {
+ .extid_start = SBI_EXT_DBCN,
+ .extid_end = SBI_EXT_DBCN,
+ .handle = sbi_ecall_dbcn_handler,
+ .probe = sbi_ecall_dbcn_probe,
+};
+#endif
--
2.34.1
More information about the opensbi
mailing list