@@ -83,3 +83,58 @@ pub unsafe fn set<I: CoreInterruptNumber, E: ExceptionNumber>(cause: Trap<I, E>)
83
83
} ;
84
84
_write ( bits) ;
85
85
}
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