Skip to content

Commit 6ecf8a6

Browse files
committed
riscv: add basic stvec unit tests
Adds basic unit tests for the `stvec` CSR.
1 parent a87165f commit 6ecf8a6

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

riscv/src/register/stvec.rs

+41
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,44 @@ impl Stvec {
5454
}
5555
}
5656
}
57+
58+
#[cfg(test)]
59+
mod tests {
60+
use super::*;
61+
62+
#[test]
63+
fn test_stvec() {
64+
let mut stvec = Stvec::from_bits(0);
65+
66+
[TrapMode::Direct, TrapMode::Vectored]
67+
.into_iter()
68+
.for_each(|trap_mode| {
69+
test_csr_field!(stvec, trap_mode: trap_mode);
70+
});
71+
72+
(1..=usize::BITS)
73+
.map(|r| (((1u128 << r) - 1) as usize) & !TRAP_MASK)
74+
.for_each(|address| {
75+
stvec.set_address(address);
76+
assert_eq!(stvec.address(), address);
77+
78+
assert_eq!(stvec.try_set_address(address), Ok(()));
79+
assert_eq!(stvec.address(), address);
80+
});
81+
82+
(1..=usize::BITS)
83+
.filter_map(|r| match ((1u128 << r) - 1) as usize {
84+
addr if (addr & TRAP_MASK) != 0 => Some(addr),
85+
_ => None,
86+
})
87+
.for_each(|address| {
88+
assert_eq!(
89+
stvec.try_set_address(address),
90+
Err(Error::InvalidFieldVariant {
91+
field: "stvec::address",
92+
value: address,
93+
})
94+
);
95+
});
96+
}
97+
}

0 commit comments

Comments
 (0)