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