macros.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. macro_rules! read_csr {
  2. ($csr_number:expr) => {
  3. /// Reads the CSR
  4. #[inline]
  5. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  6. unsafe fn _read() -> usize {
  7. let r: usize;
  8. asm!("csrrs $0, $1, x0" : "=r"(r) : "i"($csr_number) :: "volatile");
  9. r
  10. }
  11. #[inline]
  12. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  13. unsafe fn _read() -> usize {
  14. unimplemented!()
  15. }
  16. };
  17. }
  18. macro_rules! read_csr_as {
  19. ($register:ident, $csr_number:expr) => {
  20. read_csr!($csr_number);
  21. /// Reads the CSR
  22. #[inline]
  23. pub fn read() -> $register {
  24. $register { bits: unsafe{ _read() } }
  25. }
  26. };
  27. }
  28. macro_rules! read_csr_as_usize {
  29. ($csr_number:expr) => {
  30. read_csr!($csr_number);
  31. /// Reads the CSR
  32. #[inline]
  33. pub fn read() -> usize {
  34. unsafe{ _read() }
  35. }
  36. };
  37. }
  38. macro_rules! write_csr {
  39. ($csr_number:expr) => {
  40. /// Writes the CSR
  41. #[inline]
  42. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  43. unsafe fn _write(bits: usize) {
  44. asm!("csrrw x0, $1, $0" :: "r"(bits), "i"($csr_number) :: "volatile");
  45. }
  46. #[inline]
  47. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  48. unsafe fn _write(_bits: usize) {
  49. unimplemented!()
  50. }
  51. };
  52. }
  53. macro_rules! write_csr_as_usize {
  54. ($csr_number:expr) => {
  55. write_csr!($csr_number);
  56. /// Writes the CSR
  57. #[inline]
  58. pub fn write(bits: usize) {
  59. unsafe{ _write(bits) }
  60. }
  61. };
  62. }
  63. macro_rules! set {
  64. ($csr_number:expr) => {
  65. /// Set the CSR
  66. #[inline]
  67. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  68. unsafe fn _set(bits: usize) {
  69. asm!("csrrs x0, $1, $0" :: "r"(bits), "i"($csr_number) :: "volatile");
  70. }
  71. #[inline]
  72. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  73. unsafe fn _set(_bits: usize) {
  74. unimplemented!()
  75. }
  76. };
  77. }
  78. macro_rules! clear {
  79. ($csr_number:expr) => {
  80. /// Clear the CSR
  81. #[inline]
  82. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  83. unsafe fn _clear(bits: usize) {
  84. asm!("csrrc x0, $1, $0" :: "r"(bits), "i"($csr_number) :: "volatile");
  85. }
  86. #[inline]
  87. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  88. unsafe fn _clear(_bits: usize) {
  89. unimplemented!()
  90. }
  91. };
  92. }
  93. macro_rules! set_csr {
  94. ($set_field:ident, $e:expr) => {
  95. #[inline]
  96. pub unsafe fn $set_field() {
  97. _set($e);
  98. }
  99. }
  100. }
  101. macro_rules! clear_csr {
  102. ($clear_field:ident, $e:expr) => {
  103. #[inline]
  104. pub unsafe fn $clear_field() {
  105. _clear($e);
  106. }
  107. }
  108. }
  109. macro_rules! set_clear_csr {
  110. ($set_field:ident, $clear_field:ident, $e:expr) => {
  111. set_csr!($set_field, $e);
  112. clear_csr!($clear_field, $e);
  113. }
  114. }