build-full.rs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. use rustsbi::RustSBI;
  2. use sbi_spec::{
  3. binary::{HartMask, Physical, SbiRet, SharedPtr},
  4. nacl::shmem_size::NATIVE,
  5. };
  6. #[derive(RustSBI)]
  7. struct FullyImplemented {
  8. console: DummyConsole,
  9. cppc: DummyCppc,
  10. hsm: DummyHsm,
  11. ipi: DummyIpi,
  12. nacl: DummyNacl,
  13. pmu: DummyPmu,
  14. reset: DummyReset,
  15. fence: DummyFence,
  16. sta: DummySta,
  17. susp: DummySusp,
  18. timer: DummyTimer,
  19. info: DummyEnvInfo,
  20. }
  21. #[derive(RustSBI)]
  22. struct AlternateName {
  23. dbcn: DummyConsole,
  24. cppc: DummyCppc,
  25. hsm: DummyHsm,
  26. ipi: DummyIpi,
  27. nacl: DummyNacl,
  28. pmu: DummyPmu,
  29. srst: DummyReset,
  30. rfnc: DummyFence,
  31. sta: DummySta,
  32. susp: DummySusp,
  33. time: DummyTimer,
  34. info: DummyEnvInfo,
  35. }
  36. #[derive(RustSBI)]
  37. struct TupleStruct(
  38. #[rustsbi(dbcn)] DummyConsole,
  39. #[rustsbi(cppc)] DummyCppc,
  40. #[rustsbi(hsm)] DummyHsm,
  41. #[rustsbi(ipi)] DummyIpi,
  42. #[rustsbi(nacl)] DummyNacl,
  43. #[rustsbi(pmu)] DummyPmu,
  44. #[rustsbi(srst)] DummyReset,
  45. #[rustsbi(rfnc)] DummyFence,
  46. #[rustsbi(sta)] DummySta,
  47. #[rustsbi(susp)] DummySusp,
  48. #[rustsbi(time)] DummyTimer,
  49. #[rustsbi(info)] DummyEnvInfo,
  50. );
  51. #[cfg(feature = "machine")]
  52. #[derive(RustSBI)]
  53. struct UnitStruct;
  54. #[test]
  55. fn rustsbi_impl_id() {
  56. let sbi = FullyImplemented {
  57. console: DummyConsole,
  58. cppc: DummyCppc,
  59. hsm: DummyHsm,
  60. ipi: DummyIpi,
  61. nacl: DummyNacl,
  62. pmu: DummyPmu,
  63. reset: DummyReset,
  64. fence: DummyFence,
  65. sta: DummySta,
  66. susp: DummySusp,
  67. timer: DummyTimer,
  68. info: DummyEnvInfo,
  69. };
  70. assert_eq!(sbi.handle_ecall(0x4E41434C, 0x0, [0; 6]), SbiRet::success(13));
  71. assert_eq!(sbi.handle_ecall(0x4E41434C, 0x1, [0; 6]), SbiRet::success(14));
  72. assert_eq!(sbi.handle_ecall(0x4E41434C, 0x2, [0; 6]), SbiRet::success(15));
  73. assert_eq!(sbi.handle_ecall(0x4E41434C, 0x3, [0; 6]), SbiRet::success(16));
  74. assert_eq!(sbi.handle_ecall(0x4E41434C, 0x4, [0; 6]), SbiRet::success(17));
  75. assert_eq!(sbi.handle_ecall(0x504D55, 0x0, [0; 6]), SbiRet::success(18));
  76. assert_eq!(sbi.handle_ecall(0x504D55, 0x1, [0; 6]), SbiRet::success(19));
  77. assert_eq!(sbi.handle_ecall(0x504D55, 0x2, [0; 6]), SbiRet::success(20));
  78. assert_eq!(sbi.handle_ecall(0x504D55, 0x3, [0; 6]), SbiRet::success(21));
  79. assert_eq!(sbi.handle_ecall(0x504D55, 0x4, [0; 6]), SbiRet::success(22));
  80. assert_eq!(sbi.handle_ecall(0x504D55, 0x5, [0; 6]), SbiRet::success(23));
  81. assert_eq!(sbi.handle_ecall(0x504D55, 0x6, [0; 6]), SbiRet::success(24));
  82. assert_eq!(sbi.handle_ecall(0x53525354, 0x0, [0; 6]), SbiRet::success(25));
  83. assert_eq!(sbi.handle_ecall(0x52464E43, 0x0, [0; 6]), SbiRet::success(26));
  84. assert_eq!(sbi.handle_ecall(0x52464E43, 0x1, [0; 6]), SbiRet::success(27));
  85. assert_eq!(sbi.handle_ecall(0x52464E43, 0x2, [0; 6]), SbiRet::success(28));
  86. assert_eq!(sbi.handle_ecall(0x52464E43, 0x3, [0; 6]), SbiRet::success(29));
  87. assert_eq!(sbi.handle_ecall(0x52464E43, 0x4, [0; 6]), SbiRet::success(30));
  88. assert_eq!(sbi.handle_ecall(0x52464E43, 0x5, [0; 6]), SbiRet::success(31));
  89. assert_eq!(sbi.handle_ecall(0x52464E43, 0x6, [0; 6]), SbiRet::success(32));
  90. let sbi = AlternateName {
  91. dbcn: DummyConsole,
  92. cppc: DummyCppc,
  93. hsm: DummyHsm,
  94. ipi: DummyIpi,
  95. nacl: DummyNacl,
  96. pmu: DummyPmu,
  97. srst: DummyReset,
  98. rfnc: DummyFence,
  99. sta: DummySta,
  100. susp: DummySusp,
  101. time: DummyTimer,
  102. info: DummyEnvInfo,
  103. };
  104. assert_eq!(sbi.handle_ecall(0x10, 0x1, [0; 6]).value, 4);
  105. let sbi = TupleStruct(
  106. DummyConsole,
  107. DummyCppc,
  108. DummyHsm,
  109. DummyIpi,
  110. DummyNacl,
  111. DummyPmu,
  112. DummyReset,
  113. DummyFence,
  114. DummySta,
  115. DummySusp,
  116. DummyTimer,
  117. DummyEnvInfo,
  118. );
  119. assert_eq!(sbi.handle_ecall(0x10, 0x1, [0; 6]).value, 4);
  120. }
  121. #[cfg(feature = "machine")]
  122. #[test]
  123. fn unit_struct() {
  124. let sbi = UnitStruct;
  125. assert_eq!(sbi.handle_ecall(0x10, 0x1, [0; 6]).value, 4);
  126. }
  127. #[test]
  128. fn extension_impl() {
  129. let sbi = FullyImplemented {
  130. console: DummyConsole,
  131. cppc: DummyCppc,
  132. hsm: DummyHsm,
  133. ipi: DummyIpi,
  134. nacl: DummyNacl,
  135. pmu: DummyPmu,
  136. reset: DummyReset,
  137. fence: DummyFence,
  138. sta: DummySta,
  139. susp: DummySusp,
  140. timer: DummyTimer,
  141. info: DummyEnvInfo,
  142. };
  143. assert_eq!(
  144. sbi.handle_ecall(0x4442434E, 0x0, [0; 6]).error,
  145. -1isize as _
  146. );
  147. }
  148. struct DummyConsole;
  149. impl rustsbi::Console for DummyConsole {
  150. fn write(&self, _: Physical<&[u8]>) -> SbiRet {
  151. // special return value for test cases
  152. SbiRet::failed()
  153. }
  154. fn read(&self, _: Physical<&mut [u8]>) -> SbiRet {
  155. unimplemented!()
  156. }
  157. fn write_byte(&self, _: u8) -> SbiRet {
  158. unimplemented!()
  159. }
  160. }
  161. struct DummyCppc;
  162. impl rustsbi::Cppc for DummyCppc {
  163. fn probe(&self, _: u32) -> SbiRet {
  164. unimplemented!()
  165. }
  166. fn read(&self, _: u32) -> SbiRet {
  167. unimplemented!()
  168. }
  169. fn read_hi(&self, _: u32) -> SbiRet {
  170. unimplemented!()
  171. }
  172. fn write(&self, _: u32, _: u64) -> SbiRet {
  173. unimplemented!()
  174. }
  175. }
  176. struct DummyHsm;
  177. impl rustsbi::Hsm for DummyHsm {
  178. fn hart_start(&self, _: usize, _: usize, _: usize) -> SbiRet {
  179. unimplemented!()
  180. }
  181. fn hart_stop(&self) -> SbiRet {
  182. unimplemented!()
  183. }
  184. fn hart_get_status(&self, _: usize) -> SbiRet {
  185. unimplemented!()
  186. }
  187. fn hart_suspend(&self, _: u32, _: usize, _: usize) -> SbiRet {
  188. unimplemented!()
  189. }
  190. }
  191. struct DummyIpi;
  192. impl rustsbi::Ipi for DummyIpi {
  193. fn send_ipi(&self, _: HartMask) -> SbiRet {
  194. unimplemented!()
  195. }
  196. }
  197. struct DummyNacl;
  198. impl rustsbi::Nacl for DummyNacl {
  199. fn probe_feature(&self, _: u32) -> SbiRet {
  200. SbiRet::success(13)
  201. }
  202. fn set_shmem(&self, _: SharedPtr<[u8; NATIVE]>, _: usize) -> SbiRet {
  203. SbiRet::success(14)
  204. }
  205. fn sync_csr(&self, _: usize) -> SbiRet {
  206. SbiRet::success(15)
  207. }
  208. fn sync_hfence(&self, _: usize) -> SbiRet {
  209. SbiRet::success(16)
  210. }
  211. fn sync_sret(&self) -> SbiRet {
  212. SbiRet::success(17)
  213. }
  214. }
  215. struct DummyPmu;
  216. impl rustsbi::Pmu for DummyPmu {
  217. fn num_counters(&self) -> usize {
  218. 18
  219. }
  220. fn counter_get_info(&self, _: usize) -> SbiRet {
  221. SbiRet::success(19)
  222. }
  223. fn counter_config_matching(&self, _: usize, _: usize, _: usize, _: usize, _: u64) -> SbiRet {
  224. SbiRet::success(20)
  225. }
  226. fn counter_start(&self, _: usize, _: usize, _: usize, _: u64) -> SbiRet {
  227. SbiRet::success(21)
  228. }
  229. fn counter_stop(&self, _: usize, _: usize, _: usize) -> SbiRet {
  230. SbiRet::success(22)
  231. }
  232. fn counter_fw_read(&self, _: usize) -> SbiRet {
  233. SbiRet::success(23)
  234. }
  235. fn counter_fw_read_hi(&self, _: usize) -> SbiRet {
  236. SbiRet::success(24)
  237. }
  238. }
  239. struct DummyReset;
  240. impl rustsbi::Reset for DummyReset {
  241. fn system_reset(&self, _: u32, _: u32) -> SbiRet {
  242. SbiRet::success(25)
  243. }
  244. }
  245. struct DummyFence;
  246. impl rustsbi::Fence for DummyFence {
  247. fn remote_fence_i(&self, _: HartMask) -> SbiRet {
  248. SbiRet::success(26)
  249. }
  250. fn remote_sfence_vma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
  251. SbiRet::success(27)
  252. }
  253. fn remote_sfence_vma_asid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  254. SbiRet::success(28)
  255. }
  256. fn remote_hfence_gvma_vmid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  257. SbiRet::success(29)
  258. }
  259. fn remote_hfence_gvma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
  260. SbiRet::success(30)
  261. }
  262. fn remote_hfence_vvma_asid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  263. SbiRet::success(31)
  264. }
  265. fn remote_hfence_vvma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
  266. SbiRet::success(32)
  267. }
  268. }
  269. struct DummySta;
  270. impl rustsbi::Sta for DummySta {
  271. fn set_shmem(&self, _: SharedPtr<[u8; 64]>, _: usize) -> SbiRet {
  272. unimplemented!()
  273. }
  274. }
  275. struct DummySusp;
  276. impl rustsbi::Susp for DummySusp {
  277. fn system_suspend(&self, _: u32, _: usize, _: usize) -> SbiRet {
  278. unimplemented!()
  279. }
  280. }
  281. struct DummyTimer;
  282. impl rustsbi::Timer for DummyTimer {
  283. fn set_timer(&self, _: u64) {
  284. unimplemented!()
  285. }
  286. }
  287. struct DummyEnvInfo;
  288. impl rustsbi::EnvInfo for DummyEnvInfo {
  289. fn mvendorid(&self) -> usize {
  290. unimplemented!()
  291. }
  292. fn marchid(&self) -> usize {
  293. unimplemented!()
  294. }
  295. fn mimpid(&self) -> usize {
  296. unimplemented!()
  297. }
  298. }