OpenSBI Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/6] OpenSBI debug console support
@ 2022-11-24 13:29 Anup Patel
  2022-11-24 13:29 ` [PATCH v3 1/6] include: Add defines for SBI debug console extension Anup Patel
                   ` (5 more replies)
  0 siblings, 6 replies; 16+ messages in thread
From: Anup Patel @ 2022-11-24 13:29 UTC (permalink / raw)
  To: opensbi

The latest draft-v4 proposal of SBI debug console can be found here:
https://lists.riscv.org/g/tech-unixplatformspec/message/1815

This series implements SBI debug console support in OpenSBI
as-per above draft proposal.

These patches can also be found in riscv_sbi_dbcn_v3 branch
at: https://github.com/avpatel/opensbi.git

Changes since v2:
 - Reworked sbi_domain_check_addr_range() in PATCH3 to make it work
   for overlapping regions.

Changes since v1:
 - New PATCH3 to implement sbi_domain_check_addr_range() function
 - Added checks in PATCH4 for location and size of string to print
 - New PATCH5 to add console_puts() callback in the console device
 - New PATCH6 to implement console_puts() for semihosting
 
Anup Patel (6):
  include: Add defines for SBI debug console extension
  lib: sbi: Add sbi_nputs() function
  lib: sbi: Add sbi_domain_check_addr_range() function
  lib: sbi: Implement SBI debug console extension
  lib: sbi: Add console_puts() callback in the console device
  lib: utils/serial: Implement console_puts() for semihosting

 include/sbi/sbi_console.h         |  5 +++
 include/sbi/sbi_domain.h          | 15 +++++++
 include/sbi/sbi_ecall_interface.h |  4 ++
 lib/sbi/Kconfig                   |  4 ++
 lib/sbi/objects.mk                |  3 ++
 lib/sbi/sbi_console.c             | 25 +++++++++--
 lib/sbi/sbi_domain.c              | 69 +++++++++++++++++++++++++++++++
 lib/sbi/sbi_ecall_dbcn.c          | 62 +++++++++++++++++++++++++++
 lib/utils/serial/semihosting.c    | 33 +++++++++++++++
 9 files changed, 217 insertions(+), 3 deletions(-)
 create mode 100644 lib/sbi/sbi_ecall_dbcn.c

-- 
2.34.1


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v3 1/6] include: Add defines for SBI debug console extension
  2022-11-24 13:29 [PATCH v3 0/6] OpenSBI debug console support Anup Patel
@ 2022-11-24 13:29 ` Anup Patel
  2022-11-24 13:29 ` [PATCH v3 2/6] lib: sbi: Add sbi_nputs() function Anup Patel
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 16+ messages in thread
From: Anup Patel @ 2022-11-24 13:29 UTC (permalink / raw)
  To: opensbi

We add SBI debug console extension related defines/enum to the
SBI ecall interface header.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Xiang W <wxjstz@126.com>
---
 include/sbi/sbi_ecall_interface.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/include/sbi/sbi_ecall_interface.h b/include/sbi/sbi_ecall_interface.h
index a3f2bf4..1dd3874 100644
--- a/include/sbi/sbi_ecall_interface.h
+++ b/include/sbi/sbi_ecall_interface.h
@@ -29,6 +29,7 @@
 #define SBI_EXT_HSM				0x48534D
 #define SBI_EXT_SRST				0x53525354
 #define SBI_EXT_PMU				0x504D55
+#define SBI_EXT_DBCN				0x4442434E
 
 /* SBI function IDs for BASE extension*/
 #define SBI_EXT_BASE_GET_SPEC_VERSION		0x0
@@ -230,6 +231,9 @@ enum sbi_pmu_ctr_type {
 /* Flags defined for counter stop function */
 #define SBI_PMU_STOP_FLAG_RESET (1 << 0)
 
+/* SBI function IDs for DBCN extension */
+#define SBI_EXT_DBCN_CONSOLE_PUTS		0x0
+
 /* SBI base specification related macros */
 #define SBI_SPEC_VERSION_MAJOR_OFFSET		24
 #define SBI_SPEC_VERSION_MAJOR_MASK		0x7f
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v3 2/6] lib: sbi: Add sbi_nputs() function
  2022-11-24 13:29 [PATCH v3 0/6] OpenSBI debug console support Anup Patel
  2022-11-24 13:29 ` [PATCH v3 1/6] include: Add defines for SBI debug console extension Anup Patel
@ 2022-11-24 13:29 ` Anup Patel
  2022-11-24 13:29 ` [PATCH v3 3/6] lib: sbi: Add sbi_domain_check_addr_range() function Anup Patel
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 16+ messages in thread
From: Anup Patel @ 2022-11-24 13:29 UTC (permalink / raw)
  To: opensbi

We add new sbi_nputs() which help us print a fixed number of characters
from a physical memory location.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Xiang W <wxjstz@126.com>
---
 include/sbi/sbi_console.h |  2 ++
 lib/sbi/sbi_console.c     | 10 ++++++++++
 2 files changed, 12 insertions(+)

diff --git a/include/sbi/sbi_console.h b/include/sbi/sbi_console.h
index e15b55d..1bdeeb9 100644
--- a/include/sbi/sbi_console.h
+++ b/include/sbi/sbi_console.h
@@ -33,6 +33,8 @@ void sbi_putc(char ch);
 
 void sbi_puts(const char *str);
 
+void sbi_nputs(const char *str, unsigned long len);
+
 void sbi_gets(char *s, int maxwidth, char endchar);
 
 int __printf(2, 3) sbi_sprintf(char *out, const char *format, ...);
diff --git a/lib/sbi/sbi_console.c b/lib/sbi/sbi_console.c
index cfef2f8..a975708 100644
--- a/lib/sbi/sbi_console.c
+++ b/lib/sbi/sbi_console.c
@@ -51,6 +51,16 @@ void sbi_puts(const char *str)
 	spin_unlock(&console_out_lock);
 }
 
+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]);
+	spin_unlock(&console_out_lock);
+}
+
 void sbi_gets(char *s, int maxwidth, char endchar)
 {
 	int ch;
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v3 3/6] lib: sbi: Add sbi_domain_check_addr_range() function
  2022-11-24 13:29 [PATCH v3 0/6] OpenSBI debug console support Anup Patel
  2022-11-24 13:29 ` [PATCH v3 1/6] include: Add defines for SBI debug console extension Anup Patel
  2022-11-24 13:29 ` [PATCH v3 2/6] lib: sbi: Add sbi_nputs() function Anup Patel
@ 2022-11-24 13:29 ` Anup Patel
  2022-11-25  2:01   ` Xiang W
  2022-12-21  9:30   ` Bin Meng
  2022-11-24 13:29 ` [PATCH v3 4/6] lib: sbi: Implement SBI debug console extension Anup Patel
                   ` (2 subsequent siblings)
  5 siblings, 2 replies; 16+ messages in thread
