hc
2024-03-22 619f0f87159c5dbd2755b1b0a0eb35784be84e7a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Copyright (c) 2019 Western Digital Corporation or its affiliates.
 *
 * Authors:
 *   Anup Patel <anup.patel@wdc.com>
 */
 
#include <sbi/sbi_ecall_interface.h>
 
#define SBI_ECALL(__num, __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 a7 asm("a7") = (unsigned long)(__num); \
       asm volatile("ecall"                                          \
                : "+r"(a0)                                       \
                : "r"(a1), "r"(a2), "r"(a7)                      \
                : "memory");                                     \
       a0;                                                           \
   })
 
#define SBI_ECALL_0(__num) SBI_ECALL(__num, 0, 0, 0)
#define SBI_ECALL_1(__num, __a0) SBI_ECALL(__num, __a0, 0, 0)
#define SBI_ECALL_2(__num, __a0, __a1) SBI_ECALL(__num, __a0, __a1, 0)
 
#define sbi_ecall_console_putc(c) SBI_ECALL_1(SBI_EXT_0_1_CONSOLE_PUTCHAR, (c))
 
static inline void sbi_ecall_console_puts(const char *str)
{
   while (str && *str)
       sbi_ecall_console_putc(*str++);
}
 
#define wfi()                                             \
   do {                                              \
       __asm__ __volatile__("wfi" ::: "memory"); \
   } while (0)
 
void test_main(unsigned long a0, unsigned long a1)
{
   sbi_ecall_console_puts("\nTest payload running\n");
 
   while (1)
       wfi();
}