mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-24 23:41:23 +01:00

Previously, 'make run' would hang in WFI after printing the test message. This commit adds an SBI ecall to ensure QEMU exits cleanly after the test payload runs. Reviewed-by: Anup Patel <anup@brainfault.org> Signed-off-by: Xiang W <wxjstz@126.com> Link: https://lore.kernel.org/r/20250721010807.460788-1-wxjstz@126.com Signed-off-by: Anup Patel <anup@brainfault.org>
67 lines
1.9 KiB
C
67 lines
1.9 KiB
C
/*
|
|
* 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>
|
|
#include <sbi/sbi_string.h>
|
|
|
|
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)
|
|
{
|
|
sbi_ecall(SBI_EXT_DBCN, SBI_EXT_DBCN_CONSOLE_WRITE,
|
|
sbi_strlen(str), (unsigned long)str, 0, 0, 0, 0);
|
|
}
|
|
|
|
static inline void sbi_ecall_shutdown(void)
|
|
{
|
|
sbi_ecall(SBI_EXT_SRST, SBI_EXT_SRST_RESET,
|
|
SBI_SRST_RESET_TYPE_SHUTDOWN, SBI_SRST_RESET_REASON_NONE,
|
|
0, 0, 0, 0);
|
|
}
|
|
|
|
#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");
|
|
sbi_ecall_shutdown();
|
|
sbi_ecall_console_puts("sbi_ecall_shutdown failed to execute.\n");
|
|
}
|