From: Anup Patel @ 2022-11-24 13:29 UTC (permalink / raw)
  To: opensbi

We add sbi_domain_check_addr_range() helper function to check
whether a given address range is accessible under a particular
domain.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
---
 include/sbi/sbi_domain.h | 15 +++++++++
 lib/sbi/sbi_domain.c     | 69 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+)

diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
index 5553d21..4afcc37 100644
--- a/include/sbi/sbi_domain.h
+++ b/include/sbi/sbi_domain.h
@@ -154,6 +154,21 @@ bool sbi_domain_check_addr(const struct sbi_domain *dom,
 			   unsigned long addr, unsigned long mode,
 			   unsigned long access_flags);
 
+/**
+ * Check whether we can access specified address range for given mode and
+ * memory region flags under a domain
+ * @param dom pointer to domain
+ * @param addr the start of the address range to be checked
+ * @param size the size of the address range to be checked
+ * @param mode the privilege mode of access
+ * @param access_flags bitmask of domain access types (enum sbi_domain_access)
+ * @return TRUE if access allowed otherwise FALSE
+ */
+bool sbi_domain_check_addr_range(const struct sbi_domain *dom,
+				 unsigned long addr, unsigned long size,
+				 unsigned long mode,
+				 unsigned long access_flags);
+
 /** Dump domain details on the console */
 void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix);
 
diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
index f24a8e5..11a547c 100644
--- a/lib/sbi/sbi_domain.c
+++ b/lib/sbi/sbi_domain.c
@@ -195,6 +195,44 @@ static bool is_region_before(const struct sbi_domain_memregion *regA,
 	return FALSE;
 }
 
+static const struct sbi_domain_memregion *find_region(
+						const struct sbi_domain *dom,
+						unsigned long addr)
+{
+	unsigned long rstart, rend;
+	struct sbi_domain_memregion *reg;
+
+	sbi_domain_for_each_memregion(dom, reg) {
+		rstart = reg->base;
+		rend = (reg->order < __riscv_xlen) ?
+			rstart + ((1UL << reg->order) - 1) : -1UL;
+		if (rstart <= addr && addr <= rend)
+			return reg;
+	}
+
+	return NULL;
+}
+
+static const struct sbi_domain_memregion *find_next_subset_region(
+				const struct sbi_domain *dom,
+				const struct sbi_domain_memregion *reg,
+				unsigned long addr)
+{
+	struct sbi_domain_memregion *sreg, *ret = NULL;
+
+	sbi_domain_for_each_memregion(dom, sreg) {
+		if (sreg == reg || (sreg->base <= addr) ||
+		    !is_region_subset(sreg, reg))
+			continue;
+
+		if (!ret || (sreg->base < ret->base) ||
+		    ((sreg->base == ret->base) && (sreg->order < ret->order)))
+			ret = sreg;
+	}
+
+	return ret;
+}
+
 static int sanitize_domain(const struct sbi_platform *plat,
 			   struct sbi_domain *dom)
 {
@@ -303,6 +341,37 @@ static int sanitize_domain(const struct sbi_platform *plat,
 	return 0;
 }
 
+bool sbi_domain_check_addr_range(const struct sbi_domain *dom,
+				 unsigned long addr, unsigned long size,
+				 unsigned long mode,
+				 unsigned long access_flags)
+{
+	unsigned long max = addr + size;
+	const struct sbi_domain_memregion *reg, *sreg;
+
+	if (!dom)
+		return FALSE;
+
+	while (addr < max) {
+		reg = find_region(dom, addr);
+		if (!reg)
+			return FALSE;
+
+		if (!sbi_domain_check_addr(dom, addr, mode, access_flags))
+			return FALSE;
+
+		sreg = find_next_subset_region(dom, reg, addr);
+		if (sreg)
+			addr = sreg->base;
+		else if (reg->order < __riscv_xlen)
+			addr = reg->base + (1UL << reg->order);
+		else
+			break;
+	}
+
+	return TRUE;
+}
+
 void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix)
 {
 	u32 i, k;
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v3 4/6] lib: sbi: Implement SBI debug console extension
  2022-11-24 13:29 [PATCH v3 0/6] OpenSBI debug console support Anup Patel
                   ` (2 preceding siblings ...)
  2022-11-24 13:29 ` [PATCH v3 3/6] lib: sbi: Add sbi_domain_check_addr_range() function Anup Patel
