build-full.rs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  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(0x10, 0x0, [0; 6]).value, 0x02000000);
  71. assert_eq!(sbi.handle_ecall(0x10, 0x1, [0; 6]).value, 4);
  72. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x10, 0, 0, 0, 0, 0]).value, 1);
  73. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x54494d45, 0, 0, 0, 0, 0]).value, 1);
  74. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x735049, 0, 0, 0, 0, 0]).value, 1);
  75. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x52464e43, 0, 0, 0, 0, 0]).value, 1);
  76. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x48534d, 0, 0, 0, 0, 0]).value, 1);
  77. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x53525354, 0, 0, 0, 0, 0]).value, 1);
  78. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x504d55, 0, 0, 0, 0, 0]).value, 1);
  79. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x4442434e, 0, 0, 0, 0, 0]).value, 1);
  80. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x53555350, 0, 0, 0, 0, 0]).value, 1);
  81. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x4e41434c, 0, 0, 0, 0, 0]).value, 1);
  82. assert_eq!(sbi.handle_ecall(0x10, 0x3, [0x535441, 0, 0, 0, 0, 0]).value, 1);
  83. assert_eq!(sbi.handle_ecall(0x4442434e, 0, [0; 6]), SbiRet::success(1));
  84. assert_eq!(sbi.handle_ecall(0x4442434e, 1, [0; 6]), SbiRet::success(2));
  85. assert_eq!(sbi.handle_ecall(0x4442434e, 2, [0; 6]), SbiRet::success(3));
  86. assert_eq!(sbi.handle_ecall(0x43505043, 0, [0; 6]), SbiRet::success(4));
  87. assert_eq!(sbi.handle_ecall(0x43505043, 1, [0; 6]), SbiRet::success(5));
  88. assert_eq!(sbi.handle_ecall(0x43505043, 2, [0; 6]), SbiRet::success(6));
  89. assert_eq!(sbi.handle_ecall(0x43505043, 3, [0; 6]), SbiRet::success(7));
  90. assert_eq!(sbi.handle_ecall(0x48534d, 0, [0; 6]), SbiRet::success(8));
  91. assert_eq!(sbi.handle_ecall(0x48534d, 1, [0; 6]), SbiRet::success(9));
  92. assert_eq!(sbi.handle_ecall(0x48534d, 2, [0; 6]), SbiRet::success(10));
  93. assert_eq!(sbi.handle_ecall(0x48534d, 3, [0; 6]), SbiRet::success(11));
  94. assert_eq!(sbi.handle_ecall(0x735049, 0, [0; 6]), SbiRet::success(12));
  95. assert_eq!(sbi.handle_ecall(0x535441, 0, [0; 6]), SbiRet::success(33));
  96. assert_eq!(sbi.handle_ecall(0x53555350, 0, [0; 6]), SbiRet::success(34));
  97. // assert_eq!(sbi.handle_ecall(0x54494D45, 0, [0; 6]), SbiRet::success(35));
  98. assert_eq!(sbi.handle_ecall(0x10, 4, [0; 6]), SbiRet::success(36));
  99. assert_eq!(sbi.handle_ecall(0x10, 5, [0; 6]), SbiRet::success(37));
  100. assert_eq!(sbi.handle_ecall(0x10, 6, [0; 6]), SbiRet::success(38));
  101. let sbi = AlternateName {
  102. dbcn: DummyConsole,
  103. cppc: DummyCppc,
  104. hsm: DummyHsm,
  105. ipi: DummyIpi,
  106. nacl: DummyNacl,
  107. pmu: DummyPmu,
  108. srst: DummyReset,
  109. rfnc: DummyFence,
  110. sta: DummySta,
  111. susp: DummySusp,
  112. time: DummyTimer,
  113. info: DummyEnvInfo,
  114. };
  115. assert_eq!(sbi.handle_ecall(0x10, 0x1, [0; 6]).value, 4);
  116. let sbi = TupleStruct(
  117. DummyConsole,
  118. DummyCppc,
  119. DummyHsm,
  120. DummyIpi,
  121. DummyNacl,
  122. DummyPmu,
  123. DummyReset,
  124. DummyFence,
  125. DummySta,
  126. DummySusp,
  127. DummyTimer,
  128. DummyEnvInfo,
  129. );
  130. assert_eq!(sbi.handle_ecall(0x10, 0x1, [0; 6]).value, 4);
  131. }
  132. #[cfg(feature = "machine")]
  133. #[test]
  134. fn unit_struct() {
  135. let sbi = UnitStruct;
  136. assert_eq!(sbi.handle_ecall(0x10, 0x1, [0; 6]).value, 4);
  137. }
  138. #[test]
  139. fn extension_impl() {
  140. let sbi = FullyImplemented {
  141. console: DummyConsole,
  142. cppc: DummyCppc,
  143. hsm: DummyHsm,
  144. ipi: DummyIpi,
  145. nacl: DummyNacl,
  146. pmu: DummyPmu,
  147. reset: DummyReset,
  148. fence: DummyFence,
  149. sta: DummySta,
  150. susp: DummySusp,
  151. timer: DummyTimer,
  152. info: DummyEnvInfo,
  153. };
  154. assert_eq!(
  155. sbi.handle_ecall(0x4442434E, 0x0, [0; 6]).error,
  156. -1isize as _
  157. );
  158. }
  159. struct DummyConsole;
  160. impl rustsbi::Console for DummyConsole {
  161. fn write(&self, _: Physical<&[u8]>) -> SbiRet {
  162. SbiRet::success(1)
  163. }
  164. fn read(&self, _: Physical<&mut [u8]>) -> SbiRet {
  165. SbiRet::success(2)
  166. }
  167. fn write_byte(&self, _: u8) -> SbiRet {
  168. SbiRet::success(3)
  169. }
  170. }
  171. struct DummyCppc;
  172. impl rustsbi::Cppc for DummyCppc {
  173. fn probe(&self, _: u32) -> SbiRet {
  174. SbiRet::success(4)
  175. }
  176. fn read(&self, _: u32) -> SbiRet {
  177. SbiRet::success(5)
  178. }
  179. fn read_hi(&self, _: u32) -> SbiRet {
  180. SbiRet::success(6)
  181. }
  182. fn write(&self, _: u32, _: u64) -> SbiRet {
  183. SbiRet::success(7)
  184. }
  185. }
  186. struct DummyHsm;
  187. impl rustsbi::Hsm for DummyHsm {
  188. fn hart_start(&self, _: usize, _: usize, _: usize) -> SbiRet {
  189. SbiRet::success(8)
  190. }
  191. fn hart_stop(&self) -> SbiRet {
  192. SbiRet::success(9)
  193. }
  194. fn hart_get_status(&self, _: usize) -> SbiRet {
  195. SbiRet::success(10)
  196. }
  197. fn hart_suspend(&self, _: u32, _: usize, _: usize) -> SbiRet {
  198. SbiRet::success(11)
  199. }
  200. }
  201. struct DummyIpi;
  202. impl rustsbi::Ipi for DummyIpi {
  203. fn send_ipi(&self, _: HartMask) -> SbiRet {
  204. SbiRet::success(12)
  205. }
  206. }
  207. struct DummyNacl;
  208. impl rustsbi::Nacl for DummyNacl {
  209. fn probe_feature(&self, _: u32) -> SbiRet {
  210. unimplemented!()
  211. }
  212. fn set_shmem(&self, _: SharedPtr<[u8; NATIVE]>, _: usize) -> SbiRet {
  213. unimplemented!()
  214. }
  215. fn sync_csr(&self, _: usize) -> SbiRet {
  216. unimplemented!()
  217. }
  218. fn sync_hfence(&self, _: usize) -> SbiRet {
  219. unimplemented!()
  220. }
  221. fn sync_sret(&self) -> SbiRet {
  222. unimplemented!()
  223. }
  224. }
  225. struct DummyPmu;
  226. impl rustsbi::Pmu for DummyPmu {
  227. fn num_counters(&self) -> usize {
  228. unimplemented!()
  229. }
  230. fn counter_get_info(&self, _: usize) -> SbiRet {
  231. unimplemented!()
  232. }
  233. fn counter_config_matching(&self, _: usize, _: usize, _: usize, _: usize, _: u64) -> SbiRet {
  234. unimplemented!()
  235. }
  236. fn counter_start(&self, _: usize, _: usize, _: usize, _: u64) -> SbiRet {
  237. unimplemented!()
  238. }
  239. fn counter_stop(&self, _: usize, _: usize, _: usize) -> SbiRet {
  240. unimplemented!()
  241. }
  242. fn counter_fw_read(&self, _: usize) -> SbiRet {
  243. unimplemented!()
  244. }
  245. fn counter_fw_read_hi(&self, _: usize) -> SbiRet {
  246. unimplemented!()
  247. }
  248. }
  249. struct DummyReset;
  250. impl rustsbi::Reset for DummyReset {
  251. fn system_reset(&self, _: u32, _: u32) -> SbiRet {
  252. unimplemented!()
  253. }
  254. }
  255. struct DummyFence;
  256. impl rustsbi::Fence for DummyFence {
  257. fn remote_fence_i(&self, _: HartMask) -> SbiRet {
  258. unimplemented!()
  259. }
  260. fn remote_sfence_vma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
  261. unimplemented!()
  262. }
  263. fn remote_sfence_vma_asid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  264. unimplemented!()
  265. }
  266. fn remote_hfence_gvma_vmid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  267. unimplemented!()
  268. }
  269. fn remote_hfence_gvma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
  270. unimplemented!()
  271. }
  272. fn remote_hfence_vvma_asid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  273. unimplemented!()
  274. }
  275. fn remote_hfence_vvma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
  276. unimplemented!()
  277. }
  278. }
  279. struct DummySta;
  280. impl rustsbi::Sta for DummySta {
  281. fn set_shmem(&self, _: SharedPtr<[u8; 64]>, _: usize) -> SbiRet {
  282. SbiRet::success(33)
  283. }
  284. }
  285. struct DummySusp;
  286. impl rustsbi::Susp for DummySusp {
  287. fn system_suspend(&self, _: u32, _: usize, _: usize) -> SbiRet {
  288. SbiRet::success(34)
  289. }
  290. }
  291. struct DummyTimer;
  292. impl rustsbi::Timer for DummyTimer {
  293. fn set_timer(&self, _: u64) {
  294. todo!()
  295. }
  296. }
  297. struct DummyEnvInfo;
  298. impl rustsbi::EnvInfo for DummyEnvInfo {
  299. fn mvendorid(&self) -> usize {
  300. 36
  301. }
  302. fn marchid(&self) -> usize {
  303. 37
  304. }
  305. fn mimpid(&self) -> usize {
  306. 38
  307. }
  308. }