firmware: payload: test: Change to SBI v2.0 DBCN ecalls
authorInochi Amaoto <inochiama@outlook.com>
Wed, 30 Aug 2023 00:34:43 +0000 (08:34 +0800)
committerAnup Patel <anup@brainfault.org>
Wed, 6 Sep 2023 11:20:50 +0000 (16:50 +0530)
As the the "Console Putchar" extension is already legacy and may
be removed in the furture. So replace it with the SBI v2.0 "DBCN"
extension.

Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
firmware/payloads/test_main.c

index ae2ed4f5edfcaeb1e5bc5110a1595bebd7552b15..194dbbe6c50b6837e0acb91610fef8f3c0b6521e 100644 (file)
@@ -8,31 +8,42 @@
  */
 
 #include <sbi/sbi_ecall_interface.h>
+#include <sbi/sbi_string.h>
 
-#define SBI_ECALL(__eid, __fid, __a0, __a1, __a2)                             \
-       ({                                                                    \
-               register unsigned long a0 asm("a0") = (unsigned long)(__a0);  \
-               register unsigned long a1 asm("a1") = (unsigned long)(__a1);  \
-               register unsigned long a2 asm("a2") = (unsigned long)(__a2);  \
-               register unsigned long a6 asm("a6") = (unsigned long)(__fid); \
-               register unsigned long a7 asm("a7") = (unsigned long)(__eid); \
-               asm volatile("ecall"                                          \
-                            : "+r"(a0)                                       \
-                            : "r"(a1), "r"(a2), "r"(a6), "r"(a7)             \
-                            : "memory");                                     \
-               a0;                                                           \
-       })
-
-#define SBI_ECALL_0(__eid, __fid) SBI_ECALL(__eid, __fid, 0, 0, 0)
-#define SBI_ECALL_1(__eid, __fid, __a0) SBI_ECALL(__eid, __fid, __a0, 0, 0)
-#define SBI_ECALL_2(__eid, __fid, __a0, __a1) SBI_ECALL(__eid, __fid, __a0, __a1, 0)
-
-#define sbi_ecall_console_putc(c) SBI_ECALL_1(SBI_EXT_0_1_CONSOLE_PUTCHAR, 0, (c))
+struct sbiret {
+       unsigned long error;
+       unsigned long value;
+};
+
+struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
+                       unsigned long arg1, unsigned long arg2,
+                       unsigned long arg3, unsigned long arg4,
+                       unsigned long arg5)
+{
+       struct sbiret ret;
+
+       register unsigned long a0 asm ("a0") = (unsigned long)(arg0);
+       register unsigned long a1 asm ("a1") = (unsigned long)(arg1);
+       register unsigned long a2 asm ("a2") = (unsigned long)(arg2);
+       register unsigned long a3 asm ("a3") = (unsigned long)(arg3);
+       register unsigned long a4 asm ("a4") = (unsigned long)(arg4);
+       register unsigned long a5 asm ("a5") = (unsigned long)(arg5);
+       register unsigned long a6 asm ("a6") = (unsigned long)(fid);
+       register unsigned long a7 asm ("a7") = (unsigned long)(ext);
+       asm volatile ("ecall"
+                     : "+r" (a0), "+r" (a1)
+                     : "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6), "r" (a7)
+                     : "memory");
+       ret.error = a0;
+       ret.value = a1;
+
+       return ret;
+}
 
 static inline void sbi_ecall_console_puts(const char *str)
 {
-       while (str && *str)
-               sbi_ecall_console_putc(*str++);
+       sbi_ecall(SBI_EXT_DBCN, SBI_EXT_DBCN_CONSOLE_WRITE,
+                 sbi_strlen(str), (unsigned long)str, 0, 0, 0, 0);
 }
 
 #define wfi()                                             \