1 // SPDX-License-Identifier: GPL-2.0-only 2 #include <libcflat.h> 3 #include <asm/sbi.h> 4 5 struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, 6 unsigned long arg1, unsigned long arg2, 7 unsigned long arg3, unsigned long arg4, 8 unsigned long arg5) 9 { 10 register uintptr_t a0 asm ("a0") = (uintptr_t)(arg0); 11 register uintptr_t a1 asm ("a1") = (uintptr_t)(arg1); 12 register uintptr_t a2 asm ("a2") = (uintptr_t)(arg2); 13 register uintptr_t a3 asm ("a3") = (uintptr_t)(arg3); 14 register uintptr_t a4 asm ("a4") = (uintptr_t)(arg4); 15 register uintptr_t a5 asm ("a5") = (uintptr_t)(arg5); 16 register uintptr_t a6 asm ("a6") = (uintptr_t)(fid); 17 register uintptr_t a7 asm ("a7") = (uintptr_t)(ext); 18 struct sbiret ret; 19 20 asm volatile ( 21 "ecall" 22 : "+r" (a0), "+r" (a1) 23 : "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6), "r" (a7) 24 : "memory"); 25 ret.error = a0; 26 ret.value = a1; 27 28 return ret; 29 } 30 31 void sbi_shutdown(void) 32 { 33 sbi_ecall(SBI_EXT_SRST, 0, 0, 0, 0, 0, 0, 0); 34 puts("SBI shutdown failed!\n"); 35 } 36 37 struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp) 38 { 39 return sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_START, hartid, entry, sp, 0, 0, 0); 40 } 41