build-full.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  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!(
  74. sbi.handle_ecall(0x10, 0x3, [0x54494d45, 0, 0, 0, 0, 0])
  75. .value,
  76. 1
  77. );
  78. assert_eq!(
  79. sbi.handle_ecall(0x10, 0x3, [0x735049, 0, 0, 0, 0, 0]).value,
  80. 1
  81. );
  82. assert_eq!(
  83. sbi.handle_ecall(0x10, 0x3, [0x52464e43, 0, 0, 0, 0, 0])
  84. .value,
  85. 1
  86. );
  87. assert_eq!(
  88. sbi.handle_ecall(0x10, 0x3, [0x48534d, 0, 0, 0, 0, 0]).value,
  89. 1
  90. );
  91. assert_eq!(
  92. sbi.handle_ecall(0x10, 0x3, [0x53525354, 0, 0, 0, 0, 0])
  93. .value,
  94. 1
  95. );
  96. assert_eq!(
  97. sbi.handle_ecall(0x10, 0x3, [0x504d55, 0, 0, 0, 0, 0]).value,
  98. 1
  99. );
  100. assert_eq!(
  101. sbi.handle_ecall(0x10, 0x3, [0x4442434e, 0, 0, 0, 0, 0])
  102. .value,
  103. 1
  104. );
  105. assert_eq!(
  106. sbi.handle_ecall(0x10, 0x3, [0x53555350, 0, 0, 0, 0, 0])
  107. .value,
  108. 1
  109. );
  110. assert_eq!(
  111. sbi.handle_ecall(0x10, 0x3, [0x4e41434c, 0, 0, 0, 0, 0])
  112. .value,
  113. 1
  114. );
  115. assert_eq!(
  116. sbi.handle_ecall(0x10, 0x3, [0x535441, 0, 0, 0, 0, 0]).value,
  117. 1
  118. );
  119. assert_eq!(sbi.handle_ecall(0x4442434e, 0, [0; 6]), SbiRet::success(1));
  120. assert_eq!(sbi.handle_ecall(0x4442434e, 1, [0; 6]), SbiRet::success(2));
  121. assert_eq!(sbi.handle_ecall(0x4442434e, 2, [0; 6]), SbiRet::success(3));
  122. assert_eq!(sbi.handle_ecall(0x43505043, 0, [0; 6]), SbiRet::success(4));
  123. assert_eq!(sbi.handle_ecall(0x43505043, 1, [0; 6]), SbiRet::success(5));
  124. assert_eq!(sbi.handle_ecall(0x43505043, 2, [0; 6]), SbiRet::success(6));
  125. assert_eq!(sbi.handle_ecall(0x43505043, 3, [0; 6]), SbiRet::success(7));
  126. assert_eq!(sbi.handle_ecall(0x48534d, 0, [0; 6]), SbiRet::success(8));
  127. assert_eq!(sbi.handle_ecall(0x48534d, 1, [0; 6]), SbiRet::success(9));
  128. assert_eq!(sbi.handle_ecall(0x48534d, 2, [0; 6]), SbiRet::success(10));
  129. assert_eq!(sbi.handle_ecall(0x48534d, 3, [0; 6]), SbiRet::success(11));
  130. assert_eq!(sbi.handle_ecall(0x735049, 0, [0; 6]), SbiRet::success(12));
  131. assert_eq!(
  132. sbi.handle_ecall(0x4E41434C, 0x0, [0; 6]),
  133. SbiRet::success(13)
  134. );
  135. assert_eq!(
  136. sbi.handle_ecall(0x4E41434C, 0x1, [0; 6]),
  137. SbiRet::success(14)
  138. );
  139. assert_eq!(
  140. sbi.handle_ecall(0x4E41434C, 0x2, [0; 6]),
  141. SbiRet::success(15)
  142. );
  143. assert_eq!(
  144. sbi.handle_ecall(0x4E41434C, 0x3, [0; 6]),
  145. SbiRet::success(16)
  146. );
  147. assert_eq!(
  148. sbi.handle_ecall(0x4E41434C, 0x4, [0; 6]),
  149. SbiRet::success(17)
  150. );
  151. assert_eq!(sbi.handle_ecall(0x504D55, 0x0, [0; 6]), SbiRet::success(18));
  152. assert_eq!(sbi.handle_ecall(0x504D55, 0x1, [0; 6]), SbiRet::success(19));
  153. assert_eq!(sbi.handle_ecall(0x504D55, 0x2, [0; 6]), SbiRet::success(20));
  154. assert_eq!(sbi.handle_ecall(0x504D55, 0x3, [0; 6]), SbiRet::success(21));
  155. assert_eq!(sbi.handle_ecall(0x504D55, 0x4, [0; 6]), SbiRet::success(22));
  156. assert_eq!(sbi.handle_ecall(0x504D55, 0x5, [0; 6]), SbiRet::success(23));
  157. assert_eq!(sbi.handle_ecall(0x504D55, 0x6, [0; 6]), SbiRet::success(24));
  158. assert_eq!(
  159. sbi.handle_ecall(0x53525354, 0x0, [0; 6]),
  160. SbiRet::success(25)
  161. );
  162. assert_eq!(
  163. sbi.handle_ecall(0x52464E43, 0x0, [0; 6]),
  164. SbiRet::success(26)
  165. );
  166. assert_eq!(
  167. sbi.handle_ecall(0x52464E43, 0x1, [0; 6]),
  168. SbiRet::success(27)
  169. );
  170. assert_eq!(
  171. sbi.handle_ecall(0x52464E43, 0x2, [0; 6]),
  172. SbiRet::success(28)
  173. );
  174. assert_eq!(
  175. sbi.handle_ecall(0x52464E43, 0x3, [0; 6]),
  176. SbiRet::success(29)
  177. );
  178. assert_eq!(
  179. sbi.handle_ecall(0x52464E43, 0x4, [0; 6]),
  180. SbiRet::success(30)
  181. );
  182. assert_eq!(
  183. sbi.handle_ecall(0x52464E43, 0x5, [0; 6]),
  184. SbiRet::success(31)
  185. );
  186. assert_eq!(
  187. sbi.handle_ecall(0x52464E43, 0x6, [0; 6]),
  188. SbiRet::success(32)
  189. );
  190. assert_eq!(sbi.handle_ecall(0x535441, 0, [0; 6]), SbiRet::success(33));
  191. assert_eq!(sbi.handle_ecall(0x53555350, 0, [0; 6]), SbiRet::success(34));
  192. // assert_eq!(sbi.handle_ecall(0x54494D45, 0, [0; 6]), SbiRet::success(35));
  193. assert_eq!(sbi.handle_ecall(0x10, 4, [0; 6]), SbiRet::success(36));
  194. assert_eq!(sbi.handle_ecall(0x10, 5, [0; 6]), SbiRet::success(37));
  195. assert_eq!(sbi.handle_ecall(0x10, 6, [0; 6]), SbiRet::success(38));
  196. let sbi = AlternateName {
  197. dbcn: DummyConsole,
  198. cppc: DummyCppc,
  199. hsm: DummyHsm,
  200. ipi: DummyIpi,
  201. nacl: DummyNacl,
  202. pmu: DummyPmu,
  203. srst: DummyReset,
  204. rfnc: DummyFence,
  205. sta: DummySta,
  206. susp: DummySusp,
  207. time: DummyTimer,
  208. info: DummyEnvInfo,
  209. };
  210. assert_eq!(sbi.handle_ecall(0x10, 0x1, [0; 6]).value, 4);
  211. let sbi = TupleStruct(
  212. DummyConsole,
  213. DummyCppc,
  214. DummyHsm,
  215. DummyIpi,
  216. DummyNacl,
  217. DummyPmu,
  218. DummyReset,
  219. DummyFence,
  220. DummySta,
  221. DummySusp,
  222. DummyTimer,
  223. DummyEnvInfo,
  224. );
  225. assert_eq!(sbi.handle_ecall(0x10, 0x1, [0; 6]).value, 4);
  226. }
  227. #[cfg(feature = "machine")]
  228. #[test]
  229. fn unit_struct() {
  230. let sbi = UnitStruct;
  231. assert_eq!(sbi.handle_ecall(0x10, 0x1, [0; 6]).value, 4);
  232. }
  233. #[test]
  234. fn extension_impl() {
  235. let sbi = FullyImplemented {
  236. console: DummyConsole,
  237. cppc: DummyCppc,
  238. hsm: DummyHsm,
  239. ipi: DummyIpi,
  240. nacl: DummyNacl,
  241. pmu: DummyPmu,
  242. reset: DummyReset,
  243. fence: DummyFence,
  244. sta: DummySta,
  245. susp: DummySusp,
  246. timer: DummyTimer,
  247. info: DummyEnvInfo,
  248. };
  249. assert_eq!(sbi.handle_ecall(0x4442434E, 0x0, [0; 6]).error, 0isize as _);
  250. }
  251. struct DummyConsole;
  252. impl rustsbi::Console for DummyConsole {
  253. fn write(&self, _: Physical<&[u8]>) -> SbiRet {
  254. SbiRet::success(1)
  255. }
  256. fn read(&self, _: Physical<&mut [u8]>) -> SbiRet {
  257. SbiRet::success(2)
  258. }
  259. fn write_byte(&self, _: u8) -> SbiRet {
  260. SbiRet::success(3)
  261. }
  262. }
  263. struct DummyCppc;
  264. impl rustsbi::Cppc for DummyCppc {
  265. fn probe(&self, _: u32) -> SbiRet {
  266. SbiRet::success(4)
  267. }
  268. fn read(&self, _: u32) -> SbiRet {
  269. SbiRet::success(5)
  270. }
  271. fn read_hi(&self, _: u32) -> SbiRet {
  272. SbiRet::success(6)
  273. }
  274. fn write(&self, _: u32, _: u64) -> SbiRet {
  275. SbiRet::success(7)
  276. }
  277. }
  278. struct DummyHsm;
  279. impl rustsbi::Hsm for DummyHsm {
  280. fn hart_start(&self, _: usize, _: usize, _: usize) -> SbiRet {
  281. SbiRet::success(8)
  282. }
  283. fn hart_stop(&self) -> SbiRet {
  284. SbiRet::success(9)
  285. }
  286. fn hart_get_status(&self, _: usize) -> SbiRet {
  287. SbiRet::success(10)
  288. }
  289. fn hart_suspend(&self, _: u32, _: usize, _: usize) -> SbiRet {
  290. SbiRet::success(11)
  291. }
  292. }
  293. struct DummyIpi;
  294. impl rustsbi::Ipi for DummyIpi {
  295. fn send_ipi(&self, _: HartMask) -> SbiRet {
  296. SbiRet::success(12)
  297. }
  298. }
  299. struct DummyNacl;
  300. impl rustsbi::Nacl for DummyNacl {
  301. fn probe_feature(&self, _: u32) -> SbiRet {
  302. SbiRet::success(13)
  303. }
  304. fn set_shmem(&self, _: SharedPtr<[u8; NATIVE]>, _: usize) -> SbiRet {
  305. SbiRet::success(14)
  306. }
  307. fn sync_csr(&self, _: usize) -> SbiRet {
  308. SbiRet::success(15)
  309. }
  310. fn sync_hfence(&self, _: usize) -> SbiRet {
  311. SbiRet::success(16)
  312. }
  313. fn sync_sret(&self) -> SbiRet {
  314. SbiRet::success(17)
  315. }
  316. }
  317. struct DummyPmu;
  318. impl rustsbi::Pmu for DummyPmu {
  319. fn num_counters(&self) -> usize {
  320. 18
  321. }
  322. fn counter_get_info(&self, _: usize) -> SbiRet {
  323. SbiRet::success(19)
  324. }
  325. fn counter_config_matching(&self, _: usize, _: usize, _: usize, _: usize, _: u64) -> SbiRet {
  326. SbiRet::success(20)
  327. }
  328. fn counter_start(&self, _: usize, _: usize, _: usize, _: u64) -> SbiRet {
  329. SbiRet::success(21)
  330. }
  331. fn counter_stop(&self, _: usize, _: usize, _: usize) -> SbiRet {
  332. SbiRet::success(22)
  333. }
  334. fn counter_fw_read(&self, _: usize) -> SbiRet {
  335. SbiRet::success(23)
  336. }
  337. fn counter_fw_read_hi(&self, _: usize) -> SbiRet {
  338. SbiRet::success(24)
  339. }
  340. }
  341. struct DummyReset;
  342. impl rustsbi::Reset for DummyReset {
  343. fn system_reset(&self, _: u32, _: u32) -> SbiRet {
  344. SbiRet::success(25)
  345. }
  346. }
  347. struct DummyFence;
  348. impl rustsbi::Fence for DummyFence {
  349. fn remote_fence_i(&self, _: HartMask) -> SbiRet {
  350. SbiRet::success(26)
  351. }
  352. fn remote_sfence_vma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
  353. SbiRet::success(27)
  354. }
  355. fn remote_sfence_vma_asid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  356. SbiRet::success(28)
  357. }
  358. fn remote_hfence_gvma_vmid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  359. SbiRet::success(29)
  360. }
  361. fn remote_hfence_gvma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
  362. SbiRet::success(30)
  363. }
  364. fn remote_hfence_vvma_asid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  365. SbiRet::success(31)
  366. }
  367. fn remote_hfence_vvma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
  368. SbiRet::success(32)
  369. }
  370. }
  371. struct DummySta;
  372. impl rustsbi::Sta for DummySta {
  373. fn set_shmem(&self, _: SharedPtr<[u8; 64]>, _: usize) -> SbiRet {
  374. SbiRet::success(33)
  375. }
  376. }
  377. struct DummySusp;
  378. impl rustsbi::Susp for DummySusp {
  379. fn system_suspend(&self, _: u32, _: usize, _: usize) -> SbiRet {
  380. SbiRet::success(34)
  381. }
  382. }
  383. struct DummyTimer;
  384. impl rustsbi::Timer for DummyTimer {
  385. fn set_timer(&self, _: u64) {
  386. todo!()
  387. }
  388. }
  389. struct DummyEnvInfo;
  390. impl rustsbi::EnvInfo for DummyEnvInfo {
  391. fn mvendorid(&self) -> usize {
  392. 36
  393. }
  394. fn marchid(&self) -> usize {
  395. 37
  396. }
  397. fn mimpid(&self) -> usize {
  398. 38
  399. }
  400. }