dynamic-priority.rs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. use rustsbi::{RustSBI, SbiRet};
  2. use sbi_spec::rfnc::EID_RFNC;
  3. #[derive(RustSBI)]
  4. #[rustsbi(dynamic)]
  5. struct MultipleFences {
  6. #[rustsbi(fence)]
  7. fence_one: Option<FenceOne>,
  8. #[rustsbi(fence)]
  9. fence_two: Option<FenceTwo>,
  10. env_info: DummyEnvInfo,
  11. }
  12. struct FenceOne;
  13. impl rustsbi::Fence for FenceOne {
  14. fn remote_fence_i(&self, _: rustsbi::HartMask) -> SbiRet {
  15. SbiRet::success(1)
  16. }
  17. fn remote_sfence_vma(&self, _: rustsbi::HartMask, _: usize, _: usize) -> SbiRet {
  18. SbiRet::success(2)
  19. }
  20. fn remote_sfence_vma_asid(&self, _: rustsbi::HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  21. SbiRet::success(3)
  22. }
  23. }
  24. struct FenceTwo;
  25. impl rustsbi::Fence for FenceTwo {
  26. fn remote_fence_i(&self, _: rustsbi::HartMask) -> SbiRet {
  27. SbiRet::success(4)
  28. }
  29. fn remote_sfence_vma(&self, _: rustsbi::HartMask, _: usize, _: usize) -> SbiRet {
  30. SbiRet::success(5)
  31. }
  32. fn remote_sfence_vma_asid(&self, _: rustsbi::HartMask, _: usize, _: usize, _: usize) -> SbiRet {
  33. SbiRet::success(6)
  34. }
  35. }
  36. #[test]
  37. fn priority() {
  38. let sbi = MultipleFences {
  39. fence_one: Some(FenceOne),
  40. fence_two: None,
  41. env_info: DummyEnvInfo,
  42. };
  43. assert_eq!(sbi.handle_ecall(EID_RFNC, 0x0, [0; 6]), SbiRet::success(1));
  44. let sbi = MultipleFences {
  45. fence_one: None,
  46. fence_two: Some(FenceTwo),
  47. env_info: DummyEnvInfo,
  48. };
  49. assert_eq!(sbi.handle_ecall(EID_RFNC, 0x0, [0; 6]), SbiRet::success(4));
  50. let sbi = MultipleFences {
  51. fence_one: Some(FenceOne),
  52. fence_two: Some(FenceTwo),
  53. env_info: DummyEnvInfo,
  54. };
  55. assert_eq!(sbi.handle_ecall(EID_RFNC, 0x0, [0; 6]), SbiRet::success(1));
  56. let sbi = MultipleFences {
  57. fence_one: None,
  58. fence_two: None,
  59. env_info: DummyEnvInfo,
  60. };
  61. assert_eq!(
  62. sbi.handle_ecall(EID_RFNC, 0x0, [0; 6]),
  63. SbiRet::not_supported()
  64. );
  65. }
  66. struct DummyEnvInfo;
  67. impl rustsbi::EnvInfo for DummyEnvInfo {
  68. fn mvendorid(&self) -> usize {
  69. 36
  70. }
  71. fn marchid(&self) -> usize {
  72. 37
  73. }
  74. fn mimpid(&self) -> usize {
  75. 38
  76. }
  77. }