utvec.rs 885 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  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. #[inline]
  11. pub fn bits(&self) -> usize {
  12. self.bits
  13. }
  14. /// Returns the trap-vector base-address
  15. #[inline]
  16. pub fn address(&self) -> usize {
  17. self.bits - (self.bits & 0b11)
  18. }
  19. /// Returns the trap-vector mode
  20. #[inline]
  21. pub fn trap_mode(&self) -> Option<TrapMode> {
  22. let mode = self.bits & 0b11;
  23. match mode {
  24. 0 => Some(TrapMode::Direct),
  25. 1 => Some(TrapMode::Vectored),
  26. _ => None,
  27. }
  28. }
  29. }
  30. read_csr_as!(Utvec, 0x005);
  31. write_csr!(0x005);
  32. /// Writes the CSR
  33. #[inline]
  34. pub unsafe fn write(addr: usize, mode: TrapMode) {
  35. _write(addr + mode as usize);
  36. }