Skip to content

Commit 9fd2f73

Browse files
committed
riscv: add mtvec unit-tests
Adds basic unit-tests for the `mtvec` CSR.
1 parent b343fbe commit 9fd2f73

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

riscv/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
2727
- Use CSR helper macros to define `mip` register
2828
- Use CSR helper macros to define `mstatus` register
2929
- Use CSR helper macros to define `mstatush` register
30+
- Use CSR helper macros to define `mtvec` register
3031

3132
## [v0.12.1] - 2024-10-20
3233

riscv/src/register/mtvec.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,41 @@ impl Mtvec {
6363
}
6464
}
6565
}
66+
67+
#[cfg(test)]
68+
mod tests {
69+
use super::*;
70+
71+
#[test]
72+
fn test_mtvec() {
73+
let mut m = Mtvec::from_bits(0);
74+
75+
(1..=usize::BITS)
76+
.map(|r| (((1u128 << r) - 1) as usize) & !TRAP_MASK)
77+
.for_each(|address| {
78+
m.set_address(address);
79+
assert_eq!(m.address(), address);
80+
81+
assert_eq!(m.try_set_address(address), Ok(()));
82+
assert_eq!(m.address(), address);
83+
});
84+
85+
(1..=usize::BITS)
86+
.filter_map(|r| match ((1u128 << r) - 1) as usize {
87+
addr if (addr & TRAP_MASK) != 0 => Some(addr),
88+
_ => None,
89+
})
90+
.for_each(|address| {
91+
assert_eq!(
92+
m.try_set_address(address),
93+
Err(Error::InvalidFieldVariant {
94+
field: "mtvec::address",
95+
value: address,
96+
})
97+
);
98+
});
99+
100+
test_csr_field!(m, trap_mode: TrapMode::Direct);
101+
test_csr_field!(m, trap_mode: TrapMode::Vectored);
102+
}
103+
}

0 commit comments

Comments
 (0)