riscv/register/
mcounteren.rs1use crate::result::{Error, Result};
4
5read_write_csr! {
6 Mcounteren: 0x306,
8 mask: 0xffff_ffff,
9}
10
11read_write_csr_field! {
12 Mcounteren,
13 cy: 0,
15}
16
17read_write_csr_field! {
18 Mcounteren,
19 tm: 1,
21}
22
23read_write_csr_field! {
24 Mcounteren,
25 ir: 2,
27}
28
29read_write_csr_field! {
30 Mcounteren,
31 hpm: 3..=31,
33}
34
35set!(0x306);
36clear!(0x306);
37
38set_clear_csr!(
39, set_cy, clear_cy, 1 << 0);
41
42set_clear_csr!(
43, set_tm, clear_tm, 1 << 1);
45
46set_clear_csr!(
47, set_ir, clear_ir, 1 << 2);
49
50#[inline]
59pub unsafe fn set_hpm(index: usize) {
60 try_set_hpm(index).unwrap();
61}
62
63#[inline]
67pub unsafe fn try_set_hpm(index: usize) -> Result<()> {
68 if (3..32).contains(&index) {
69 _try_set(1 << index)
70 } else {
71 Err(Error::IndexOutOfBounds {
72 index,
73 min: 3,
74 max: 31,
75 })
76 }
77}
78
79#[inline]
88pub unsafe fn clear_hpm(index: usize) {
89 try_clear_hpm(index).unwrap();
90}
91
92#[inline]
96pub unsafe fn try_clear_hpm(index: usize) -> Result<()> {
97 if (3..32).contains(&index) {
98 _try_clear(1 << index)
99 } else {
100 Err(Error::IndexOutOfBounds {
101 index,
102 min: 3,
103 max: 31,
104 })
105 }
106}
107
108#[cfg(test)]
109mod tests {
110 use super::*;
111
112 #[test]
113 fn test_mcounteren() {
114 let mut m = Mcounteren { bits: 0 };
115
116 test_csr_field!(m, cy);
117 test_csr_field!(m, tm);
118 test_csr_field!(m, ir);
119
120 (3..32).for_each(|i| test_csr_field!(m, hpm, i));
121
122 (0..3).chain(32..64).for_each(|index| {
123 test_csr_field!(
124 m,
125 hpm,
126 index,
127 Error::IndexOutOfBounds {
128 index,
129 min: 3,
130 max: 31
131 }
132 )
133 });
134 }
135}