@ 2022-11-24 13:29 ` Anup Patel
  2022-11-26 12:55   ` Xiang W
  2022-12-21 10:21   ` Bin Meng
  2022-11-24 13:29 ` [PATCH v3 5/6] lib: sbi: Add console_puts() callback in the console device Anup Patel
  2022-11-24 13:29 ` [PATCH v3 6/6] lib: utils/serial: Implement console_puts() for semihosting Anup Patel
  5 siblings, 2 replies; 16+ messages in thread
From: Anup Patel @ 2022-11-24 13:29 UTC (permalink / raw)
  To: opensbi

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@ventanamicro.com>
---
 lib/sbi/Kconfig          |  4 +++
 lib/sbi/objects.mk       |  3 ++
 lib/sbi/sbi_ecall_dbcn.c | 62 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+)
 create mode 100644 lib/sbi/sbi_ecall_dbcn.c

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 c774ebb..319f38d 100644
--- a/lib/sbi/objects.mk
+++ b/lib/sbi/objects.mk
@@ -37,6 +37,9 @@ libsbi-objs-$(CONFIG_SBI_ECALL_SRST) += sbi_ecall_srst.o
 carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_PMU) += ecall_pmu
 libsbi-objs-$(CONFIG_SBI_ECALL_PMU) += sbi_ecall_pmu.o
 
+carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_DBCN) += ecall_dbcn
+libsbi-objs-$(CONFIG_SBI_ECALL_DBCN) += sbi_ecall_dbcn.o
+
 carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_LEGACY) += ecall_legacy
 libsbi-objs-$(CONFIG_SBI_ECALL_LEGACY) += sbi_ecall_legacy.o
 
diff --git a/lib/sbi/sbi_ecall_dbcn.c b/lib/sbi/sbi_ecall_dbcn.c
new file mode 100644
index 0000000..19ac021
--- /dev/null
+++ b/lib/sbi/sbi_ecall_dbcn.c
@@ -0,0 +1,62 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2022 Ventana Micro Systems Inc.
+ *
+ * Authors:
+ *   Anup Patel <apatel@ventanamicro.com>
+ */
+
+#include <sbi/sbi_console.h>
+#include <sbi/sbi_domain.h>
+#include <sbi/sbi_error.h>
+#include <sbi/sbi_ecall.h>
+#include <sbi/sbi_ecall_interface.h>
+#include <sbi/sbi_trap.h>
+#include <sbi/riscv_asm.h>
+
+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)
+{
+	ulong smode = (csr_read(CSR_MSTATUS) & MSTATUS_MPP) >>
+			MSTATUS_MPP_SHIFT;
+
+	if (funcid == SBI_EXT_DBCN_CONSOLE_PUTS) {
+		/*
+		 * On RV32, the M-mode can only access the first 4GB of
+		 * the physical address space because M-mode does not have
+		 * MMU to access full 34-bit physical address space.
+		 *
+		 * Based on above, we simply fail if the upper 32bits of
+		 * the physical address (i.e. a2 register) is non-zero on
+		 * RV32.
+		 */
+#if __riscv_xlen == 32
+		if (regs->a2)
+			return SBI_ERR_FAILED;
+#endif
+		if (!sbi_domain_check_addr_range(sbi_domain_thishart_ptr(),
+					regs->a1, regs->a0, smode,
+					SBI_DOMAIN_READ|SBI_DOMAIN_WRITE))
+			return SBI_EINVALID_ADDR;
+		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,
+};
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v3 5/6] lib: sbi: Add console_puts() callback in the console device
  2022-11-24 13:29 [PATCH v3 0/6] OpenSBI debug console support Anup Patel
                   ` (3 preceding siblings ...)
  2022-11-24 13:29 ` [PATCH v3 4/6] lib: sbi: Implement SBI debug console extension Anup Patel
@ 2022-11-24 13:29 ` Anup Patel
  2022-11-26 12:55   ` Xiang W
  2022-12-21 10:23   ` Bin Meng
  2022-11-24 13:29 ` [PATCH v3 6/6] lib: utils/serial: Implement console_puts() for semihosting Anup Patel
  5 siblings, 2 replies; 16+ messages in thread
From: Anup Patel @ 2022-11-24 13:29 UTC (permalink / raw)
  To: opensbi

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 <apatel@ventanamicro.com>
---
 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 <sbi/sbi_hart.h>
 #include <sbi/sbi_platform.h>
 #include <sbi/sbi_scratch.h>
+#include <sbi/sbi_string.h>
 
 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



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v3 6/6] lib: utils/serial: Implement console_puts() for semihosting
  2022-11-24 13:29 [PATCH v3 0/6] OpenSBI debug console support Anup Patel
                   ` (4 preceding siblings ...)
  2022-11-24 13:29 ` [PATCH v3 5/6] lib: sbi: Add console_puts() callback in the console device Anup Patel
@ 2022-11-24 13:29 ` Anup Patel
  2022-11-26 12:55   ` Xiang W
  2022-12-21 10:24   ` Bin Meng
  5 siblings, 2 replies; 16+ messages in thread
From: Anup Patel @ 2022-11-24 13:29 UTC (permalink / raw)
  To: opensbi

We implement console_puts() for semihosting serial driver to speed-up
semihosting based prints.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
---
 lib/utils/serial/semihosting.c | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/lib/utils/serial/semihosting.c b/lib/utils/serial/semihosting.c
index 86fa296..773b75e 100644
--- a/lib/utils/serial/semihosting.c
+++ b/lib/utils/serial/semihosting.c
@@ -15,6 +15,7 @@
 
 #define SYSOPEN     0x01
 #define SYSWRITEC   0x03
+#define SYSWRITE    0x05
 #define SYSREAD     0x06
 #define SYSREADC    0x07
 #define SYSERRNO	0x13
@@ -93,6 +94,7 @@ static int semihosting_errno(void)
 }
 
 static int semihosting_infd = SBI_ENODEV;
+static int semihosting_outfd = SBI_ENODEV;
 
 static long semihosting_open(const char *fname, enum semihosting_open_mode mode)
 {
@@ -141,6 +143,21 @@ static long semihosting_read(long fd, void *memp, size_t len)
 	return len - ret;
 }
 
+static long semihosting_write(long fd, const void *memp, size_t len)
+{
+	long ret;
+	struct semihosting_rdwr_s write;
+
+	write.fd = fd;
+	write.memp = (void *)memp;
+	write.len = len;
+
+	ret = semihosting_trap(SYSWRITE, &write);
+	if (ret < 0)
+		return semihosting_errno();
+	return len - ret;
+}
+
 /* clang-format on */
 
 static void semihosting_putc(char ch)
