sbi_ecall.c 1.3 KB

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