[PATCH kvm-unit-tests] This patch adds a unit test for the debug console write() and write_byte() functions. It also fixes the virt_to_phys() function to return the offset address, not the PTE aligned address.

Cade Richard cade.richard at gmail.com
Wed Jul 3 20:43:44 PDT 2024



---
Signed-off-by: Cade Richard <cade.richard at berkeley.edu>
---
 riscv/run           |  1 +
 lib/riscv/asm/sbi.h |  5 ++++
 riscv/sbi.c         | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 77 insertions(+)

diff --git a/riscv/run b/riscv/run
index 73f2bf54..e4e39d74 100755
--- a/riscv/run
+++ b/riscv/run
@@ -30,6 +30,7 @@ fi
 mach='-machine virt'
 
 command="$qemu -nodefaults -nographic -serial mon:stdio"
+
 command+=" $mach $acc $firmware -cpu $processor "
 command="$(migration_cmd) $(timeout_cmd) $command"
 
diff --git a/lib/riscv/asm/sbi.h b/lib/riscv/asm/sbi.h
index d82a384d..4ae15879 100644
--- a/lib/riscv/asm/sbi.h
+++ b/lib/riscv/asm/sbi.h
@@ -12,6 +12,11 @@
 #define SBI_ERR_ALREADY_STARTED		-7
 #define SBI_ERR_ALREADY_STOPPED		-8
 
+#define DBCN_WRITE_TEST_STRING "DBCN_WRITE_TEST_STRING\n"
+#define DBCN_READ_TEST_STRING "DBCN_READ_TEST_STRING\n"
+#define DBCN_WRITE_BYTE_TEST_BYTE 'a'
+#define DBCN_WRITE_TEST_BYTE_FLAG "DBCN_WRITE_TEST_CHAR: "
+
 #ifndef __ASSEMBLY__
 
 enum sbi_ext_id {
diff --git a/riscv/sbi.c b/riscv/sbi.c
index 762e9711..0fb7a300 100644
--- a/riscv/sbi.c
+++ b/riscv/sbi.c
@@ -7,6 +7,11 @@
 #include <libcflat.h>
 #include <stdlib.h>
 #include <asm/sbi.h>
+#include <asm/csr.h>
+#include <asm/io.h>
+#include <asm/sbi.h>
+
+#define INVALID_RW_ADDR 0x0000000002000000;
 
 static void help(void)
 {
@@ -112,6 +117,72 @@ static void check_base(void)
 	report_prefix_pop();
 }
 
+static void check_dbcn(void)
+{
+	
+	struct sbiret ret;
+	unsigned long num_bytes, base_addr_lo, base_addr_hi;
+
+	report_prefix_push("dbcn");
+	
+	ret = __base_sbi_ecall(SBI_EXT_BASE_PROBE_EXT, SBI_EXT_DBCN);
+	if (!ret.value) {
+		report_skip("DBCN extension unavailable");
+		report_prefix_pop();
+		return;
+	}
+
+	report_prefix_pop();
+
+	report_prefix_push("write");
+	
+	num_bytes = strlen(DBCN_WRITE_TEST_STRING);
+	base_addr_hi = 0x0;
+	base_addr_lo = virt_to_phys((void *) &DBCN_WRITE_TEST_STRING);
+
+	do {
+		ret = __dbcn_sbi_ecall(SBI_EXT_DBCN_CONSOLE_WRITE, num_bytes, base_addr_lo, base_addr_hi);
+	} while (ret.value != num_bytes || ret.error != SBI_SUCCESS) ;
+	report(SBI_SUCCESS == ret.error, "write success");
+    report(ret.value == num_bytes, "correct number of bytes written");
+
+	base_addr_lo = INVALID_RW_ADDR;
+	ret = __dbcn_sbi_ecall(SBI_EXT_DBCN_CONSOLE_WRITE, num_bytes, base_addr_lo, base_addr_hi);
+    report(SBI_ERR_INVALID_PARAM == ret.error, "invalid parameter: address");
+
+	report_prefix_pop();
+	
+	report_prefix_push("read");
+
+/*	num_bytes = strlen(DBCN_READ_TEST_STRING);
+	char *actual = malloc(num_bytes);
+	base_addr_hi = 0x0;
+	base_addr_lo = virt_to_phys(( void *) actual);
+
+	do {
+		ret = __dbcn_sbi_ecall(SBI_EXT_DBCN_CONSOLE_READ, num_bytes, base_addr_lo, base_addr_hi);
+	} while (ret.value != num_bytes || ret.error != SBI_SUCCESS) ;
+	report(SBI_SUCCESS == ret.error, "read success");
+    report(ret.value == num_bytes, "correct number of bytes read");
+	report(strcmp(actual,DBCN_READ_TEST_STRING) == 0, "correct bytes read");
+*/
+	base_addr_lo = INVALID_RW_ADDR;
+    ret = __dbcn_sbi_ecall(SBI_EXT_DBCN_CONSOLE_READ, num_bytes, base_addr_lo, base_addr_hi);
+    report(SBI_ERR_INVALID_PARAM == ret.error, "invalid parameter: address");
+
+	report_prefix_pop();
+	
+	report_prefix_push("write_byte");
+
+	puts(DBCN_WRITE_TEST_BYTE_FLAG);
+	ret = __dbcn_sbi_ecall(SBI_EXT_DBCN_CONSOLE_WRITE_BYTE, (u8) DBCN_WRITE_BYTE_TEST_BYTE, 0, 0);
+	puts("\n");
+    report(SBI_SUCCESS == ret.error, "write success");
+    report(0 == ret.value, "expected ret.value");
+
+	report_prefix_pop();
+}
+
 int main(int argc, char **argv)
 {
 

---
base-commit: a68956b3fb6f5f308822b20ce0ff8e02db1f7375
change-id: 20240703-sbi-dbcn-write-894334156f6f

Best regards,
-- 
Cade Richard <cade.richard at berkeley.edu>




More information about the kvm-riscv mailing list