pmu.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. use sbi_spec::binary::SbiRet;
  2. #[cfg(target_pointer_width = "64")]
  3. #[inline]
  4. pub fn handle_ecall(
  5. function: usize,
  6. param0: usize,
  7. param1: usize,
  8. param2: usize,
  9. param3: usize,
  10. param4: usize,
  11. ) -> SbiRet {
  12. use crate::pmu::*;
  13. use sbi_spec::pmu::*;
  14. match function {
  15. PMU_NUM_COUNTERS => num_counters(),
  16. PMU_COUNTER_GET_INFO => counter_get_info(param0),
  17. PMU_COUNTER_CONFIG_MATCHING => {
  18. counter_config_matching(param0, param1, param2, param3, param4 as _)
  19. }
  20. PMU_COUNTER_START => counter_start(param0, param1, param2, param3 as _),
  21. PMU_COUNTER_STOP => counter_stop(param0, param1, param2),
  22. PMU_COUNTER_FW_READ => counter_fw_read(param0),
  23. #[cfg(feature = "sbi_2_0")]
  24. PMU_COUNTER_FW_READ_HI => counter_fw_read_hi(param0),
  25. _ => SbiRet::not_supported(),
  26. }
  27. }
  28. #[cfg(target_pointer_width = "32")]
  29. #[inline]
  30. pub fn handle_ecall(
  31. function: usize,
  32. param0: usize,
  33. param1: usize,
  34. param2: usize,
  35. param3: usize,
  36. param4: usize,
  37. param5: usize,
  38. ) -> SbiRet {
  39. use super::concat_u32;
  40. use crate::pmu::*;
  41. use sbi_spec::pmu::*;
  42. match function {
  43. PMU_NUM_COUNTERS => num_counters(),
  44. PMU_COUNTER_GET_INFO => counter_get_info(param0),
  45. PMU_COUNTER_CONFIG_MATCHING => {
  46. counter_config_matching(param0, param1, param2, param3, concat_u32(param5, param4))
  47. }
  48. PMU_COUNTER_START => counter_start(param0, param1, param2, concat_u32(param4, param3)),
  49. PMU_COUNTER_STOP => counter_stop(param0, param1, param2),
  50. PMU_COUNTER_FW_READ => counter_fw_read(param0),
  51. #[cfg(feature = "sbi_2_0")]
  52. PMU_COUNTER_FW_READ_HI => counter_fw_read_hi(param0),
  53. _ => SbiRet::not_supported(),
  54. }
  55. }