| 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | /* Copyright (c) 2024 Rivos Inc. */ |
| 3 | |
| 4 | #include <asm/sbi.h> |
| 5 | #define CREATE_TRACE_POINTS |
| 6 | #include <asm/trace.h> |
| 7 | |
| 8 | long __sbi_base_ecall(int fid) |
| 9 | { |
| 10 | struct sbiret ret; |
| 11 | |
| 12 | ret = sbi_ecall(SBI_EXT_BASE, fid, 0, 0, 0, 0, 0, 0); |
| 13 | if (!ret.error) |
| 14 | return ret.value; |
| 15 | else |
| 16 | return sbi_err_map_linux_errno(ret.error); |
| 17 | } |
| 18 | EXPORT_SYMBOL(__sbi_base_ecall); |
| 19 | |
| 20 | struct sbiret __sbi_ecall(unsigned long arg0, unsigned long arg1, |
| 21 | unsigned long arg2, unsigned long arg3, |
| 22 | unsigned long arg4, unsigned long arg5, |
| 23 | int fid, int ext) |
| 24 | { |
| 25 | struct sbiret ret; |
| 26 | |
| 27 | trace_sbi_call(ext, fid); |
| 28 | |
| 29 | register uintptr_t a0 asm ("a0" ) = (uintptr_t)(arg0); |
| 30 | register uintptr_t a1 asm ("a1" ) = (uintptr_t)(arg1); |
| 31 | register uintptr_t a2 asm ("a2" ) = (uintptr_t)(arg2); |
| 32 | register uintptr_t a3 asm ("a3" ) = (uintptr_t)(arg3); |
| 33 | register uintptr_t a4 asm ("a4" ) = (uintptr_t)(arg4); |
| 34 | register uintptr_t a5 asm ("a5" ) = (uintptr_t)(arg5); |
| 35 | register uintptr_t a6 asm ("a6" ) = (uintptr_t)(fid); |
| 36 | register uintptr_t a7 asm ("a7" ) = (uintptr_t)(ext); |
| 37 | asm volatile ("ecall" |
| 38 | : "+r" (a0), "+r" (a1) |
| 39 | : "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6), "r" (a7) |
| 40 | : "memory" ); |
| 41 | ret.error = a0; |
| 42 | ret.value = a1; |
| 43 | |
| 44 | trace_sbi_return(ext, ret.error, ret.value); |
| 45 | |
| 46 | return ret; |
| 47 | } |
| 48 | EXPORT_SYMBOL(__sbi_ecall); |
| 49 | |