utvec.rs 864 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. //! stvec register
  2. pub use crate::register::mtvec::TrapMode;
  3. /// stvec register
  4. #[derive(Clone, Copy, Debug)]
  5. pub struct Utvec {
  6. bits: usize,
  7. }
  8. impl Utvec {
  9. /// Returns the contents of the register as raw bits
  10. pub fn bits(&self) -> usize {
  11. self.bits
  12. }
  13. /// Returns the trap-vector base-address
  14. pub fn address(&self) -> usize {
  15. self.bits - (self.bits & 0b11)
  16. }
  17. /// Returns the trap-vector mode
  18. pub fn trap_mode(&self) -> TrapMode {
  19. let mode = self.bits & 0b11;
  20. match mode {
  21. 0 => TrapMode::Direct,
  22. 1 => TrapMode::Vectored,
  23. _ => unimplemented!(),
  24. }
  25. }
  26. }
  27. read_csr_as!(Utvec, 0x005, __read_utvec);
  28. write_csr!(0x005, __write_utvec);
  29. /// Writes the CSR
  30. #[inline]
  31. pub unsafe fn write(addr: usize, mode: TrapMode) {
  32. _write(addr + mode as usize);
  33. }