macros.rs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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_rv32 {
  19. ($csr_number:expr) => {
  20. /// Reads the CSR
  21. #[inline]
  22. #[cfg(target_arch = "riscv32")]
  23. unsafe fn _read() -> usize {
  24. let r: usize;
  25. asm!("csrrs $0, $1, x0" : "=r"(r) : "i"($csr_number) :: "volatile");
  26. r
  27. }
  28. #[inline]
  29. #[cfg(not(target_arch = "riscv32"))]
  30. unsafe fn _read() -> usize {
  31. unimplemented!()
  32. }
  33. };
  34. }
  35. macro_rules! read_csr_as {
  36. ($register:ident, $csr_number:expr) => {
  37. read_csr!($csr_number);
  38. /// Reads the CSR
  39. #[inline]
  40. pub fn read() -> $register {
  41. $register { bits: unsafe{ _read() } }
  42. }
  43. };
  44. }
  45. macro_rules! read_csr_as_usize {
  46. ($csr_number:expr) => {
  47. read_csr!($csr_number);
  48. /// Reads the CSR
  49. #[inline]
  50. pub fn read() -> usize {
  51. unsafe{ _read() }
  52. }
  53. };
  54. }
  55. macro_rules! read_csr_as_usize_rv32 {
  56. ($csr_number:expr) => {
  57. read_csr_rv32!($csr_number);
  58. /// Reads the CSR
  59. #[inline]
  60. pub fn read() -> usize {
  61. unsafe{ _read() }
  62. }
  63. };
  64. }
  65. macro_rules! write_csr {
  66. ($csr_number:expr) => {
  67. /// Writes the CSR
  68. #[inline]
  69. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  70. unsafe fn _write(bits: usize) {
  71. asm!("csrrw x0, $1, $0" :: "r"(bits), "i"($csr_number) :: "volatile");
  72. }
  73. #[inline]
  74. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  75. unsafe fn _write(_bits: usize) {
  76. unimplemented!()
  77. }
  78. };
  79. }
  80. macro_rules! write_csr_as_usize {
  81. ($csr_number:expr) => {
  82. write_csr!($csr_number);
  83. /// Writes the CSR
  84. #[inline]
  85. pub fn write(bits: usize) {
  86. unsafe{ _write(bits) }
  87. }
  88. };
  89. }
  90. macro_rules! set {
  91. ($csr_number:expr) => {
  92. /// Set the CSR
  93. #[inline]
  94. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  95. unsafe fn _set(bits: usize) {
  96. asm!("csrrs x0, $1, $0" :: "r"(bits), "i"($csr_number) :: "volatile");
  97. }
  98. #[inline]
  99. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  100. unsafe fn _set(_bits: usize) {
  101. unimplemented!()
  102. }
  103. };
  104. }
  105. macro_rules! clear {
  106. ($csr_number:expr) => {
  107. /// Clear the CSR
  108. #[inline]
  109. #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
  110. unsafe fn _clear(bits: usize) {
  111. asm!("csrrc x0, $1, $0" :: "r"(bits), "i"($csr_number) :: "volatile");
  112. }
  113. #[inline]
  114. #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
  115. unsafe fn _clear(_bits: usize) {
  116. unimplemented!()
  117. }
  118. };
  119. }
  120. macro_rules! set_csr {
  121. ($set_field:ident, $e:expr) => {
  122. #[inline]
  123. pub unsafe fn $set_field() {
  124. _set($e);
  125. }
  126. }
  127. }
  128. macro_rules! clear_csr {
  129. ($clear_field:ident, $e:expr) => {
  130. #[inline]
  131. pub unsafe fn $clear_field() {
  132. _clear($e);
  133. }
  134. }
  135. }
  136. macro_rules! set_clear_csr {
  137. ($set_field:ident, $clear_field:ident, $e:expr) => {
  138. set_csr!($set_field, $e);
  139. clear_csr!($clear_field, $e);
  140. }
  141. }