@@ -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