binary.rs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. //! Chapter 3. Binary Encoding
  2. // This module is designated to use under RISC-V only, but it builds under non-RISC-V targets
  3. // to allow unit tests and `cargo fix` operations.
  4. // `sbi_call_6` has 8 arguments which is allowed
  5. #![allow(clippy::too_many_arguments)]
  6. use sbi_spec::binary::SbiRet;
  7. #[inline(always)]
  8. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  9. pub(crate) fn sbi_call_0(eid: usize, fid: usize) -> SbiRet {
  10. let (error, value);
  11. unsafe {
  12. core::arch::asm!(
  13. "ecall",
  14. in("a7") eid,
  15. in("a6") fid,
  16. lateout("a0") error,
  17. lateout("a1") value,
  18. );
  19. }
  20. SbiRet { error, value }
  21. }
  22. #[inline(always)]
  23. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  24. pub(crate) fn sbi_call_0(_eid: usize, _fid: usize) -> SbiRet {
  25. unimplemented!("unsupported architecture")
  26. }
  27. #[inline(always)]
  28. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  29. pub(crate) fn sbi_call_1(eid: usize, fid: usize, arg0: usize) -> SbiRet {
  30. let (error, value);
  31. unsafe {
  32. core::arch::asm!(
  33. "ecall",
  34. in("a7") eid,
  35. in("a6") fid,
  36. inlateout("a0") arg0 => error,
  37. lateout("a1") value,
  38. );
  39. }
  40. SbiRet { error, value }
  41. }
  42. #[inline(always)]
  43. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  44. pub(crate) fn sbi_call_1(_eid: usize, _fid: usize, _arg0: usize) -> SbiRet {
  45. unimplemented!("unsupported architecture")
  46. }
  47. #[inline(always)]
  48. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  49. pub(crate) fn sbi_call_2(eid: usize, fid: usize, arg0: usize, arg1: usize) -> SbiRet {
  50. let (error, value);
  51. unsafe {
  52. core::arch::asm!(
  53. "ecall",
  54. in("a7") eid,
  55. in("a6") fid,
  56. inlateout("a0") arg0 => error,
  57. inlateout("a1") arg1 => value,
  58. );
  59. }
  60. SbiRet { error, value }
  61. }
  62. #[inline(always)]
  63. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  64. pub(crate) fn sbi_call_2(_eid: usize, _fid: usize, _arg0: usize, _arg1: usize) -> SbiRet {
  65. unimplemented!("unsupported architecture")
  66. }
  67. #[inline(always)]
  68. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  69. pub(crate) fn sbi_call_3(eid: usize, fid: usize, arg0: usize, arg1: usize, arg2: usize) -> SbiRet {
  70. let (error, value);
  71. unsafe {
  72. core::arch::asm!(
  73. "ecall",
  74. in("a7") eid,
  75. in("a6") fid,
  76. inlateout("a0") arg0 => error,
  77. inlateout("a1") arg1 => value,
  78. in("a2") arg2,
  79. );
  80. }
  81. SbiRet { error, value }
  82. }
  83. #[inline(always)]
  84. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  85. pub(crate) fn sbi_call_3(
  86. _eid: usize,
  87. _fid: usize,
  88. _arg0: usize,
  89. _arg1: usize,
  90. _arg2: usize,
  91. ) -> SbiRet {
  92. unimplemented!("unsupported architecture")
  93. }
  94. #[inline(always)]
  95. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  96. pub(crate) fn sbi_call_4(
  97. eid: usize,
  98. fid: usize,
  99. arg0: usize,
  100. arg1: usize,
  101. arg2: usize,
  102. arg3: usize,
  103. ) -> SbiRet {
  104. let (error, value);
  105. unsafe {
  106. core::arch::asm!(
  107. "ecall",
  108. in("a7") eid,
  109. in("a6") fid,
  110. inlateout("a0") arg0 => error,
  111. inlateout("a1") arg1 => value,
  112. in("a2") arg2,
  113. in("a3") arg3,
  114. );
  115. }
  116. SbiRet { error, value }
  117. }
  118. #[inline(always)]
  119. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  120. pub(crate) fn sbi_call_4(
  121. _eid: usize,
  122. _fid: usize,
  123. _arg0: usize,
  124. _arg1: usize,
  125. _arg2: usize,
  126. _arg3: usize,
  127. ) -> SbiRet {
  128. unimplemented!("unsupported architecture")
  129. }
  130. #[inline(always)]
  131. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  132. pub(crate) fn sbi_call_5(
  133. eid: usize,
  134. fid: usize,
  135. arg0: usize,
  136. arg1: usize,
  137. arg2: usize,
  138. arg3: usize,
  139. arg4: usize,
  140. ) -> SbiRet {
  141. let (error, value);
  142. unsafe {
  143. core::arch::asm!(
  144. "ecall",
  145. in("a7") eid,
  146. in("a6") fid,
  147. inlateout("a0") arg0 => error,
  148. inlateout("a1") arg1 => value,
  149. in("a2") arg2,
  150. in("a3") arg3,
  151. in("a4") arg4,
  152. );
  153. }
  154. SbiRet { error, value }
  155. }
  156. #[inline(always)]
  157. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  158. pub(crate) fn sbi_call_5(
  159. _eid: usize,
  160. _fid: usize,
  161. _arg0: usize,
  162. _arg1: usize,
  163. _arg2: usize,
  164. _arg3: usize,
  165. _arg4: usize,
  166. ) -> SbiRet {
  167. unimplemented!("unsupported architecture")
  168. }
  169. #[inline(always)]
  170. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  171. #[allow(unused)] // only used on RV32 for RISC-V SBI 2.0 specification
  172. pub(crate) fn sbi_call_6(
  173. eid: usize,
  174. fid: usize,
  175. arg0: usize,
  176. arg1: usize,
  177. arg2: usize,
  178. arg3: usize,
  179. arg4: usize,
  180. arg5: usize,
  181. ) -> SbiRet {
  182. let (error, value);
  183. unsafe {
  184. core::arch::asm!(
  185. "ecall",
  186. in("a7") eid,
  187. in("a6") fid,
  188. inlateout("a0") arg0 => error,
  189. inlateout("a1") arg1 => value,
  190. in("a2") arg2,
  191. in("a3") arg3,
  192. in("a4") arg4,
  193. in("a5") arg5,
  194. );
  195. }
  196. SbiRet { error, value }
  197. }
  198. #[inline(always)]
  199. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  200. #[allow(unused)] // only used on RV32 for RISC-V SBI 2.0 specification
  201. pub(crate) fn sbi_call_6(
  202. _eid: usize,
  203. _fid: usize,
  204. _arg0: usize,
  205. _arg1: usize,
  206. _arg2: usize,
  207. _arg3: usize,
  208. _arg4: usize,
  209. _arg5: usize,
  210. ) -> SbiRet {
  211. unimplemented!("unsupported architecture")
  212. }