@@ -148,6 +165,20 @@ static void semihosting_putc(char ch)
 	semihosting_trap(SYSWRITEC, &ch);
 }
 
+static void semihosting_puts(const char *str, unsigned long len)
+{
+	char ch;
+	unsigned long i;
+
+	if (semihosting_outfd < 0) {
+		for (i = 0; i < len; i++) {
+			ch = str[i];
+			semihosting_trap(SYSWRITEC, &ch);
+		}
+	} else
+		semihosting_write(semihosting_outfd, str, len);
+}
+
 static int semihosting_getc(void)
 {
 	char ch = 0;
@@ -165,12 +196,14 @@ static int semihosting_getc(void)
 static struct sbi_console_device semihosting_console = {
 	.name = "semihosting",
 	.console_putc = semihosting_putc,
+	.console_puts = semihosting_puts,
 	.console_getc = semihosting_getc
 };
 
 int semihosting_init(void)
 {
 	semihosting_infd = semihosting_open(":tt", MODE_READ);
+	semihosting_outfd = semihosting_open(":tt", MODE_WRITE);
 
 	sbi_console_set_device(&semihosting_console);
 
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v3 3/6] lib: sbi: Add sbi_domain_check_addr_range() function
  2022-11-24 13:29 ` [PATCH v3 3/6] lib: sbi: Add sbi_domain_check_addr_range() function Anup Patel
@ 2022-11-25  2:01   ` Xiang W
  2022-12-21  9:30   ` Bin Meng
  1 sibling, 0 replies; 16+ messages in thread
From: Xiang W @ 2022-11-25  2:01 UTC (permalink / raw)
  To: opensbi

? 2022-11-24???? 18:59 +0530?Anup Patel???
> We add sbi_domain_check_addr_range() helper function to check
> whether a given address range is accessible under a particular
> domain.
> 
> Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Look good to me

Reviewed-by: Xiang W <wxjstz@126.com>
> ---
> ?include/sbi/sbi_domain.h | 15 +++++++++
> ?lib/sbi/sbi_domain.c???? | 69 ++++++++++++++++++++++++++++++++++++++++
> ?2 files changed, 84 insertions(+)
> 
> diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
> index 5553d21..4afcc37 100644
> --- a/include/sbi/sbi_domain.h
> +++ b/include/sbi/sbi_domain.h
> @@ -154,6 +154,21 @@ bool sbi_domain_check_addr(const struct sbi_domain *dom,
> ?????????????????????????? unsigned long addr, unsigned long mode,
> ?????????????????????????? unsigned long access_flags);
> ?
> +/**
> + * Check whether we can access specified address range for given mode and
> + * memory region flags under a domain
> + * @param dom pointer to domain
> + * @param addr the start of the address range to be checked
> + * @param size the size of the address range to be checked
> + * @param mode the privilege mode of access
> + * @param access_flags bitmask of domain access types (enum sbi_domain_access)
> + * @return TRUE if access allowed otherwise FALSE
> + */
> +bool sbi_domain_check_addr_range(const struct sbi_domain *dom,
> +??????????????????????????????? unsigned long addr, unsigned long size,
> +??????????????????????????????? unsigned long mode,
> +??????????????????????????????? unsigned long access_flags);
> +
> ?/** Dump domain details on the console */
> ?void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix);
> ?
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index f24a8e5..11a547c 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -195,6 +195,44 @@ static bool is_region_before(const struct sbi_domain_memregion *regA,
> ????????return FALSE;
> ?}
> ?
> +static const struct sbi_domain_memregion *find_region(
> +???????????????????????????????????????????????const struct sbi_domain *dom,
> +???????????????????????????????????????????????unsigned long addr)
> +{
> +???????unsigned long rstart, rend;
> +???????struct sbi_domain_memregion *reg;
> +
> +???????sbi_domain_for_each_memregion(dom, reg) {
> +???????????????rstart = reg->base;
> +???????????????rend = (reg->order < __riscv_xlen) ?
> +???????????????????????rstart + ((1UL << reg->order) - 1) : -1UL;
> +???????????????if (rstart <= addr && addr <= rend)
> +???????????????????????return reg;
> +???????}
> +
> +???????return NULL;
> +}
> +
> +static const struct sbi_domain_memregion *find_next_subset_region(
> +???????????????????????????????const struct sbi_domain *dom,
> +???????????????????????????????const struct sbi_domain_memregion *reg,
> +???????????????????????????????unsigned long addr)
> +{
> +???????struct sbi_domain_memregion *sreg, *ret = NULL;
> +
> +???????sbi_domain_for_each_memregion(dom, sreg) {
> +???????????????if (sreg == reg || (sreg->base <= addr) ||
> +?????????????????? !is_region_subset(sreg, reg))
> +???????????????????????continue;
> +
> +???????????????if (!ret || (sreg->base < ret->base) ||
> +?????????????????? ((sreg->base == ret->base) && (sreg->order < ret->order)))
> +???????????????????????ret = sreg;
> +???????}
> +
> +???????return ret;
> +}
> +
> ?static int sanitize_domain(const struct sbi_platform *plat,
> ?????????????????????????? struct sbi_domain *dom)
> ?{
> @@ -303,6 +341,37 @@ static int sanitize_domain(const struct sbi_platform *plat,
> ????????return 0;
> ?}
> ?
> +bool sbi_domain_check_addr_range(const struct sbi_domain *dom,
> +??????????????????????????????? unsigned long addr, unsigned long size,
> +??????????????????????????????? unsigned long mode,
> +??????????????????????????????? unsigned long access_flags)
> +{
> +???????unsigned long max = addr + size;
> +???????const struct sbi_domain_memregion *reg, *sreg;
> +
> +???????if (!dom)
> +???????????????return FALSE;
> +
> +???????while (addr < max) {
> +???????????????reg = find_region(dom, addr);
> +???????????????if (!reg)
> +???????????????????????return FALSE;
> +
> +???????????????if (!sbi_domain_check_addr(dom, addr, mode, access_flags))
> +???????????????????????return FALSE;
> +
> +???????????????sreg = find_next_subset_region(dom, reg, addr);
> +???????????????if (sreg)
> +???????????????????????addr = sreg->base;
> +???????????????else if (reg->order < __riscv_xlen)
> +???????????????????????addr = reg->base + (1UL << reg->order);
> +???????????????else
> +???????????????????????break;
> +???????}
> +
> +???????return TRUE;
> +}
> +
> ?void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix)
> ?{
> ????????u32 i, k;
> -- 
> 2.34.1
> 
> 




^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v3 4/6] lib: sbi: Implement SBI debug console extension
  2022-11-24 13:29 ` [PATCH v3 4/6] lib: sbi: Implement SBI debug console extension Anup Patel
@ 2022-11-26 12:55   ` Xiang W
  2022-12-21 10:21   ` Bin Meng
  1 sibling, 0 replies; 16+ messages in thread
From: Xiang W @ 2022-11-26 12:55 UTC (permalink / raw)
  To: opensbi

? 2022-11-24???? 18:59 +0530?Anup Patel???
> 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@ventanamicro.com>
Look good to me

Reviewed-by: Xiang W <wxjstz@126.com>
> ---
> ?lib/sbi/Kconfig????????? |? 4 +++
> ?lib/sbi/objects.mk?????? |? 3 ++
> ?lib/sbi/sbi_ecall_dbcn.c | 62 ++++++++++++++++++++++++++++++++++++++++
> ?3 files changed, 69 insertions(+)
> ?create mode 100644 lib/sbi/sbi_ecall_dbcn.c
> 
> 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 c774ebb..319f38d 100644
> --- a/lib/sbi/objects.mk
> +++ b/lib/sbi/objects.mk
> @@ -37,6 +37,9 @@ libsbi-objs-$(CONFIG_SBI_ECALL_SRST) += sbi_ecall_srst.o
> ?carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_PMU) += ecall_pmu
> ?libsbi-objs-$(CONFIG_SBI_ECALL_PMU) += sbi_ecall_pmu.o
> ?
> +carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_DBCN) += ecall_dbcn
> +libsbi-objs-$(CONFIG_SBI_ECALL_DBCN) += sbi_ecall_dbcn.o
> +
> ?carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_LEGACY) += ecall_legacy
> ?libsbi-objs-$(CONFIG_SBI_ECALL_LEGACY) += sbi_ecall_legacy.o
> ?
> diff --git a/lib/sbi/sbi_ecall_dbcn.c b/lib/sbi/sbi_ecall_dbcn.c
> new file mode 100644
> index 0000000..19ac021
> --- /dev/null
> +++ b/lib/sbi/sbi_ecall_dbcn.c
> @@ -0,0 +1,62 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2022 Ventana Micro Systems Inc.
> + *
> + * Authors:
> + *?? Anup Patel <apatel@ventanamicro.com>
> + */
> +
> +#include <sbi/sbi_console.h>
> +#include <sbi/sbi_domain.h>
> +#include <sbi/sbi_error.h>
> +#include <sbi/sbi_ecall.h>
> +#include <sbi/sbi_ecall_interface.h>
> +#include <sbi/sbi_trap.h>
> +#include <sbi/riscv_asm.h>
> +
> +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)
> +{
> +???????ulong smode = (csr_read(CSR_MSTATUS) & MSTATUS_MPP) >>
> +???????????????????????MSTATUS_MPP_SHIFT;
> +
> +???????if (funcid == SBI_EXT_DBCN_CONSOLE_PUTS) {
> +???????????????/*
> +??????????????? * On RV32, the M-mode can only access the first 4GB of
> +??????????????? * the physical address space because M-mode does not have
> +??????????????? * MMU to access full 34-bit physical address space.
> +??????????????? *
> +??????????????? * Based on above, we simply fail if the upper 32bits of
> +??????????????? * the physical address (i.e. a2 register) is non-zero on
> +??????????????? * RV32.
> +??????????????? */
> +#if __riscv_xlen == 32
> +???????????????if (regs->a2)
> +???????????????????????return SBI_ERR_FAILED;
> +#endif
> +???????????????if (!sbi_domain_check_addr_range(sbi_domain_thishart_ptr(),
> +???????????????????????????????????????regs->a1, regs->a0, smode,
> +???????????????????????????????????????SBI_DOMAIN_READ|SBI_DOMAIN_WRITE))
> +???????????????????????return SBI_EINVALID_ADDR;
> +???????????????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,
> +};
> -- 
> 2.34.1
> 
> 




^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v3 5/6] lib: sbi: Add console_puts() callback in the console device
  2022-11-24 13:29 ` [PATCH v3 5/6] lib: sbi: Add console_puts() callback in the console device Anup Patel
@ 2022-11-26 12:55   ` Xiang W
  2022-12-21 10:23   ` Bin Meng
  1 sibling, 0 replies; 16+ messages in thread
From: Xiang W @ 2022-11-26 12:55 UTC (permalink / raw)
  To: opensbi

? 2022-11-24???? 18:59 +0530?Anup Patel???
> 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 <apatel@ventanamicro.com>
Look good to me

Reviewed-by: Xiang W <wxjstz@126.com>
> ---
> ?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 <sbi/sbi_hart.h>
> ?#include <sbi/sbi_platform.h>
> ?#include <sbi/sbi_scratch.h>
> +#include <sbi/sbi_string.h>
> ?
> ?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
> 
> 




^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v3 6/6] lib: utils/serial: Implement console_puts() for semihosting
  2022-11-24 13:29 ` [PATCH v3 6/6] lib: utils/serial: Implement console_puts() for semihosting Anup Patel
