Skip to content

Commit b2b533e

Browse files
committed
riscv: add basic scause unit tests
Adds basic unit tests for the `scause` CSR.
1 parent 08886c1 commit b2b533e

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

riscv/src/register/scause.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,58 @@ pub unsafe fn set<I: CoreInterruptNumber, E: ExceptionNumber>(cause: Trap<I, E>)
8383
};
8484
_write(bits);
8585
}
86+
87+
#[cfg(test)]
88+
mod tests {
89+
use super::*;
90+
91+
#[test]
92+
fn test_scause() {
93+
let new_code = 0;
94+
(1usize..=usize::BITS as usize)
95+
.map(|r| ((1u128 << r) - 1) as usize)
96+
.for_each(|raw| {
97+
let exp_interrupt = (raw >> (usize::BITS - 1)) != 0;
98+
let exp_code = raw & ((1usize << (usize::BITS - 1)) - 1);
99+
let exp_cause = if exp_interrupt {
100+
Trap::Interrupt(exp_code)
101+
} else {
102+
Trap::Exception(exp_code)
103+
};
104+
105+
let mut scause = Scause::from_bits(raw);
106+
107+
assert_eq!(scause.interrupt(), exp_interrupt);
108+
assert_eq!(scause.is_interrupt(), exp_interrupt);
109+
assert_eq!(scause.is_exception(), !exp_interrupt);
110+
111+
assert_eq!(scause.code(), exp_code);
112+
assert_eq!(scause.cause(), exp_cause);
113+
114+
scause.set_interrupt(!exp_interrupt);
115+
116+
assert_eq!(scause.is_interrupt(), !exp_interrupt);
117+
assert_eq!(scause.is_exception(), exp_interrupt);
118+
119+
scause.set_code(new_code);
120+
let new_cause = if scause.interrupt() {
121+
Trap::Interrupt(new_code)
122+
} else {
123+
Trap::Exception(new_code)
124+
};
125+
126+
assert_eq!(scause.code(), new_code);
127+
assert_eq!(scause.cause(), new_cause);
128+
129+
scause.set_code(exp_code);
130+
let exp_cause = if scause.interrupt() {
131+
Trap::Interrupt(exp_code)
132+
} else {
133+
Trap::Exception(exp_code)
134+
};
135+
136+
assert_eq!(scause.code(), exp_code);
137+
assert_eq!(scause.cause(), exp_cause);
138+
});
139+
}
140+
}

0 commit comments

Comments
 (0)