derive.rs 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. use rustsbi::{HartMask, MachineInfo, RustSBI};
  2. use sbi_spec::binary::SbiRet;
  3. #[derive(RustSBI)]
  4. struct MySBI {
  5. fence: MyFence,
  6. info: MyMachineInfo,
  7. }
  8. struct MyFence;
  9. impl rustsbi::Fence for MyFence {
  10. fn remote_fence_i(&self, _: HartMask) -> SbiRet {
  11. println!("remote fence i called");
  12. SbiRet::success(0)
  13. }
  14. fn remote_sfence_vma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
  15. todo!()
  16. }
  17. fn remote_sfence_vma_asid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  18. todo!()
  19. }
  20. }
  21. struct MyMachineInfo;
  22. impl MachineInfo for MyMachineInfo {
  23. fn mvendorid(&self) -> usize {
  24. 0x100
  25. }
  26. fn marchid(&self) -> usize {
  27. 0x200
  28. }
  29. fn mimpid(&self) -> usize {
  30. 0x300
  31. }
  32. }
  33. fn main() {
  34. let sbi = MySBI {
  35. fence: MyFence,
  36. info: MyMachineInfo,
  37. };
  38. sbi.handle_ecall(sbi_spec::rfnc::EID_RFNC, 0, [0; 6]);
  39. let sbi_impl_id = sbi.handle_ecall(0x10, 0x1, [0; 6]);
  40. println!("SBI implementation ID: {:x?}", sbi_impl_id.value);
  41. }