@ 2022-11-26 12:55   ` Xiang W
  2022-12-21 10:24   ` Bin Meng
  1 sibling, 0 replies; 16+ messages in thread
From: Xiang W @ 2022-11-26 12:55 UTC (permalink / raw)
  To: opensbi

? 2022-11-24???? 18:59 +0530?Anup Patel???
> We implement console_puts() for semihosting serial driver to speed-up
> semihosting based prints.
> 
> Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Look good to me

Reviewed-by: Xiang W <wxjstz@126.com>
> ---
> ?lib/utils/serial/semihosting.c | 33 +++++++++++++++++++++++++++++++++
> ?1 file changed, 33 insertions(+)
> 
> diff --git a/lib/utils/serial/semihosting.c b/lib/utils/serial/semihosting.c
> index 86fa296..773b75e 100644
> --- a/lib/utils/serial/semihosting.c
> +++ b/lib/utils/serial/semihosting.c
> @@ -15,6 +15,7 @@
> ?
> ?#define SYSOPEN???? 0x01
> ?#define SYSWRITEC?? 0x03
> +#define SYSWRITE??? 0x05
> ?#define SYSREAD???? 0x06
> ?#define SYSREADC??? 0x07
> ?#define SYSERRNO???????0x13
> @@ -93,6 +94,7 @@ static int semihosting_errno(void)
> ?}
> ?
> ?static int semihosting_infd = SBI_ENODEV;
> +static int semihosting_outfd = SBI_ENODEV;
> ?
> ?static long semihosting_open(const char *fname, enum semihosting_open_mode mode)
> ?{
> @@ -141,6 +143,21 @@ static long semihosting_read(long fd, void *memp, size_t len)
> ????????return len - ret;
> ?}
> ?
> +static long semihosting_write(long fd, const void *memp, size_t len)
> +{
> +???????long ret;
> +???????struct semihosting_rdwr_s write;
> +
> +???????write.fd = fd;
> +???????write.memp = (void *)memp;
> +???????write.len = len;
> +
> +???????ret = semihosting_trap(SYSWRITE, &write);
> +???????if (ret < 0)
> +???????????????return semihosting_errno();
> +???????return len - ret;
> +}
> +
> ?/* clang-format on */
> ?
> ?static void semihosting_putc(char ch)
> @@ -148,6 +165,20 @@ static void semihosting_putc(char ch)
> ????????semihosting_trap(SYSWRITEC, &ch);
> ?}
> ?
> +static void semihosting_puts(const char *str, unsigned long len)
> +{
> +???????char ch;
> +???????unsigned long i;
> +
> +???????if (semihosting_outfd < 0) {
> +???????????????for (i = 0; i < len; i++) {
> +???????????????????????ch = str[i];
> +???????????????????????semihosting_trap(SYSWRITEC, &ch);
> +???????????????}
> +???????} else
> +???????????????semihosting_write(semihosting_outfd, str, len);
> +}
> +
> ?static int semihosting_getc(void)
> ?{
> ????????char ch = 0;
> @@ -165,12 +196,14 @@ static int semihosting_getc(void)
> ?static struct sbi_console_device semihosting_console = {
> ????????.name = "semihosting",
> ????????.console_putc = semihosting_putc,
> +???????.console_puts = semihosting_puts,
> ????????.console_getc = semihosting_getc
> ?};
> ?
> ?int semihosting_init(void)
> ?{
> ????????semihosting_infd = semihosting_open(":tt", MODE_READ);
> +???????semihosting_outfd = semihosting_open(":tt", MODE_WRITE);
> ?
> ????????sbi_console_set_device(&semihosting_console);
> ?
> -- 
> 2.34.1
> 
> 




^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v3 3/6] lib: sbi: Add sbi_domain_check_addr_range() function
  2022-11-24 13:29 ` [PATCH v3 3/6] lib: sbi: Add sbi_domain_check_addr_range() function Anup Patel
  2022-11-25  2:01   ` Xiang W
@ 2022-12-21  9:30   ` Bin Meng
  2022-12-21 10:17     ` Bin Meng
  1 sibling, 1 reply; 16+ messages in thread
From: Bin Meng @ 2022-12-21  9:30 UTC (permalink / raw)
  To: opensbi

On Thu, Nov 24, 2022 at 9:32 PM Anup Patel <apatel@ventanamicro.com> wrote:
>
> We add sbi_domain_check_addr_range() helper function to check
> whether a given address range is accessible under a particular
> domain.
>
> Signed-off-by: Anup Patel <apatel@ventanamicro.com>
> ---
>  include/sbi/sbi_domain.h | 15 +++++++++
>  lib/sbi/sbi_domain.c     | 69 ++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 84 insertions(+)
>
> diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
> index 5553d21..4afcc37 100644
> --- a/include/sbi/sbi_domain.h
> +++ b/include/sbi/sbi_domain.h
> @@ -154,6 +154,21 @@ bool sbi_domain_check_addr(const struct sbi_domain *dom,
>                            unsigned long addr, unsigned long mode,
>                            unsigned long access_flags);
>
> +/**
> + * Check whether we can access specified address range for given mode and
> + * memory region flags under a domain
> + * @param dom pointer to domain
> + * @param addr the start of the address range to be checked
> + * @param size the size of the address range to be checked
> + * @param mode the privilege mode of access
> + * @param access_flags bitmask of domain access types (enum sbi_domain_access)
> + * @return TRUE if access allowed otherwise FALSE
> + */
> +bool sbi_domain_check_addr_range(const struct sbi_domain *dom,
> +                                unsigned long addr, unsigned long size,
> +                                unsigned long mode,
> +                                unsigned long access_flags);
> +
>  /** Dump domain details on the console */
>  void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix);
>
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index f24a8e5..11a547c 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -195,6 +195,44 @@ static bool is_region_before(const struct sbi_domain_memregion *regA,
>         return FALSE;
>  }
>
> +static const struct sbi_domain_memregion *find_region(
> +                                               const struct sbi_domain *dom,
> +                                               unsigned long addr)
> +{
> +       unsigned long rstart, rend;
> +       struct sbi_domain_memregion *reg;
> +
> +       sbi_domain_for_each_memregion(dom, reg) {
> +               rstart = reg->base;
> +               rend = (reg->order < __riscv_xlen) ?
> +                       rstart + ((1UL << reg->order) - 1) : -1UL;
> +               if (rstart <= addr && addr <= rend)

addr < rend?

> +                       return reg;
> +       }
> +
> +       return NULL;
> +}
> +
> +static const struct sbi_domain_memregion *find_next_subset_region(
> +                               const struct sbi_domain *dom,
> +                               const struct sbi_domain_memregion *reg,
> +                               unsigned long addr)
> +{
> +       struct sbi_domain_memregion *sreg, *ret = NULL;
> +
> +       sbi_domain_for_each_memregion(dom, sreg) {
> +               if (sreg == reg || (sreg->base <= addr) ||
> +                   !is_region_subset(sreg, reg))
> +                       continue;
> +
> +               if (!ret || (sreg->base < ret->base) ||
> +                   ((sreg->base == ret->base) && (sreg->order < ret->order)))
> +                       ret = sreg;
> +       }
> +
> +       return ret;
> +}
> +
>  static int sanitize_domain(const struct sbi_platform *plat,
>                            struct sbi_domain *dom)
>  {
> @@ -303,6 +341,37 @@ static int sanitize_domain(const struct sbi_platform *plat,
>         return 0;
>  }
>
> +bool sbi_domain_check_addr_range(const struct sbi_domain *dom,
> +                                unsigned long addr, unsigned long size,
> +                                unsigned long mode,
> +                                unsigned long access_flags)
> +{
> +       unsigned long max = addr + size;
> +       const struct sbi_domain_memregion *reg, *sreg;
> +
> +       if (!dom)
> +               return FALSE;
> +
> +       while (addr < max) {
> +               reg = find_region(dom, addr);
> +               if (!reg)
> +                       return FALSE;
> +
> +               if (!sbi_domain_check_addr(dom, addr, mode, access_flags))
> +                       return FALSE;
> +
> +               sreg = find_next_subset_region(dom, reg, addr);
> +               if (sreg)
> +                       addr = sreg->base;
> +               else if (reg->order < __riscv_xlen)
> +                       addr = reg->base + (1UL << reg->order);
> +               else
> +                       break;
> +       }
> +
> +       return TRUE;
> +}
> +
>  void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix)
>  {
>         u32 i, k;

Regards,
Bin


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v3 3/6] lib: sbi: Add sbi_domain_check_addr_range() function
  2022-12-21  9:30   ` Bin Meng
@ 2022-12-21 10:17     ` Bin Meng
  0 siblings, 0 replies; 16+ messages in thread
