| // SPDX-License-Identifier: GPL-2.0 |
| /* Copyright (c) 2024 Rivos Inc. */ |
| |
| #include <asm/sbi.h> |
| #define CREATE_TRACE_POINTS |
| #include <asm/trace.h> |
| |
| long __sbi_base_ecall(int fid) |
| { |
| struct sbiret ret; |
| |
| ret = sbi_ecall(SBI_EXT_BASE, fid, 0, 0, 0, 0, 0, 0); |
| if (!ret.error) |
| return ret.value; |
| else |
| return sbi_err_map_linux_errno(ret.error); |
| } |
| EXPORT_SYMBOL(__sbi_base_ecall); |
| |
| struct sbiret __sbi_ecall(unsigned long arg0, unsigned long arg1, |
| unsigned long arg2, unsigned long arg3, |
| unsigned long arg4, unsigned long arg5, |
| int fid, int ext) |
| { |
| struct sbiret ret; |
| |
| trace_sbi_call(ext, fid); |
| |
| register uintptr_t a0 asm ("a0") = (uintptr_t)(arg0); |
| register uintptr_t a1 asm ("a1") = (uintptr_t)(arg1); |
| register uintptr_t a2 asm ("a2") = (uintptr_t)(arg2); |
| register uintptr_t a3 asm ("a3") = (uintptr_t)(arg3); |
| register uintptr_t a4 asm ("a4") = (uintptr_t)(arg4); |
| register uintptr_t a5 asm ("a5") = (uintptr_t)(arg5); |
| register uintptr_t a6 asm ("a6") = (uintptr_t)(fid); |
| register uintptr_t a7 asm ("a7") = (uintptr_t)(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; |
| |
| trace_sbi_return(ext, ret.error, ret.value); |
| |
| return ret; |
| } |
| EXPORT_SYMBOL(__sbi_ecall); |