riscv_spec.rs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #![allow(unused)]
  2. pub const CSR_TIME: u32 = 0xc01;
  3. pub const CSR_TIMEH: u32 = 0xc81;
  4. pub const CSR_STIMECMP: u32 = 0x14D;
  5. pub mod menvcfg {
  6. use core::arch::asm;
  7. pub const FIOM: usize = 0x1 << 0;
  8. pub const CBIE_FLUSH: usize = 0x01 << 4;
  9. pub const CBIE_INVALIDATE: usize = 0x11 << 4;
  10. pub const CBCFE: usize = 0x1 << 6;
  11. pub const CBZE: usize = 0x1 << 7;
  12. pub const PBMTE: usize = 0x1 << 62;
  13. pub const STCE: usize = 0x1 << 63;
  14. #[inline(always)]
  15. pub fn set_stce() {
  16. set_bits(STCE);
  17. }
  18. pub fn set_bits(option: usize) {
  19. let mut bits: usize;
  20. unsafe {
  21. asm!("csrr {}, menvcfg", out(reg) bits, options(nomem));
  22. }
  23. bits |= option;
  24. unsafe {
  25. asm!("csrw menvcfg, {}", in(reg) bits, options(nomem));
  26. }
  27. }
  28. }
  29. pub mod stimecmp {
  30. use core::arch::asm;
  31. pub fn set(value: u64) {
  32. unsafe {
  33. asm!("csrrw zero, stimecmp, {}", in(reg) value, options(nomem));
  34. }
  35. }
  36. }
  37. #[inline]
  38. pub fn current_hartid() -> usize {
  39. riscv::register::mhartid::read()
  40. }