From: Bin Meng @ 2022-12-21 10:17 UTC (permalink / raw)
  To: opensbi

On Wed, Dec 21, 2022 at 5:30 PM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> On Thu, Nov 24, 2022 at 9:32 PM Anup Patel <apatel@ventanamicro.com> wrote:
> >
> > We add sbi_domain_check_addr_range() helper function to check
> > whether a given address range is accessible under a particular
> > domain.
> >
> > Signed-off-by: Anup Patel <apatel@ventanamicro.com>
> > ---
> >  include/sbi/sbi_domain.h | 15 +++++++++
> >  lib/sbi/sbi_domain.c     | 69 ++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 84 insertions(+)
> >
> > diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
> > index 5553d21..4afcc37 100644
> > --- a/include/sbi/sbi_domain.h
> > +++ b/include/sbi/sbi_domain.h
> > @@ -154,6 +154,21 @@ bool sbi_domain_check_addr(const struct sbi_domain *dom,
> >                            unsigned long addr, unsigned long mode,
> >                            unsigned long access_flags);
> >
> > +/**
> > + * Check whether we can access specified address range for given mode and
> > + * memory region flags under a domain
> > + * @param dom pointer to domain
> > + * @param addr the start of the address range to be checked
> > + * @param size the size of the address range to be checked
> > + * @param mode the privilege mode of access
> > + * @param access_flags bitmask of domain access types (enum sbi_domain_access)
> > + * @return TRUE if access allowed otherwise FALSE
> > + */
> > +bool sbi_domain_check_addr_range(const struct sbi_domain *dom,
> > +                                unsigned long addr, unsigned long size,
> > +                                unsigned long mode,
> > +                                unsigned long access_flags);
> > +
> >  /** Dump domain details on the console */
> >  void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix);
> >
> > diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> > index f24a8e5..11a547c 100644
> > --- a/lib/sbi/sbi_domain.c
> > +++ b/lib/sbi/sbi_domain.c
> > @@ -195,6 +195,44 @@ static bool is_region_before(const struct sbi_domain_memregion *regA,
> >         return FALSE;
> >  }
> >
> > +static const struct sbi_domain_memregion *find_region(
> > +                                               const struct sbi_domain *dom,
> > +                                               unsigned long addr)
> > +{
> > +       unsigned long rstart, rend;
> > +       struct sbi_domain_memregion *reg;
> > +
> > +       sbi_domain_for_each_memregion(dom, reg) {
> > +               rstart = reg->base;
> > +               rend = (reg->order < __riscv_xlen) ?
> > +                       rstart + ((1UL << reg->order) - 1) : -1UL;
> > +               if (rstart <= addr && addr <= rend)
>
> addr < rend?

Never mind. Looks good.

>
> > +                       return reg;
> > +       }
> > +
> > +       return NULL;
> > +}
> > +
> > +static const struct sbi_domain_memregion *find_next_subset_region(
> > +                               const struct sbi_domain *dom,
> > +                               const struct sbi_domain_memregion *reg,
> > +                               unsigned long addr)
> > +{
> > +       struct sbi_domain_memregion *sreg, *ret = NULL;
> > +
> > +       sbi_domain_for_each_memregion(dom, sreg) {
> > +               if (sreg == reg || (sreg->base <= addr) ||
> > +                   !is_region_subset(sreg, reg))
> > +                       continue;
> > +
> > +               if (!ret || (sreg->base < ret->base) ||
> > +                   ((sreg->base == ret->base) && (sreg->order < ret->order)))
> > +                       ret = sreg;
> > +       }
> > +
> > +       return ret;
> > +}
> > +
> >  static int sanitize_domain(const struct sbi_platform *plat,
> >                            struct sbi_domain *dom)
> >  {
> > @@ -303,6 +341,37 @@ static int sanitize_domain(const struct sbi_platform *plat,
> >         return 0;
> >  }
> >
> > +bool sbi_domain_check_addr_range(const struct sbi_domain *dom,
> > +                                unsigned long addr, unsigned long size,
> > +                                unsigned long mode,
> > +                                unsigned long access_flags)
> > +{
> > +       unsigned long max = addr + size;
> > +       const struct sbi_domain_memregion *reg, *sreg;
> > +
> > +       if (!dom)
> > +               return FALSE;
> > +
> > +       while (addr < max) {
> > +               reg = find_region(dom, addr);
> > +               if (!reg)
> > +                       return FALSE;
> > +
> > +               if (!sbi_domain_check_addr(dom, addr, mode, access_flags))
> > +                       return FALSE;
> > +
> > +               sreg = find_next_subset_region(dom, reg, addr);
> > +               if (sreg)
> > +                       addr = sreg->base;
> > +               else if (reg->order < __riscv_xlen)
> > +                       addr = reg->base + (1UL << reg->order);
> > +               else
> > +                       break;
> > +       }
> > +
> > +       return TRUE;
> > +}
> > +
> >  void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix)
> >  {
> >         u32 i, k;
>

Reviewed-by: Bin Meng <bmeng@tinylab.org>


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v3 4/6] lib: sbi: Implement SBI debug console extension
  2022-11-24 13:29 ` [PATCH v3 4/6] lib: sbi: Implement SBI debug console extension Anup Patel
  2022-11-26 12:55   ` Xiang W
