浏览代码

Read composite CSRs as one 64-bit value

Vadim Kaushan 6 年之前
父节点
当前提交
925c496949
共有 4 个文件被更改,包括 25 次插入0 次删除
  1. 22 0
      src/register/macros.rs
  2. 1 0
      src/register/mcycle.rs
  3. 1 0
      src/register/minstret.rs
  4. 1 0
      src/register/time.rs

+ 22 - 0
src/register/macros.rs

@@ -208,3 +208,25 @@ macro_rules! set_clear_csr {
         clear_csr!($(#[$attr])*, $clear_field, $e);
     }
 }
+
+macro_rules! read_composite_csr {
+    ($hi:expr, $lo:expr) => {
+        /// Reads the CSR as a 64-bit value
+        #[inline]
+        pub fn read64() -> u64 {
+            match () {
+                #[cfg(riscv32)]
+                () => loop {
+                    let hi = $hi;
+                    let lo = $lo;
+                    if hi == $hi {
+                        return ((hi as u64) << 32) | lo as u64;
+                    }
+                },
+
+                #[cfg(not(riscv32))]
+                () => $lo as u64,
+            }
+        }
+    }
+}

+ 1 - 0
src/register/mcycle.rs

@@ -1,3 +1,4 @@
 //! mcycle register
 
 read_csr_as_usize!(0xB00, __read_mcycle);
+read_composite_csr!(super::mcycleh::read(), read());

+ 1 - 0
src/register/minstret.rs

@@ -1,3 +1,4 @@
 //! minstret register
 
 read_csr_as_usize!(0xB02, __read_minstret);
+read_composite_csr!(super::minstreth::read(), read());

+ 1 - 0
src/register/time.rs

@@ -1,3 +1,4 @@
 //! time register
 
 read_csr_as_usize!(0xC01, __read_time);
+read_composite_csr!(super::timeh::read(), read());