@ 2022-12-21 10:21   ` Bin Meng
  1 sibling, 0 replies; 16+ messages in thread
From: Bin Meng @ 2022-12-21 10:21 UTC (permalink / raw)
  To: opensbi

On Thu, Nov 24, 2022 at 9:32 PM Anup Patel <apatel@ventanamicro.com> wrote:
>
> 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@ventanamicro.com>
> ---
>  lib/sbi/Kconfig          |  4 +++
>  lib/sbi/objects.mk       |  3 ++
>  lib/sbi/sbi_ecall_dbcn.c | 62 ++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 69 insertions(+)
>  create mode 100644 lib/sbi/sbi_ecall_dbcn.c
>

Reviewed-by: Bin Meng <bmeng@tinylab.org>


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v3 5/6] lib: sbi: Add console_puts() callback in the console device
  2022-11-24 13:29 ` [PATCH v3 5/6] lib: sbi: Add console_puts() callback in the console device Anup Patel
  2022-11-26 12:55   ` Xiang W
@ 2022-12-21 10:23   ` Bin Meng
  1 sibling, 0 replies; 16+ messages in thread
From: Bin Meng @ 2022-12-21 10:23 UTC (permalink / raw)
  To: opensbi

On Thu, Nov 24, 2022 at 9:33 PM Anup Patel <apatel@ventanamicro.com> wrote:
>
> 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 <apatel@ventanamicro.com>
> ---
>  include/sbi/sbi_console.h |  3 +++
>  lib/sbi/sbi_console.c     | 19 ++++++++++++++-----
>  2 files changed, 17 insertions(+), 5 deletions(-)
>

Reviewed-by: Bin Meng <bmeng@tinylab.org>


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v3 6/6] lib: utils/serial: Implement console_puts() for semihosting
  2022-11-24 13:29 ` [PATCH v3 6/6] lib: utils/serial: Implement console_puts() for semihosting Anup Patel
  2022-11-26 12:55   ` Xiang W
@ 2022-12-21 10:24   ` Bin Meng
  1 sibling, 0 replies; 16+ messages in thread
From: Bin Meng @ 2022-12-21 10:24 UTC (permalink / raw)
  To: opensbi

On Thu, Nov 24, 2022 at 9:33 PM Anup Patel <apatel@ventanamicro.com> wrote:
>
> We implement console_puts() for semihosting serial driver to speed-up
> semihosting based prints.
>
> Signed-off-by: Anup Patel <apatel@ventanamicro.com>
> ---
>  lib/utils/serial/semihosting.c | 33 +++++++++++++++++++++++++++++++++
>  1 file changed, 33 insertions(+)
>

Reviewed-by: Bin Meng <bmeng@tinylab.org>


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2022-12-21 10:24 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-11-24 13:29 [PATCH v3 0/6] OpenSBI debug console support Anup Patel
2022-11-24 13:29 ` [PATCH v3 1/6] include: Add defines for SBI debug console extension Anup Patel
2022-11-24 13:29 ` [PATCH v3 2/6] lib: sbi: Add sbi_nputs() function Anup Patel
2022-11-24 13:29 ` [PATCH v3 3/6] lib: sbi: Add sbi_domain_check_addr_range() function Anup Patel
2022-11-25  2:01   ` Xiang W
2022-12-21  9:30   ` Bin Meng
2022-12-21 10:17     ` Bin Meng
2022-11-24 13:29 ` [PATCH v3 4/6] lib: sbi: Implement SBI debug console extension Anup Patel
2022-11-26 12:55   ` Xiang W
2022-12-21 10:21   ` Bin Meng
2022-11-24 13:29 ` [PATCH v3 5/6] lib: sbi: Add console_puts() callback in the console device Anup Patel
2022-11-26 12:55   ` Xiang W
2022-12-21 10:23   ` Bin Meng
2022-11-24 13:29 ` [PATCH v3 6/6] lib: utils/serial: Implement console_puts() for semihosting Anup Patel
2022-11-26 12:55   ` Xiang W
2022-12-21 10:24   ` Bin Meng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox